本节摘要:架构选定后,参数从什么数值起步决定了第一轮训练是健康收敛还是原地卡死。本节讲解全零初始化的对称陷阱、随机与 Xavier/He 初始化的动机、以及随机种子造成的可观察波动,让你明白"换个种子成绩就变"的来源。
阅读完本节,你应当能够:
一路走来我们定了数据、定了模型。现在第一次真正起训,你会遇到一个反直觉的事实:同一个架构,同一份数据,权重初始化的选择能决定收敛或发散。新手常忽略这一步,因为它在损失曲线最前段看不出名堂;但一个取错的初始化分布,往往让模型在前几层就失去意义。
用一个类比把尺度问题想清楚:权重初始化就像是决定你要站在哪座山谷的哪一处开始爬山。站在谷底附近起步,几步就能靠近最优点;站在陡崖边缘起步,一步踏空就滚下山坡(数值发散);而全零初始化则像把所有人绑在同一位置、推他们朝同一个方向走,结果谁也走不出彼此。调参的热闹都在后面,但这一步落脚,往往就决定了这场"爬山的起点"合不合适。
如果所有权重初始化成同一个值——比如全 0——那网络里同一层的所有神经元,在训练里永远接收相同的输入、产生相同的梯度、更新后仍是相同的权重。对称永远打不破,隐含层退化成一个神经元,学习能力归零。这就是所谓的"对称破碎"问题,唯一的出路是随机打破对称。
这也是为什么偏置(bias)可以初始化为零,而权重绝不能全零——神经元之间的差异化,必须由权重这一步的随机性来注入。
只随机还不够。权重取值的尺度,要和它前后的传播尺寸配套,否则梯度在一个方向上被连环放大或缩小:
于是有了两份按传播尺寸调和的方案:
| 初始化 | 思路 | 适用激活 |
|---|---|---|
| Xavier(Glorot) | 让每层输入/输出方差守恒 | 适中,配合 t锚与双曲正切 |
| He(Kaiming) | 为 ReLU 保留更多方差 | ReLU 及其变体 |
经验法则:用 ReLU 家族,选 He;用双曲正切/软饱和,选 Xavier。多数现代框架默认初始化已经不错,但你至少该知道默认值大概在解决什么问题,以及换掉它可能引入的新问题。
# 示意:显式指定初始化分布(概念性写法) import torch.nn as nn def init_weights(m): if isinstance(m, nn.Linear): nn.init.kaiming_normal_(m.weight, nonlinearity="relu") if m.bias is not None: nn.init.zeros_(m.bias) net.apply(init_weights)
上手后怎么判断自己的初始化是不是健康?一个有成本的做法是做一次"单步前向检查":在正式训练前,喂一批数据跑一次前向和反向,看一眼各层激活值的方差、以及首轮梯度是否在合理量级(比如不是天文数字也不是趋近零)。如果某几层激活方差在传递几十层后要么爆炸要么坍缩,你的初始化尺度大概率没配好——这时不是去撞运气试超参,而是回头调初始化分布本身。这一步成本极低,却能帮你把"初始化埋雷"这类坑扼杀在训练开始之前。
落到工程里还有个务实的取舍。多数现代框架的默认初始化已经针对主流激活调过,所以在大多数任务上,你其实不需要自己手写 Xavier/He——直接信任框架默认往往既省事又安全。真正值得你手动改默认的场景只有几种:换了极深或极浅的架构、换了非主流激活、或者你明显观察到"首轮梯度异常",前面说的单步前向检查喊了警。换句话说,初始化不是那种"每跑一个任务都要重新配置一遍"的旋钮,而是一个"默认可用、只在异常时排查"的地基。把它当常态检查项,而不是调参的常规动作,你的精力就能省下来留给后面真正收益高的旋钮。
随机初始化意味着每次跑,模型都在不同的起点上路,最终成绩围绕某个期望值抖动。这就是你常遇到的"同一个模型换了个种子,验证集分数波动 0.01-0.02"的来源——不是代码出错,是初始化与数据 shuffle 引入的随机性。
应对不是"固定种子压住波动",而是用多次运行看结论:对关键超参做对比时,每个配置跑 2-3 个种子取平均,别被单次抽中的好运或霉运误导。这也回到第一章"验证信号要稳"的纪律:用多个随机起点取均值,比单次点值更能代表真实水平。
一个具体的操作习惯:比较超参 A 与超参 B 谁更好时,不要跑一次就下结论。给 A、B 各跑三个不同种子,如果 A 的 {0.920, 0.923, 0.925} 明显高于 B 的 {0.902, 0.905, 0.907},你才有底气说 A 胜出;如果两组分数互相穿插、取值范围几乎重叠,那"谁更好"只是随机噪声,继续调下去纯属给自己找错觉。
⚠️ 常见坑:为了"复现"把种子固定在 42,然后拿着这单一结果调参——你其实是在给随机性的一个特定实现调参,调到别处就失效。复制种子用于排障与研究可以,但选型置信度要建立在多次运行的分布上。
💡 关键直觉:如果同一配置在不同种子上分数忽高忽低,说明这个超参数组合本身就敏感——这本身就是一条信号,提示这个区域的解像"陡峭的山脊"而非开阔的平原,需要在调试里警惕。
起点定好了,接下来进入真正"发生训练"的核心——第四章损失、优化器与梯度下降。