阶段 1 · 最小学习机器

初始化:信号为什么
传不过第 20 层

上一章《归一化层》管住了尺度;开跑那一下呢? 堆一个 20 层的网络,你大概率见过:损失一动不动,或 第一轮就变成 NaN (不是一个数,训练已经算炸了)。这一章把原因拆开——它其实只是一个方差被反复乘了几十次。

1

一个被反复相乘的方差

一层的输出是 y = Wx。如果 W 里的数字是随机的, 那么 y 的方差大致等于 输入维度 × 权重方差 × x 的方差。

把鼠标移到公式里有虚线的项上——Var(w) 那一项会让「初始化档位」按钮亮起来。

关键在于:这个乘法要做 L 次(L 就是层数)。每层只小 20%,20 层后就只剩约 1%; 每层大 20%,20 层后就涨到约 38 倍。

互动 · 四个初始化档位,各自的后果

初始化权重 σW
—
第 1 层激活标准差
1.00
第 20 层激活标准差
1.00
放大倍数
×1.00

💡 抖动是随机性,不是噪声

上面真的建了一个 20 层网络、随机初始化、逐层测量激活值标准差—— 曲线上的抖动是真的随机性。层数少时乘法次数少,不用操心。

2

同一份初始化,两副面孔

上面那张图量的是信号(激活值)。但真正推着参数往前走的是梯度。 有意思的地方在于:同一份初始化,换个视角看,会得出完全相反的结论。

互动 · 切一下视角,看同一份数据的两副面孔

初始化权重 σW
—
第 20 层梯度范数(基准)
—
第 1 层梯度范数
—
首末相差
—

档位权重视角看到什么梯度视角看到什么后果
Zero(全零) 20 层塌成同一个点 除了最后一层全是 0 所有神经元算得一模一样,永远学不出不同东西(对称性破不开)
太小(0.01) 每层的 σW 都是 0.01,一条水平线 每往前一层掉约 1.3 个数量级 前面几层学不动(梯度消失)
合适(ReLU → He) σW ≈ √(2 / nin) 各层梯度同一量级 信号和梯度都能穿过 20 层
合适(tanh → Xavier) σW ≈ √(1 / nin) 各层梯度同一量级 信号和梯度都能穿过 20 层
太大(10) 每层的 σW 都是 10,一条水平线 每往前一层涨约 1.8 个数量级 梯度爆炸,一步就把模型打飞
💡 为什么要两个视角

在权重视角里,「太小」和「合适」的线都是平的,看不出信号被层间放大还是缩小。 切到梯度视角,「太小」那档首末差了 25 个数量级。所以调初始化时要看梯度范数(梯度整体有多大), 不是 σW 那条线。
另外两张图的 σW 数值不同(0.144 / 0.177),因为一层输入数不同——同一个 √(2/nin) 代进去。

3

两条公式,解决大半问题

前面《激活函数》的「配对实验台」已经让你看见了配错什么样; 这一节回答另一半问题——那个 2 是从哪解出来的。 目标仍然只有一句话:让方差在层间保持不变。反解那一步写在数学节, 这里先把解出来的两条公式、以及它们的边界摆在一起。

初始化权重标准差用在为什么是这个数
Xavier / Glorot √(2 / (nin+nout)) tanh、Sigmoid、线性层 同时照顾前向和反向:原式是 2/(nin+nout)。输入输出一样宽时就等于 1/n——就是《激活函数》里的 c = 1
He / Kaiming √(2 / nin) ReLU 家族 ReLU 会把负的一半直接砍掉,方差减半,所以要补偿一个 2
正交初始化 随机正交矩阵 RNN、很深的网络 正交矩阵不放大也不缩小向量长度,是最「温和」的乘法
零初始化 0 绝对不行 所有神经元完全一样,梯度也完全一样,永远学不出差异(对称性破不开)
固定常数初始化 全部相同 绝对不行 同上,等于只有一个神经元

对比 · ReLU 砍掉的那一半,He 是怎么补回来的

🎯 类比

像传话游戏。如果每个人说话都比前一个人轻 30%,传到第 20 个人时已经听不见了(只剩千分之一); 如果响 30%,传到第 20 个就是喊叫(涨到 190 倍)。
初始化的任务就是:让每个人说话音量刚刚好一样。

⚠️ 现代实践里的一个变化

今天很多大模型用 Pre-Norm + 残差,归一化层每层把尺度拉回来,初始化的敏感性大大降低—— 但 §7 会看到它没有完全退场。没有归一化的深网,初始化仍然生死攸关。

4

残差:给梯度开条高速路

反向传播要一路乘回去。层数一多,梯度要么消失要么爆炸。 残差连接做了一件极简的事:把输入直接加到输出上。

那个多出来的 1 是一条直通的路,永远在;F 那一项可正可负, 所以总和一般不会塌成 0,但也不保证 ≥ 1。 ResNet 能堆到 152 层、Transformer 能堆到上百层,残差是其中的一个原因(Transformer 还靠 Pre-Norm)。

对比 · 有残差 vs 没残差,20 层之后梯度还剩多少

互动 · 把残差系数从 0 拖到 1,看第 1 层的梯度

💡 一句话

残差连接 = 让网络「至少能学会什么也不做」。 没有它,每一层都必须做出有用的变换;有了它,每一层只需要学会「修正」。

归一化放在残差的里面还是外面,是另一件大事。 那件事的主战场在 《归一化层》那一章第 6 节, 那边还带了 2025 年的新证据(Pre-Norm 更稳,但 Post-Norm 效果更好)。 这里只记一句:残差给梯度开了高速路,放在外面会让这条路被归一化挡住—— 所以默认选 Pre-Norm(归一化放在残差里面)。

5

还有几根保险丝

保险丝它防的是什么怎么做
学习率预热 Warmup 刚开始参数完全是随机的,梯度方向很不可靠。 此时用大学习率 = 蒙着眼猛跑 前 1~5% 的步数里,学习率从 0 线性升到目标值
梯度裁剪 Clipping 偶尔一个坏 batch 产生巨大梯度,一步就把模型打飞 梯度范数超过阈值就等比缩回去,通常取 1.0
损失缩放 Loss Scaling FP16(16 位半精度)下,太小的梯度会被当成 0(下溢) 先把损失乘一个常数,反向后除回来(AMP 自动混合精度,框架自动做)

互动 · 看 warmup 和裁剪各挡住什么

💡 现代训练的稳定配方

Pre-Norm + 残差 + RMSNorm + AdamW(lr=3e-4, wd=0.1) + warmup 1% + cosine + clip 1.0
这是今天大模型预训练的一个常见起点。其中 cosine 指的是学习率按余弦曲线慢慢降下去。 这些数字是经验默认,不是从哪条公式算出来的。 这里的 wd=0.1 是解耦权重衰减,量纲比经典 L2 惩罚系数(1e-4~1e-2,见《过拟合与正则化》章)大,两处不要直接比。

M

数学 · 一个方差被乘 L 次

第 1 节的结论只有一句:方差被乘了 L 次。 先把「一层乘多少」拆成一个式子,再看它乘 L 次之后长什么样。

先把这个式子的来历拆开。这一层的输出 y 是 nin 个 wixi 相加 (nin 就是这一层的输入个数)。各项互相独立、均值为 0 时,和的方差 = 各项方差相加; 每一项是 Var(w)·Var(x)(Var 就是方差,衡量一组数散得多开),一共 nin 项, 所以 Var(y) ≈ nin·Var(w)·Var(x)。

目标是不让方差在层间跑偏,也就是让 Var(y) = Var(x)。约掉 Var(x) 就得到 nin·Var(w) = 1,即 Var(w) = 1/nin(标准差 1/√nin)—— 这是 Xavier 在等宽层上的取值。ReLU 再把负的一半压成 0、方差减半,要乘个 2 补回来: Var(w) = 2/nin,也就是 He 的 √(2/nin)。

图解 · 方差为什么是「乘 nin 项」

互动 · 左边是一层的乘法,右边是乘 L 次的结果(圆点是真的跑出来的)

输入的标准差 σ₀
1.00
每层方差乘几 r
1.00
第 L 层的标准差 σ_L
—
一共差了几个数量级
—

公式卡 · 每个符号管图上的哪一块

🎬 自己验一遍

把上面的 σ_W 从 √(1/n_in)(Xavier 在等宽层上的取值)往上拖一点点。
右边那条线会开始翘——L 层就是方差乘 L 次(σ 乘 L/2 次),翘一点点就是很多个数量级。
第 1 节那四个档位背后的全部算术就在这。反过来,把 σ_W 拖回 √(1/n_in),线立刻变平。

收束成三句:方差被乘了 L 次,乘数 r = nin·σW2; 让 r = 1,就得到 Var(w) = 1/nin;ReLU 砍掉一半,把 1 换成 2。 第 1 节那四个档位的差别,全在这两个数字上。

6

所有初始化方法,按它保什么排

第 3 节那两条公式解决的是「能不能训起来」。表里每个方法的分歧都在同一件事上:它想让什么保持不变。

方法它保的是什么一行公式什么时候用
全 0 / 全常数 什么都不保 W = 0 不行。所有神经元算出同一个数,对称性破不开,等于只有一个神经元
小随机 只要求「小」 W ~ N(0, 0.01²) 浅网络能用;深了会一路缩到 0,就是第 1 节那个「太小」档
Xavier / Glorot 2010 前向和反向的方差都保持不变 Var = 2/(nin+nout) tanh / sigmoid 那一代
He / Kaiming 2015 补上 ReLU 砍掉的那一半 Var = 2/nin ReLU 家族;CNN 时代的默认
正交初始化 让所有方向的缩放都一样(奇异值——矩阵在各方向的拉伸倍数——全为 1) W = 正交阵 RNN 时代常用,现在少见
LSUV(逐层单位方差) 用一批真数据逐层校准 逐层测、逐层调 一次性、不通用,需要先跑一遍数据
μP(最大更新参数化) 2022 让最优超参不随模型规模漂移 按宽度缩放 lr 与 init 想在小模型上调好、直接搬到大模型(zero-shot 超参迁移)
小初始化 / γ-init 2026 先压缩、再展开 W = γ · Xavier(γ 是缩小系数,< 1) 大模型预训练。把 γ 当成一个显式的旋钮,默认就该小——理由在第 7 节

一句话:全 0 时同一层的每个神经元算得一模一样,梯度也一样,所以永远分不开(展开见下)。

全 0 为什么不行?随机小一点不也接近 0 吗?

差别在对称性。全 0 时,同一层的每个神经元拿到一模一样的输入和梯度, 会永远保持一模一样,一个 1000 维的隐藏层等于 1 维。随机小虽然也小,但每个神经元不一样, 这个对称性第一时间就破了。

7

这两条公式什么时候不够用

第 3 节那两条公式是 2010 和 2015 年的答案,解决的是能不能训起来。 现在的大模型早就训得起来了,问题变成能训多好——答案也变了。

2026 年的一个结果:把尺度再压小,反而更好

📉 减小初始化尺度,稳定地提升预训练 Hang et al. 2026 年的工作(《Small Initialization Matters for Large Language Models》)系统地试了各种尺度,结论是: 把初始化整体压小,预训练的损失稳定地更好, 而且收益在需要推理的任务上最大。
它的机制解释很好记:小初始化让参数先压缩成低复杂度的结构,再慢慢展开成更丰富的表示。
🔧 μP:让调参这件事本身可迁移 另一条线解决工程问题:最优学习率会随模型变大而漂移,小模型上调好的搬不过去。
μP(2022)把初始化和学习率按宽度重新缩放, 让最优超参不随规模变化——于是「小模型调参、大模型直接用」第一次成了可依赖的做法。

这两条都在说同一件事:「方差保持 1」不是终点,是一个中间站。 它保证你能训,但不保证你训得好。

所以,它不成立的地方在哪

它不成立的地方什么时候真的会痛怎么办
「方差保持 1」只是「能训」的保证 模型已经能稳定训练了,而你在追效果 把初始化尺度当成一个显式的旋钮(γ),往下调试试——2026 年的结果是它默认就该偏小
Xavier 假设的是线性激活 你用 ReLU,却按 Xavier 的公式算方差 ReLU 会把一半压成 0,方差直接减半,He 那一篇存在的理由就在这——想看混用的后果,回配对实验台选 ReLU × Xavier,两条线一起阴跌
初始化和学习率是一对,不能分开调 你换了初始化方法,却留着原来的学习率 最优学习率本身就是初始化的函数。μP 这一支做的就是把两者的缩放关系绑在一起
残差不是万能的 层数到了几十上百层,只靠残差还是不稳 还要配上归一化放在正确的位置、warmup,以及偏小的初始化——三件事一起才够
它完全不负责数据这一侧 输入特征本身的尺度差了三个数量级 输入那一层要单独做标准化。初始化管的是权重,管不了你的原始特征
那我是不是该把自己的网络初始化调小?

先看两件事:你用的是不是残差结构(是 → 值得试), 你的模型够不够大(小模型上收益不明显)。而且一定要同时看学习率—— 只动一个往往看不出效果。

8

小结

这一章没有新算法,一个损失函数也没改。它只回答一个问题:「深」这个物理量,靠什么维持?
读完你应该能:给一个新网络挑对初始化(ReLU → He,tanh → Xavier),并且知道训不动时先看逐层的梯度大小, 而不是 σW 那条线。想再压小初始化(§7),先确认你有残差结构、模型够大,而且学习率要一起调。

它对应哪条线 ⑦ 拧得动——深度不会自己长出来,它是每一层都替方差「站岗」换来的; 信号和梯度能一路传到底,几千亿个旋钮才有得拧。它同时站在 ⑥ 层层组合上:这份「后勤」是逐层做的,层数越多越断不得。
一句话 这一章的做法,本质上是在给信号和梯度做后勤—— 让同一个方差在穿过 20 层、100 层之后,还是原来那个方差。
它牺牲了什么 牺牲了结构和数值上的自由:不能随便选初始化, 不能让残差通路穿过归一化,不能一上来就用大学习率,不能放任个别 batch 的梯度。 初始化、Pre-Norm、warmup、clip 这四条「不许」是同一笔账的四个分项。
💡 检验一下:你现在能指着哪个互动说这句话

回到第 2 节那张「权重视角 / 梯度视角」的图。把档位停在「太小(0.01)」,视角切到「权重视角」—— 曲线是一条水平线,看不出任何毛病;然后把视角切到「梯度视角」——同一条健康曲线变成了陡峭的 25 个数量级下坡。

那个切换的瞬间,你看到的就是「深度需要被主动维护」。 参数没变、数据没变,只是换了个看它的角度,结论就从「没问题」翻成「已经死了」。

为什么是 ⑦,而不是看起来更像的 ⑤

更近的线为什么这一章不挂在它上面
⑤ 高维里的低维不涉及——这一章不降维,也不假设数据住在低维曲面上。 「换个角度结论就反了」是观测难,不是高维几何
④ 学习即压缩沾边:§7 那篇 2026 的工作说,小初始化让参数先压缩、再展开。 但这一章的机制是数值上的方差守衡,不是表示在形成——那一条留给讲表示学习的章

所以主线是 ⑦ 拧得动:几千亿个旋钮要拧得动,先得让信号和梯度穿过几十层还是活的。 初始化、归一化、残差、warmup 是同一笔账的四个分项(本节暗线表的 C 行就是「深度为什么值得」)。

它在暗线里站在哪

暗线这一章的回答
A 信息流动 前向:96 维的输入 x 穿过 20 层,每层的中间结果记作 z₁…z₂₀,最后收成一个标量损失。 这一章唯一特别的地方是形状全程不变:20 层的张量形状和 1 层一模一样。 所以这里丢的不是形状而是尺度——方差是 20 次方(σ 是 10 次方)。
B 什么被牺牲了 换来的是深度。牺牲的是「随便初始化、随便放归一化、随便开大学习率」的自由。 四条规矩都在做同一件事:在做任何「让模型更强」的事之前, 先花力气让数值别跑偏。这笔开销不会换来任何精度,但没有它,后面一步都走不了
C 参数账本 页面上那个网络:宽度 96、深度 20,每层 96×96 = 9,216 个权重, 共 184,320 个;一次前向每层约 2×96² ≈ 1.8 万次浮点运算,20 层约 37 万次。 残差连接一个参数都不加;Pre-Norm 只是换了归一化的位置——残差那个加号只加了每层 96 次加法。
真实规模:175B 参数的模型用 Adam 训练,每个参数额外付 8 字节(一阶 + 二阶动量,fp32),优化器状态就是 175B × 8 = 1.4 TB——比参数本身还大。
E 它假设了什么 假设层间同分布——每层输入有一个稳定的尺度,「保持方差不变」才是有意义的目标。
一旦层间分布剧烈漂移(稀疏特征、多模态输入、被量化过的权重), 这个目标就不再正确,改用 LayerNorm「每一层重新定义尺度」会更耐用。 所以在 Pre-Norm 的模型里,尺度的活大半交给了归一化层——但 §7 说了,初始化并没有完全退场
F 违背了哪个直觉 两条。
① 「参数量一样,模型就一样」是错的。同一个 20 层网络、同一份随机权重, 只换一个缩放系数,第 1 层和第 20 层的梯度就差了 25 个数量级。
② 「加深应该更强」曾经被实测证伪。2015 年发生过一次:56 层的训练误差 高于20 层,而且不是过拟合——模型容量明明更大,优化器却找不到解。
🎯 前后钩子

它接住了什么:《归一化层》把每层的尺度拉了回来—— 但开跑前第一次相乘的系数,是这一章定的。

它往后面留了什么:量级稳了,可训练真坏了、损失不降时按什么顺序查—— 那是《症状与病因》。

一句话带走初始化与稳定性

深层网络的稳定性问题,本质是一个方差被乘了几十次。
初始化让第一次相乘的系数正好是 1(Xavier 给 tanh,He 给 ReLU);
残差连接给梯度留了一条系数为 1 的直通路;
Pre-Norm保证这条高速路不被归一化挡住;
warmup + 梯度裁剪是最后两道保险丝。
训不动的时候,先看逐层的梯度大小,不是 σW 那条线——选对初始化(ReLU 用 He,tanh 用 Xavier)比调别的便宜。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式