跳转至

第 5 章 稳定训练

5.1 回顾:已经有的归一化

第 2.7 节的 Block 是 Post-LN:先算子层,与残差相加,再 LayerNorm——

\[ x_{l+1}=\operatorname{LN}\!\left(x_l+F_l(x_l)\right) \qquad\text{(Post-LN)} \]

LayerNorm 对每个位置减均值、除标准差,再仿射。小模型、浅栈上这样就能训。梯度回传时,通向浅层的路径都要穿过每层的归一化 Jacobian;层数一深,初始化阶段更容易出现梯度尺度失衡,通常要更谨慎的 warmup 和初始化。第一部分解决的是「有 Norm」;这一章解决的是「Norm 怎样摆、怎样简化,才撑得住现代深度」。

5.2 Post-LN 训不深,Pre-LN 改了什么

Pre-LN 把归一化挪到子层之前:

\[ x_{l+1}=x_l+F_l(\operatorname{Norm}(x_l)) \qquad\text{(Pre-LN)} \]

求导时出现一条显式恒等项:

\[ \frac{\partial x_{l+1}}{\partial x_l} =I+\frac{\partial F_l}{\partial\,\operatorname{Norm}(x_l)} \frac{\partial\,\operatorname{Norm}(x_l)}{\partial x_l} \]

即便残差分支暂时学得不好,梯度仍可沿 \(I\) 直达浅层。代价是深层输出的尺度会逐层累积,所以模型末尾要补一个 final norm(第 2 章 Post-LN 流水线里往往不单独强调这一步;换成 Pre-LN 之后它变成标配);一些新模型还增加输出侧 norm 或残差缩放。Pre-LN 是现代 LLM 的主流基线,但不是“所有模型唯一可用”的结构。

5.3 RMSNorm

第 2 章用的 LayerNorm 要算均值和方差、再做缩放和平移。RMSNorm 直接去掉减均值和 bias,只用均方根做缩放:

\[ \operatorname{LN}(x) =g\odot\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+b, \qquad \operatorname{RMSNorm}(x) =g\odot\frac{x}{\sqrt{\frac1d\sum_i x_i^2+\epsilon}} \]

单看归一化 kernel,它需要的归约更少;端到端能快多少取决于融合实现和归一化占总耗时的比例,不能把某个实验里的百分比当成普适常数。主要价值是更简单且效果通常不降,因此成为标配。读到这里应能分清:LayerNorm 是跑起来时的归一化;RMSNorm 是它在现代配方里的简化替换。

5.4 激活:从 ReLU 到门控 FFN

第 2 章那种 FFN 在做什么

第 2 章的 FFN 是两层投影夹一个逐元素非线性:

\[ \operatorname{FFN}(x)=W_2\,\sigma(W_1x) \]

读成三步:\(x\in\mathbb R^{d}\) 乘 \(W_1\) 升到中间维(常见 \(4d\))→ 每个中间维各自过同一个 \(\sigma\)(ReLU 或后来的 GELU)→ 乘 \(W_2\) 降回 \(d\)。
这里的 \(\sigma\) 对每个通道一视同仁:ReLU 就是「负数抹成 0」;GELU 更平滑一点。有没有信号,只取决于该通道自己过完 \(W_1\) 之后是正是负——没有第二条支路来决定「这一维要不要留给后面」。

2017 年原版用 ReLU;之后普遍换成 GELU。矩阵仍是两块:d → 4d → d。

门控多出来的那一路

门控 FFN(GLU 一族)在升维侧变成两路线性投影,再逐元素相乘:

\[ u=W_{\text{up}}x,\qquad g=W_{\text{gate}}x, \qquad h=\sigma(g)\odot u, \qquad \operatorname{FFN}(x)=W_{\text{down}}h. \]

\(u\) 与 \(g\) 同形状,都是中间维(记作 \(d_{\mathrm{ff}}\))上的向量。\(\odot\) 是按维相乘:第 \(i\) 个中间通道

\[ h_i=\sigma(g_i)\cdot u_i. \]
  • \(u_i\):这一维准备往下传的内容(线性读出来的特征)。
  • \(\sigma(g_i)\):这一维的门——一个随当前 \(x\) 变化的标量,去乘 \(u_i\)。
  • \(g_i\) 小(门接近 0)→ \(h_i\) 被压掉,后面的 \(W_{\text{down}}\) 几乎拿不到这维。
  • \(g_i\) 大(门明显大于 0)→ \(u_i\) 按比例通过。

「门」指的就是 \(\sigma(g)\) 这一路;它不另写一套注意力,只是中间维上的逐元素乘法。同一位置的不同通道可以有的开、有的关;换一个 token(换一个 \(x\)),\(g=W_{\text{gate}}x\) 变了,开关格局也变。旧式 FFN 里没有 \(g\) 这一路,每个通道只对自己的 \(\sigma(W_1x)_i\) 负责。

用三个中间维看一眼

假设 \(d_{\mathrm{ff}}=3\),某次前向算得(数字示意):

中间维 \(i\) \(u_i\)(内容) \(g_i\)(门的 logit) \(\sigma(g_i)\) 取 SiLU \(h_i=\sigma(g_i)\,u_i\)
0 \(2.0\) \(3.0\) \(\approx 2.86\) \(\approx 5.7\)(放大通过)
1 \(2.0\) \(-2.0\) \(\approx -0.24\) \(\approx -0.5\)(几乎掐掉,还带点负泄漏)
2 \(-1.0\) \(1.0\) \(\approx 0.73\) \(\approx -0.73\)(门开着,负数内容照样乘过去)

两行 \(u\) 同为 \(2.0\),只因门不同,\(h\) 一个很大、一个接近 0。门控改的是「哪一维内容乘多大系数再送给 \(W_{\text{down}}\)」;\(W_{\text{down}}\) 再把 \(h\in\mathbb R^{d_{\mathrm{ff}}}\) 压回 \(\mathbb R^{d}\)。

SwiGLU:门上用 SiLU

门上的 \(\sigma\) 可以选:

  • sigmoid → 经典 GLU(门大致在 \((0,1)\))
  • GELU → GEGLU
  • SiLU / Swish:\(\operatorname{SiLU}(z)=z\cdot\operatorname{sigmoid}(z)\) → SwiGLU

PaLM、LLaMA 之后的稠密配方几乎统一到 SwiGLU:

\[ \operatorname{SwiGLU}(x) =W_{\text{down}} \bigl( \operatorname{SiLU}(W_{\text{gate}}x) \odot (W_{\text{up}}x) \bigr). \]

SiLU 不必落在 \([0,1]\):正半轴可大于 1(放大),负半轴有一小段负值(上表维 1)。它仍是「按维乘在 \(u\) 上」的门,只是形状比硬截断的 ReLU、比挤在 \((0,1)\) 的 sigmoid 更平滑,大规模训练里更常用。

投影从两块变成三块:gate、up、down(代码里常叫 w1/w2/w3 或 gate_proj/up_proj/down_proj)。若要与旧式 d→4d→d 的参数量大致对齐,中间维常从 \(4d\) 收到约 \(8d/3\)(算法见 Q5)。\(8d/3\) 来自参数量对齐,与 SiLU 的公式无关。

两代改动分开记:只把 ReLU 换成 GELU 时,仍是两矩阵;换成 SwiGLU 时,才多出 gate 投影与逐元素相乘。

5.5 QK-Norm 与 attention logits 爆炸

第 2 章用 \(1/\sqrt{d_h}\) 处理初始化时点积过大。模型规模一大,某些头的注意力 logits 会在训练过程中持续增长,softmax 饱和成接近 one-hot,梯度消失,训练曲线出现无法恢复的尖刺——\(1/\sqrt{d_h}\) 在这个尺度上不够用了。

解决办法:在算点积之前,对 Q 和 K 各做一次 RMSNorm,限制它们的模长。Qwen3 系列全面采用,是近两年大规模训练稳定性的关键补丁之一。本章公式只写这一步:

\[ \operatorname{score}_{ij} =\frac{ \operatorname{Norm}(q_i)^\top \operatorname{Norm}(k_j) }{\sqrt{d_h}}. \]

若 Norm 不带可学习增益,点积主要由夹角决定;实现里常保留可学习缩放,模型仍能调节各维重要性。QK-Norm 管的是训练过程中 Q/K 模长漂移;初始化时的 \(1/\sqrt{d_h}\) 仍要保留。

第 6 章的 RoPE 也作用在 Q/K 上,但管的是位置,与这里的模长控制是两件事。两者都装时,常见顺序是:线性投影 → reshape 成头 → QK-Norm → RoPE → 点积。读本章公式不必先懂 RoPE;装完第 6 章后再把 RoPE 插进「Norm 之后、点积之前」即可。

5.6 初始化与残差缩放

归一化只能控制进入子层的输入,不能替你决定每个子层一开始往残差流里写多大。若每层残差输出方差近似为 \(\sigma_F^2\),且各层近似独立,那么叠加 \(L\) 层后:

\[ \operatorname{Var}(x_L) \approx\operatorname{Var}(x_0)+L\sigma_F^2. \]

层数增长而初始化尺度不变,残差流的方差就会随深度增大。经典做法是把每个残差分支最后一个投影(attention 的 o_proj、FFN 的 down_proj)按残差分支总数缩放:

\[ W_{\text{out}} \sim\mathcal N\!\left(0,\frac{\sigma^2}{2L}\right), \]

等价地,可先按普通标准差初始化,再将这类权重乘 \(1/\sqrt{2L}\)。不同模型会采用截断正态、按 fan-in 缩放、DeepNorm 或额外的可学习 residual scale,公式不完全相同;共同目标是让前向激活与反向梯度在深度上保持同一量级。

线性层的 bias 在现代 decoder 里常直接去掉。前面已有 RMSNorm(或 LayerNorm)把每个位置的尺度拉回;后面残差又把子层输出加回主干。再给每个投影加一套可学习偏置,多出来的自由度大多被 Norm 的仿射或后续线性层吸收,参数和 kernel 却多一截。去掉之后,尺度主要由「初始化方差 + Norm 增益 + 残差缩放」共同决定。

RMSNorm 的增益 \(g\) 初始化为 1:前向一开始等于「只做均方根缩放、不额外放大或缩小某一维」。若存成「参数为 0、前向用 \(g=1+\delta\)」的零中心写法,初始行为相同,只是把「偏离 1 的增量」交给优化器去学,更新更稳一点。

SwiGLU 的 gate 与 up 不能初始化成全零:否则 \(h=\sigma(g)\odot u\) 全程为 0,这一支 FFN 开局没有任何输出,梯度也过不去。

具体标准差还要和参数化、优化器、宽度缩放一起定。

5.7 模型规模

同样的参数预算,可以摊成深而窄或浅而宽。层数 \(L\)、宽度 \(d\)、中间维 \(d_{\mathrm{ff}}\)、词表 \(V\) 和训练长度 \(n\) 一起,决定这台模型能装多少知识、每步算多贵、上下文能撑多长、以及它更像「端侧助手」还是「数据中心旗舰」。

形状设定

Block 本身在第 2 章已经定型;「定形状」就是决定这个 Block 循环多少次(\(L\)),以及每次循环里张量有多宽:

  • 深宽比 \(L\) 与 \(d\):更深通常有利于多层组合与推理深度,但 Decode 时层间串行,延迟随 \(L\) 涨;更宽利于张量并行与算力打满,单层表达更胖。开源稠密模型里,\(d\) 与 \(L\) 落在一条相对窄的经验带上——不是公式推出来的唯一解,而是精度、串行深度和硬件利用率折出来的。
  • 头维常固定 128:\(h=d/128\),KV 头数 \(n_{\mathrm{kv}}\) 另定(第 7 章 GQA)。硬件与 kernel 按这个粒度优化得最狠。
  • FFN 中间维:两层 FFN 常见 \(4d\);SwiGLU 为对齐参数量常取约 \(8d/3\)(§5.4 / Q5)。
  • 词表与是否共享嵌入:\(V\) 直接乘进嵌入与 lm_head 的参数。小模型常 tie_word_embeddings;大约 8B 以上一般拆开,让输入与输出各自学。

参数量粗算仍是

\[ P\approx L\left(P_{\text{attn}}+P_{\text{ffn}}\right)+P_{\text{embed}}+P_{\text{head}}. \]

还要满足张量并行可整除、以及 64/128/256 一类对齐。

前沿模型的规模

第二部分要装配的,正是今天仍大量部署的稠密骨架。以 Qwen3 稠密系列(技术报告公开配置)和 Llama 3.1 8B 为参照,数量级大致如下:

模型 量级 层数 \(L\) 注意力头(Q / KV) 原生上下文 训练数据量级
Qwen3-0.6B / 1.7B 端侧 28 16 / 8 32K 与系列同池,约数十 T token 量级
Qwen3-4B / 8B 单卡常用 36 32 / 8 128K 同上;Qwen3 全系列预训练约 36T token
Qwen3-14B 工作站 / 小集群 40 40 / 8 128K 同上
Qwen3-32B 稠密旗舰 64 64 / 8 128K 同上
Llama 3.1 8B 对照基线 32 32 / 8(\(d=4096\)) 128K 15.6T token

读这张表时,能力与形状的对应可以压成四条:

  1. \(L\) 是 Block 循环次数。 从约 28 层(亚 B 级)到 64 层(稠密 32B),深度大致随档位爬升。层数不够,多跳推理与组合能力容易见顶;层数堆高,没有 Pre-LN / 初始化(本章前几节)就训不稳,推理延迟也按层付费。
  2. 总参数 \(P\) 主要买「知识与技能容量」。 同配方下,0.6B → 8B → 32B 的质量台阶,首先来自 \(L\) 与 \(d\) 一起把 \(P\) 拉开。第 4 章的稠密估算给出代价:每生成一个 token,计算约 \(2P\)——形状放大,Decode 单价几乎同比放大。
  3. 上下文长度不是 \(L\)、\(d\) 的副产品。 上表里 32K / 128K 靠的是位置编码(第 6 章)、长序列训练阶段,以及推理期 YaRN 一类外推;形状只决定「全注意力时 KV 与算力是否扛得住」(第 4、7、11 章)。能写进 config 的最大长度 ≠ 任意任务上都好用的长度。
  4. 训练 token 数与 \(P\) 同样决定上限。 仅就训练算力最优而言,约 20 token/参数往往够用;面向部署的产品模型会远超这一比例——Llama 3.1 的 8B 约 1800 token/参数,Qwen3 全系列约 36T——用一次更贵的训练换取长期更便宜的推理(附录 B)。同一套 \(L,d\),数据差一个数量级,下游能力可以差一档。

因此:读者看到「7B/8B、三十多层、128K、十几 T token」,应能立刻对上「单卡可部署的通用稠密助手」这一档;看到「六十多层、三十 B 级稠密」,应想到质量更高、但每 token 的权重读取也更贵。

2025–2026 旗舰的规模

旗舰已经很少用「把稠密 \(P\) 再乘十」这一种扩法。总参数可以到万亿,但每 token 只激活其中一小截;上下文冲到 1M,靠的是混合 / 稀疏注意力,而不是 64 层全量 \(n\times n\)。数字会过期,透视关系相对稳——细拆见附录 D 与第 16 章:

模型(约 2025–2026) 总参 / 激活 上下文(厂商口径) 训练数据量级 相对稠密 8B,形状上多出来的轴
DeepSeek-V3 671B / 37B 128K ~15T token MoE:用总参扩容量,用激活控单价
Qwen3-235B-A22B 235B / 22B 128K ~36T token MoE + 更深(报告中 94 层)
Llama 4 Scout / Maverick 109B / 17B;约 400B / 17B Scout 宣称可达 10M;Maverick 约 1M >30T token MoE + 位置 / 注意力混合(iRoPE 等)
DeepSeek-V4-Pro 1.6T / 49B 1M >32T token 极端稀疏 MoE + 压缩/稀疏注意力
Kimi K3 2.8T / 104B 1M (见报告) 同上量级;残差流也开始改(附录 D)
Qwen3.8-Flash-Next 125B / 6B(另挂大嵌入表等) 262K 原生,可扩 1M (见模型卡) 混合注意力(约 3:1)+ MoE;激活接近「小稠密」

和稠密表对照:

  • 质量与「知识体积」跟总参数、数据更相关;交互时延与算力跟激活参数更相关。 6B 激活可以跑出远超 6B 稠密的质量,前提是愿意为全部专家权重付显存(第 9.6 节)。
  • 百万级上下文几乎必然改注意力形状(多数层便宜、少数层精确),而不是把 §5.7 的稠密 Block 原样堆到更长的 \(n\)。第 4 章的 KV 公式在混合架构下要按「会产生随长度增长的缓存的那些层」重算。
  • 稠密配方(Pre-LN、RMSNorm、SwiGLU、RoPE、GQA)并没有作废——旗舰往往仍以它为骨架,再在 FFN 侧加专家、在注意力侧加混合。第 8 章先把稠密一层装对;后面各部分是在这张形状账单上开新的轴。

归纳起来,形状与能力由四项共同给定:

  • 总参数:\(L\) 与 \(d\) 一经选定,\(P\) 大致确定;它同时决定稠密模型的能力档位,以及每 token 约 \(2P\) 的计算量。
  • 激活参数:前向真正参与计算的那一部分。稠密时等于全体;MoE 时总参数决定容量与常驻显存,激活参数决定单步算力。
  • 上下文长度:32K–128K 主要靠位置编码与长序列训练;百万级通常还要改写注意力计算图,不能由加层、加宽单独推出。
  • 预训练 token 规模:与 \(P\) 同等重要。产品模型普遍过训;同一形状下,数据差一个数量级,能力可以差一档。

四项缺一,参数表上的数字便不足以预言最终表现。

当然,真正落地很少是「同一 Block 原样复制 \(L\) 次」就结束。FFN 可以拆成每次只走少数专家(第 9 章);注意力可以多数层用线性或稀疏、少数层保留精确全局(第 12–14 章);连残差怎么往主干上写,2026 年起也开始出现可选择、可分叉的变体(附录 D)。

动手:改一处

把第 2 章的 Post-LN + LayerNorm 骨架换成 Pre-LN + RMSNorm + SwiGLU,对比改动前后的 loss 曲线和单步耗时。刻意把学习率调高,复现一次 Post-LN 训崩、Pre-LN 撑住的对照实验。


核心问答

Q1:第 2 章已经有 LayerNorm,为什么还要整章讲归一化? 第 2 章解决的是「没有 Norm 跑不起来」。这一章解决的是「有了 Post-LN,放大后仍训不深」。位置挪到子层前(Pre-LN)、统计量简化成 RMSNorm、再加上 QK-Norm,都是放大之后的补丁,不是把「要不要 Norm」重讲一遍。

Q2:Pre-LN 到底为什么稳? 因为残差主干上不再有归一化,从最后一层到第一层存在一条恒等的梯度通路,梯度不会被逐层缩放。代价是各层输出方差累积,需要末尾补一个 final norm。

Q3:RMSNorm 省掉的那一步(减均值)真的没影响吗? 在 Transformer 这个结构里基本没有。理解上可以认为后续的线性层本来就能吸收均值偏移,所以显式去均值是冗余的。这是一个典型的"实验先于理论"的工业选择。

Q4:原版 Transformer 的 FFN 就是 SwiGLU 吗? 原版是 \(W_2\operatorname{ReLU}(W_1x)\),两个矩阵。换成 GELU 仍是两个矩阵。SwiGLU 多一块 gate 投影,再与 up 逐元素相乘,约 2020 年起进入主流稠密配方。

Q5:门是 0/1 开关吗? 是逐元素乘法 \(h_i=\sigma(g_i)\,u_i\)。sigmoid 门大致在 \((0,1)\);SiLU 还可大于 1 或略为负。效果是按维缩放 \(u_i\),再交给 \(W_{\text{down}}\)。

Q6:config 里 FFN 中间维为什么常看到约 \(8d/3\)(如 11008)? 两矩阵 FFN 中间维常见 \(4d\)。换成三矩阵 SwiGLU 后,若与旧式 d→4d→d 参数量大致相当(约 \(8d^2\)),则 \(3d\cdot d_{\mathrm{ff}}=8d^2\),得 \(d_{\mathrm{ff}}=8d/3\)。例如 \(d=4096\) 时 \(8d/3\approx10923\),对齐后常见 11008。写成 12288(\(3d\))是刻意加宽。\(8d/3\) 是等参数参照,与 SiLU 公式无关。

Q7:QK-Norm 和第 2 章的 1/√d 是什么关系? 1/√d 管初始化时点积方差;训练过程中 Q/K 模长仍可能涨,logits 会再次尖掉。QK-Norm 在每次前向里把 Q、K 模长拉回,补的是后一段。

Q8:为什么小模型才共享输入输出嵌入? 嵌入层参数量与词表成正比、与模型宽度深度无关。0.6B 里嵌入可能占三分之一,共享收益大;8B 以上占比常不到 10%,更常让输入、输出各自学。

Q9:已经有 Pre-LN,为什么还要管初始化? Pre-LN 提供恒等梯度路径;残差分支写入主干的尺度仍由初始化决定。残差缩放、归一化和 warmup 管的是不同阶段。

Q10:模型形状与最终能力由哪些量共同决定? 稠密设定下,\(L\) 与 \(d\) 决定总参数 \(P\),因而同时约束容量与每 token 约 \(2P\) 的计算;训练 token 数决定同一形状还能抬多高;上下文长度取决于位置编码、长序列训练与注意力是否改写。MoE 还须区分总参数与激活参数:前者偏容量与显存,后者偏单步算力。§5.7 两张表按此口径对照。