神经网络权重初始化简介

在训练神经网络时,权重的初始化非常关键。如果初始化不合理,可能出现:

  • 梯度消失(vanishing gradient):深层网络梯度太小,无法更新权重, 一般因数据方差太小导致
  • 梯度爆炸(exploding gradient):梯度太大,训练不稳定,一般因数据方差太大导致

因此需要一些特殊的初始化来解决这些问题.


Xavier 初始化(Xavier Initialization)

Xavier 的目标是:

保持每一层输出的方差 ≈ 输入的方差

假设:

  • 全连接层权重矩阵 W 的维度为 nout×ninn_\text{out} \times n_\text{in}
  • 输入 x,输出 y = Wx

Xavier 希望:

Var(y)Var(x) \text{Var}(y) \approx \text{Var}(x)

Xavier 初始化公式

3.1 均匀分布

Wi,jU[6nin+nout,6nin+nout] W_{i,j} \sim \mathcal{U}\Big[-\sqrt{\frac{6}{n_\text{in} + n_\text{out}}}, \sqrt{\frac{6}{n_\text{in} + n_\text{out}}}\Big]

正态分布

Wi,jN(0,2nin+nout) W_{i,j} \sim \mathcal{N}\Big(0, \frac{2}{n_\text{in} + n_\text{out}}\Big)

其中 ninn_\text{in} 是输入神经元数量,noutn_\text{out} 是输出神经元数量
常用 6/(nin+nout)\sqrt{6/(n_\text{in}+n_\text{out})}2/(nin+nout)\sqrt{2/(n_\text{in}+n_\text{out})} 来控制权重方差

PyTorch 示例

1
2
3
4
5
6
7
8
import torch
import torch.nn as nn

# 创建全连接层
fc = nn.Linear(128, 64) # 输入128,输出64

# 均匀分布 Xavier 初始化
nn.init.xavier_uniform_(fc.weight)

参数化(parameterization)

在深度学习中,参数化是指对模型参数进行某种变换或约束,以改善训练过程和模型性能。常见的参数化方法包括:

普通参数化: 直接使用权重矩阵 W 作为参数。y=Wx
这样做的坏处是当我们将layer扩张到4倍之后,梯度会变得及其不稳定,训练效果会很差,需要重新调超参数(比如调学习率)。

muP参数化:

使用了muP,当我们扩大layer的时候,梯度仍然是稳定的,不需要重调学习率之类的超参数。这样就可以让小模型和大模型在训练初期表现一致,从而让我们可以更容易地将小模型的训练经验迁移到大模型上。

He initialization

He 初始化:适合 ReLU/Leaky ReLU

Xavier 初始化:适合 tanh/sigmoid

He 初始化(Kaiming Initialization)

为 ReLU 及其变体(如 Leaky ReLU)提出的初始化方法,由 He 等人于 2015 年提出。

公式:

Wi,jN(0,2nin) W_{i,j} \sim \mathcal{N}\Big(0, \frac{2}{n_\text{in}}\Big)

或者均匀分布版本:

Wi,jU[6nin,6nin] W_{i,j} \sim \mathcal{U}\Big[-\sqrt{\frac {6}{n_\text{in}}}, \sqrt{\frac{6}{n_\text{in}}}\Big]

其中,ninn_\text{in}:当前层的输入神经元数

方差的系数 2 是因为 ReLU 只激活一半的输入(负值变为 0),为了补偿未激活部分的方差损失。

优点:

保持 前向传播方差 和 反向传播方差 稳定

加速收敛