# 前馈神经网络

# 直观理解

前馈神经网络在Transformer中就像是一个信息处理器,它接收注意力机制输出的原始特征,通过非线性变换提取更高层次的特征。可以类比为人类在获取信息后的思考和推理过程,将零散的信息整合成更有意义的认知。

# 技术原理

# 1. 结构设计

前馈网络包含两个线性变换和一个激活函数:

  • 第一个线性层扩展维度
  • 非线性激活函数
  • 第二个线性层压缩维度

# 2. 激活函数

Transformer中通常使用ReLU或GELU作为激活函数:

  • ReLU: f(x)=max(0,x)f(x) = max(0, x)
  • GELU: f(x)=xΦ(x)f(x) = x \cdot \Phi(x),其中Φ(x)\Phi(x)是标准正态分布的累积分布函数

# 数学表达

# 1. 前向计算

前馈网络的计算过程可以表示为:

FFN(x)=W2(σ(W1x+b1))+b2FFN(x) = W_2(\sigma(W_1x + b_1)) + b_2

其中:

  • W1Rdff×dmodelW_1 \in \mathbb{R}^{d_{ff} \times d_{model}}
  • W2Rdmodel×dffW_2 \in \mathbb{R}^{d_{model} \times d_{ff}}
  • σ\sigma 是激活函数
  • dffd_{ff} 通常是 dmodeld_{model} 的4倍

# 2. 维度变化

输入维度:[batch_size,seq_length,dmodel][batch\_size, seq\_length, d_{model}] 中间维度:[batch_size,seq_length,dff][batch\_size, seq\_length, d_{ff}] 输出维度:[batch_size,seq_length,dmodel][batch\_size, seq\_length, d_{model}]

# 实现细节

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. 参数效率

  1. 低秩分解

    • 将大矩阵分解为两个小矩阵的乘积
    • 减少参数量和计算量
  2. 参数共享

    • 在不同层之间共享部分参数
    • 平衡模型容量和效率

# 2. 训练稳定性

  1. 初始化策略

    • 使用合适的权重初始化方法
    • 避免梯度消失或爆炸
  2. 正则化技术

    • Dropout防止过拟合
    • Layer Normalization保持数值稳定

# 应用变体

# 1. GLU变体

门控线性单元(Gated Linear Unit)变体:

FFNGLU(x)=(W1x)σ(W2x)FFN_{GLU}(x) = (W_1x) \otimes \sigma(W_2x)

其中\otimes表示逐元素相乘。

# 2. Expert-based变体

混合专家系统(Mixture of Experts):

  • 多个专家网络并行处理
  • 通过门控机制选择或组合专家输出

# 注意事项

  1. 计算复杂度

    • FFN层通常占据模型大部分参数
    • 需要在模型容量和效率之间权衡
  2. 内存消耗

    • 中间激活值可能占用大量显存
    • 考虑使用梯度检查点等技术
  3. 训练技巧

    • 使用梯度裁剪控制梯度范围
    • 采用预热学习率调度器