2. 参数初始化策略:零初始化、随机初始化、Xavier初始化、He初始化,适用场景与对比
好,咱们直接进入正题。
参数初始化这事儿,看着不起眼,但坑特别多。我早年做经济模型训练时,就因为初始化没选对,模型死活不收敛。折腾了两天,最后发现是初始化策略的问题。嗯,从那以后,我对这块就特别上心。
说白了,初始化就是给模型的每个参数(权重和偏置)赋一个初始值。这个初始值选得好,模型训练就顺风顺水;选得不好,梯度消失、梯度爆炸、收敛慢,各种问题全来了。
2.1 零初始化
最直观的想法:把所有参数都设成0。简单吧?但这是个陷阱。
为什么?你想想看,如果所有神经元的权重都是0,那同一层的每个神经元接收到的输入信号完全一样,计算出的梯度也完全一样。结果就是,所有神经元都在做同样的更新——它们永远学不到不同的特征。这叫“对称性问题”。
适用场景:
- 逻辑回归(单层网络)—— 可以用,因为只有一层,不存在对称性问题
- 某些简单的线性模型
不适用场景:
- 任何多层神经网络
- CNN、RNN、Transformer等复杂结构
2.2 随机初始化
既然零不行,那就随机给值。常见做法是从均匀分布或正态分布中采样。
# 均匀分布随机初始化
W = np.random.uniform(-0.1, 0.1, size=(input_dim, output_dim))
# 正态分布随机初始化
W = np.random.randn(input_dim, output_dim) * 0.01
随机初始化打破了对称性,每个神经元可以学到不同的特征。但问题来了:随机值的尺度怎么选?
如果随机值太大:
- 经过激活函数后,输出容易饱和(比如sigmoid进入平坦区)
- 梯度趋近于0,参数几乎不更新
如果随机值太小:
- 信号在传播过程中逐渐衰减
- 深层网络的输出趋近于0,梯度也趋近于0
说白了,随机初始化就像猜数字。猜对了还行,猜错了就完蛋。我早期做项目时,经常要手动调这个随机范围,特别痛苦。
2.3 Xavier初始化(Glorot初始化)
Xavier初始化就是为了解决上面那个问题而生的。它的核心思想:让每一层的输出方差尽量等于输入方差。
公式很简单:
# 对于tanh激活函数
W = np.random.randn(input_dim, output_dim) * np.sqrt(1 / input_dim)
# 或者用均匀分布版本
limit = np.sqrt(6 / (input_dim + output_dim))
W = np.random.uniform(-limit, limit, size=(input_dim, output_dim))
Xavier初始化为什么有效?
- 它考虑了输入维度,自动调整随机值的尺度
- 信号在正向传播和反向传播时,方差保持稳定
- 梯度不会太快消失,也不会爆炸
适用场景:
- 使用tanh或sigmoid激活函数的网络
- 全连接层、卷积层(配合tanh)
不适用场景:
- 使用ReLU及其变体的网络(这个后面说)
2.4 He初始化(Kaiming初始化)
ReLU激活函数出现后,Xavier初始化就不太够用了。为什么?因为ReLU会把一半的神经元“杀死”(输出为0),导致实际传递的信号方差减半。
He初始化针对这个问题做了调整:
# 对于ReLU激活函数
W = np.random.randn(input_dim, output_dim) * np.sqrt(2 / input_dim)
# 对于Leaky ReLU
W = np.random.randn(input_dim, output_dim) * np.sqrt(2 / (1 + alpha^2) / input_dim)
注意看,He初始化比Xavier多乘了一个√2。这个小小的改动,就是为了补偿ReLU带来的信号衰减。
适用场景:
- 使用ReLU、Leaky ReLU、PReLU等激活函数的网络
- ResNet、VGG等现代CNN架构
- 大多数深度学习任务(现在的主流选择)
2.5 四种初始化策略对比
| 初始化策略 | 核心公式 | 适用激活函数 | 优点 | 缺点 |
|---|---|---|---|---|
| 零初始化 | W = 0 | 无(仅线性模型) | 简单 | 对称性问题,无法用于深度网络 |
| 随机初始化 | W ~ Uniform(-r, r) | 任意 | 打破对称性 | 尺度难调,易梯度消失/爆炸 |
| Xavier初始化 | W ~ N(0, 1/n_in) | tanh, sigmoid | 保持方差稳定 | 不适用于ReLU |
| He初始化 | W ~ N(0, 2/n_in) | ReLU, Leaky ReLU | 专为ReLU设计,效果好 | 不适用于tanh/sigmoid |
2.6 知识体系结构图
下面这张图,把四种初始化策略的核心逻辑串起来了。我建议你多看几遍,理解它们之间的演进关系。
2.7 实战选择建议
说了这么多,到底怎么选?我直接给结论:
- 默认首选:He初始化 —— 配合ReLU,适用于绝大多数现代网络
- 如果激活函数是tanh/sigmoid:用Xavier初始化
- 单层线性模型:零初始化可以用 —— 但也没必要,随机初始化也不费事
- 纯随机初始化:尽量别用 —— 除非你特别清楚自己在做什么
最后说一句:初始化策略不是玄学,它有严格的数学推导。你理解了它背后的方差控制逻辑,就知道什么时候该用哪种了。嗯,今天就到这儿。
公众号:蓝海资料掘金营,微信deep3321