权重初始化策略:Xavier、He 与正交初始化

FreeGuideOnline 最新 2026-06-21

权重初始化策略:Xavier、He 与正交初始化

在训练深度神经网络时,权重初始化方式直接影响模型能否收敛以及收敛速度。错误的初始化可能导致梯度消失或梯度爆炸,而合理的策略则能让信号在网络中稳定流动。本文将深入讲解三种经典且广泛使用的初始化方法:Xavier均匀/正态初始化He初始化以及正交初始化,并对比它们的适用场景。


为什么权重初始化如此重要

深度网络通过层层叠加的矩阵乘法与非线性激活传递信息。若初始权重设置不当,会出现两种常见问题:

  • 梯度消失:反向传播时,梯度随层数增加呈指数级衰减,浅层参数几乎不更新。
  • 梯度爆炸:梯度指数级增长,导致参数更新幅度过大,模型震荡甚至溢出。

这两种现象的根本原因在于,输入信号的方差在经过每一层后不断缩放。理想情况下,我们希望每一层输出的方差与输入方差尽量一致,从而维持信号在前向和反向传播中的稳定。基于这一思想,诞生了Xavier和He初始化。


朴素初始化方法及其缺陷

在理解高级策略之前,先回顾几种不推荐的初始化方式:

全零初始化

将所有权重设为0,神经元会学习到完全相同的特征,网络对称性无法打破,模型等同于一个线性单元。

随机小值初始化

权重 = 0.01 * np.random.randn(...)。小权重可能导致梯度在深层网络中消失;若数值过大,又可能引起梯度爆炸。这种初始化没有考虑网络规模和激活函数特性,需人工调参。

标准正态分布

直接使用 np.random.randn(...) 乘以1,对于深层网络会导致方差逐层放大或缩小,不满足稳定性要求。


Xavier初始化(Glorot初始化)

由Glorot和Bengio在2010年提出,专门针对S型激活函数(如sigmoid、tanh)设计。其核心思想是:保持前向传播中每一层输出的方差一致,且反向传播中梯度的方差也一致

数学推导要点

考虑全连接层:Y = X W + b,其中 $X$ 的维度为 $(n_{in})$,$W$ 的维度为 $(n_{in} \times n_{out})$。假设输入 $X$ 和权重 $W$ 的各元素独立同分布,均值为0,且偏置初始化为0。

  • 前向方差:$Var(Y) = n_{in} \cdot Var(X) \cdot Var(W)$
  • 反向梯度方差:$Var(\frac{\partial L}{\partial X}) = n_{out} \cdot Var(\frac{\partial L}{\partial Y}) \cdot Var(W)$

为使两者方差保持一致,需要满足: $$n_{in} \cdot Var(W) = 1 \quad \text{和} \quad n_{out} \cdot Var(W) = 1$$ 作为折衷,取: $$Var(W) = \frac{2}{n_{in} + n_{out}}$$

采样方式

根据该方差,可以得到两种具体的初始化分布:

  • Xavier均匀分布:$W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{in} + n_{out}}}, \frac{\sqrt{6}}{\sqrt{n_{in} + n_{out}}}\right]$
  • Xavier正态分布:$W \sim \mathcal{N}\left(0, \frac{2}{n_{in} + n_{out}}\right)$

其中均匀分布的上下界推导自均匀分布方差公式 $Var = \frac{(b-a)^2}{12}$,将目标方差代入可得。

适用激活函数

Xavier假设激活函数在0附近近似线性(如tanh在0附近的斜率为1),且输入均值为0。因此它适用于:

  • tanh
  • sigmoid(但仍需注意sigmoid的非零均值问题)
  • 线性激活

不适用于ReLU及其变体,因为ReLU的线性区域斜率仅为正半轴,会破坏方差缩放假设。

PyTorch示例

import torch.nn as nn

layer = nn.Linear(in_features=256, out_features=128)

# Xavier均匀初始化
nn.init.xavier_uniform_(layer.weight)
# Xavier正态初始化
nn.init.xavier_normal_(layer.weight)
# 偏置通常初始化为0
nn.init.zeros_(layer.bias)

He初始化(Kaiming初始化)

由何恺明等人于2015年提出,专门针对ReLU系列激活函数。ReLU的非线性特性导致输出均值为正,且负半轴完全屏蔽,使得Xavier的方差假设不再成立。

数学推导修正

考虑ReLU:$y = \max(0, x)$。若输入 $x$ 服从均值为0的对称分布,则经过ReLU后:

  • 输出均值 $\approx 0.5 \cdot \sqrt{\frac{2}{\pi}} \sigma$(非零)
  • 输出方差 $Var(y) = \frac{1}{2} Var(x)$(因为一半的值被置零)

因此,前向信号传播的方差修正为: $$Var(Y) = n_{in} \cdot Var(W) \cdot \frac{1}{2} Var(X)$$ 要保持方差稳定,需要: $$n_{in} \cdot Var(W) \cdot \frac{1}{2} = 1 \quad\Rightarrow\quad Var(W) = \frac{2}{n_{in}}$$

反向传播时同样考虑ReLU的导数性质,得到 $Var(W) = \frac{2}{n_{out}}$。实践中通常只使用前向版本(即仅依赖 $n_{in}$),因为效果已足够好。

针对不同ReLU变体的调整

He初始化可适配多种激活函数,只需根据激活的“负半轴斜率”调整增益系数:

  • ReLU:使用 $Var(W) = \frac{2}{n_{in}}$
  • LeakyReLU(负斜率 $a$):$Var(W) = \frac{2}{(1 + a^2) \cdot n_{in}}$
  • PReLU 同理,$a$ 为可学习参数,初始化时仍按上述公式设置。
  • ELU/SELU 等也有各自的修正因子,但框架中He均匀/正态仍以默认 a=0(即标准ReLU)为主。

采样方式

  • He均匀分布:$W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{in}}}, \frac{\sqrt{6}}{\sqrt{n_{in}}}\right]$ (乘以适当的 gain 可适配LeakyReLU等)
  • He正态分布:$W \sim \mathcal{N}\left(0, \frac{2}{n_{in}}\right)$

PyTorch示例

layer = nn.Linear(256, 128)

# He正态初始化(默认针对ReLU)
nn.init.kaiming_normal_(layer.weight, mode='fan_in', nonlinearity='relu')
# He均匀初始化
nn.init.kaiming_uniform_(layer.weight, mode='fan_in', nonlinearity='relu')
# 偏置初始化
nn.init.zeros_(layer.bias)

参数 mode='fan_in' 表示使用输入神经元数计算方差,nonlinearity 用于PyTorch自动调整增益值(如 'leaky_relu' 时会考虑负斜率)。


正交初始化

正交初始化并非直接源自方差稳定理论,而是从几何结构角度保持信号范数。其核心是:使权重矩阵为(半)正交矩阵,即 $W^T W = I$ 或 $W W^T = I$(对非方阵而言列正交或行正交)。这样乘以输入 $x$ 时: $$|Wx| = |x|$$ 误差信号的范数在层间保持不变,能有效避免梯度消失或爆炸,尤其在循环神经网络(RNN)中效果显著。

原理与优势

  1. 范数保持性:正交矩阵作为线性变换是等距映射,传递信号时仅旋转/反射,不缩放。
  2. 避免激活饱和:结合适当的激活函数(如tanh),梯度能保持稳定。
  3. 解缠绕特征:正交权重使隐藏层特征彼此线性独立,有利于优化。
  4. 适用深层RNN/LSTM:可缓解长期依赖问题,是LSTM初始化常用技巧之一。

如何构造正交权重矩阵

框架通常先随机生成一个矩阵,再通过QR分解或SVD获得正交矩阵。

随机正交矩阵生成步骤:

  1. 生成一个 $n \times n$ 的高斯随机矩阵 $A$。
  2. 对 $A$ 进行QR分解:$A = QR$,$Q$ 即为正交矩阵。
  3. 若需非方阵(如 $n_{in} > n_{out}$),可先对较大维度生成方阵,再截取前 $n_{out}$ 列;PyTorch直接支持 nn.init.orthogonal_

PyTorch示例

layer = nn.Linear(256, 128)

# 正交初始化权重,增益gain可用来缩放(如结合非线性激活调整范数)
nn.init.orthogonal_(layer.weight, gain=1.0)
nn.init.zeros_(layer.bias)

对于RNN,增益 gain 通常根据激活函数设定(如tanh推荐 gain=1.0gain=5/3 等经验值)。


三种初始化对比与选择指南

初始化策略 适用激活函数 核心思想 典型使用场景
Xavier tanh, sigmoid, 线性 平衡前向与反向方差,折衷输入输出维度 浅层网络、传统MLP
He ReLU, LeakyReLU, PReLU 仅保持前向方差,考虑ReLU的单侧抑制 现代CNN、ResNet、绝大多数深层网络
正交 任何(配合增益调整) 保持向量范数,避免特征扭曲和梯度问题 RNN/LSTM/GRU、生成对抗网络、深层线性层初始

实际工程建议

  1. 绝大多数卷积和全连接层,直接使用He初始化(kaiming_normal_kaiming_uniform_)搭配ReLU/BN,已成为行业默认。
  2. 使用tanh或sigmoid时,可选用Xavier初始化。
  3. RNN的隐藏状态权重强烈建议使用正交初始化,偏置可适当设为较小值(如LSTM遗忘门偏置设为1)。
  4. 框架内置默认值:PyTorch中 nn.Linearnn.Conv2d 默认使用He均匀初始化(基于 fan_in),而 nn.Embedding 使用正态分布。大多数情况下默认初始化已足够,但在自定义模型或使用特殊激活函数时需手动调整。
  5. 批归一化(BatchNorm) 层的存在会降低对权重初始化的敏感度,但仍推荐使用合适的初始化以加速收敛。
  6. 初始化偏置通常设为0,除非有特别理由(如LSTM遗忘门偏置设置正数以鼓励长期记忆)。

总结

  • Xavier初始化 基于激活函数线性区域假设,保持前向与反向方差,适合tanh/sigmoid。
  • He初始化 修正了ReLU的非线性影响,只保持前向方差,是现代深度网络的首选。
  • 正交初始化 从范数不变角度出发,极大缓解RNN梯度问题,适合循环结构和需要特征解耦的场景。

理解这些初始化背后的设计哲学,不仅能帮你正确选用,还能在面对新型激活函数或网络结构时,推导出合适的自定义初始化策略。实践中,请熟练使用框架提供的 nn.init 工具,并结合具体任务做微调。


下一篇教程预告:学习率调度策略——让模型更快收敛的调参艺术。