一句话定义:权重初始化(Weight Initialization)是指在训练开始之前,为神经网络里每一个权重参数赋予初始数值的过程。它看起来只是一次“填随机数”,实际上决定了信号能不能在几十上百层之间顺利传递。
为什么不能随便填
先把网络想象成一场接力传话:每一层都是一个传话人,把上一层的消息乘以权重、加上偏置,再交给下一层。如果每个传话人都习惯把音量压到九折,传过 50 层,声音只剩原来的 0.5%;反过来,每个人都放大一点,信号很快就会震耳欲聋。深度网络里的“信号”就是激活值和梯度,它的幅度会随着层数指数级放大或缩小——这就是梯度爆炸与梯度消失,而初始权重的尺度直接决定了开局往哪边走。
更极端的错误是全部填 0(或同一个常数)。此时同一层里所有神经元的输出完全一样,反向传播收到的梯度也一样,它们会永远同步更新,等于一层里只养了一个神经元。这种“对称性无法打破”是硬伤,所以偏置可以初始化为 0,权重不行。
Xavier 和 He 在做什么
Xavier 初始化(也叫 Glorot 初始化)的思路是:让每一层输出的方差大致保持不变,同时兼顾反向传播时梯度的方差,因此把权重方差取在 2/(fan_in + fan_out) 附近,其中 fan_in、fan_out 分别是该层的输入和输出连接数。它适合 tanh、sigmoid 这类两端会饱和的激活函数。
He 初始化(Kaiming 初始化)是 Xavier 针对 ReLU 的修正版。ReLU 会把一半的输入直接压成 0,相当于方差被砍掉一半,所以要把权重方差放大到约 2/fan_in 来补偿。一句话记法:用 ReLU 就用 He,用 tanh/sigmoid 就用 Xavier。
| 做法 | 权重尺度(近似) | 常见搭配 | 主要问题 |
|---|---|---|---|
| 全零 / 常数 | 0 | 无 | 对称性无法打破,学不动 |
| 固定小随机数 | 如 0.01 | 浅层网络 | 深层易梯度消失 |
| Xavier / Glorot | 2/(fan_in+fan_out) | tanh、sigmoid | 配 ReLU 偏小 |
| He / Kaiming | 2/fan_in | ReLU 及其变体 | 需正确判断 fan_in |
| 预训练权重 | 由上游模型给出 | 迁移学习、微调 | 依赖已有模型 |
和相邻概念的区别
它常被和 Batch Normalization、残差连接混为一谈。后两者是训练过程中持续稳定数值的手段,属于“中途补救”;初始化只在第 0 步起作用。但初始化做对了,后面的补救会轻松很多,甚至不需要。另外,加载预训练权重本质上也是一种初始化,只是起点不再是随机数,而是别人已经学到的东西——这也是微调能快速收敛的原因之一。
对从业者的实际意义
主流框架都给了默认初始化(如 PyTorch 的默认方案),所以日常很少手写。真正要小心的是三种情况:换了激活函数却没换初始化;自己手写层或自定义算子,忘了初始化;复现实验时发现换了随机种子结果波动很大,说明初始化尺度可能落在危险区间。排查顺序可以很简单——先看各层激活值的均值和方差是否随层数剧烈变化,再看梯度的量级。
一句总结:初始化不决定模型的上限,但决定它有没有机会开始学习。它不是“随便填的随机数”,而是一次经过计算的起步姿势。具体 API 与默认行为请以所用框架的官方文档为准。
