xavier 初始化

Xavier 初始化 (也称 Glorot 初始化 )是由 Xavier Glorot 和 Yoshua Bengio 在 2010 年的论文《Understanding the Difficulty of Training Deep Feedforward Neural Networks》中提出的。它是深度学习历史上第一个被广泛认可的、专门解决梯度消失/爆炸问题的权重初始化方法。

1. 为什么需要它?(与 Kaiming 的背景类似)

在深度网络(如 6-10 层)刚兴起时,人们发现网络很难训练。原因在于:

  • 梯度消失:浅层(靠近输入层)的权重几乎不更新,无法学习。
  • 梯度爆炸:梯度变得极大,导致权重更新失控。

Xavier 指出,问题的根源在于权重的初始尺度 。他提出一个核心原则:让每一层输出的方差等于输入的方差,并且让梯度的方差在反向传播时也保持恒定

2. 核心数学原理

Xavier 的推导基于以下假设:

  • 激活函数是线性的(在初始化阶段,tanh 在小值附近近似线性)。
  • 权重和输入是独立同分布的,且均值为 0。
  • 不使用偏置(或偏置初始化为 0)。

推导结果:权重的方差应该设置为:

\\text{Var}(W) = \\frac{2}{\\text{fan_in} + \\text{fan_out}}

  • fan_in:当前层的输入神经元数量(即权重矩阵的输入维度)。
  • fan_out:当前层的输出神经元数量(即权重矩阵的输出维度)。

这个公式同时考虑了前向传播(用到 fan_in)和反向传播(用到 fan_out),是一个调和平均的思想。

3. 常用实现公式

在实际代码中,Xavier 初始化通常采用均匀分布正态分布来采样:

均匀分布 (Uniform)

由于均匀分布的方差为 ( \frac{(b-a)^2}{12} ),为了得到上述方差,边界 ( b ) 和 ( a ) 应设为:

W \\sim U\\left\[-\\sqrt{\\frac{6}{\\text{fan_in} + \\text{fan_out}}},\\ \\sqrt{\\frac{6}{\\text{fan_in} + \\text{fan_out}}}\\right

]

正态分布 (Normal)

W \\sim \\mathcal{N}\\left(0,\\ \\sqrt{\\frac{2}{\\text{fan_in} + \\text{fan_out}}}\\right)

4. 代码实现(PyTorch 示例)

PyTorch 提供了内置的 Xavier 初始化方法:

python 复制代码
import torch.nn as nn

# 定义一个线性层
linear_layer = nn.Linear(256, 128)

# Xavier 均匀分布初始化
nn.init.xavier_uniform_(linear_layer.weight, gain=1.0)

# Xavier 正态分布初始化
nn.init.xavier_normal_(linear_layer.weight, gain=1.0)

# 如果有偏置,通常初始化为 0
if linear_layer.bias is not None:
    nn.init.constant_(linear_layer.bias, 0)

参数说明

  • gain:可选的缩放因子。对于不同的激活函数,建议使用不同的 gain 值(见下表)。

5. 适用场景与激活函数选择

激活函数 推荐初始化 gain 值
Tanh Xavier gain = 1.0(默认)
Sigmoid Xavier gain = 1.0
ReLU ❌ Xavier 效果差,应使用 Kaiming ---
Leaky ReLU Kaiming 更好 ---

为什么 ReLU 不适合 Xavier?

  • Xavier 假设激活函数关于 0 对称,且在小值范围内近似线性。
  • ReLU 将所有负值置为 0,导致输出方差减半。因此 Xavier 初始化在 ReLU 网络中会导致信号逐渐消失。
  • 这就是为什么后来 Kaiming He 专门针对 ReLU 提出了 Kaiming 初始化(方差公式中使用 ( \frac{2}{\text{fan_in}} ) 而不是 ( \frac{2}{\text{fan_in} + \text{fan_out}} ))。

6. Xavier vs. Kaiming 对比

维度 Xavier 初始化 Kaiming 初始化
提出时间 2010 年 2015 年
适用激活函数 Tanh, Sigmoid, 线性 ReLU, Leaky ReLU, PReLU
方差公式 ( \frac{2}{\text{fan_in} + \text{fan_out}} ) ( \frac{2}{\text{fan_in}} ) (ReLU)
理论假设 激活函数关于 0 对称 激活函数非对称(存在负值截断)
解决的主要问题 梯度消失/爆炸(浅层网络) 深层网络(如 ResNet)中的 ReLU 信号衰减

7. 总结与使用建议

  • 激活函数是 Tanh 或 Sigmoid :优先选择 Xavier 初始化
  • 激活函数是 ReLU 或其变体 :优先选择 Kaiming 初始化 (PyTorch 中也称 kaiming_uniform_kaiming_normal_)。
  • 不太确定时:现代深度学习(尤其是 CNN)几乎默认使用 ReLU + Kaiming 初始化。但如果你在使用 Transformer 或 MLP 时遇到 Tanh,Xavier 依然是不错的选择。
  • 一个小技巧 :PyTorch 的 nn.init.calculate_gain() 可以帮助你计算不同激活函数下推荐的 gain 值,用于调整初始化尺度。
python 复制代码
# 计算不同激活函数的推荐 gain
gain_tanh = nn.init.calculate_gain('tanh')   # 输出 1.0
gain_relu = nn.init.calculate_gain('relu')   # 输出 1.414 (即 sqrt(2))
gain_sigmoid = nn.init.calculate_gain('sigmoid')  # 输出 1.0

总的来说,Xavier 初始化是深度学习中对称激活函数(Tanh/Sigmoid)的最佳选择,也是理解现代初始化方法(如 Kaiming)的基础。掌握它,你就掌握了深度学习权重初始化的核心理念。

相关推荐
湘美书院--湘美谈教育7 小时前
湘美谈教育AI系列经验集锦:赋能整理聊斋志异大寓言
大数据·人工智能·深度学习·神经网络·机器学习
大模型最新论文速读9 小时前
小红书提出 RedKnot:分头处理 kv 缓存,延时降低 60%效果还提升
论文阅读·人工智能·深度学习·机器学习·缓存·自然语言处理
星浩AI10 小时前
(七)GPT2中文生成模型定制化微调训练[附源码]
pytorch·深度学习·llm
卡梅德生物科技小能手10 小时前
卡梅德生物科普MCAM(黑色素瘤细胞黏附分子)
人工智能·经验分享·深度学习
月疯11 小时前
torch:expand和repeate的区别
开发语言·python·深度学习
xianghongtao011612 小时前
把 Prompt 当成“可训练参数“:SkillOpt 如何用深度学习的纪律去优化 Agent 技能
人工智能·深度学习·性能优化·prompt
装不满的克莱因瓶12 小时前
PyTorch 与它的自动微分工具:Autograd
人工智能·pytorch·python·深度学习·神经网络·机器学习·ai
EQUINOX113 小时前
【ch03】Coding-attention-mechanisms
人工智能·深度学习·机器学习
老饼讲解-BP神经网络13 小时前
具体说说-RBF神经网络-newrbe函数和newrb函数的区别
人工智能·深度学习·神经网络
机器学习之心13 小时前
198种组合算法+优化CNN-LSTM+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备
深度学习·算法·cnn-lstm·shap分析·198种组合算法