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的输出与原始输入进行残差连接,并通过层归一化操作得到最终输出。
上述部分在整体的位置