跳到主要内容

模型蓝图与 RMSNorm — 配置里的每个数字

这一章讲两件事: 一台模型动工前要定下的每个尺寸(原书把它们全部装进一个 18 行的配置类); 以及让信号在几十层之间不失控的第一道稳定器 RMSNorm——本章是全书第一个能被 4 行代码讲完的机制。 从这一章起,我们开始真的「拼装」模型:每个零件一章。

1. 先看现象:模型是一个数字列表

原书开篇那句写得很透:一个神经网络容易显得庞大而不可测, 但它的底下只是一个数字列表——每个数字都是一个设计决策1。 多深(层数)决定它能堆多高的抽象,多宽(维度)决定它想得多细,词表多大决定它认得多少符号, 上下文多长决定它一眼能看几页。

这些数字全部写进一个叫 ModelConfig 的配置类。本书模型的真实取值(照录原书2):

字段(配置里的一项)取值它决定什么(详见哪一节)
num_hidden_layers4模型多少层(§2)
vocab_size8,000认得多少符号(§2)
hidden_size256每个位置用多长的数字串表示(§2)
intermediate_size256前馈层的草稿纸多宽(§2)
head_dim / 注意力头数 / KV 头数64 / 4 / 2注意力怎么分视角、KV 缓存省多少(§2、第 06 章)
sliding_window0每层看多远(第 06 章)
initial_context_length4,096一次看多长(§2)
rope_theta 等四个 RoPE 参数10000 等位置怎么编码、能不能撑长(第 05 章)
num_experts / experts_per_token16 / 2专家混合的路由(第 08 章)
swiglu_limit7.0激活值的天花板(第 08 章)

配置驱动是这个行业的行规:改一个数字就是一台新模型,代码一行不动; 存模型时配置也存下来(第 09 章的 checkpoint),不然加载时不知道该把零件造多大。

2. 逐个尺寸:名字背后的取舍

原书给每个字段配了一节「它是什么、为什么是这个数」。四条最承重的:

深度 = 抽象的层数。 浅网便宜但脆,只认得出局部花样; 深网能把「这是个数字」「这两个词相邻」一路垒成「这段话在反讽」—— 但每加一层都多一分梯度消失、数值爆炸的风险3。「多深」永远是「付得起多少风险」的问题。

词表 = 思考的粒度。 8,000 的词表意味着模型直接操作 8,000 种符号。 原书点破折中:小词表把词切碎、一串变长但省内存;大词表一串短、但嵌入表和输出层跟着膨胀4。 (词表怎么造出来的,第 03 章刚讲完。)

hidden_size = 相机的分辨率。 原书的比喻:每个词的表示就是这台相机拍出的一张照片, 256 维是「不太粗也不太细」5。分辨率高,细微的语义差别拍得出来;代价是每一层的矩阵都变大。

intermediate_size = 草稿纸。 前馈层先把表示撑宽、算完再压回来—— 「不在草稿纸上摊开算,复杂的式子在脑子里算不动」6。 本书取它与 hidden 相等,是轻量选择;大模型常见 2-4 倍。

还有一个初看平淡、到推理时才显出分量的字段:initial_context_length = 4,096。 原书指出两件事:它定了「模型一眼最远看几页」;更贵的是推理时KV 缓存 (把每个过去词的键和值存起来免得重算,第 06 章细讲)的显存随它线性(长度翻倍、占用也翻倍,不平方)增长7

3. 主走查:RMSNorm 四行代码,手算一遍

模型往深处堆层,每一层的输出是下一层的输入——数值只要整体偏大或偏小一点, 几十层滚下来就会爆炸或归零,训练直接失稳。归一化就是把每层的信号拉回稳定区间。 先看本书选的这款怎么算(向量——一串排好序的数——取 [2, 0, 4, 0] 为例,这些数是为演示编的)8:

输入 x = [2, 0, 4, 0]

① 平方取平均 (2²+0²+4²+0²)/4 = 5 ← 这就是「均方」
② 取倒数平方根 1/√(5+ε) ≈ 0.447 ← ε(如 0.00001)防除零
③ 逐个相乘 [2,0,4,0] × 0.447 = [0.89, 0, 1.79, 0]
④ 乘可学习缩放 [0.89, 0, 1.79, 0] × g(初始全 1,训练中自己学)

图说:输出向量的「均方根」被拉回 1 附近——不管输入原本多大。
全程没有减均值、没有求平均的符号,只有平方、平均、开根号。

代码只有四行,与手算一一对应:var = x.pow(2).mean(-1)x * torch.rsqrt(var + eps)x * self.scale9。 原书特别表扬了 rsqrt(倒数平方根一步算完,省掉「先开方再除法」两次浮点操作)—— 归一化在每个块里都要做,这点省法乘上层数就是真钱10

4. 为什么砍掉减均值:RMSNorm 对 LayerNorm

上一版标准答案是 LayerNorm(先减均值、再除以标准差(数的波动幅度)、最后乘缩放加偏移)。 RMSNorm 的全部改动就一条:不减均值,只管把「平方平均值的根」拉回 111

原书给的三条理由12:

理由一:省算力(算力:能做的计算量)。少一遍均值统计;原书引的实验里训练提速 7%-64%,transformer 场景约 7-9%,效果持平(翻译质量分数 26.8-27.7 区间不变)12

理由二:重新居中没那么重要。深网里残差(把每层的输入原样加回输出;第 07 章细讲)连接已经让信号带着「原始值」流动,居中的收益被覆盖12

理由三:隐式的步幅适配。输入幅度大时归一化自动压小修正量,训练自己稳住自己12

原书还给了一个进阶省法:pRMSNorm——均方只取向量的前 6.25% 来估,估计粗一点但更快13

这一换发生在哪?原书点名:GPT-3 那一代还是 LayerNorm,LLaMA、GPT-J 这一代开源模型全部换成了 RMSNorm14。 本书跟的是新一代,所以第 04 章就定下这个零件。

归一化放在块的哪一头

原书顺带交代了一个位置问题:归一化放在注意力/前馈之前(pre-norm)还是之后(post-norm)。 LLaMA 一系是放前面:先把信号捋稳再进零件,深堆时梯度更稳15。 第 07 章总装时你会看到它就站在块的第一行。

5. 作者的判断与证据

说法书里的证据我们的标注
RMSNorm 效果不降、速度更快引原始论文实验:翻译质量分持平、提速 7-9%;读理解任务收敛更快16有出处的研究结论
「重新居中可以省」是假设不是定理原书用词是 hypothesizing(推测)17作者如实标注了这是经验假设
每个超参都是取舍逐字段讲了收益与代价,没有给「最优值」写法诚实:配置没有标准答案

判断(我们的,不是书里的): 这一章真正的教学重点不是 RMSNorm 本身(它只有四行), 而是「深网的稳定是被一件件小工程挣来的」这个行业气质——ε 防除零、rsqrt 省一次浮点、 归一化挪到块前面,单看每件都小得可笑,叠起来决定几十层的网络训不训得动。 如果错,会错在: 如果某个现代模型的训练崩坏其实源于完全无关的原因(如数据或学习率), 把功劳记在归一化头上就是归因错误——但「这些小工程让训练更稳」这个方向性结论有原书引的实验背书。

6. 边界与局限

  • RMSNorm 的「重新居中没必要」是经验结论,没有理论证明;换一种架构(比如没有残差的深网)未必成立;
  • 原书这一章的数学公式同样是图片、转码后丢失,本章算式按散文重建;
  • 配置表里的取值(4 层/256 维)是教学尺寸;生产模型是 32-100 层、2048-12288 维的量级, 原书自己在第 10 章的对照表里给过这组数18——零件相同,规模差五个数量级。

7. 可带走的

  1. 模型开工前先定一串尺寸,全部装进一个配置对象;改配置就是改模型;
  2. 深度=抽象层数,词表=粒度,hidden=分辨率,intermediate=草稿纸,上下文=视野+显存账单;
  3. KV 缓存的显存随上下文长度线性涨——「看得远」是要按字节付钱的;
  4. RMSNorm 四步:平方→平均→倒数平方根→乘可学习缩放;没有减均值;
  5. 砍掉减均值省 7-10% 算力、效果持平,LLaMA 一代全部改用;
  6. 归一化放在块的最前面(pre-norm)是现代默认;
  7. ε 是所有除法旁边的常客:防的不是错误,是「恰好除以零」;
  8. 教学尺寸和生产规模差五个数量级,零件却完全相同——这是「从零写」教学的全部意义。

8. 原文地图

主题原书章原文位置
配置=数字列表4. RMS Normalization and Model Configurationtext/39-ch04-4-rms-normalization-and-model-configuration.txt:77(搜「list of numbers」)
ModelConfig 全字段Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:43(搜「ModelConfig」) · text/39-ch04-4-rms-normalization-and-model-configuration.txt:51(搜「vocab_size」)
深度与抽象层级Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:97(搜「hierarchies of abstraction」) · text/39-ch04-4-rms-normalization-and-model-configuration.txt:99(搜「Shallow models」)
词表的粒度折中Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:113(搜「granularity」)
hidden_size=分辨率Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:129(搜「resolution」)
intermediate=草稿纸Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:147(搜「scratch paper」)
KV 缓存随长度线性涨Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:235(搜「scales linearly」)
rope_theta=显微镜/望远镜Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:253(搜「microscope」)
swiglu_limit=边界Model Parameters Configuration and Mathematical Foundationstext/39-ch04-4-rms-normalization-and-model-configuration.txt:281(搜「intelligence requires boundaries」)
RMSNorm 定义(不减均值)RMS Normalization in GPT Architecturestext/39-ch04-4-rms-normalization-and-model-configuration.txt:339(搜「without subtracting the mean」)
pRMSNorm 6.25%RMS Normalization in GPT Architecturestext/39-ch04-4-rms-normalization-and-model-configuration.txt:351(搜「6.25%」)
提速 7-64% 与质量持平RMS Normalization in GPT Architecturestext/39-ch04-4-rms-normalization-and-model-configuration.txt:357(搜「7–64%」)
LLaMA/GPT-J 采用RMS Normalization in GPT Architecturestext/39-ch04-4-rms-normalization-and-model-configuration.txt:363(搜「LLaMA, GPT-J」)
pre-norm 放前面RMS Normalization in GPT Architecturestext/39-ch04-4-rms-normalization-and-model-configuration.txt:389(搜「before the attention」)
RMSNorm 代码RMS Normalization for Our Custom Large Language Modeltext/39-ch04-4-rms-normalization-and-model-configuration.txt:423(搜「rsqrt」) · text/39-ch04-4-rms-normalization-and-model-configuration.txt:421(搜「pow(2)」)
rsqrt 是性能优化Comprehensive Explanation of RMSNorm Codetext/39-ch04-4-rms-normalization-and-model-configuration.txt:599(搜「rsqrt」)
scale 初始化为 1Comprehensive Explanation of RMSNorm Codetext/39-ch04-4-rms-normalization-and-model-configuration.txt:499(搜「initialized to ones」)

Footnotes

  1. 出处:「4. RMS Normalization and Model Configuration」第 77 段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:77,搜「list of numbers」)。原文:神经网络底下「deceptively simple: a list of numbers, each representing a design decision」——一个数字列表,每个数字都是一个设计决策。

  2. 出处:「Model Parameters Configuration and Mathematical Foundations」代码段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:43,搜「ModelConfig」;:51,搜「vocab_size」)。字段取值:num_hidden_layers=4、num_experts=16、experts_per_token=2、vocab_size=8000、hidden_size=256、intermediate_size=256、head_dim=64、num_attention_heads=4、num_key_value_heads=2、sliding_window=0、initial_context_length=4096、rope_theta=10000.0、swiglu_limit=7.0。

  3. 出处:「num_hidden_layers」一节(text/39-ch04-4-rms-normalization-and-model-configuration.txt:97,搜「hierarchies of abstraction」;:99,搜「Shallow models」)。原文:浅网便宜但脆,深网强大但每一层都引入梯度消失、数值爆炸、过拟合的风险。

  4. 出处:「vocab_size」一节(text/39-ch04-4-rms-normalization-and-model-configuration.txt:113,搜「granularity」)。原文:小词表把词压成碎片、拉长序列但省内存;大词表缩短序列但让嵌入与 softmax 层膨胀;8,000 是折中。

  5. 出处:「hidden_size」一节(text/39-ch04-4-rms-normalization-and-model-configuration.txt:129,搜「resolution」)。原文:「如果我们把模型想成一台相机,hidden_size 就是它的分辨率」;256 维不算粗也不算细。

  6. 出处:「intermediate_size」一节(text/39-ch04-4-rms-normalization-and-model-configuration.txt:147,搜「scratch paper」)。原文:「试想不做草稿就在脑子里解方程——简单情形还行,复杂一点就得先摊开到更大的工作面再压缩回来」;并注明本书 intermediate=hidden 是轻量选择,大模型常扩 2-4 倍。

  7. 出处:「initial_context_length」一节(text/39-ch04-4-rms-normalization-and-model-configuration.txt:235,搜「scales linearly」)。原文:推理时 KV 缓存存两个张量(键与值),显存随上下文长度线性增长,长上下文模型因此吃显存。

  8. 手算演示:均方 (4+0+16+0)/4=5;1/√(5+10⁻⁵)≈0.4472;输出 [0.89, 0, 1.79, 0]。向量取值是为演示编的,不是书里数值;算式对应原书 RMSNorm 公式(「RMS Normalization in GPT Architectures」,text/39-ch04-4-rms-normalization-and-model-configuration.txt:21,搜「root mean square」)。

  9. 出处:「RMS Normalization for Our Custom Large Language Model」代码(text/39-ch04-4-rms-normalization-and-model-configuration.txt:423,搜「rsqrt」;:421,搜「pow(2)」)。原文代码:var = x.pow(2).mean(dim=-1, keepdim=True); x = x * torch.rsqrt(var + self.eps); return x * self.scale。

  10. 出处:「Comprehensive Explanation of RMSNorm Code」(Efficiency 一条)(text/39-ch04-4-rms-normalization-and-model-configuration.txt:599,搜「rsqrt」)。原文:rsqrt 免去先开方再相除,是性能优化;归一化在每个 transformer 块里执行多次,这点节约在大模型上很关键。

  11. 出处:「RMS Normalization in GPT Architectures」第 339 段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:339,搜「without subtracting the mean」)。原文:RMSNorm 用输入的均方根归一化、不减均值,是对 LayerNorm 的简化,保证输出对输入或权重的缩放不变。

  12. 出处:「Why Is RMSNorm Used in GPT Architectures?」第 357 段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:357,搜「7–64%」)。原文:去掉均值统计后训练提速 7%-64%(transformer 约 7-9%);翻译质量分 26.8-27.7 与 LayerNorm 相当;梯度随输入幅度自然适配。 2 3 4

  13. 出处:「RMS Normalization in GPT Architectures」第 351 段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:351,搜「6.25%」)。原文:pRMSNorm 只用部分元素(如前 6.25%)估计 RMS,进一步省计算,同时保持缩放不变性。

  14. 出处:「RMS Normalization in GPT Architectures」末段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:363,搜「LLaMA, GPT-J」)。原文:早期 GPT(如 GPT-3)用 LayerNorm,RMSNorm 在 LLaMA、GPT-J 等后续开源大模型中普及。

  15. 出处:「RMS Normalization in GPT Architectures」(Step-by-Step 末尾)(text/39-ch04-4-rms-normalization-and-model-configuration.txt:389,搜「before the attention」)。原文:LLaMA 这类 GPT 式架构把 RMSNorm 放在注意力与前馈层之前(prenormalization)。

  16. 出处:「RMS Normalization in GPT Architectures」实验段(text/39-ch04-4-rms-normalization-and-model-configuration.txt:393,搜「26.8」)。原文:RMSNorm 在 transformer 机器翻译上取得与 LayerNorm 相当的 BLEU(约 26.8-27.7),训练快 7-9%,阅读理解任务收敛更好。

  17. 出处:「RMS Normalization in GPT Architectures」第 5 段用词(text/39-ch04-4-rms-normalization-and-model-configuration.txt:349,搜「hypothesizing」)。原文:作者明说「RMSNorm 跳过均值计算,推测重新居中对性能不如重新缩放关键」——这是假设语气。

  18. 出处:「Training Large Language Models」(Model Architecture 一节)(text/72-fm-training-large-language-models.txt:7,搜「20–100+ layers」)。原文:现代模型深度 20-100+ 层、宽度 2,048-12,288、注意力头 16-128、上下文 2,048-128,000+。