【深度学习】参数初始化与Batch Normalization

时间:2024-04-05 15:33:21

一、参数初始化原则

参数初始化作为模型训练的起点,决定了模型训练的初始位置。选择的好坏很大程度影响收敛的速度与最终的训练结果。一般来说,参数初始化遵循以下几点要求:

  • 不建议同时初始化为一个值,容易出现“对称失效”
  • 最好保证均值为0,正负交错,参数大致数量相等
  • 初始化参数不要太大或太小,前者会导致梯度发散难以训练,后者会导致特征对后面的影响逐渐变小

二、常见的初始化方法

1、全零初始化与随机初始化

如果神经元的权重被初始化为0, 在第一次更新的时候,除了输出之外,所有的中间层的节点的值都为零。一般神经网络拥有对称的结构,那么在进行第一次误差反向传播时,更新后的网络参数将会相同,在下一次更新时,相同的网络参数学习提取不到有用的特征,因此深度学习模型都不会使用0初始化所有参数。
随机初始化顾名思义,一般值大了容易饱和,小了对后面的影响太小,**函数的效果也不好。

2、Glorot初始化方法

(1)正态化的Glorot初始化——glorot_normal
Glorot 正态分布初始化器,也称为 Xavier 正态分布初始化器。它从以 0 为中心,标准差为 stddev = sqrt(2 / (fan_in + fan_out)) 的截断正态分布中抽取样本。其中 fan_in 是权值张量中的输入单位的数量, fan_out 是权值张量中的输出单位的数量。
(2)标准化的Glorot初始化——glorot_uniform
Glorot 均匀分布初始化器,也称为 Xavier 均匀分布初始化器。
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / (fan_in + fan_out)), fan_in 是权值张量中的输入单位的数量, fan_out 是权值张量中的输出单位的数量。
(3)Glorot初始化器的缺点
首先有一个共识必须先提出:神经网络如果保持每层的信息流动是同一方差,那么会更加有利于优化。不然大家也不会去争先恐后地研究各种normalization方法。不过,Xavier Glorot认为还不够,应该增强这个条件,好的初始化应该使得各层的**值和梯度的方差在传播过程中保持一致,这个被称为Glorot条件。如果反向传播每层梯度保持近似的方差,则信息能反馈到各层。而前向传播**值方差近似相等,有利于平稳地学习。当然为了做到这一点,对**函数也必须作出一些约定。
(1) **函数是线性的,至少在0点附近,而且导数为1。
(2) **值关于0对称。
这两个都不适用于sigmoid函数和ReLU函数,而适合tanh函数。

3、Kaiming初始化

Kaiming初始化,也称之为he初始化。是残差网络的作者何凯明在这篇论文中提出了ReLU网络的初始化方法。
(1)正态化的kaiming初始化——he_normal
它从以 0 为中心,标准差为 stddev = sqrt(2 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in是权值张量中的输入单位的数量
(2)标准化化的kaiming初始化——he_uniform
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / fan_in), 其中 fan_in 是权值张量中的输入单位的数量

4、lecun初始化

(1)正态化的lecun初始化——lecun_normal
它从以 0 为中心,标准差为 stddev = sqrt(1 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in是权值张量中的输入单位的数量。
(2)标准化的lecun初始化——lecun_uniform
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(3 / fan_in), fan_in 是权值张量中的输入单位的数量。

三、Batch Normalization

随着网络层数的增加,分布逐渐发生偏移,之所以收敛慢,是因为整体分布往非线性函数取值区间的上下限靠近。这会导致反向传播时梯度消失。BN就是通过规范化的手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值0方差1的标准正态分布,使得**输入值落入非线性函数中比较敏感的区域。可以让梯度变大,学习收敛速度快,能大大加快收敛速度。

四、初始化选择建议

【深度学习】参数初始化与Batch Normalization
这张图已经能很好地反映初始化的一些思路了,由于现在batch norm比较流行所以可能对初始化要求不是那么高,一般用relu的话使用he初始化会好一些,或者直接用norm batch。
使用 RELU(without BN) **函数时,最好选用 He 初始化方法,将参数初始化为服从高斯分布或者均匀分布的较小随机数。
使用 BN 时,减少了网络对参数初始值尺度的依赖,此时使用较小的标准差(eg:0.01)进行初始化即可,初始化方法没有那么重要了。

另外关于ReLU和BN的顺序,原paper建议将BN层放置在ReLU前,因为ReLU**函数的输出非负,不能近似为高斯分布。实验表明,放在前后的差异似乎不大,甚至放在ReLU后还好一些。使用梯度下降法对参数进行优化学习时,非常关键的一个问题是如何合理地初始化参数值,为此提出了Xavier初始化和He初始化等方法,而使用BN操作后,对于参数初始化的要求就没那么高了。而且也可以使用大的学习率,另外BN也能够有效地缓解梯度消失的问题。

参考资料

https://cloud.tencent.com/developer/article/1437995
https://zhuanlan.zhihu.com/p/57454669
https://blog.csdn.net/mzpmzk/article/details/79839047