Transformer中的FeedForward
flyfish
class PoswiseFeedForwardNet(nn.Module):
def __init__(self, d_ff=2048):
super(PoswiseFeedForwardNet, self).__init__()
# 定义一维卷积层 1,用于将输入映射到更高维度
self.conv1 = nn.Conv1d(in_channels=d_embedding, out_channels=d_ff, kernel_size=1)
# 定义一维卷积层 2,用于将输入映射回原始维度
self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_embedding, kernel_size=1)
# 定义层归一化
self.layer_norm = nn.LayerNorm(d_embedding)
def forward(self, inputs):
#------------------------- 维度信息 --------------------------------
# inputs [batch_size, len_q, embedding_dim]
#----------------------------------------------------------------
residual = inputs # 保留残差连接
# 在卷积层 1 后使用 ReLU 激活函数
output = nn.ReLU()(self.conv1(inputs.transpose(1, 2)))
#------------------------- 维度信息 --------------------------------
# output [batch_size, d_ff, len_q]
#----------------------------------------------------------------
# 使用卷积层 2 进行降维
output = self.conv2(output).transpose(1, 2)
#------------------------- 维度信息 --------------------------------
# output [batch_size, len_q, embedding_dim]
#----------------------------------------------------------------
# 与输入进行残差链接,并进行层归一化
output = self.layer_norm(output + residual)
#------------------------- 维度信息 --------------------------------
# output [batch_size, len_q, embedding_dim]
#----------------------------------------------------------------
return output # 返回加入残差连接后层归一化的结果
PoswiseFeedForwardNe继承自PyTorch的nn.Module类。该网络包含两个一维卷积层和一个层归一化操作。在前向传播过程中,该网络首先对输入进行卷积操作,然后通过ReLU激活函数进行非线性变换,接着进行降维操作,并与原始输入进行残差连接,最后通过层归一化得到输出。
具体来说,函数初始化时,根据参数d_ff设置两个一维卷积层的输出维度。在前向传播过程中,输入的维度为[batch_size, len_q, embedding_dim],首先将输入保留为残差连接的副本。然后,通过一维卷积层1将输入映射到更高维度,并在卷积层1后使用ReLU激活函数。接着,通过一维卷积层2将输出映射回原始维度。最后,将卷积层2的输出与原始输入进行残差连接,并通过层归一化操作得到最终输出。
上述部分在整体的位置