简介
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
类定义/初始化
参数:
- d_model: 输入的维度。
- num_heads: 多头注意力中的注意力头数。
- d_ff: 位置感知前馈网络中内层的维度。
- dropout: 用于正则化的dropout率。
组件:
- self.self_attn: 多头自注意力机制。
- self.feed_forward: 位置感知前馈神经网络。
- self.norm1和self.norm2: 层归一化,应用于平滑层的输入。
- 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)
前向方法
输入:
- x: 编码器层的输入。
- mask: 可选掩码,用于忽略输入的某些部分。
处理步骤:
- 自注意力:输入x通过多头自注意力机制传递。
- 加法 & 归一化(自注意力后):注意力输出添加到原始输入(残差连接),然后是dropout和使用norm1的归一化。
- 前馈网络:前一步的输出通过位置感知前馈网络传递。
- 加法 & 归一化(前馈后):与步骤2类似,前馈输出添加到该阶段的输入(残差连接),然后是dropout和使用norm2的归一化。
- 输出:处理后的张量作为编码器层的输出返回。
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