# 前馈神经网络
# 直观理解
前馈神经网络在Transformer中就像是一个信息处理器,它接收注意力机制输出的原始特征,通过非线性变换提取更高层次的特征。可以类比为人类在获取信息后的思考和推理过程,将零散的信息整合成更有意义的认知。
# 技术原理
# 1. 结构设计
前馈网络包含两个线性变换和一个激活函数:
- 第一个线性层扩展维度
- 非线性激活函数
- 第二个线性层压缩维度
# 2. 激活函数
Transformer中通常使用ReLU或GELU作为激活函数:
- ReLU:
- GELU: ,其中是标准正态分布的累积分布函数
# 数学表达
# 1. 前向计算
前馈网络的计算过程可以表示为:
其中:
- 是激活函数
- 通常是 的4倍
# 2. 维度变化
输入维度: 中间维度: 输出维度:
# 实现细节
class FeedForward(nn.Module):
def __init__(self, d_model, d_ff, dropout=0.1):
super().__init__()
self.linear1 = nn.Linear(d_model, d_ff)
self.linear2 = nn.Linear(d_ff, d_model)
self.dropout = nn.Dropout(dropout)
self.activation = nn.GELU()
def forward(self, x):
# x: [batch_size, seq_length, d_model]
x = self.linear1(x)
x = self.activation(x)
x = self.dropout(x)
x = self.linear2(x)
return x
# 优化技巧
# 1. 参数效率
低秩分解
- 将大矩阵分解为两个小矩阵的乘积
- 减少参数量和计算量
参数共享
- 在不同层之间共享部分参数
- 平衡模型容量和效率
# 2. 训练稳定性
初始化策略
- 使用合适的权重初始化方法
- 避免梯度消失或爆炸
正则化技术
- Dropout防止过拟合
- Layer Normalization保持数值稳定
# 应用变体
# 1. GLU变体
门控线性单元(Gated Linear Unit)变体:
其中表示逐元素相乘。
# 2. Expert-based变体
混合专家系统(Mixture of Experts):
- 多个专家网络并行处理
- 通过门控机制选择或组合专家输出
# 注意事项
计算复杂度
- FFN层通常占据模型大部分参数
- 需要在模型容量和效率之间权衡
内存消耗
- 中间激活值可能占用大量显存
- 考虑使用梯度检查点等技术
训练技巧
- 使用梯度裁剪控制梯度范围
- 采用预热学习率调度器