← 返回题目列表

Transformer 的 FFN 扩展比例如何选择?

高频 困难 第 21 / 25 题 更新于 2026/09/17
TransformerFFNExpansion RatioSwiGLU

简化版

FFN 扩展比例 r=d_ff/d_model 决定每个 token 的通道混合容量与主要参数/FLOPs。传统 GELU FFN 常用约 4 倍;SwiGLU 有两路上投影,为保持参数量相近常把中间维设为约 8/3·d_model 并对齐硬件倍数。最佳比例取决于总参数预算、深宽配置、数据和硬件,需在等参数/等算力实验中比较损失、下游能力和真实吞吐。

详细版

普通 FFN 参数约 2·d_model·d_ff;门控 FFN 如 SwiGLU 有 gate、value、down 三个矩阵,约 3·d_model·d_ff。若要与 4H 的普通 FFN 参数相近:

2·H·4H = 3·H·d_ff  =>  d_ff ≈ 8H/3

比例增大提升每 token 的非线性特征容量,也线性增加 FFN 参数、计算与中间激活。比例减小可把预算给更多层、更宽 attention 或更长上下文。中间维通常 round 到 128/256 等倍数以适配 Tensor Core,理论参数相同不保证吞吐相同。

完整版教学

一、FFN 在每个 token 上做什么

Attention 在 token 之间混合信息,FFN 对每个位置独立做通道变换。传统形式为:

FFN(x) = W2 · φ(W1x)
W1: H -> F, W2: F -> H

扩展维 F 提供非线性表示容量,比例 r=F/H。位置之间不在 FFN 内交互,但所有位置共享权重。

记忆钩子:Attention 决定“和谁交流”,FFN 决定“每个 token 内部怎样加工”;扩展比控制加工车间宽度。

二、传统 4 倍从哪里来

原始 Transformer 常设 F=4H,这是有效经验点,不是数学定律。普通 FFN 两个大矩阵参数约 2HF,忽略 bias。

若 H=4096、F=16384,一层 FFN 权重约:

2 × 4096 × 16384 ≈ 134M parameters

这往往超过同层 Attention 权重占比,使 FFN 成为模型参数和计算主体。

三、SwiGLU 为什么常不是 4 倍

SwiGLU 使用两路上投影,一路经过 SiLU 作 gate,再逐元素乘另一路,最后下投影:

SwiGLU(x) = W_down(SiLU(W_gate x) ⊙ W_up x)

它有三个 H×F 级矩阵。若 F 仍取 4H,参数比两矩阵 GELU FFN 多约 50%;为等参数比较,令 3HF≈8H²,得到 F≈8H/3

实际实现再向硬件友好倍数取整,因此配置会看到 11008、14336 等非整数比例。

四、扩展比影响哪些资源

参数与 FFN FLOPs 近似随 F 线性增长,中间激活 [B,S,F] 也随 F 增长。门控结构可能同时保存 gate/value 激活,训练显存更敏感。

资源F 增大后的变化
参数近似线性增加
前后向 FLOPs近似线性增加
FFN 激活近似线性增加
KV Cache基本不直接变化

KV Cache 由 Attention 的 K/V 维与序列决定,因此减少 FFN 不直接解决推理 KV 内存。

五、容量与参数预算的权衡

固定总参数下,更大 FFN 意味着层数、H 或其他模块要减少。宽 FFN 擅长丰富通道特征,更多层提供更长计算深度;哪一个更好取决于 scaling law 与数据。

若任务需要复杂逐 token 变换,增加 F 可能有效;若长程组合推理受深度限制,增加层数可能更好。不能只在固定 H、L 下增 F 再把收益全归于比例,因为总算力也增加了。

公平实验至少做等参数或等训练 FLOPs对照。

六、硬件对齐会改变最佳值

GPU GEMM 在某些维度倍数上效率更高。理论最优 F=10922.7,取 11008 或 10752 可能比精确取整更快。张量并行还要求 F 能被并行度整除。

小矩阵、低 batch 和量化 kernel 的最佳形状不同。比较配置时记录真实 tokens/s、MFU 和显存,而非只算参数。

量化 group size 与专家并行也可能对 F 提出额外整除约束。

七、稠密 FFN 与 MoE 的关系

MoE 把 FFN 替换为多个专家,每个 token 只激活少数专家。总参数可大幅增加,而单 token 激活计算受 top-k 控制。

专家内部仍有扩展维,扩展比与专家数、top-k 和路由容量共同决定成本。不能把稠密 4×经验原样复制后只看总参数。

MoE 还增加通信与负载不均,最佳理论 FLOPs 不一定对应最佳集群吞吐。

八、如何做消融选择

选择若干 r,在相同 tokenizer、数据、训练 token 和优化设置下比较。若固定参数,需要同步调整层数或 H;若固定计算,确保训练 FLOPs接近。

测验证 loss、事实/代码/推理等下游、训练 tokens/s、推理吞吐、峰值显存和部署 kernel。模型较小时的最佳比例未必外推到更大规模。

训练早期曲线接近不代表最终相同,应达到足够 token 或用可靠 scaling 拟合。

九、常见误区与追问

  • 误区:FFN 永远应该是 4H。 4 倍是传统经验,激活函数和预算不同会变化。
  • 误区:SwiGLU 用 4H 才能公平比较。 三矩阵结构会增加约 50% 参数。
  • 误区:扩大 F 只增加参数,不影响激活。 [B,S,F] 中间张量也会变大。
  • 误区:FFN 变小能显著减少 KV Cache。 KV Cache 主要由 Attention 决定。
  • 误区:理论 FLOPs相同就同样快。 矩阵形状、对齐和通信决定真实吞吐。
  • 追问:为什么常见 8/3? 它让三矩阵门控 FFN 与两矩阵 4H FFN 参数近似相等。
  • 追问:F 为什么取奇怪数值? 从比例计算后向硬件/并行友好倍数取整。
  • 追问:怎样公平选比例? 做等参数或等 FLOPs消融,并报告质量与真实速度。

十、加强记忆

FFN 扩展比记住“两矩阵看 2HF,门控三矩阵看 3HF”:传统 GELU 常取 4H;SwiGLU 为等参数得到约 8H/3,再按 Tensor Core、量化和并行整除取整。F 增大同时增加容量、FLOPs和激活,却不直接改变 KV Cache。最终必须在等参数/等算力条件下比较模型质量和实际 tokens/s,而不是把 4 倍当固定法则。