为什么大模型几乎都用偶数层的 Transformer block?有什么训练上的考量?

我最早以为“偶数层”背后藏着什么深刻的数学原理,还认真翻过几篇讲残差网络稳定性的论文。直到我把 GPT-3 论文里的模型配置表从头到尾看了一遍,注意到它的层数序列是 12、24、24、24、32、32、40、96,才慢慢意识到:问题可能没有我想的那么复杂,但也不是一句“巧合”就能带过。

AI technology illustration

直接给结论:“Transformer block 必须用偶数层”不是硬性规定,而是一个由工程习惯、并行训练和初始化细节共同塑造出来的强烈偏好。如果你真的想设计一个 13 层的模型,数学上完全行得通,但你会发现,在抄各种配置、切分布式训练时,总会多出一点麻烦。

真正的规律不是“偶数”,而是“很容易切得开”

先问一个更普适的问题:为什么几乎没有大模型用 25 层、27 层、33 层?你看 25 也是奇数,27 也是奇数,但 GPT-3 的 40 层是偶数,LLaMA 的 80 层也是偶数。其实大家真正在意的不是“能不能被 2 整除”,而是“能不能被好多种数字整除”。

原因在于大模型训练几乎必然要做分布式并行。最常见的并行方式之一是流水线并行:把 Transformer 的层切成若干段,每个 GPU 负责一段。为了保证各段计算时间接近,层的总数必须能被 GPU 数量整除。一个 24 层的模型,你可以切成 2 段、3 段、4 段、6 段、8 段、12 段;一个 25 层的模型,只能切成 5 段或 25 段。在同样有 8 张卡的情况下,24 层可以平均切给 8 张卡,每张卡 3 层;25 层就切不开。这种“好切”的程度,专业一点叫高度合数。

模型 层数 可以被多少种 stage 数整除 几个常用切法(stage 数)
BERT-Large 24 8 种 2、3、4、6、8、12
GPT-3 13B 40 8 种 2、4、5、8、10、20
LLaMA 65B 80 10 种 2、4、8、10、16、20、40
GPT-3 175B 96 12 种 2、4、6、8、12、16、24、32、48
虚构的 25 层模型 25 3 种 5

看到没,24、40、80、96 这些数不光能被 2 整除,还能被 3、5、10、16 整除。选这些数字,主要是为了在不确定未来用几张卡训练时,给自己留足切分的余地。这就是“训练上的考量”。它不是一道奇偶数学题,而是一道工程调度题。

6 + 6 = 12:路径依赖的起点

回到一切的原点,Transformer 原论文里编码器和解码器都是 6 层,加起来 12。BERT 直接把编码器层数翻倍成 12 层作为 base;GPT 也用了 12 层。最早这批模型没有经过大规模超参搜索,而是拍脑袋选了跟主流 GPU 内存相匹配的数字。后来 12 层的模型效果不错,后人就在 12 层的基础上成倍放大。

放大时人们几乎不约而同选择了乘 2 而不是乘 1.5,因为这样可以复用初始化、学习率、正则等默认参数。于是 12→24→48→96 的链条就形成了。这条链条上全是偶数,但每一步升级的倍数 2 才是真正的发动机。

每个 block 内部其实住着两个“子层”

你可能听过一种解释:Transformer block 都是 attention 加 FFN 两个子层组成的,所以“层数”天然是偶数。这个说法只对了一半。

确实,一个典型的 Transformer block 包含两个子层——多头注意力和前馈网络,并且在每个子层外面都套了一个残差连接。如果你去数“残差子层”的数量,那 12 个 block 就有 24 个残差子层,这永远是偶数。但问题是,大家口里的“层数”指的是 block 的个数,而不是子层数。所以用“内部有两个子层”来解释 block 数是偶数,本质上是在偷换概念。

不过这个结构确实留下一个痕迹——初始化公式里的那个“2”。

GPT-2 初始化里的“2”,其实是个障眼法

OpenAI 在训练 GPT-2 时用了一个很常用的小技巧:残差层权重的标准差在 0.02 的基础上再除以 sqrt(2N),其中 N 是 Transformer block 数。你打开 GPT-2 源码,会看到类似这样的初始化:

# 每个 block 有两个输出投影:attn.c_proj 和 mlp.c_proj
for module in model.modules():
if isinstance(module, Linear):
module.weight.data.normal_(0.0, 0.02)
if hasattr(module, 'c_proj'):
module.weight.data.mul_(1 / math.sqrt(2 * config.n_layer))

这里的 2 * n_layer 是因为每个 block 有两个残差子层,所以总共 2N 个需要缩放的输出投影。这个因子里的 2 来自“双层结构”,而不是来自“n_layer 必须是偶数”。可惜很多人在讨论这个问题时,误把公式里的 2 当成了“偶数层”的证据。

事实是,你把 N 换成 13,初始化公式照样成立,反向传播公式里也没有任何一项依赖层数的奇偶。据我所知,目前没有公开的对照实验表明奇数层在数学上会导致发散。不少研究者私下会试非标准的层数,大家只是不太会在论文里专门报告“我用了奇数层”而已。

如果奇数层真的这么“无罪”,为什么没人愿意当第一个吃螃蟹的人?

  1. 抄作业省心。现在大模型的默认超参数全都建立在 12、24、32、96 这些基线上。你用 13 层,就意味着学习率、warmup、深度初始化系数、流水线划分都要重新调。
  2. 硬件和框架的惯性。一些推理引擎、融合算子会按“两个子层”或者“四个子层”来打包优化,所以层数如果是个奇怪的质数,优化器可能多走一次循环。虽然不是大问题,但总归不够优雅。
  3. 读者预期。一个 13 层的模型配置会让读者下意识觉得奇怪。奇怪的数字如果没有带来显著的收益,很难说服审稿人,也很难说服未来的自己。

所以,答案是“没有硬性理由”吗?

对,没有硬性理由。但你可以把它理解为一种“最优默认值”。大模型的训练成本太高,任何偏离常规的选择都会增加额外风险。层数选 24 而不是 25,不是因为 25 会爆炸,而是因为 24 能让你在改并行方案时少一道算术题。

如果你将来要训练一个 30 亿参数的模型,我给你的建议是:优先选 24 或 32 层。如果你有非常强的理由要做 17 层,放心做,至少奇偶本身不会惩罚你。你真正需要担心的是那个“强理由”到底成不成立。

这本质上是一个关于工程决策的统计问题,而不是数学问题。我们观察到的“几乎都是偶数”其实是大规模资源约束、历史先例和谨慎心理共同合成的结果。理解这一层后,你会发现很多“模型设计法则”都带着类似的属性:它们不是物理学定律,而是“大多数人不愿意承担额外测试成本”的集合体现。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/631.html

(0)
上一篇 1天前
下一篇 1天前

相关推荐