神经网络的参数初始化
参数初始化
- 1. 固定值初始化
- 1.1 全零初始化
- 1.2 全1初始化
- 1.3 任意常数初始化
- 2. 随机初始化
- 3. Xavier 初始化
- 4. He初始化
- 5. 总结
神经网络的参数初始化是训练深度学习模型的关键步骤之一。初始化参数(通常是权重和偏置)会对模型的训练速度、收敛性以及最终的性能产生重要影响。下面是关于神经网络参数初始化的一些常见方法及其相关知识点。
官方文档参考:https://pytorch.org/docs/stable/nn.init.html
1. 固定值初始化
固定值初始化是指在神经网络训练开始时,将所有权重或偏置初始化为一个特定的常数值。这种初始化方法虽然简单,但在实际深度学习应用中通常并不推荐。
1.1 全零初始化
将神经网络中的所有权重参数初始化为0。
方法:将所有权重初始化为零。
缺点:导致对称性破坏,每个神经元在每一层中都会执行相同的计算,模型无法学习。
应用场景:通常不用来初始化权重,但可以用来初始化偏置。
对称性问题
- 现象:同一层的所有神经元具有完全相同的初始权重和偏置。
- 后果:
- 在反向传播时,所有神经元会收到相同的梯度,导致权重更新完全一致。
- 无论训练多久,同一层的神经元本质上会保持相同的功能(相当于“一个神经元”的多个副本),极大降低模型的表达能力。
1.2 全1初始化
全1初始化会导致网络中每个神经元接收到相同的输入信号,进而输出相同的值,这就无法进行学习和收敛。所以全1初始化只是一个理论上的初始化方法,但在实际神经网络的训练中并不适用。
1.3 任意常数初始化
将所有参数初始化为某个非零的常数(如 0.1,-1 等)。虽然不同于全0和全1,但这种方法依然不能避免对称性破坏的问题。
2. 随机初始化
方法:将权重初始化为随机的小值,通常从正态分布或均匀分布中采样。
应用场景:这是最基本的初始化方法,通过随机初始化避免对称性破坏。
代码演示:随机分布之均匀初始化
model=nn.Linear(1,1)#随机均匀分布参数初始化nn.init.uniform_(model.weight)#随机正态分布初始化nn.init.normal_(model.weight,mean=0,std=1)
3. Xavier 初始化
前置知识
Xavier 初始化(由 Xavier Glorot 在 2010 年提出)是一种自适应权重初始化方法,专门为解决神经网络训练初期的梯度消失或爆炸问题而设计。Xavier 初始化也叫做Glorot初始化。Xavier 初始化的核心思想是根据输入和输出的维度来初始化权重,使得每一层的输出的方差保持一致。具体来说,权重的初始化范围取决于前一层的神经元数量(输入维度)和当前层的神经元数量(输出维度)。
方法:根据输入和输出神经元的数量来选择权重的初始值。
Xavier 的数学原理
优点:平衡了输入和输出的方差,适合Sigmoid和 Tanh 激活函数。
应用场景:常用于浅层网络或使用Sigmoid 、Tanh 激活函数的网络。
Xavier初始化代码如下:
model=nn.Linear(1,1)#xavier均匀分布参数初始化nn.init.xavier_uniform_(model.weight)#xavier正态分布参数初始化nn.init.xavier_normal_(model,weight,mean=0,std=1)
特点:
- xavier参数初始化:是为了平衡前向传播和反向传播的方差保持一致
- xavier有两种采样方式:均匀分布,正态分布
- 一般用在浅层神经网络:可以和sigmoid函数和、Tanh激活函数的网络
4. He初始化
也叫kaiming 初始化。He 初始化的核心思想是调整权重的初始化范围,使得每一层的输出的方差保持一致。与 Xavier 初始化不同,He 初始化专门针对 ReLU 激活函数的特性进行了优化。
He参数初始化数学原理
(3) 两种模式
fan_in
模式(默认):优先保证前向传播稳定,方差 2nin\frac{2}{n_{in}}nin2。fan_out
模式:优先保证反向传播稳定,方差2nout\frac{2}{n_{out}}nout2。
方法:专门为 ReLU 激活函数设计。权重从以下分布中采样:
均匀分布:
W∼U(−6nin,6nin)W\sim\mathrm{U}\left(-\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}}},\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}}}\right) W∼U(−nin6,nin6)
正态分布:
W∼N(0,2nin)W\sim\mathrm{N}\left(0,\frac{2}{n_\mathrm{in}}\right) W∼N(0,nin2)
其中 ninn_{\text{in}}nin 是当前层的输入神经元数量。
优点:适用于ReLU和Leaky ReLU激活函数。
应用场景:深度网络,尤其是使用 ReLU 激活函数时。
代码如下:
model=nn.Linear(1,1)# He均匀分布初始化nn.init.kaiming_uniform_(model.weight)#He正态分布初始化nn.init.kaiming.normal_(model.weight,mean=0,std=1)
- He初始化(kaiming初始化):专门正对ReLu激活函数进行的优化
- 两种模式:
- fan_in:优先保证前向传播方差稳定,默认
- fan_out:优先保证方向传播方差稳定
- 两个采样方式:均匀分布和正态分布
5. 总结
在使用Torch构建网络模型时,每个网络层的参数都有默认的初始化方法,同时还可以通过以上方法来对网络参数进行初始化。