超参数考量与设计

前馈网络(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 渐弃、权重衰减仍用但其真实作用是优化干预而非防过拟合。

这些经验法则不是铁律,但遵循它们能在大多数情况下得到合理模型。

相关推荐
雪落漂泊1 小时前
C++算法 滑动窗口篇(上)
开发语言·c++·算法
AI小百科1 小时前
模型微调是什么?企业怎么用好它
人工智能
硅谷秋水1 小时前
VLMeg:把 VLM 从奖励回归器变成成功检测器
人工智能·机器学习·语言模型·数据挖掘·机器人
IT智慧客07311 小时前
什么人适合做 OPC,又该怎么开始?
人工智能
Data_AI4Science1 小时前
AI 时代,人更重要了
人工智能·ai·智能体·生物医药·电子实验记录本·ai取代人
张小姐的猫1 小时前
【MySQL】表的约束
android·linux·服务器·数据库·c++·mysql·adb
企业数字化笔记1 小时前
AI视频成片怎样做到可追溯?用镜头清单、文件哈希和字幕时间轴复盘交付
人工智能·音视频·哈希算法
吞下星星的少年·-·1 小时前
Div.2 CF edu195A题(数学,贪心)
数学·算法·贪心
霍格沃兹测试学院-小舟畅学1 小时前
Playwright CLI:语义快照与局部检索,AI 如何找到正确的页面元素?
人工智能·microsoft