跳到主要内容

起点与刻度 — 初始化怎么定,以及把每层拉回同一把刻度

这一章讲两件事: 参数的起点怎么定——书里用一条不训练的输入,把「起点的散布」 和「逐层信号的强弱」之间的因果关系直接量了出来; 以及训练过程中每一层的数值怎么稳住——两件工具,一件沿批维、一件沿特征维。

它在全书链条里的位置: 第 07 章看到「信号传不回去」和「神经元卡死」两类故障, 当时只换了非线性。这一章处理另外两个病根:起点没定好、刻度逐层漂。 第 16 章的 Transformer 编码器里,这一章的两件工具会原样出现。

需要的基础: 第 07 章的两个坑;第 04 章的方差与标准差。

1. 先看现象:同一个起点,毁掉同一张网络

回看前面埋下的三处伏笔:

  • 第 07 章第 2 节:所有参数设成同一个值,同一层的所有神经元就退化成一个—— 前向输出一样,反向梯度也一样,怎么训都分不开;
  • 第 07 章第 5 节:偏置初始化成 −8,整条网络五层梯度全为零——神经元集体卡死;
  • 第 10 章第 3 节:循环层的权重乘了 0.1 做小尺度初始化, 代码注释写明——否则标准正态初始化会让那道非线性一开始就饱和、网络难以训练。

三次故障,同一个病根:起点。 书里的说法是: 训练本质上是在一个非凸损失面上做优化,起点选在哪里直接影响优化的难度与最终的泛化能力1

这一章要回答的就是:起点该怎么撒,撒多大。

全章主走查(第一处):不训练,只看一次前向
═══════════════════════════════════════════════════════════════════
网络 100 → 200 → 400 → 300 → 200 → 100(六层,激活用那条 S 形曲线)
输入 一条均值 0、标准差 0.1 的随机向量,形状 [1, 100]
动作 只跑一次前向,打印每一层输出的方差
───────────────────────────────────────────────────────────────────
§3 ① 高斯起点,按输入输出维度缩放:0.005416 / 0.003292 / 0.003820 / 0.004489
§4 ② 均匀起点,同一套缩放: 0.005596 / 0.003397 / 0.004084 / 0.005171
§5 ③ 第二处走查:换网络也换数据,缩放 vs 不缩放的损失曲线
§7 ④ 沿批维拉回刻度:(0.688, −0.806)/(18.35, 15.49) → (≈0, ≈1)
§8 ⑤ 训练时累积、推断时改用:滑动均值 (−0.633, 0.176)
═══════════════════════════════════════════════════════════════════

2. 三类起点:随机、拿别人训好的、按先验固定

书里把主流初始化策略归为三类2:

怎么做什么时候用
随机初始化用一个随机分布逐参数采样最常用的默认选项
预训练初始化把已经在大规模数据上训好的模型当起点,再针对目标任务微调目标任务数据稀少时
固定值初始化对带先验知识的关键参数显式赋值例如用那道折线激活时把偏置设成 0.01 这样的微小正数,防止一开始就输出零

预训练初始化通常效果最稳,但灵活性差——网络结构一改,现成权重就对不上了。 所以工程默认仍是随机初始化3

这一章聚焦随机初始化的一个问题:撒多大? 最朴素的撒法是从一个固定形状的分布里采——比如均值 0、方差 σ² 的高斯分布, 或者区间 [−r, r] 内的均匀分布(区间内每个数等概率被抽到)4

问题在「固定」两个字上: 第一层 100 个输入、第四层 700 个输入, 同一把尺子撒出来的权重,经过形状完全不同的层,信号会被逐层放大或衰减。 第 07 章那两类故障,本质就是这件事在反向传播方向上的表现。

3. 主走查 ①:按输入输出维度缩放的高斯起点

补救思路:让每一层的散布跟着这一层的形状走。 这种按层的输入、输出神经元数量自适应调整初始方差的做法,书里叫方差缩放; 其中最有代表性的方案叫 Xavier 初始化—— 它把权重的方差表示成输入维与输出维的函数5

在那条 S 形激活、高斯采样的设定下,权重按「均值 0、标准差 √(2/(输入维+输出维))」采样5

直觉上这条公式在干什么:输入维越大,每个权重就越小。 一个神经元的输出是几百个输入的加权和——进来的路数越多,每一条的贡献就必须越小, 加出来的总和才不至于涨破天。 推导书里指回了教科书全本6

书里还有一条提醒:Xavier 的推导针对的是 S 形那类两端会压平的激活; 换成第 07 章那道折线激活,方差公式要改用另一个版本——那个版本叫 He 初始化7

现在跑主走查。 搭一个六层网络,层宽 100 → 200 → 400 → 300 → 200 → 100, 激活用那条 S 形曲线,按 Xavier 高斯方案初始化; 喂一条均值 0、标准差 0.1 的随机输入,只跑一次前向,不训练8:

主走查第 ① 步:逐层输出的方差(Xavier 高斯)
────────────────────────────────────────────────
layer 0: 0.005416
layer 1: 0.003292
layer 2: 0.003820
layer 3: 0.004489
────────────────────────────────────────────────
输入自身的方差:0.1² = 0.01

读这组数:四层输出的方差都在 0.003 到 0.006 之间——同一个数量级。 书里的结论是:Xavier 高斯初始化把每一层的方差稳定在了同一个数量级, 未出现典型的指数式衰减或膨胀9

「同一数量级」为什么值得追求? 回到第 07 章那条因果: 信号每过一层被乘一次,层与层之间只要稳定差一个固定的小倍数,几十层下来就是指数级的消失或爆炸。 把每一层的进出比拉回到 1 附近,这条乘法链就失效了。

4. 主走查 ②:换成均匀起点,结果几乎一样

同一个缩放思路还有一个均匀分布版本: 区间半径取 r = √(6/(输入维+输出维)),在 [−r, r] 内均匀采样10

主走查第 ② 步:同一个网络、同一条输入,只换初始化方式11:

逐层输出的方差(Xavier 均匀)
────────────────────────────────────────────────
layer 0: 0.005596
layer 1: 0.003397
layer 2: 0.004084
layer 3: 0.005171

两组数逐项对比,最大相对差不到两成——同一量级。 书里的结论是:两种 Xavier 方案在保持方差稳态上效果接近11

这一组对照的教学意义不在「均匀也能用」,而在: 决定成败的是「按形状缩放」这条规则,不是采样分布的形状。

5. 第二处走查:换网络也换数据,看训练曲线分不分开

方差稳了,训练就一定更快吗? 书里没有停在一次前向上, 而是换了网络、换了数据,真训一遍12:

第二处走查的设定
────────────────────────────────────────────────
网络 2 → 300 → 500 → 700 → 400 → 1(六层,S 形激活)
数据 300 条弯月数据,200 条训练、100 条验证
训练 每步喂 10 条、每步挪 0.005、训 100 轮
对照 Xavier 高斯起点 vs 不缩放的标准正态起点

注意这不是单变量演示的延续——网络、数据、任务全换了。 第 3、4 节那两组网状数字只证明「一次前向的方差稳」, 这一组才回答「训练曲线是不是也跟着受益」。

结果:两条损失曲线明显分开——Xavier 起点的损失更低、收敛也更稳13。 书里的解释是:它按每层输入输出维度调整初始权重的方差, 避免了固定方差初始化在深网络里逐层放大或衰减信号的问题13

诚实地说一句边界:书里只给了两条曲线的图,没有打印逐点数值。 「明显更低」是图上的形态,不是一个精确的分差。

6. 换一件工具:训练过程中,每一层的刻度还在漂

起点定好,只解决了第 0 步的问题。 训练一开始,前面各层的参数就在动; 第 l 层接收到的输入分布会随着前面各层的更新持续漂移, 迫使这一层不断适应新的分布——这种现象叫内部协变量偏移,是深网络训练困难的重要诱因之一14

书里给的工具是:把数据预处理阶段那个「归一化」思想移植到网络的中间层, 对每一层的输入做即时规范化,使其分布保持稳定15。 这一类做法统称逐层规范化

两件工具,差别只在「沿哪个方向求均值和方差」16:

把一批数据写成 K 行 D 列的表(K 条样本,每条 D 个特征)
────────────────────────────────────────────────────────────
批量规范化(BN) 沿列求:同一个特征,跨样本算均值方差
——回答「这个特征在这一批里整体偏多少」
层规范化(LN) 沿行求:同一条样本,跨特征算均值方差
——回答「这条样本自己的数值散布是多少」

两件工具的共同骨架: 先减均值、除以标准差,把数值拉回 (0, 1) 附近; 然后再乘以一对可学习的缩放与平移参数 (γ, β)—— 为什么不拉回 (0, 1) 就完事?因为 S 形激活在 0 附近恰好是近似直线, 拉得太标准反而会削弱非线性表达力;γ、β 让网络自己决定要不要还原回去17

γ、β 是可学习的参数,跟其他权重一样被优化器更新18

7. 沿批维那一版:两组数,一组漂走,一组拉回

先看沿批维的批量规范化(名字 Batch Normalization,通常缩写 BN)。

书里搭了两个结构相同的网络:一个不带 BN、一个带, 喂同一批 200 条、每条 100 维的随机数据(均值≈0、标准差≈1), 看第 4 层净输入的分布19:

第 4 层净输入的均值与标准差(两个特征维)
────────────────────────────────────────────────────
不带 BN 均值 (0.688, −0.806) 标准差 (18.35, 15.49)
带 BN 均值 (≈0, ≈0) 标准差 (1.0000, 1.0000)
────────────────────────────────────────────────────
输入本来是近似 (0, 1);穿过前 4 层之后,
不带 BN 的版本已经漂到标准差 15 以上

这就是内部协变量偏移的实物照片:输入是标准的,四层之后就不认识了。 而带 BN 的版本被严格拉回了 (0, 1) 附近20

γ、β 不是摆设。 书里给不同层显式指定了不同的缩放与平移 (γ = [1, 2, 3, 5, 4],β = [3, 2, 1, 2, 2]),再测21:

第 0 层输出 均值 3.0、标准差 1.0 ← 正是 β₀=3、γ₀=1
第 3 层输出 均值 2.0、标准差 5.0 ← 正是 β₃=2、γ₃=5

规范化之后的分布,精确地落在你指定的刻度上——(γ, β) 就是那把刻度的两个旋钮。

8. 双模式:训练时看这一批,推断时看攒下的账本

BN 有一个绕不开的工程问题:它的均值方差是从「这一批」算出来的。 推断时如果还这么干,同一个样本的预测结果就会受同批其他样本影响—— 这在产品里是不可接受的。

书里的做法:训练过程中以滑动平均的方式持续累积全局的均值和方差, 推断时改用这套累积统计量,不再看当前这批22

书里用 50 次前向验证了这个累积——只前向、不更新权重,第 3 层 BN 攒下的账本是23:

50 次前向之后,第 3 层 BN 的滑动统计量
────────────────────────────────────────────────
滑动均值 (−0.633, 0.176)
滑动方差 (149.98, 267.16)

切到推断模式(第 03 章那句切换语句),BN 就改用账本上的数,而不是当前批的数24这就是第 03 章说「少一句切推断模式,同一份输入会给出不一致的输出」的两个元凶之一 (另一个是第 14 章要讲的随机关闭)。

这两个模式在代码里的落点:那两份账本不是参数、不参与梯度, 框架里用一种「跟着模型走、会被保存加载、但不回传梯度」的容器登记25

BN 的效果书里在手写数字数据上做了对照:同一个轻量卷积网络, 带 BN 的版本收敛明显更快、最终精度也更稳26书里还补了一句重要的史观:BN 最初是为缓解内部协变量偏移而提出的, 但后续研究发现它真正的核心收益其实是把损失曲面「熨平」、稳住梯度27—— 工具的真实价值,常常不是它被发明时的那个理由。

9. 沿特征维那一版:没有双模式,小批量下更稳

BN 的软肋在「沿批维」三个字上: 它要在每一批里估计每个特征的均值方差,批量太小,统计量就失真28。 而有一类任务批量天然大不了——序列模型、生成模型(负责产出文本、图像这类新样本的模型)。

沿特征维的层规范化(名字 Layer Normalization,通常缩写 LN)就没有这个软肋: 它对每一条样本自己的特征维求均值方差,根本不跨样本, 因此没有「训练时统计、推断时用」的双模式,训练/推断走的是同一段代码29

书里的验证实验:10 条 100 维的随机数据,过带 LN 的五层网络, 同样给每层指定不同的 (γ, β),输出被严格压回对应刻度—— 第 0 层 10 条样本均值全是 3、标准差全是 1;第 3 层全是 2、全是 530

两件工具怎么选? 书里的说法是: 一般来说 BN 收敛和泛化更好,是卷积网络的默认选项; 但当批大小必须很小时,BN 的统计量噪声大反而拖累训练,这时 LN 就是更稳的选择31

LN 还有一个更重要的去向:第 16 章要搭的 Transformer 编码器, 每个组块里两次「相加再拉回刻度」,用的就是它。它在编码器里的具体位置,第 16 章第 6 节讲。

10. 作者的判断与证据

书里给了证据的:

  • Xavier 起点下逐层方差同一量级——高斯、均匀两组打印数值911;
  • 缩放起点训练曲线更低更稳——第二处走查的两条曲线13;
  • BN 把 (0.688, −0.806)/(18.35, 15.49) 拉回 (0, 1)——打印数值20;
  • (γ, β) 精确控制输出刻度——两组打印数值2130;
  • BN 收敛更快——手写数字上的对照曲线26

属于后续研究、书里转述的:

  • 「BN 真正的收益是熨平损失曲面」——书里明说这不是原始动机,是后续研究的发现27;
  • 「BN 收敛和泛化更好、小批量用 LN」——经验说法,书里没给对照实验31

判断(我们的,不是书里的):这一章的两件工具解决的是同一个问题的两个时刻。 初始化管「第 0 步的刻度」,规范化管「每一步的刻度」—— 前者是一次性的,后者是持续的。把它们放进同一章是对的: 第 07 章那两类故障,病根不是「非线性选错了」,而是「数值的尺度没人管」。 如果错,会错在: 如果读者的网络只有两三层,尺度问题确实不致命, 初始化随便撒、规范化不加也能训。判据是:第 5 节那个六层网络上, 不缩放的起点是不是明显更差——书里说是。

11. 边界与局限

这一章没覆盖的:

没讲什么依据 / 为什么值得知道
He 初始化的公式与实验书里只给了名字,实验留成了动手练习7
Xavier 的推导指回教科书全本第 7.3.2.1 节6
残差网络里的专用初始化全书没有涉及
规范化在循环网络里的用法这一章的实验全是前馈与卷积

出门会撞见的名字:

  • Xavier / Glorot 初始化 —— 第 3 节那一族缩放起点;Glorot 是提出者的姓,两个名字指同一件事;
  • He / Kaiming 初始化 —— 折线激活对应的那一版7;
  • nn.BatchNorm1d / 2dnn.LayerNorm —— 框架内置的两件工具;
  • running_mean / running_var —— 第 8 节那两份账本在框架里的名字;
  • 权重标准化(Weight Standardization)、组规范化(GroupNorm) —— 这一族的其他成员,本书没讲。

12. 可带走的

  1. 起点是第 07 章两类故障的第一现场——全同值退化、大负偏置卡死、散布过大饱和,三次都是起点;
  2. 三类起点:随机、拿别人训好的、按先验固定;工程默认是随机;
  3. 方差缩放的核心规则是「按层的形状定散布」——输入维越大,每个权重越小;
  4. Xavier 高斯与均匀效果接近——决定成败的是缩放规则,不是分布形状;
  5. 一次前向的方差稳 ≠ 训练一定更快——书里为此专门换了网络和数据做第二组实验;
  6. 内部协变量偏移:前面层在动,后面层的输入分布就一直在漂;
  7. 逐层规范化两件工具:BN 沿批维(跨样本),LN 沿特征维(样本内);
  8. 拉回 (0, 1) 之后还要 (γ, β)——拉得太标准会削弱非线性,让网络自己决定刻度;
  9. BN 有双模式:训练看当前批,推断用攒下的滑动平均账本——推断模式那句切换管的就是它;
  10. BN 的真实收益是熨平损失曲面——不是它被发明时的理由;
  11. 小批量用 LN——它没有双模式,也是 Transformer 的默认零件。

13. 原文地图

主题原书章原文位置
起点为什么重要第7章 网络优化与正则化text/08-ch07.txt:1262(搜「起点选在哪里」)
三类起点第7章 网络优化与正则化text/08-ch07.txt:1266(搜「主流初始化策略可归为三类」)
方差缩放与 Xavier第7章 网络优化与正则化text/08-ch07.txt:1275(搜「方差缩放」)
高斯 Xavier 逐层方差第7章 网络优化与正则化text/08-ch07.txt:1386(搜「0.005416」)
均匀 Xavier 逐层方差第7章 网络优化与正则化text/08-ch07.txt:1415(搜「0.005596」)
第二处走查第7章 网络优化与正则化text/08-ch07.txt:1423(搜「真实训练任务上对比」) · text/08-ch07.txt:1489(搜「明显更低」)
内部协变量偏移第7章 网络优化与正则化text/08-ch07.txt:1503(搜「内部协变量偏移」)
为什么要 (γ, β)第7章 网络优化与正则化text/08-ch07.txt:1521(搜「过度规范化」)
BN 拉回刻度第7章 网络优化与正则化text/08-ch07.txt:1671(搜「18.348772」)
指定 (γ, β)第7章 网络优化与正则化text/08-ch07.txt:1697(搜「output means with bn 0」)
双模式与移动平均第7章 网络优化与正则化text/08-ch07.txt:1531(搜「训练和推断两种模式」) · text/08-ch07.txt:1715(搜「moving mean」)
MNIST + BN第7章 网络优化与正则化text/08-ch07.txt:1728(搜「熨平」)
LN 与双模式第7章 网络优化与正则化text/08-ch07.txt:1833(搜「对每行做归一化」) · text/08-ch07.txt:1896(搜「同一段代码」)

Footnotes

  1. 出处:「第7章 网络优化与正则化」第 1262 段(text/08-ch07.txt:1262,搜「起点选在哪里」)。原文:神经网络的训练本质上是在一个非凸损失面上做优化,起点选在哪里直接影响优化的难度与最终模型的泛化能力。

  2. 出处:「第7章 网络优化与正则化」第 1266 段(text/08-ch07.txt:1266,搜「主流初始化策略可归为三类」)。三类:随机初始化(最常用默认)、预训练初始化(目标任务数据稀少时,把已在大规模数据上训练好的模型作为起点再微调)、固定值初始化(对带先验知识的关键参数显式赋值,例如使用 ReLU 时常把偏置设为一个微小正数如 0.01,确保前向输出不会一开始就为 0,缓解死亡 ReLU)。

  3. 出处:「第7章 网络优化与正则化」第 1274 段(text/08-ch07.txt:1274,搜「灵活性差」)。原文:预训练初始化通常效果最稳,但灵活性差——网络结构一旦改动就难以直接复用现成权重;因此工程中默认仍是随机初始化。

  4. 出处:「第7章 网络优化与正则化」第 1280 段(text/08-ch07.txt:1280,搜「固定分布中采样」)。原文:最简单的随机初始化是从均值为 0、方差为 σ² 的固定分布中采样;常用形式有两种——高斯分布初始化与均匀分布初始化。

  5. 出处:「第7章 网络优化与正则化」第 1275 段(text/08-ch07.txt:1275,搜「方差缩放」)。原文:在深网络中,固定方差初始化的问题是——层数一深,前向激活值的方差会沿层指数衰减或膨胀,进而触发梯度消失或爆炸;一个直接的缓解思路是方差缩放(Variance Scaling),根据当前层的输入/输出神经元数量自适应地调整初始化方差,使前向和反向方向上的方差近似稳定;Xavier 初始化就是其中最具代表性的方案,在 Tanh 激活、高斯采样的设定下,权重按 N(0, 2/(输入维+输出维)) 采样。 2

  6. 出处:「第7章 网络优化与正则化」第 1300 段(text/08-ch07.txt:1300,搜「推导细节可参考」)。这是笔记框:Xavier 初始化的推导细节可参考《神经网络与深度学习》第 7.3.2.1 节。 2

  7. 出处:「第7章 网络优化与正则化」第 1312 段(text/08-ch07.txt:1312,搜「He 初始化」)。这是笔记框:Xavier 初始化的原始推导针对 Tanh 和 Logistic 等饱和型激活;对 ReLU 等非对称激活,方差公式应改用 He 初始化形式;本节给出的函数是 Tanh 家族的版本。He 初始化的动手实现是练习 7.9(第 1492 段,text/08-ch07.txt:1493,搜「he_normal_std」)。 2 3

  8. 出处:「第7章 网络优化与正则化」第 1366 段(text/08-ch07.txt:1366,搜「构造一个 5 层网络」)。设定:layers_size = [100, 200, 400, 300, 200, 100],激活函数 Tanh,Xavier 高斯初始化;输入为 torch.normal(0.0, 0.1, size=[1, 100]);代码只跑一次前向并打印每层输出的方差。

  9. 出处:「第7章 网络优化与正则化」第 1386 段(text/08-ch07.txt:1386,搜「0.005416」)与第 1391 段(text/08-ch07.txt:1391,搜「同一个数量级」)。打印输出:layer 0: 0.005416、layer 1: 0.003292、layer 2: 0.003820、layer 3: 0.004489;书里结论:Xavier 高斯初始化把每一层的方差稳定在了同一个数量级,未出现典型的指数式衰减或膨胀。 2

  10. 出处:「第7章 网络优化与正则化」第 1393 段(text/08-ch07.txt:1393,搜「均匀分布初始化」)。原文:若改用区间 [−r, r] 的均匀分布采样权重,Xavier 方案下 r = √(6/(输入维+输出维))。

  11. 出处:「第7章 网络优化与正则化」第 1415 段(text/08-ch07.txt:1415,搜「0.005596」)与第 1420 段(text/08-ch07.txt:1420,搜「几乎在同一量级」)。打印输出:0.005596 / 0.003397 / 0.004084 / 0.005171;书里结论:数值与高斯版本几乎在同一量级——两种 Xavier 方案在保持方差稳态上效果接近。 2 3

  12. 出处:「第7章 网络优化与正则化」第 1423 段(text/08-ch07.txt:1423,搜「真实训练任务上对比」)与第 1456 段(text/08-ch07.txt:1456,搜「layers_size」)。设定:layers_size = [2, 300, 500, 700, 400, 1],Tanh 激活,make_moons 生成 300 条样本(200 训练、100 验证),批大小 10,SGD 学习率 0.005,两个结构完全相同的网络分别用 Xavier 高斯与未缩放的标准正态初始化,各训 100 个回合。

  13. 出处:「第7章 网络优化与正则化」第 1489 段(text/08-ch07.txt:1489,搜「明显更低」)。原文:Xavier 初始化对应的损失曲线明显更低、收敛也更稳——它按每层输入输出维度调整初始权重的方差,避免了固定方差初始化在深网络里逐层放大或衰减信号的问题。 2 3

  14. 出处:「第7章 网络优化与正则化」第 1503 段(text/08-ch07.txt:1503,搜「内部协变量偏移」)。原文:随着前面若干层参数的更新,第 l 层接收到的输入分布会持续漂移,迫使该层不断适应新的分布——这种现象被称为内部协变量偏移(Internal Covariate Shift),是深网络训练困难的重要诱因之一。

  15. 出处:「第7章 网络优化与正则化」第 1500 段(text/08-ch07.txt:1500,搜「把数据预处理阶段常见的」)。原文:逐层规范化(Layer-wise Normalization)把数据预处理阶段常见的「归一化」思想移植到深网络的中间层——对每一层的输入做即时规范化,使其分布保持稳定,从而显著提升训练效率。

  16. 出处:「第7章 网络优化与正则化」第 1822 段(text/08-ch07.txt:1822,搜「归一化的方向不同」)与第 1833 段(text/08-ch07.txt:1833,搜「对每行做归一化」)。原文:BN 沿样本维求均值方差(同一神经元跨批次),LN 沿特征维求均值方差(同一样本跨神经元);把小批量写成 K 行的矩阵后,LN 是对每行做归一化,BN 是对每列做归一化。

  17. 出处:「第7章 网络优化与正则化」第 1521 段(text/08-ch07.txt:1521,搜「过度规范化」)。原文:直接把每一层强行拉回到均值 0、方差 1 并不总是好事——如果激活函数是 Sigmoid 型,0 附近恰好处于近似线性区间,过度规范化反而会削弱非线性表达力;为此,BN 在标准化之后又额外引入一对可学习的缩放与平移参数 (γ, β),让网络自行决定到底要不要还原回原始分布。

  18. 出处:「第7章 网络优化与正则化」第 1550 段(text/08-ch07.txt:1550,搜「必须用nn.Parameter包装」)。这是书里代码的注释:gamma 和 beta 是可学习参数,必须用 nn.Parameter 包装才会被优化器更新。

  19. 出处:「第7章 网络优化与正则化」第 1641 段(text/08-ch07.txt:1641,搜「内部协变量偏移实验」)与第 1647 段(text/08-ch07.txt:1647,搜「layers_size」)。设定:layers_size = [100, 200, 400, 300, 2, 2],200 条 100 维随机输入,一个不带 BN、一个带 BN(γ = 1、β = 0),比较第 4 层净输入的分布。

  20. 出处:「第7章 网络优化与正则化」第 1671 段(text/08-ch07.txt:1671,搜「18.348772」)与第 1678 段(text/08-ch07.txt:1678,搜「严格拉回」)。打印输出:不带 BN 时输出均值 [0.688, −0.806]、标准差 [18.35, 15.49];带 BN 后均值约 0、标准差 1.0;书里结论:这正是 BN「稳住每层分布」的直接效果。 2

  21. 出处:「第7章 网络优化与正则化」第 1684 段(text/08-ch07.txt:1684,搜「gamma = [1, 2, 3, 5, 4]」)与第 1697 段(text/08-ch07.txt:1697,搜「output means with bn 0」)。设定 γ = [1, 2, 3, 5, 4]、β = [3, 2, 1, 2, 2];打印输出:第 0 层均值 3.0、标准差 1.0,第 3 层均值 2.0、标准差 5.0。 2

  22. 出处:「第7章 网络优化与正则化」第 1531 段(text/08-ch07.txt:1531,搜「训练和推断两种模式」)。原文:训练时每个小批量直接按当前批次估计均值方差;推断时若仍依赖批次统计量,会让同一个样本的预测受同批其他样本影响;常见做法是在训练过程中以指数移动平均的方式记录全局均值方差,推断时改用这套累计统计量。

  23. 出处:「第7章 网络优化与正则化」第 1715 段(text/08-ch07.txt:1715,搜「moving mean」)。50 次前向(不更新权重,仅触发统计累积)后打印:batch norm 3 moving mean: [[−0.633, 0.176]];moving variance: [[149.98, 267.16]]。

  24. 出处:「第7章 网络优化与正则化」第 1719 段(text/08-ch07.txt:1719,搜「切换到推断模式」)。原文:切换到推断模式(model.eval()),BN 会改用累积的移动均值/方差代替当前批次的统计量。

  25. 出处:「第7章 网络优化与正则化」第 1553 段(text/08-ch07.txt:1553,搜「register_buffer」)。这是书里代码的注释:moving_mean / moving_variance 是不参与梯度的「缓冲区」,用 register_buffer 注册后会随 model.to(device) 一同迁移、并被 state_dict 保存/加载。

  26. 出处:「第7章 网络优化与正则化」第 1794 段(text/08-ch07.txt:1794,搜「收敛速度上明显更快」)。原文:启用 BN 的版本在收敛速度上明显更快,且最终精度也更稳,与前述分析吻合;实验为两层卷积网络在 MNIST 上训 5 轮,Adam 学习率 0.01。 2

  27. 出处:「第7章 网络优化与正则化」第 1728 段(text/08-ch07.txt:1728,搜「熨平」)。原文:BN 最初是为了缓解内部协变量偏移而提出的,但后续研究发现它真正的核心收益其实是把损失曲面「熨平」、稳住梯度,从而显著提升训练速度。 2

  28. 出处:「第7章 网络优化与正则化」第 1638 段(text/08-ch07.txt:1638,搜「最低要求」)。原文:由于 BN 要在每个小批量里估计单个神经元的均值方差,因此对批大小有最低要求——批量太小,统计量会失真。

  29. 出处:「第7章 网络优化与正则化」第 1896 段(text/08-ch07.txt:1896,搜「同一段代码」)。原文:由于 LN 只用样本自身的特征做归一化,不存在「训练时统计、推断时用」的双模式,因此训练/推断走的是同一段代码——这一点既是 LN 对小批量友好的根源,也是它和 BN 在工程行为上最显眼的区别。

  30. 出处:「第7章 网络优化与正则化」第 1889 段(text/08-ch07.txt:1889,搜「output means with ln 0」)。打印输出:第 0 层 10 条样本均值全为 3、标准差全为 1;第 3 层均值全为 2、标准差全为 5。 2

  31. 出处:「第7章 网络优化与正则化」第 1834 段(text/08-ch07.txt:1834,搜「一般来说 BN」)。原文:一般来说 BN 收敛和泛化更好,所以是 CNN 的默认选项;但当批大小必须很小(如序列模型、对比学习、生成模型)时,BN 的统计量噪声大反而拖累训练,这时 LN 就是更稳的选择。 2