使用 Xavier 均匀初始化方法(Xavier Uniform Initialization)来初始化张量 m.weight
的权重值:
1. Xavier 均匀初始化的定义
Xavier 均匀初始化是 权重初始化 的一种方法,其主要目的是:
- 保持前向传播和反向传播过程中,梯度的尺度在各层间保持稳定,避免梯度爆炸或梯度消失。
公式如下:
W
∼
U
[
−
6
n
i
n
+
n
o
u
t
,
6
n
i
n
+
n
o
u
t
]
W \sim \mathcal{U}\left[-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right]
W∼U[−nin+nout6,nin+nout6]
其中:
- U \mathcal{U} U 表示均匀分布。
- n i n n_{in} nin: 当前层的输入神经元数量。
- n o u t n_{out} nout: 当前层的输出神经元数量。
- 权重值 W W W 被初始化为介于上述范围内的随机数。
2. 代码解析
nn.init.xavier_uniform_(m.weight)
-
m.weight
:m
通常是一个层(如nn.Linear
或nn.Conv2d
)。m.weight
是该层的权重张量。
-
nn.init.xavier_uniform_
:- PyTorch 提供的函数,用于实现 Xavier 均匀初始化。
- 它会根据权重的形状自动计算 n i n n_{in} nin 和 n o u t n_{out} nout。
3. 使用示例
假设 m
是一个全连接层:
import torch
import torch.nn as nn
# 定义一个线性层
m = nn.Linear(in_features=128, out_features=64)
# 使用 Xavier 均匀初始化
nn.init.xavier_uniform_(m.weight)
# 查看初始化后的权重范围
print(m.weight)
4. 为什么需要 Xavier 初始化?
在深层神经网络中:
-
前向传播:
- 如果权重初始化过大,激活值会过于分散,导致梯度爆炸。
- 如果权重初始化过小,激活值会过于集中,导致梯度消失。
-
反向传播:
- 权重的梯度也可能因初始化不当而无法有效更新。
Xavier 初始化确保:
- 权重值既不太大也不太小。
- 神经元的输入和输出方差尽可能相同,保证梯度在各层之间稳定传播。
5. Xavier 均匀与 Xavier 正态的区别
PyTorch 还提供了 Xavier 正态初始化,用法类似:
nn.init.xavier_normal_(m.weight)
区别:
- Xavier 均匀: 从均匀分布中采样初始化值。
- Xavier 正态: 从正态分布中采样初始化值,分布均值为 0,标准差为:
σ = 2 n i n + n o u t \sigma = \sqrt{\frac{2}{n_{in} + n_{out}}} σ=nin+nout2
选择哪种方法主要取决于具体的模型和任务。