前馈网络(FFN)尺寸应该扩大多少?
核心结论
FFN 通常是两层线性变换夹一个激活函数:
FFN(x)=W2⋅Activation(W1x+b1)+b2 FFN(x) = W_2 \cdot Activation(W_1x + b_1) + b_2 FFN(x)=W2⋅Activation(W1x+b1)+b2
其中:
- dmodeld_{model}dmodel:输入/输出维度;
- dffd_{ff}dff:中间隐藏层维度。
扩展系数 r=dff/dmodelr = d_{ff}/d_{model}r=dff/dmodel 的经验法则:
| 激活函数类型 | 推荐扩展系数 r | 说明 |
|---|---|---|
| ReLU 类 MLP | 4 | 原始 Transformer 及多数早期模型 |
| GLU 变体 (GeGLU/SwiGLU) | 8/3 ≈ 2.66 | 因为 GLU 有两个投影矩阵,参数量约为 ReLU 的1.5 倍,为保持总参数量相当,扩展系数调低 |
ReLU 类:默认 4 倍
几乎所有使用 ReLU 类 MLP 的模型都设:
dff=4×dmodel d_{ff} = 4 \times d_{model} dff=4×dmodel
数值例子:
设 dmodel=512d_{model} = 512dmodel=512,则:
dff=4×512=2048 d_{ff} = 4 \times 512 = 2048 dff=4×512=2048
FFN 参数量:
W1:512×2048=1,048,576 W_1: 512 \times 2048 = 1,048,576 W1:512×2048=1,048,576
W2:2048×512=1,048,576 W_2: 2048 \times 512 = 1,048,576 W2:2048×512=1,048,576
总参数量:
1,048,576+1,048,576=2,097,152≈2.1M 1,048,576 + 1,048,576 = 2,097,152 \approx 2.1\text{M} 1,048,576+1,048,576=2,097,152≈2.1M
即:
FFN 参数量≈2×dmodel×dff=2×512×2048=2.1M \text{FFN 参数量} \approx 2 \times d_{model} \times d_{ff} = 2 \times 512 \times 2048 = 2.1\text{M} FFN 参数量≈2×dmodel×dff=2×512×2048=2.1M
GLU 类:扩展系数调整为 2/3
GLU 变体(GeGLU、SwiGLU)有三组线性变换,而不是两组。为了保持与 4 倍 ReLU 相同的参数量,需要把 dffd_{ff}dff 缩小到原来的 2/3:
dff=23×4×dmodel=83dmodel≈2.67dmodel d_{ff} = \frac{2}{3} \times 4 \times d_{model} = \frac{8}{3} d_{model} \approx 2.67 d_{model} dff=32×4×dmodel=38dmodel≈2.67dmodel
为什么是 2/3?
ReLU FFN 参数量:
2×dmodel×dffReLU=2×d×4d=8d2 2 \times d_{model} \times d_{ff}^{ReLU} = 2 \times d \times 4d = 8d^2 2×dmodel×dffReLU=2×d×4d=8d2
GLU FFN 参数量(三组矩阵):
3×dmodel×dffGLU=3×d×dffGLU 3 \times d_{model} \times d_{ff}^{GLU} = 3 \times d \times d_{ff}^{GLU} 3×dmodel×dffGLU=3×d×dffGLU
令两者相等:
3d⋅dffGLU=8d2⇒dffGLU=83d≈2.67d 3d \cdot d_{ff}^{GLU} = 8d^2 \Rightarrow d_{ff}^{GLU} = \frac{8}{3}d \approx 2.67d 3d⋅dffGLU=8d2⇒dffGLU=38d≈2.67d
数值例子:
设 dmodel=512d_{model} = 512dmodel=512:
- ReLU 版:dff=2048d_{ff} = 2048dff=2048,参数量 2×512×2048=2.1M2 \times 512 \times 2048 = 2.1\text{M}2×512×2048=2.1M
- GLU 版:dff=83×512≈1365d_{ff} = \frac{8}{3} \times 512 \approx 1365dff=38×512≈1365,参数量 3×512×1365≈2.1M3 \times 512 \times 1365 \approx 2.1\text{M}3×512×1365≈2.1M
两者参数量基本一致,计算量也接近。
例外:T5 的 64 倍
T5-11B 采用 dmodel=1024d_{model} = 1024dmodel=1024,dff=65536d_{ff} = 65536dff=65536:
dffdmodel=655361024=64 \frac{d_{ff}}{d_{model}} = \frac{65536}{1024} = 64 dmodeldff=102465536=64
这是非常激进的配置。
T5 的理由是极大化矩阵乘法宽度,获得系统性能提升。
但 T5 v1.1 后来回调到约 2.5 倍 GeGLU,说明 64 倍并非最优。
Kaplan 的缩放定律研究
Kaplan 等人绘制了损失随 dff/dmodeld_{ff}/d_{model}dff/dmodel 比例变化的曲线,发现比例在 1 到 10 之间都有较宽的最优区间。
所以 4 倍、2.67 倍都是经验安全值,但不是铁律。
模型应该更深还是更宽?宽深比怎么定?
标准做法:1:1 比例
大多数模型遵循:
dmodel=num_heads×dheadd_{model} = \text{num\heads} \times d{head}dmodel=num_heads×dhead
且通常 dmodel≈num_headsd_{model} \approx \text{num\_heads}dmodel≈num_heads 的量级(比例约为 1,但这里指的是头维度固定,头数随模型维度增长)。
更准确地说,标准做法是保持每个头的维度固定(如 64 或 128),然后增加头数。
数值例子
设 dmodel=512d_{model} = 512dmodel=512,每个头维度 dhead=64d_{head} = 64dhead=64:
num_heads=51264=8 \text{num\_heads} = \frac{512}{64} = 8 num_heads=64512=8
注意力参数量(Q、K、V、O 四个投影矩阵):
WQ:512×512=262,144 W_Q: 512 \times 512 = 262,144WQ:512×512=262,144
WK:512×512=262,144 W_K: 512 \times 512 = 262,144 WK:512×512=262,144
WV:512×512=262,144 W_V: 512 \times 512 = 262,144 WV:512×512=262,144
WO:512×512=262,144 W_O: 512 \times 512 = 262,144 WO:512×512=262,144
总参数量:
4×512×512=1,048,576≈1.05M 4 \times 512 \times 512 = 1,048,576 \approx 1.05\text{M} 4×512×512=1,048,576≈1.05M
如果头数设为 10:
dhead=512/10=51.2 d_{head} = 512/10 = 51.2 dhead=512/10=51.2
不整除,无法均分,所以不可行。num_heads 必须能整除 $d_{model}$,否则每个头的维度不一致,无法并行计算。
如果头数设为 16:
dhead=512/16=32 d_{head} = 512/16 = 32 dhead=512/16=32
可以整除,但每个头维度只有 32,Bhojanapalli 等人指出头维度太小会导致注意力秩降低,影响表达能力。
所以通常头维度保持在 64 或 128。
T5 的 16 比例
T5 尝试了 dmodel/num_heads=16d_{model}/\text{num\_heads} = 16dmodel/num_heads=16 的配置,即每个头维度很小、头数很多。但其他模型(GPT-3、LLaMA、PaLM)都保持 1:1 左右的比例。
模型的宽深比
经验法则:每层约 128 个隐藏维度
业界普遍遵循:
宽深比=dmodelnum_layers≈100∼128 \text{宽深比} = \frac{d_{model}}{\text{num\_layers}} \approx 100 \sim 128 宽深比=num_layersdmodel≈100∼128
等价地:
num_layers≈dmodel128 \text{num\layers} \approx \frac{d{model}}{128} num_layers≈128dmodel
数值例子
GPT-3 175B:
text
d_model = 12288
num_layers = 96
宽深比:
12288/96=128 12288/96=128 12288/96=128
正好符合经验法则。
LLaMA-2 7B:
text
d_model = 4096
num_layers = 32
宽深比:
4096/32=128 4096/32=128 4096/32=128
同样符合。
假设一个反例:
text
d_model = 8192
num_layers = 16
宽深比:
8192/16=512 8192/16=512 8192/16=512
过宽,参数量大但深度不足,表达能力可能受限。
另一个反例:
text
d_model = 1024
num_layers = 64
宽深比:
1024/64=16 1024/64=16 1024/64=16
过深,梯度传播困难,训练不稳定。
Kaplan 的宽深比研究
Kaplan 等人绘制了不同模型规模下,损失随宽深比变化的曲线,发现:
- 5000 万参数、2.74 亿参数、15 亿参数三个规模下,最优宽深比都在
100左右; - 宽深比过小(
太深)或过大(太宽)都会导致损失上升。
系统并行策略的隐形约束
| 并行方式 | 适合的模型形状 | 原因 |
|---|---|---|
| 流水线并行 | 深模型 | 按层切分到不同设备,通信需求较低 |
| 张量并行 | 宽模型 | 将大矩阵切片到多 GPU,通信模式规整 |
- 深模型需要流水线并行,存在"气泡"和调度复杂问题;
- 宽模型更容易用张量并行,实现简单;
- 所以业界倾向适度控制深度、保持一定宽度,宽深比稳定在 100 左右。
词表规模多大合适?
趋势
| 时期 | 词表大小 | 典型模型 |
|---|---|---|
| 早期单语模型 | 3 万 ~ 5 万 | GPT-2、LLaMA-1 |
| 现代多语言/生产模型 | 10 万 ~ 25 万 | GPT-4、Cohere Command |
参数量参考
LLaMA-2:
text
词表大小 = 32000
GPT-4(使用 cl100k_base 分词器):
text
词表大小 ≈ 100000
Cohere Command 模型:
text
词表大小 ≈ 250000
词表对参数量的影响
Embedding 层参数量:
Embedding 参数=V×dmodel \text{Embedding 参数} = V \times d_{\text{model}} Embedding 参数=V×dmodel
数值例子:
设 dmodel=4096d_{\text{model}} = 4096dmodel=4096。
V=50,000V = 50{,}000V=50,000:
50,000×4096=204,800,000≈2.05亿 50{,}000 \times 4096 = 204{,}800{,}000 \approx 2.05\text{亿} 50,000×4096=204,800,000≈2.05亿
V=250,000V = 250{,}000V=250,000:
250,000×4096=1,024,000,000≈10.24亿 250{,}000 \times 4096 = 1{,}024{,}000{,}000 \approx 10.24\text{亿} 250,000×4096=1,024,000,000≈10.24亿
词表从 5 万扩到 25 万,Embedding 参数量增加 5 倍,达到 10 亿级别。
对于 7B 模型,这占了约 15% 的参数,不可忽视。
多语言词表的优势
- 对高资源语言(英语、中文):小词表也能胜任,大词表影响较小;
- 对低资源语言:大词表能让非英语语言用更少 token 表示,大幅降低推理成本。
例如,某个低资源语言的词在 5 万词表中可能被拆成 5 个 subword token,而在 25 万词表中可能只需 2 个 token,推理成本降低 60%。
Dropout 和权重衰减
核心结论
| 正则化方法 | 现状 | 真实作用 |
|---|---|---|
| Dropout | 逐渐失宠,新模型(除 Qwen 外)基本不用 | 预训练单轮遍历,过拟合风险低 |
| 权重衰减 | 仍被广泛使用 | 主要不是防过拟合,而是与学习率调度交互,降低训练损失 |
为什么权重衰减有用?
反直觉事实:预训练数据量极大,单轮训练几乎不可能过拟合。
实验表明,不同强度的权重衰减不会改变训练损失与验证损失的比例。
权重衰减真正的作用是:在训练末期学习率趋近于零时,与优化动态产生复杂交互,产生"隐性加速",帮助模型收敛到更优的局部极小值。
数值上,设权重衰减系数为 λ\lambdaλ,学习率为 η\etaη,参数更新:
θt+1=θt−η∇L(θt)−ηλθt \theta_{t+1} = \theta_t - \eta \nabla L(\theta_t) - \eta \lambda \theta_t θt+1=θt−η∇L(θt)−ηλθt
当 η\etaη 很小时,第二项衰减很慢;但当学习率余弦衰减到接近 0 时,权重衰减的相对影响发生变化,与优化器动量等产生交互,最终降低训练损失。
结论: 权重衰减不是传统正则化,而是优化干预手段;Dropout 在预训练中已基本被弃用。
综合数值例子:设计一个 1B 参数模型
假设我们要设计一个约 10 亿参数的模型,遵循经验法则。
设定宽深比
取宽深比 128,设 dmodel=2048d_{model} = 2048dmodel=2048,则:
num_layers=2048/128=16 \text{num\_layers} = 2048 / 128 = 16 num_layers=2048/128=16
设定注意力头
取 dhead=128d_{head} = 128dhead=128,则:
num_heads=2048/128=16 \text{num\_heads} = 2048 / 128 = 16 num_heads=2048/128=16
num_heads 整除 d_model,满足要求。
设定 FFN
使用 SwiGLU,扩展系数 8/3:
dff=83×2048≈5461d_{ff} = \frac{8}{3} \times 2048 \approx 5461dff=38×2048≈5461
取 5461。
估算参数量
每层注意力参数:
4×dmodel2=4×20482=16,777,216 4 \times d_{model}^2 = 4 \times 2048^2 = 16,777,216 4×dmodel2=4×20482=16,777,216
(Q、K、V、O 四个投影矩阵)
每层 FFN 参数(SwiGLU 三个矩阵):
3×dmodel×dff=3×2048×5461≈33,553,152 3 \times d_{model} \times d_{ff} = 3 \times 2048 \times 5461 \approx 33,553,152 3×dmodel×dff=3×2048×5461≈33,553,152
每层总参数:
16,777,216+33,553,152≈50,330,368 16,777,216 + 33,553,152 \approx 50,330,368 16,777,216+33,553,152≈50,330,368
16 层总参数:
16×50,330,368≈805,285,888≈8.05 亿 16 \times 50,330,368 \approx 805,285,888 \approx 8.05 \text{ 亿} 16×50,330,368≈805,285,888≈8.05 亿
嵌入层(词表 32k):
32000×2048=65,536,000≈0.66 亿 32000 \times 2048 = 65,536,000 \approx 0.66 \text{ 亿} 32000×2048=65,536,000≈0.66 亿
总参数量:
8.05+0.66≈8.71 亿 8.05 + 0.66 \approx 8.71 \text{ 亿} 8.05+0.66≈8.71 亿
接近 10 亿,符合目标。
总结
| 超参数 | 经验法则 | 数值例子 (d_model=2048) |
|---|---|---|
| FFN 扩展系数 (ReLU) | 4 | dff=8192d_{ff} = 8192dff=8192 |
| FFN 扩展系数 (GLU) | 8/3 ≈ 2.66 | dff≈5461d_{ff} \approx 5461dff≈5461 |
| 注意力头维度 | 保持 64 或 128 | dhead=128d_{head} = 128dhead=128,num_heads=16 |
| num_heads 整除 d_model | 必须 | 2048 / 16 = 128,整除 |
| 宽深比 | 约 128 | 2048 / 16 = 128 |
| 词表大小 | 3-5 万(单语),10-25 万(多语言) | 32k 或 100k |
| Dropout | 预训练基本不用 | - |
| 权重衰减 | 仍用,但作用是优化加速而非正则化 | - |
一句话: FFN 默认扩 4 倍(GLU 用 2.66 倍),注意力头保持 64~128 维且整除 d_model,宽深比约 128,词表现代多语言模型 10~25 万,Dropout 渐弃、权重衰减仍用但其真实作用是优化干预而非防过拟合。
这些经验法则不是铁律,但遵循它们能在大多数情况下得到合理模型。