前馈神经网络层
FeedForward Network
-
论文地址
https://arxiv.org/pdf/1706.03762
前馈网络介绍
-
前馈网络是Transformer模型中的关键组件,每个Transformer层包含一个多头注意力模块和一个前馈网络模块。该模块通过两次线性变换和激活函数,为模型提供非线性建模能力。其核心设计是通过中间隐藏层的维度扩展(d_ff > d_model),增强模型的特征表达能力。
典型配置中d_ff=2048(当d_model=512时),这种"扩展-收缩"结构帮助模型捕获更复杂的模式。前馈网络独立作用于每个位置,与注意力机制形成功能互补。
数学公式
-
前馈网络FFN(FeedForward Network)的计算过程可表示为:
FFN ( x ) = ReLU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2
在标准实现中:- 第一层将维度从 d _ m o d e l d\_model d_model扩展到 d _ f f d\_ff d_ff
- 第二层将维度从 d _ f f d\_{ff} d_ff恢复为 d _ m o d e l d\_{model} d_model
- 实际实现中常省略偏置项(bias=False)
带Dropout的改进公式:
FFN ( x ) = Dropout ( ReLU ( x W 1 ) W 2 ) \text{FFN}(x) = \text{Dropout}(\text{ReLU}(xW_1)W_2) FFN(x)=Dropout(ReLU(xW1)W2)
代码实现
-
前馈网络模块实现
import torch from torch import nnclass FeedForward(nn.Module):def __init__(self, d_model, d_ff, dropout_prob=0.1):""":param d_ff: 中间隐藏层维度"""super(FeedForward, self).__init__()self.ffn = nn.Sequential(nn.Linear(in_features=d_model, out_features=d_ff, bias=False),nn.ReLU(),nn.Linear(in_features=d_ff, out_features=d_model, bias=False),nn.Dropout(dropout_prob))def forward(self, x):output = self.ffn(x)return output
-
参数说明
参数名称 说明 典型值 d_model 输入/输出维度(embedding维度) 512 d_ff 中间层扩展维度 2048 dropout_prob Dropout概率(输出层之后应用) 0.1
维度变换流程
-
数据流经各层的形状变化:
操作步骤 张量形状变化示例 输入数据 [batch_size, seq_len, d_model] 第一线性层(d_model→d_ff) [batch_size, seq_len, d_ff] ReLU激活 [batch_size, seq_len, d_ff] 第二线性层(d_ff→d_model) [batch_size, seq_len, d_model] Dropout [batch_size, seq_len, d_model]
使用示例
-
测试代码
if __name__ == "__main__":batch_size = 4seq_len = 100d_model = 512d_ff = 2048x = torch.randn(batch_size, seq_len, d_model)ffn = FeedForward(d_model=d_model, d_ff=d_ff)out = ffn(x)print("输入形状:", x.shape) # torch.Size([4, 100, 512])print("输出形状:", out.shape) # torch.Size([4, 100, 512])print("输出均值:", out.mean().item()) # ≈0(受初始化影响)