正态分布初始化(Normal Initialization)是一种简单的初始化方法,它假设神经网络的权重服从正态分布(高斯分布):
W ∼ N ( μ , σ 2 ) W \sim \mathcal{N}(\mu, \sigma^2) W∼N(μ,σ2)
其中:
import torch
import torch.nn as nn
# 创建一个 3x3 的权重矩阵
weights = torch.empty(3, 3)
nn.init.normal_(weights, mean=0, std=0.1) # 使用均值 0,标准差 0.1 的正态分布初始化
print(weights)
可能输出:
tensor([[ 0.0564, -0.0342, 0.0971],
[-0.0123, 0.0422, -0.0788],
[ 0.0074, -0.0254, 0.0659]])
Xavier 初始化是一种专门针对有非线性激活函数的神经网络的初始化方法。
它的目的是让前向传播和反向传播的方差保持稳定,避免梯度消失或爆炸。
权重 ( W ) 服从:
W ∼ U ( − 6 n in + n out , 6 n in + n out ) W \sim U\left(-\frac{\sqrt{6}}{\sqrt{n_{\text{in}} + n_{\text{out}}}}, \frac{\sqrt{6}}{\sqrt{n_{\text{in}} + n_{\text{out}}}}\right) W∼U(−nin+nout6,nin+nout6)
或:
W ∼ N ( 0 , 2 n in + n out ) W \sim \mathcal{N}\left(0, \frac{2}{n_{\text{in}} + n_{\text{out}}}\right) W∼N(0,nin+nout2)
其中:
import torch
import torch.nn as nn
# 创建一个 3x3 的权重矩阵
weights = torch.empty(3, 3)
nn.init.xavier_uniform_(weights) # Xavier 均匀分布初始化
print(weights)
可能输出:
tensor([[-0.4313, 0.2189, -0.3745],
[ 0.3827, 0.0576, -0.1932],
[-0.2154, 0.4018, -0.2498]])
如果想使用Xavier 正态分布(而不是均匀分布):
nn.init.xavier_normal_(weights)
方法 | 适用场景 | 优缺点 |
---|---|---|
正态分布初始化 | 适用于浅层模型、线性模型、嵌入层 | 简单易用,但深层网络可能导致梯度消失/爆炸 |
Xavier 初始化 | 适用于DNN、CNN、MLP,特别是带非线性激活的网络 | 避免梯度消失/爆炸,适合深度网络 |
nn.init.normal_(weights, mean=0, std=0.1)
nn.init.xavier_uniform_(weights)
或nn.init.xavier_normal_(weights)