前言:深度学习的初始化参数指的是在网络训练之前,对各个节点的权重和偏置进行初始化的过程,很多时候我们以为这个初始化是无关紧要的,不需要什么讲究,但是实际上,一个参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,这都是至关重要的,有时候因为参数初始化的缘故,甚至得不到好的训练结果。本文就来讨论一下参数初始化到底有什么讲究以及常见的参数初始化的一些策略方法。阅读本文需要神经网络相关背景,能够理解误差反向传播算法的实现过程。
一、参数初始化的原则
1.1 一些基本的储备知识
在总结参数初始化的原则之前,先简单看一下网络运行的过程,参数初始化的目的是使网络能够更好的训练,现在大部分的网络训练依然是采用误差的反向传播算法,误差反向传播分为正反两个过程,这里就不再赘述了,先引入几个概念,看下面这幅图,这是一个神经网络的某一个层:
我们引入几个概念:
**值h:因为它经过了**函数,实质上就是每一个网络层的输出值;
状态值z:每一个层内部的组成如上所示,z是作为**函数的一个输入,它在网络层的内部,所以称之为状态值。
数据在网络中流动的时候,会有下面的公式(这里默认没有偏置项):
然后在反向传播的过程中,由于是复合函数的求导,根据链式法则,会有两组倒数,一个是损失函数Cost对Z的导数,一个是损失函数对W的导数,(详细过程这里不推到),这里再引入两个概念:
(1)损失函数关于状态Z的梯度:即
(2)损失函数关于参数W的梯度:即
2、参数初始化的几个基本条件
什么样的初始化参数才是最好的呢?这里直接引入几个参数初始化的要求:
Glorot条件:优秀的初始化应该保证以下两个条件:
(1)各个层的**值h(输出值)的方差要保持一致,即
(2)各个层对状态Z的梯度的方差要保持一致
这就是Glorot条件条件,后面会介绍到Glorot初始化。
3、关于方差的三个客观事实
既然要保持上面的两个方差在各个网络层中不改变,那也就是它实际上是会改变的,关于为什么会改变的公式推导,这里不详细说明了,直接引入三个基本的客观事实(两有关一无关):
(1)各个层**值h(输出值)的方差与网络的层数有关
(2)关于状态Z的梯度的方差与网络的层数有关
(3)各个层参数W的梯度的方差与层数无关
关于上面几个基本结论的详情以及公式推导,我们可以参考原论文:
http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
借用论文中的几幅图,也可以看出这几个结论。
(1)各层**值h直方图如下:
可以看出,**值的方差逐层递减。
(2)各层状态Z的梯度的直方图如下:
状态的梯度在反向传播过程中越往下梯度越小(因为方差越来越小)。
(3)各层参数W的梯度的直方图
参数梯度的方差和层数基本无关。
4、参数初始化的几点要求
(1)参数不能全部初始化为0,也不能全部初始化同一个值,为什么,请参见“对称失效”;
(2)最好保证参数初始化的均值为0,正负交错,正负参数大致上数量相等;
(3)初始化参数不能太大或者是太小,参数太小会导致特征在每层间逐渐缩小而难以产生作用,参数太大会导致数据在逐层间传递时逐渐放大而导致梯度消失发散,不能训练
(4)如果有可能满足Glorot条件也是不错的
上面的几点要求中,(1)(2)(3)基本上是硬性要求,这也就衍生出了一系列的参数初始化方法,什么正态标准化等诸如此类的标准化方法,关于各种参数初始化方法,会在后面继续说明。
二、常见的参数初始化方法
我们常见的几种初始化方法是按照“正态分布随机初始化——对应为normal”和按照“均匀分布随机初始化——对应为uniform”,这里就不再多说了,这里介绍几种遇见较少的初始化方法。
1、Glorot初始化方法
(1)正态化的Glorot初始化——glorot_normal
Glorot 正态分布初始化器,也称为 Xavier 正态分布初始化器。它从以 0 为中心,标准差为 stddev = sqrt(2 / (fan_in + fan_out))
的截断正态分布中抽取样本, 其中 fan_in
是权值张量中的输入单位的数量, fan_out
是权值张量中的输出单位的数量。
在keras和tensorflow均有实现,以keras为例:
keras.initializers.glorot_normal(seed=None)
(2)标准化的Glorot初始化——glorot_uniform
Glorot 均匀分布初始化器,也称为 Xavier 均匀分布初始化器。
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit
是 sqrt(6 / (fan_in + fan_out))
, fan_in
是权值张量中的输入单位的数量, fan_out
是权值张量中的输出单位的数量。
以keras为例:
keras.initializers.glorot_uniform(seed=None)
(3)Glorot初始化器的缺点
因为Xavier的推导过程是基于几个假设的,
其中一个是**函数是线性的,这并不适用于ReLU,sigmoid等非线性**函数;
另一个是**值关于0对称,这个不适用于sigmoid函数和ReLU函数它们不是关于0对称的。
2、Kaiming初始化
Kaiming初始化,也称之为he初始化,也称之为msra初始化,出自大神 何凯明只手。即
Kaiming initializer=he initializer=msra initializer
因为前面讲了Glorot初始化不适合relu**函数,所以
残差网络的作者何凯明在这篇论文中提出了ReLU网络的初始化方法:Kaming初始化。作者的推导过程针对的其实是卷积网络的前向和反向过程。而为了和Xavier初始化方法保持一致,这里我们还是讨论全连接网络结构。
关于期望、方差的性质,我们已经在Xavier初始化一节介绍过了,这里不再重复。
在Xavier论文中,作者给出的Glorot条件是:正向传播时,**值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。
这在本文中稍作变换:正向传播时,状态值的方差保持不变;反向传播时,关于**值的梯度的方差保持不变。
(1)正态化的kaiming初始化——he_normal
He 正态分布初始化器。
它从以 0 为中心,标准差为 stddev = sqrt(2 / fan_in)
的截断正态分布中抽取样本, 其中 fan_in
是权值张量中的输入单位的数量,在keras中的实现为
keras.initializers.he_normal(seed=None)
(2)标准化化的kaiming初始化——he_uniform
He 均匀方差缩放初始化器。
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit
是 sqrt(6 / fan_in)
, 其中 fan_in
是权值张量中的输入单位的数量。
keras.initializers.he_uniform(seed=None)
3、lecun初始化
出自大神Lecun之手。
(1)标准化化的kaiming初始化——lecun_uniform
LeCun 均匀初始化器。
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit
是 sqrt(3 / fan_in)
, fan_in
是权值张量中的输入单位的数量。
keras.initializers.lecun_uniform(seed=None)
(2)正态化的kaiming初始化——lecun_normal
LeCun 正态分布初始化器。
它从以 0 为中心,标准差为 stddev = sqrt(1 / fan_in)
的截断正态分布中抽取样本, 其中 fan_in
是权值张量中的输入单位的数量。
keras.initializers.lecun_normal(seed=None)
4、Batch Normalization
BN是将输入的数据分布变成高斯分布,这样可以保证每一层神经网络的输入保持相同分布。
优点
随着网络层数的增加,分布逐渐发生偏移,之所以收敛慢,是因为整体分布往非线性函数取值区间的上下限靠近。这会导致反向传播时梯度消失。BN就是通过规范化的手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值0方差1的标准正态分布,使得**输入值落入非线性函数中比较敏感的区域。可以让梯度变大,学习收敛速度快,能大大加快收敛速度。
Scale and Shift作用
γ和βγ和β是学习到的参数,他们可以让标准正态分布变得更高/更胖和向左右偏移。
三、参数初始化方法的总结
四、参考文献
https://blog.csdn.net/mzpmzk/article/details/79839047
https://blog.csdn.net/siyue0211/article/details/80384951
http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
https://blog.csdn.net/victoriaw/article/details/73000632
https://blog.csdn.net/VictoriaW/article/details/73166752