参数初始化(Parameter Initialization)是深度学习训练中关键的第一步——在梯度下降开始之前,我们需要为模型的所有参数(权重和偏置)设置初始值。这个看似简单的步骤,实际上对训练的收敛速度、最终性能和能否成功训练有着决定性的影响。
选择错误的初始化方法可能导致梯度消失或梯度爆炸,使模型根本无法学习;而好的初始化方法则为优化提供一个良好的起点,帮助模型快速收敛到好的解。
如果起点不对,即使是最好的优化算法也无能为力。
如果将网络中所有权重初始化为相同的值(例如全部为 0),那么同一层的所有神经元在训练过程中将始终学习相同的特征。这是因为在反向传播中,同一层所有神经元的梯度完全相同,导致它们的参数始终对称。这种现象称为对称性破缺失败(Failure of Symmetry Breaking)。
具体例子:考虑一个全连接层,输入维度为 100,输出维度为 50。如果所有 都初始化为 0,那么对于任意输入 ,该层所有 50 个神经元的输出都是 0,反向传播时所有参数的梯度也完全相同。无论训练多久,这 50 个神经元始终学习同样的特征——相当于只用了 1 个神经元。
在深度网络中,梯度在反向传播过程中需要逐层传递。如果初始化不当,梯度会随着层数加深而指数级地衰减或放大。
即使梯度消失和爆炸问题不致命(例如通过 Batch Normalization 缓解),不恰当的初始化也会大幅拖慢收敛速度。良好的初始化解空间位于损失函数曲面中"信息量丰富"的区域,使每个参数更新都能有效降低损失。
| 初始化方法 | 提出时间 | 适用激活函数 | 核心思想 |
|---|---|---|---|
| 零初始化 | — | 仅偏置 | 所有权重设为 0 |
| 随机均匀初始化 | — | 任意 | 从均匀分布采样小随机值 |
| LeCun 初始化 | 1998 | Sigmoid/Tanh | 保持输入方差为 1 |
| Xavier/Glorot 初始化 | 2010 | Tanh/线性 | 保持输入输出方差一致 |
| He/Kaiming 初始化 | 2015 | ReLU/PReLU | 适配 ReLU 的半波整流 |
| Orthogonal 初始化 | 2012 | RNN/线性 | 保持正交变换的范数不变性 |
问题:如前所述,所有权重相同导致对称性未被打破。因此零初始化只能用于偏置项,不能用于权重。
使用场景:偏置通常初始化为 0,因为在合理初始化权重的情况下,偏置从 0 开始学习是有效的。
其中 为输入神经元数量。这种初始化保证了参数期望值为 0,且随着输入维度增加,参数范围减小,使得输出的方差可控。
局限:对于深度网络,仅靠这种简单的缩放仍然无法完全避免深层梯度的不稳定性。
由 Yann LeCun 在 1998 年的 LeNet 论文中提出,是首个系统化研究初始化的工作。
核心思想:保持每个神经元的输入方差为 1。假设输入 的方差为 ,则神经元输出 的方差为:
令 ,则 。
2010 年,Xavier Glorot 和 Yoshua Bengio 在《Understanding the difficulty of training deep feedforward neural networks》中提出了 Xavier 初始化(又称 Glorot 初始化),这是深度学习发展史上的里程碑之一。
Glorot 和 Bengio 提出:理想初始化应该同时满足两个条件:
根据这两个条件,可以推导出:
其中 和 分别为该层的输入和输出维度。
均匀分布:
正态分布:
考虑一个输入维度 ,输出维度 的全连接层,激活函数为 Tanh。
使用 Xavier 正态分布初始化,标准差为:
这意味着大多数权重值分布在 区间内。
对比测试:
| 方法 | 标准差 | 单层前向传播后输出方差 | 10 层后输出方差 |
|---|---|---|---|
| 过大初始化 () | 0.5 | 约 25 | 爆炸到 量级 |
| Xavier 初始化 () | 0.115 | 约 1.0 | 约 1.0(稳定) |
| 过小初始化 () | 0.01 | 约 0.01 | 衰减到 量级 |
结论:Xavier 初始化在 Tanh 等零均值的对称激活函数下表现优异,能有效保持前向和反向传播中的信号强度。
Xavier 初始化假设激活函数是线性的且在 0 附近可近似为恒等映射。对于 ReLU 这种非对称激活函数(输出一半为 0),它会导致信号衰减。
2015 年,何恺明(Kaiming He)等人在 ResNet 论文中提出了专门针对 ReLU 激活函数的初始化方法。
ReLU 激活函数 会将一半的神经元输出设为 0,使得输出的方差减半。因此在经过 ReLU 后,实际方差只有 Xavier 假设的一半。
如果 ReLU 层输入的特征服从关于 0 对称的分布,经过 ReLU 后约一半神经元被"关闭",所以:
令 ,得到:
正态分布:
均匀分布:
考虑一个 50 层的网络,每层 ,激活函数为 ReLU:
| 方法 | 第 1 层后输出均值 | 第 10 层后输出均值 | 第 50 层后输出均值 |
|---|---|---|---|
| Xavier | ≈ 0.5 | ≈ 0.03 | → 0(信号消失) |
| He | ≈ 0.5 | ≈ 0.5 | ≈ 0.5(稳定) |
实验结果清晰地显示,在 ReLU 网络中 Xavier 初始化会导致信号随网络加深而消失,而 He 初始化则能保持信号强度的稳定。
对于 Leaky ReLU 和 PReLU,He 初始化可以推广为:
其中 是 Leaky ReLU 的负斜率参数(通常默认为 0.01 或可学习)。
对于循环神经网络(RNN)和某些深层的线性网络,正交初始化是一种有效的策略。
定义:权重矩阵 (假设 )满足 ,即列向量两两正交且为单位向量。
构造方法:从标准正态分布采样一个随机矩阵,然后对其做 QR 分解得到正交矩阵。
优点:
数值示例:
对于 RNN 序列长度 的任务:
| 初始化方法 | 梯度范数() | 梯度范数() | 梯度范数() |
|---|---|---|---|
| 均匀随机 | 0.85 | 0.12 | 0.008 |
| 正交 | 1.02 | 0.95 | 0.91 |
正交初始化在长序列上保持了梯度信号的稳定性,而随机初始化则使梯度迅速衰减。
在 CIFAR-10 数据集上使用一个 20 层的纯全连接网络(激活函数为 ReLU)进行对比实验的结果:
| 初始化方法 | 初始损失值 | 50 epochs 后准确率 | 200 epochs 后准确率 | 训练是否稳定 |
|---|---|---|---|---|
| 零初始化 | N/A | N/A | N/A | ❌ 因对称性无法训练 |
| 过小随机 () | 损失极小 | 20.3% | 45.2% | ✅ 极慢收敛 |
| 过大随机 () | 损失极大 | 10.1%(发散) | 10.0%(发散) | ❌ 梯度爆炸 |
| Xavier 初始化 | 2.30 | 32.1% | 41.8% | ⚠️ 深层信号衰减 |
| He 初始化 | 2.30 | 55.7% | 72.3% | ✅ 快速稳定收敛 |
核心发现:He 初始化在 ReLU 网络中的收敛速度显著优于 Xavier 初始化,最终准确率也高出约 30 个百分点(相对值)。
| 网络类型 | 激活函数 | 推荐初始化方法 |
|---|---|---|
| 前馈网络(浅层,<5层) | Sigmoid/Tanh | Xavier/Glorot 初始化 |
| 前馈网络(深度,≥5层) | Tanh | Xavier/Glorot 初始化 |
| 前馈网络(任意深度) | ReLU/Leaky ReLU | He/Kaiming 初始化 |
| 卷积神经网络 | ReLU | He 初始化 |
| 循环神经网络(RNN) | Tanh | 正交初始化 |
| LSTM/GRU | Sigmoid/Tanh | Xavier 初始化(权重)+ 正交初始化(遗忘门) |
| Transformer | GELU/ReLU | He 初始化或默认的 truncated normal |
| Batch Normalization 后的网络 | 任意 | 可放宽要求,但仍建议遵循上述规则 |
偏置项(Bias)的初始化相对简单:
| 框架 | 默认初始化方法 |
|---|---|
PyTorch(nn.Linear) |
He 均匀初始化() |
PyTorch(nn.Conv2d) |
He 均匀初始化 |
TensorFlow / Keras(Dense) |
Glorot 均匀初始化 |
JAX(nn.Dense) |
He 正态初始化(LeCun 正态在旧版本中) |
不同框架的默认值不同,在迁移代码或进行公平对比时需要注意。
当模型训练异常时,可以通过以下方式排查初始化问题:
如果在每一层后使用 Batch Normalization,初始化可以适当放宽,因为 BN 在前向传播中会强制将输出重新缩放为均值为 0、方差为 1 的分布。
实践建议:即使使用 BN,仍推荐使用 He 或 Xavier 初始化。合理的初始化与 BN 配合可以进一步加速收敛,且允许使用更大的学习率。
ResNet 的残差连接使得信号可以绕过某些层直接传播,本质上缓解了深层网络中的梯度消失问题。结合 He 初始化,可以使数百层的网络也能稳定训练:
在 He 初始化的配合下,残差块 的输出方差维持在 1 左右,则 在 100 层后的方差约增长到 100(比不加残差的情况慢得多),使得深层训练成为可能。
相同的初始化 + 相同的数据顺序会对最终结果产生一致影响。不同的随机种子会导致模型收敛到不同的局部最优,性能可能有 1-5% 的波动(取决于任务复杂度)。
是的,称为元初始化或学习初始化(如 MetaInit, 2019)。这种方法通过优化一小步梯度下降后的损失来"学习"一个好的初始化点,特别适用于小样本学习场景。
在确定性模式下,相同随机种子在不同硬件上应给出相同的初始化结果。但 TensorFlow 和 PyTorch 的随机数生成器在不同硬件实现上可能有细微差异。建议在关键实验中固定种子并记录硬件信息。