Ch06 神经网络基础修订于 二〇二六年七月二日
6.7 权重初始化
6.7.1 为什么初始化这么重要
训练神经网络的本质是用梯度下降在参数空间中寻找最优点。初始参数的位置决定了:
- 收敛速度:初始点离最优点近,几步就到了;离得远,可能要跑几万步
- 能否收敛:初始点落在”悬崖”上,梯度爆炸,参数飞掉;落在”平原”上,梯度消失,永远学不动
- 最终效果:不同的初始点可能收敛到不同的局部最优解
一个直观的例子:初始化全为0会怎样?所有神经元在每一层都输出相同的值,反向传播时梯度也相同,所以所有神经元学到的参数永远一样——这等于只训练了一个神经元,整个网络的表达能力被完全浪费。这个现象叫”对称性破坏”(symmetry breaking),随机初始化正是为了打破它。
6.7.2 Xavier初始化(Glorot初始化)
2010年,Xavier Glorot 和 Yoshua Bengio 提出:为了让信号在前向和反向传播中都不爆炸也不消失,每层权重的方差应该满足:
Var(W) = 2 / (n_in + n_out)
其中 n_in 是输入维度,n_out 是输出维度。用正态分布 N(0, sqrt(2/(n_in+n_out))) 或均匀分布采样。
Xavier初始化在Sigmoid/Tanh激活函数的时代效果很好,因为它假设激活函数在0附近近似线性。但ReLU出现了之后,这个假设不成立了。
6.7.3 He初始化(Kaiming初始化)
2015年,何恺明(Kaiming He)针对ReLU的特性做了修正。ReLU会把一半的神经元输出置零(负数区域),这意味着有效的信号方差会减半。He初始化的补偿方案:
Var(W) = 2 / n_in
分母只用 n_in(不用 n_out),分子是2(补偿ReLU的50%信号损失)。用正态分布 N(0, sqrt(2/n_in)) 采样。
实践效果:He初始化让ResNet(152层)训练成功,而Xavier初始化在同样深的网络上会梯度消失。这是为什么2015年之后,卷积网络几乎全部切换到He初始化。
6.7.4 不同初始化对训练的影响
| 初始化方法 | 适用激活函数 | 特点 | 典型场景 |
|---|---|---|---|
| 全零初始化 | 无 | 对称性不破坏,无法训练 | 永远不要用 |
| 全1初始化 | 无 | 同上,且梯度爆炸 | 永远不要用 |
| 小随机数 N(0, 0.01) | Sigmoid/Tanh | 浅层还行,深层梯度消失 | 2012年之前的做法 |
| Xavier | Sigmoid/Tanh | 信号方差在前向和反向都稳定 | 2012-2015年的主流 |
| He | ReLU及其变体 | 补偿ReLU的信号损失 | CNN标配,2015年至今 |
| 小随机数 N(0, 0.02) | GELU/SiLU | GPT系列的默认做法 | Transformer/LLM |
6.7.5 2026年默认做法
在2026年,如果你从零训练一个网络:
- CNN/ResNet:
torch.nn.init.kaiming_normal_(He初始化),搭配ReLU - Transformer/LLM:
torch.nn.init.normal_(std=0.02)或std=1/sqrt(d_model),这是GPT-2以来的经验默认值,虽然理论上不如He/Xavier优雅,但经过大量实验验证有效 - 简单MLP:He初始化 + ReLU,简单可靠
- PyTorch默认:
nn.Linear默认使用kaiming_uniform_,对大多数场景已经是合理的起点
← 上一节:6.6 归一化层:BatchNorm 与 LayerNorm | 下一节:6.8 前向传播:从输入到输出 →