Transformer构建编码器块

155 阅读2分钟

encoder.png

简介

EncoderLayer类定义了Transformer编码器的单层。它封装了多头自注意力机制,然后是位置感知前馈神经网络,带有残差连接、层归一化和dropout。这些组件共同允许编码器捕获输入数据中的复杂关系,并将它们转换为下游任务的有用表示。通常,多个这样的编码器层堆叠在一起形成完整的编码器部分。

全部代码

class EncoderLayer(nn.Module):  
    def __init__(self, d_model, num_heads, d_ff, dropout):  
        super(EncoderLayer, self).__init__()  
        self.self_attn = MultiHeadAttention(d_model, num_heads)  
        self.feed_forward = PositionWiseFeedForward(d_model, d_ff)  
        self.norm1 = nn.LayerNorm(d_model)  
        self.norm2 = nn.LayerNorm(d_model)  
        self.dropout = nn.Dropout(dropout)  
  
    def forward(self, x, mask):  
        attn_output = self.self_attn(x, x, x, mask)  
        x = self.norm1(x + self.dropout(attn_output))  
        ff_output = self.feed_forward(x)  
        x = self.norm2(x + self.dropout(ff_output))  
        return x  

类定义/初始化

参数:

  1. d_model: 输入的维度。
  2. num_heads: 多头注意力中的注意力头数。
  3. d_ff: 位置感知前馈网络中内层的维度。
  4. dropout: 用于正则化的dropout率。

组件:

  1. self.self_attn: 多头自注意力机制。
  2. self.feed_forward: 位置感知前馈神经网络。
  3. self.norm1和self.norm2: 层归一化,应用于平滑层的输入。
  4. self.dropout: Dropout层,用于通过在训练期间随机将一些激活设置为零来防止过拟合。
class EncoderLayer(nn.Module):  
    def __init__(self, d_model, num_heads, d_ff, dropout):  
        super(EncoderLayer, self).__init__()  
        self.self_attn = MultiHeadAttention(d_model, num_heads)  
        self.feed_forward = PositionWiseFeedForward(d_model, d_ff)  
        self.norm1 = nn.LayerNorm(d_model)  
        self.norm2 = nn.LayerNorm(d_model)  
        self.dropout = nn.Dropout(dropout)  

前向方法

输入:

  1. x: 编码器层的输入。
  2. mask: 可选掩码,用于忽略输入的某些部分。

处理步骤:

  1. 自注意力:输入x通过多头自注意力机制传递。
  2. 加法 & 归一化(自注意力后):注意力输出添加到原始输入(残差连接),然后是dropout和使用norm1的归一化。
  3. 前馈网络:前一步的输出通过位置感知前馈网络传递。
  4. 加法 & 归一化(前馈后):与步骤2类似,前馈输出添加到该阶段的输入(残差连接),然后是dropout和使用norm2的归一化。
  5. 输出:处理后的张量作为编码器层的输出返回。
def forward(self, x, mask):  
    attn_output = self.self_attn(x, x, x, mask)  
    x = self.norm1(x + self.dropout(attn_output))  
    ff_output = self.feed_forward(x)  
    x = self.norm2(x + self.dropout(ff_output))  
    return x