为了让神经网络在训练过程中学习到有用的信息,参数梯度应该保持非零。在全连接神经网络中,参数初始化应该满足以下两个条件:①各层激活值不会出现饱和现象;②各层激活值不为0。常用的参数初始化方法如下。
1.初始化为0
如果神经元的权重被初始化为0,在第一次更新时,除了输出,所有的中间层的节点的值都为零。一般神经网络拥有对称的结构,那么在进行第一次误差反向传播时,更新后的网络参数相同,在下一次更新时,相同的网络参数提取不到有用的特征。即使是对于非对称的网络结构,这样的随机参数也不利于接下来的优化,因此,一般只在训练SLP/逻辑回归模型时才使用0来初始化所有参数。
2.生成小的随机数
将参数初始化为小的随机数,可以从均值为0、标准差为1的高斯分布中取样,即np.random.randn( n )。
一般而言,参数的初始值不能取得太小,因为较小的参数在反向传播时会导致过小的梯度产生,且对于深层网络而言,会产生梯度弥散问题,降低参数的收敛速度;而参数的初始值过大不仅会造成振荡,也会使Sigmoid函数等进入梯度饱和区,在实验结果中确实发现了这样的现象。另外,随机初始化方法的方差与该层的神经元有关,导致网络不稳定。
3.标准初始化
如果能够保持神经网络每层的权重方差与层数无关,会更加有利于优化。假如输入和权重都是零均值,则有如下关系。
如果希望输入 x 和输出 y 具有相同的方差,则需要满足 n Var( w )=1。其中, n 为每个神经元的输入数量; w 应该用 n 的平方根进行归一化。所以标准初始化方法的权重参数从 的均匀分布中生成。
均匀分布 X ~ U ( a , b )的概率密度函数为
其期望等于 ,方差等于 。 的均匀分布使得 n Var( w )=1/3,这与网络的层数无关,因此对Sigmoid函数,其自变量始终落在有梯度的范围。
4.Xavier初始化
理想的初始化应该使各层的激活值和状态梯度的方差在传播过程中保持一致,不然若更新后的激活值方差发生改变,将造成数据的不稳定。
Xavier初始化有以下关于激活函数的假设(称为Glorot激活函数假设) [10] 。
(1)每层激活的方差应该保持不变,即在正向传播时,每层的激活值的方差保持不变;在反向传播时,每层的梯度值的方差保持不变。
(2)激活函数对称,每层的输入均值都是0。
Xavier初始化取值为
这个区间是根据以下公式得到的,即[ -b , b ]的均匀分布的方差为
式中, n i 和 n i+ 1 表示输入和输出维度,此时激活值的方差和层数无关,反向传播梯度值的方差和层数无关。
虽然Xavier初始化通常与ReLU函数共同使用,但因为它是针对Tanh函数提出的,所以对于ReLU函数并不友好。网络越深,各层输入的方差就越小,网络越难训练。
5.MSRA初始化
何凯明等人提出了与Xavier初始化非常类似的MSRA初始化方法,该方法主要是基于ReLU函数提出的,其是一个均值为0、方差为(2/输入神经元的个数)的高斯分布,如式(2.28)所示。
6.初始化方法的使用
为了获得更好的初始化,通常有以下方法。
(1)使用已经训练好的模型无疑是最好的初始化方法,这样能够在训练之初迅速学习到有效的参数。
(2)选择更好的激活函数,让初始化尽量不影响梯度的传递。ReLU系列的激活函数可以实现这种效果,而且MSRA初始化方法也可以与ReLU系列的激活函数配合使用,因此两者的搭配成为当前的主流。
(3)归一化,让每层输入和输出的分布比较一致,从而降低学习难度。
此外,还有研究者分别针对零点平滑的激活函数和零点不平滑的激活函数提出了统一的初始化方法框架 [11] ,读者可以自行关注后续研究进展。