神经网络的权重为什么不能初始化为全 0?Xavier、He 初始化是什么?
简化版
权重不能初始化为全 0(或全相同值):那样同一层所有神经元收到的输入、算出的输出、反向传播得到的梯度完全一样,更新后仍然一样——它们永远保持对称、学到的东西完全相同,等于每层只有一个有效神经元,网络学不到东西(对称性无法打破)。所以要随机初始化打破对称。但也不能随便随机——初始值太大→激活饱和/梯度爆炸,太小→信号逐层衰减/梯度消失。Xavier(Glorot)初始化 让权重方差适配「输入+输出神经元数」,保持前向和反向的信号方差稳定,适合 sigmoid/tanh;He 初始化 针对 ReLU(考虑负半轴被截断掉一半),是 ReLU 网络的标配。
详细版
为什么不能全 0(对称性问题):
全 0 或全相同 → 同层神经元前向输出相同 → 反向梯度相同 → 更新后仍相同
→ 同层神经元永远「对称」、学一样的东西 → 等价于每层一个神经元
- 必须随机初始化打破对称,让不同神经元学不同特征。
随机也有讲究(方差要合适):
| 初始值 | 后果 |
|---|---|
| 太大 | 激活进入饱和区、梯度爆炸 |
| 太小 | 信号逐层衰减、梯度消失 |
| 恰当 | 各层激活/梯度方差稳定 |
主流初始化:
| 方法 | 方差 | 适配激活 |
|---|---|---|
| Xavier/Glorot | 正态方差常取 2/(fan_in+fan_out) | sigmoid、tanh |
| He/Kaiming | ≈ 2/n_in 量级 | ReLU 及其变体 |
- 核心思想:让每层输出的方差 ≈ 输入的方差,信号不逐层放大或缩小。
完整版教学
一、为什么初始化很重要
神经网络训练前,权重要先赋一个初始值。这个初始值看似不起眼,其实严重影响能否训练起来:初始化不当会直接导致梯度消失/爆炸、对称性无法打破、收敛极慢甚至训不动。所以有一套专门的初始化方法(Xavier、He)。理解它要回答两个问题:为什么不能全 0(对称性)?为什么随机也要控制方差?
二、为什么不能全 0——对称性无法打破
假设把某一层所有权重都初始化为 0(或同一个常数),会发生什么:
- 前向:该层每个神经元收到相同的输入、用相同的权重,算出的输出完全相同。
- 反向:因为输出相同、在网络里的角色对称,每个神经元收到的梯度也完全相同。
- 更新:梯度相同 → 更新量相同 → 更新后这些神经元的权重依然完全相同。
于是同一层的所有神经元永远保持一模一样,学到的东西完全相同——等价于这一层只有一个有效神经元,网络的表达能力被浪费殆尽,根本学不到复杂特征。这叫对称性无法打破(symmetry breaking failure)。
结论:必须用随机初始化让每个神经元有不同的初始权重,从一开始就打破对称,使它们能分化、学到不同的特征。(注意:偏置 b 可以初始化为 0,因为权重随机已经打破了对称。)
三、随机也不能乱来——方差要合适
随机初始化打破了对称,但随机值的大小(方差) 还要仔细控制,否则会引发梯度问题(详见梯度消失专题):
- 初始权重太大:加权和 z 很大,激活进入饱和区(sigmoid/tanh 两端导数≈0)→ 梯度消失;或数值逐层放大 → 梯度爆炸。
- 初始权重太小:信号逐层被乘以小数、方差逐层衰减,传到深层几乎为 0 → 前向信号消失、梯度也消失。
理想状态是:让信号(激活值)和梯度在逐层传播时方差保持稳定——不逐层放大也不逐层缩小。Xavier 和 He 初始化就是为达到这个目标而设计的。
四、Xavier / Glorot 初始化:适配 sigmoid/tanh
Xavier(又叫 Glorot)初始化 的核心目标:让每一层输出的方差 ≈ 输入的方差,同时兼顾前向传播和反向传播的信号稳定。它根据该层的输入神经元数 n_in 和输出神经元数 n_out 设定权重方差:
权重方差 ≈ 2 / (n_in + n_out)
(均匀分布或正态分布采样,方差按此设定)
- 直觉:神经元连接越多(扇入扇出越大),每个权重就应该越小,才能让加权和的方差不至于爆炸。
- 常用于线性或 tanh;具体增益应匹配激活 这类关于 0 对称的激活函数。
五、He / Kaiming 初始化:适配 ReLU
He(又叫 Kaiming)初始化 是针对 ReLU 激活设计的。为什么 ReLU 要单独搞一套?因为 ReLU 会把负半轴全部置 0——对零均值对称输入,ReLU 约保留一半非零响应;He 初始化按二阶矩近似补偿这部分损失。为了补偿这个「减半」,He 初始化把方差放大一倍:
权重方差 ≈ 2 / n_in
- 只用输入神经元数 n_in,且系数是 2(Xavier 大致相当于系数 1)。
- 适合 ReLU;Leaky ReLU 等变体应按负斜率选择对应 gain,是现代 ReLU 网络(CNN、ResNet 等)的标配。
六、实践要点
- 选择:sigmoid/tanh → Xavier;ReLU 系 → He。用错会影响收敛(如 ReLU 用 Xavier 可能偏保守)。
- 框架默认:PyTorch/TF 的层通常有合理默认初始化(如线性层默认 Kaiming 均匀),一般不用手动设,但要知道原理。
- 配合 BatchNorm:有了 BN 后,网络对初始化没那么敏感(BN 会重新标准化每层输入),但好的初始化仍有帮助。
- 偏置:一般初始化为 0(偏置通常置 0;是否使用非零偏置应由具体结构验证,不能替代正确初始化)。
- 别用全 0/全相同:永远打不破对称。
七、从 fan-in 算出 Xavier 与 He 的标准差
设全连接层 fan_in=fan_out=100。Xavier 正态方差为 2/(100+100)=0.01,标准差是 0.1;ReLU 的 He 正态方差为 2/100=0.02,标准差约 0.1414。He 的标准差更大,是为了补偿 ReLU 截去负半轴后的二阶矩损失。
| 初始化 | 方差 | 本例标准差 | 典型激活 |
|---|---|---|---|
| Xavier normal | 2/(fan_in+fan_out) | 0.1000 | tanh、线性 |
| He normal | 2/fan_in | 0.1414 | ReLU |
| Leaky-ReLU Kaiming | 2/[(1+a²)fan_in] | 随负斜率 a 变化 | Leaky ReLU |
卷积层的 fan_in=K_h×K_w×C_in/groups,不能只拿输入通道数。初始化公式依赖独立、零均值等近似假设;残差分支、归一化层和门控结构还可能使用缩放或零初始化末层等专门策略。
记忆钩子:随机性负责打破对称,方差尺度负责让信号稳定;这是初始化的两个不同任务。
八、常见误区与追问
- 误区:只要不是全零,任意随机范围都可以。 过大或过小都会让前向与反向尺度逐层失真。
- 误区:所有偏置也必须随机才能打破对称。 随机权重已区分神经元,偏置通常可安全初始化为零。
- 追问:卷积层的 fan-in 怎么算? 用核高×核宽×每组输入通道数,分组卷积要除以 groups。
- 追问:为什么 Leaky ReLU 的 gain 依赖负斜率? 负半轴也保留能量,二阶矩不再恰好减半。
- 追问:有归一化层还要关注初始化吗? 仍要;归一化不能消除首步数值、残差分支和无归一化路径的风险。
九、加强记忆
权重不能初始化为全 0/全相同:同层神经元前向输出、反向梯度都相同→永远对称→学一样的东西,等于每层一个神经元(对称性无法打破),所以要随机初始化(偏置可为 0)。随机值的方差也要控制:太大→激活饱和/梯度爆炸,太小→信号衰减/梯度消失,目标是各层信号方差稳定。Xavier/Glorot(方差 ≈2/(n_in+n_out))适配 sigmoid/tanh;He/Kaiming(方差 ≈2/n_in,因 ReLU 砍掉负半轴使方差减半、放大一倍补偿)适配 ReLU 系,是现代 ReLU 网络标配。有了 BatchNorm 对初始化没那么敏感,但好初始化仍有益。