上一章《归一化层》管住了尺度;开跑那一下呢? 堆一个 20 层的网络,你大概率见过:损失一动不动,或 第一轮就变成 NaN (不是一个数,训练已经算炸了)。这一章把原因拆开——它其实只是一个方差被反复乘了几十次。
一层的输出是 y = Wx。如果 W 里的数字是随机的, 那么 y 的方差大致等于 输入维度 × 权重方差 × x 的方差。
把鼠标移到公式里有虚线的项上——Var(w) 那一项会让「初始化档位」按钮亮起来。
关键在于:这个乘法要做 L 次(L 就是层数)。每层只小 20%,20 层后就只剩约 1%; 每层大 20%,20 层后就涨到约 38 倍。
互动 · 四个初始化档位,各自的后果
上面真的建了一个 20 层网络、随机初始化、逐层测量
上面那张图量的是信号(
互动 · 切一下视角,看同一份数据的两副面孔
| 档位 | 权重视角看到什么 | 梯度视角看到什么 | 后果 |
|---|---|---|---|
| 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) 代进去。
前面《激活函数》的「配对实验台」已经让你看见了配错什么样; 这一节回答另一半问题——那个 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 会看到它没有完全退场。没有归一化的深网,初始化仍然生死攸关。
反向传播要一路乘回去。层数一多,梯度要么消失要么爆炸。
那个多出来的 1 是一条直通的路,永远在;F 那一项可正可负, 所以总和一般不会塌成 0,但也不保证 ≥ 1。 ResNet 能堆到 152 层、Transformer 能堆到上百层,残差是其中的一个原因(Transformer 还靠 Pre-Norm)。
对比 · 有残差 vs 没残差,20 层之后梯度还剩多少
互动 · 把残差系数从 0 拖到 1,看第 1 层的梯度
残差连接 = 让网络「至少能学会什么也不做」。 没有它,每一层都必须做出有用的变换;有了它,每一层只需要学会「修正」。
归一化放在残差的里面还是外面,是另一件大事。 那件事的主战场在 《归一化层》那一章第 6 节, 那边还带了 2025 年的新证据(Pre-Norm 更稳,但 Post-Norm 效果更好)。 这里只记一句:残差给梯度开了高速路,放在外面会让这条路被归一化挡住—— 所以默认选 Pre-Norm(归一化放在残差里面)。
| 保险丝 | 它防的是什么 | 怎么做 |
|---|---|---|
| 刚开始参数完全是随机的,梯度方向很不可靠。 此时用大学习率 = 蒙着眼猛跑 | 前 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 是解耦
第 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 次的结果(圆点是真的跑出来的)
公式卡 · 每个符号管图上的哪一块
把上面的 σ_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 节那四个档位的差别,全在这两个数字上。
第 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 时,同一层的每个神经元拿到一模一样的输入和梯度, 会永远保持一模一样,一个 1000 维的隐藏层等于 1 维。随机小虽然也小,但每个神经元不一样, 这个对称性第一时间就破了。
第 3 节那两条公式是 2010 和 2015 年的答案,解决的是能不能训起来。 现在的大模型早就训得起来了,问题变成能训多好——答案也变了。
2026 年的一个结果:把尺度再压小,反而更好
这两条都在说同一件事:「方差保持 1」不是终点,是一个中间站。 它保证你能训,但不保证你训得好。
| 它不成立的地方 | 什么时候真的会痛 | 怎么办 |
|---|---|---|
| 「方差保持 1」只是「能训」的保证 | 模型已经能稳定训练了,而你在追效果 | 把初始化尺度当成一个显式的旋钮(γ),往下调试试——2026 年的结果是它默认就该偏小 |
| Xavier 假设的是线性激活 | 你用 ReLU,却按 Xavier 的公式算方差 | ReLU 会把一半压成 0,方差直接减半,He 那一篇存在的理由就在这——想看混用的后果,回配对实验台选 ReLU × Xavier,两条线一起阴跌 |
| 初始化和学习率是一对,不能分开调 | 你换了初始化方法,却留着原来的学习率 | 最优学习率本身就是初始化的函数。μP 这一支做的就是把两者的缩放关系绑在一起 |
| 残差不是万能的 | 层数到了几十上百层,只靠残差还是不稳 | 还要配上归一化放在正确的位置、warmup,以及偏小的初始化——三件事一起才够 |
| 它完全不负责数据这一侧 | 输入特征本身的尺度差了三个数量级 | 输入那一层要单独做标准化。初始化管的是权重,管不了你的原始特征 |
先看两件事:你用的是不是残差结构(是 → 值得试), 你的模型够不够大(小模型上收益不明显)。而且一定要同时看学习率—— 只动一个往往看不出效果。
这一章没有新算法,一个损失函数也没改。它只回答一个问题:「深」这个物理量,靠什么维持?
读完你应该能:给一个新网络挑对初始化(ReLU → He,tanh → Xavier),并且知道训不动时先看逐层的梯度大小,
而不是 σW 那条线。想再压小初始化(§7),先确认你有残差结构、模型够大,而且学习率要一起调。
回到第 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)比调别的便宜。
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。