第 5 章 稳定训练¶
5.1 回顾:已经有的归一化¶
第 2.7 节的 Block 是 Post-LN:先算子层,与残差相加,再 LayerNorm——
LayerNorm 对每个位置减均值、除标准差,再仿射。小模型、浅栈上这样就能训。梯度回传时,通向浅层的路径都要穿过每层的归一化 Jacobian;层数一深,初始化阶段更容易出现梯度尺度失衡,通常要更谨慎的 warmup 和初始化。第一部分解决的是「有 Norm」;这一章解决的是「Norm 怎样摆、怎样简化,才撑得住现代深度」。
5.2 Post-LN 训不深,Pre-LN 改了什么¶
Pre-LN 把归一化挪到子层之前:
求导时出现一条显式恒等项:
即便残差分支暂时学得不好,梯度仍可沿 \(I\) 直达浅层。代价是深层输出的尺度会逐层累积,所以模型末尾要补一个 final norm(第 2 章 Post-LN 流水线里往往不单独强调这一步;换成 Pre-LN 之后它变成标配);一些新模型还增加输出侧 norm 或残差缩放。Pre-LN 是现代 LLM 的主流基线,但不是“所有模型唯一可用”的结构。
5.3 RMSNorm¶
第 2 章用的 LayerNorm 要算均值和方差、再做缩放和平移。RMSNorm 直接去掉减均值和 bias,只用均方根做缩放:
单看归一化 kernel,它需要的归约更少;端到端能快多少取决于融合实现和归一化占总耗时的比例,不能把某个实验里的百分比当成普适常数。主要价值是更简单且效果通常不降,因此成为标配。读到这里应能分清:LayerNorm 是跑起来时的归一化;RMSNorm 是它在现代配方里的简化替换。
5.4 激活:从 ReLU 到门控 FFN¶
第 2 章那种 FFN 在做什么¶
第 2 章的 FFN 是两层投影夹一个逐元素非线性:
读成三步:\(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\) 与 \(g\) 同形状,都是中间维(记作 \(d_{\mathrm{ff}}\))上的向量。\(\odot\) 是按维相乘:第 \(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:
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 系列全面采用,是近两年大规模训练稳定性的关键补丁之一。本章公式只写这一步:
若 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\) 层后:
层数增长而初始化尺度不变,残差流的方差就会随深度增大。经典做法是把每个残差分支最后一个投影(attention 的 o_proj、FFN 的 down_proj)按残差分支总数缩放:
等价地,可先按普通标准差初始化,再将这类权重乘 \(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 以上一般拆开,让输入与输出各自学。
参数量粗算仍是
还要满足张量并行可整除、以及 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 |
读这张表时,能力与形状的对应可以压成四条:
- \(L\) 是 Block 循环次数。 从约 28 层(亚 B 级)到 64 层(稠密 32B),深度大致随档位爬升。层数不够,多跳推理与组合能力容易见顶;层数堆高,没有 Pre-LN / 初始化(本章前几节)就训不稳,推理延迟也按层付费。
- 总参数 \(P\) 主要买「知识与技能容量」。 同配方下,0.6B → 8B → 32B 的质量台阶,首先来自 \(L\) 与 \(d\) 一起把 \(P\) 拉开。第 4 章的稠密估算给出代价:每生成一个 token,计算约 \(2P\)——形状放大,Decode 单价几乎同比放大。
- 上下文长度不是 \(L\)、\(d\) 的副产品。 上表里 32K / 128K 靠的是位置编码(第 6 章)、长序列训练阶段,以及推理期 YaRN 一类外推;形状只决定「全注意力时 KV 与算力是否扛得住」(第 4、7、11 章)。能写进 config 的最大长度 ≠ 任意任务上都好用的长度。
- 训练 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 两张表按此口径对照。