我最早读 LLaMA 论文的时候,心里有两个小问号:为什么它不用 PyTorch 里现成的 nn.LayerNorm,非要换一个在当时主流大模型里还不常见的 RMSNorm?激活函数也放着好好的 GeLU 不用,偏偏用 SwiGLU?说实话,我一度以为这是论文在追求形式上的标新立异。直到后来我把两篇原始论文翻出来,又对着 LLaMA 的官方代码算了一笔账,才发现这两个改动背后,全是把几十亿参数模型塞进有限算力的真金白银考虑。

RMSNorm:少算一个均值,稳住了梯度
先说 LayerNorm 到底干了什么。对每个 token,它要计算这一组特征的平均值和方差,然后对每个特征做 (x-μ)/σ,最后再乘上可学习的缩放 γ 加上平移 β。这个“减均值”的操作,听上去是标准操作,但仔细想想,它是有一个代价的——为了算出 μ 和 σ,你得先对每个特征做一次求和,再做一次平方差求和,这意味着两次全归约。
RMSNorm 的思路很直接:既然我们有残差连接,均值的偏移实际上会被后续层“消化”掉,那干脆不要这个均值项,只把每个特征除以整个向量的均方根(RMS)。用公式表示就是 x_i = x_i / RMS(x) * γ_i。这个改动直接把“减均值”这一步去掉,还顺带丢掉了 β 这个平移参数。计算量从两次归约变成一次,梯度里也少了一项由均值减法引入的复杂的求和项。
我一开始觉得,少算一个均值,信息不就没了吗?直觉上应该效果更差才对。但 RMSNorm 论文里的实验显示,在深层 Transformer 上,RMSNorm 的收敛速度和最终效果甚至略优于 LayerNorm。后来我想通了:在反向传播时,LayerNorm 的均值项会让梯度在每一层都叠加一次所有位置的求和,这种额外项在深层网络里可能会放大噪声。RMSNorm 去掉了这个项,梯度路径变得更“干净”。也许这正是它训练更稳的原因。
LLaMA 官方代码里的 RMSNorm 也确实只有一个可学习的缩放权重 γ,没有 β。对大模型训练来说,每次归一化多一点开销,在几千亿 token 的训练里都会被放大成巨大的成本。
| 对比维度 | LayerNorm | RMSNorm |
|---|---|---|
| 均值中心化 | 需要,减均值 | 不需要 |
| 计算量 | 均值+方差两次归约 | 平方均值一次归约 |
| 可学习参数 | γ(缩放)+β(平移) | 通常只有 γ |
| 收敛表现 | 基线 | 在深层模型上略优 |
SwiGLU:不是换一种激活函数,而是加了门控
GeLU 本质上是逐点的非线性变换:每一个神经元输入 x,输出 x 乘以标准正态累积分布函数 Φ(x)。它比 ReLU 平滑,但本质上还是“每个神经元自己激活自己”。
SwiGLU 完全不是这个套路。它把输入 x 同时送入两个线性变换:一个变成“门”向量,一个变成“内容”向量。门向量通过 Swish(x·sigmoid(x))函数激活,然后和内容向量逐元素相乘,最后再过一次线性变换输出。公式长这样:
SwiGLU(x) = (Swish(xW_gate) ⊙ xW_up) W_down
用大白话说:模型先学一个“开关”,再决定让内容向量的哪些维度通过、哪些抑制。这就是门控思想,跟 LSTM 里的门类似。GeLU 是一个固定的非线性曲线,而 SwiGLU 是一个可以学习、可以动态调节的信息过滤器。
那么这个门控到底值不值?GLU Variants Improve Transformer论文里做了系统的对比,在 Transformer 同等训练步数下,SwiGLU 的验证困惑度明显低于 ReLU 和 GeLU。也就是说,用 SwiGLU 可以更快地拟合训练数据,或者在相同效果下减少训练步数。
一个被忽略的代价:多出来的矩阵,得从维度里省回来
注意,SwiGLU 有 3 个权重矩阵:W_gate、W_up、W_down,而标准 FFN 只有 W1 和 W2 两个。如果直接把中间维度设成和标准 FFN 一样的 4×hidden,参数量会多出差不多一半。LLaMA 是怎么处理的?它把中间维度从 4h 压缩到了约 2.7h。
我们来算一笔账。标准 FFN 参数:两个矩阵,中间维度 4h,总参数量是 2×(4h×h)=8h²。SwiGLU 有三个矩阵,中间维度设为 d,总参数量是 d×h(gate)+ d×h(up)+ h×d(down)=3dh。令 3dh≈8h²,得到 d≈2.67h。LLaMA 在 hidden=4096 时,中间维度是 11008,11008/4096≈2.69,正好落在这个数附近。
所以 LLaMA 并没有因为用 SwiGLU 就白白多烧算力,而是用“缩小维度”换回了“门控带来的增益”。这种参数守恒的权衡,才是真正值得学习的工程思路。
| FFN 类型 | 线性层数 | 中间维度 | 参数规模 |
|---|---|---|---|
| 标准 FFN(GeLU) | 2 | 4h | ≈8h² |
| SwiGLU FFN | 3 | ≈2.7h | ≈8.1h² |
回到训练:架构选择的本质是对算力的精打细算
把两个选择放回 LLaMA 的训练语境里看:RMSNorm 省掉了归一化里的一个归约步骤,让每一层的前向反向都快一点;SwiGLU 用相同的参数量获得更好的模型质量,等价于在同样的训练预算下获得更低损失。这两者都服务于同一个目标——“用更少的 GPU 小时训练出更好的模型”。
我最初以为这些创新是为了炫技,后来才意识到,在大模型训练里,一个看起来微小的改动,乘以数千亿 token 后会放大成巨额的算力差异。RMSNorm 少算一次归约,SwiGLU 在同样参数下带来更低的困惑度,这两项优势在训练 7B 甚至 65B 模型时都是决定性因素。
最后一点心得:不要拿着 LLaMA 的组合去套所有场景。如果你在训练一个小模型,SwiGLU 带来的增益可能并不明显,反而多出来的矩阵会让训练变慢;RMSNorm 的省计算优势也会被小模型的高效归约掩盖。LLaMA 的选择源自它的目标——在大规模预训练中获得最优的困惑度。理解了这一点,你就能看懂几乎所有现代大模型架构设计的出发点。
如果你还想继续深入,推荐直接读这几篇原始论文:RMSNorm、GLU Variants Improve Transformer、以及LLaMA 论文。它们比我这篇文章严谨得多,也值得你亲自验证。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/457.html