前馈网络(FFN / MLP)

Transformer 中的 MLP(也常叫 FFN)负责“逐 token 的非线性变换”,与 Attention 的“跨 token 信息混合”互补。

经典的两层 FFN:

[ \mathrm{FFN}(x)=W_2 , \sigma(W_1 x + b_1) + b_2 ]

对序列 (X \in \mathbb{R}^{T\times d}) 是逐行独立地应用。

现代 LLM 常用的变体:SwiGLU / GeGLU

很多 LLM 使用门控 MLP(GLU family)提升效果与稳定性,例如 SwiGLU:

[ \mathrm{SwiGLU}(x) = (W_a x)\odot \mathrm{SiLU}(W_b x) ] [ \mathrm{MLP}(x)=W_o ,\mathrm{SwiGLU}(x) ]

其中 (\odot) 是逐元素乘。

工程直觉:

  • 门控结构给了模型一个“可学习的通道选择”,表达更灵活

  • 在相近参数量下常带来更好的效果

宽度(hidden size)为什么通常比 d 大?

FFN 的中间维度常取 (d_\text{ff}\approx 4d)(不同模型略有差异)。原因是:

  • Attention 更像“路由/搬运”,FFN 更像“计算/变换”

  • 扩大 FFN 宽度提升逐 token 的非线性容量

工程优化点

  • 算子融合:FFN 主要是 GEMM + activation + GEMM,适合 fuse

  • 混合精度:GEMM 用 BF16/FP16,累加用 FP32(依实现而定)

  • 张量并行:FFN 的两次线性层非常适合做 TP(按列/按行切分)