- 深度学习500问:AI工程师面试宝典
- 谈继勇
- 1695字
- 2022-09-03 00:42:32
3.6 参数初始化
为了让神经网络在训练过程中学到有用的信息,参数梯度不为0,在深度学习中参数初始化非常重要。良好的初始化可以加快梯度下降的收敛速度,降低训练错误的概率。本节主要针对权重初始化、偏差初始化等进行介绍。
3.6.1 参数初始化应满足的条件
为了保证参数更新时的梯度不为0,而参数更新的梯度和反向传播得到的状态梯度及输入激活值有关。总结起来参数初始化应该尽量满足以下几个条件。
(1)各层激活值不会出现饱和现象。
(2)各层激活值不为0。
(3)尽量使各个层的激活值的方差保持一致。
(4)尽量使各个层对状态的梯度的方差保持一致。
3.6.2 常用的几种初始化方式
常见的初始化方式主要有以下几种。
(1)预训练:早期训练神经网络的有效初始化方法。在预训练阶段,参数得以更新,形成初始值;在微调阶段,利用预训练得到的参数初始值和训练数据对模型进行整体调整。在这一过程中,参数进一步被更新,形成最终模型。
(2)随机初始化:将权重进行随机初始化,使其服从标准正态分布,在训练深度神经网络时可能会造成梯度消失和梯度爆炸的问题。
(3)xavier初始化:基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。
(4)kaiming初始化:何恺明提出的一种针对Relu的初始化方法,其思想是在Relu网络中,假定每一层有一半的神经元被激活,另一半为0。所以,要保持方差不变,只需要在xavier的基础上再除以2。
3.6.3 全0初始化带来的问题
在深度学习中,不建议将所有的权重都初始化为0,因为并不知道在训练神经网络中每一个权重最后的值,但是如果进行了恰当的数据归一化,我们有理由认为有一半的权重是正的,另一半是负的。令所有权重都初始化为0,如果神经网络计算出来的输出值是一样的,神经网络在进行反向传播算法计算出来的梯度值也一样,并且参数更新值也一样,这样的神经网络和一个线性模型的效果差不多。
在神经网络中考虑梯度下降的时候,设想你在爬山,但身处直线形的山谷中,两边是对称的山峰。由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰。你走了一步之后,情况依然不变。结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。
3.6.4 全都初始化为同样的值
全都初始化为一样的值也是深度学习中不建议的,以一个三层网络为例。
首先看图3-33所示的三层网络示意图。
图3-33 三层网络示意图
其表达式为:
如果每个权重都一样,那么在多层网络中,从第二层开始,每一层的输入值都是相同的,也就是:
既然都一样,所以全都初始化为一样的值,就相当于一个输入。
如果是反向传递算法,其中的偏置项和权重项的迭代的偏导数计算公式为:
δ的计算公式为:
如果用的是sigmoid函数,则:
把后两个公式代入计算,所得到的梯度下降法的偏导相同,经过多次迭代,最终的权重和截距是相同的,此时神经网络的效果和一个线性模型的效果差不多,提取特征的能力不佳。
3.6.5 初始化为小的随机数
将权重初始化为很小的数字是一个普遍的打破网络对称性的解决办法。其思想是:神经元在一开始都是随机的,所以它们会计算出不同的更新,并将自己整合到整个网络的各个部分。一个权重矩阵的实现可能看起来像w=0.01×np.random.randn(D,H),其中randn是从均值为0的单位标准高斯分布进行取样的。通过这个函数,每个神经元的权重向量初始化为一个从多维高斯分布取样的随机向量。
通过乘以0.01使w变小,因为当w很大时,通过计算w·x+b=a得到的a很大,此时sigmoid(a)中的a会趋向正无穷或负无穷,函数值sigmoid(a)趋向于一个平缓的趋势,在梯度下降的时候计算的梯度很小,会导致学习很慢,故使得w取一个很小的值。w在某些情况下不取0.01,会取其他的比较小的值。
注:并不是数字越小就会表现得越好。如果一个神经网络层的权重非常小,那么反向传播算法就会计算出很小的梯度(因为梯度是与权重成正比的),在网络不断地反向传播过程中将极大地减少梯度值,可能引起梯度消失。
3.6.6 用校准方差
随机初始化神经元的输出的分布有一个随输入量增加而变化的方差,可以通过将其权重向量按其输入的平方根进行缩放,从而将每个神经元的输出的方差标准化到1。将每个神经元的权重向量按进行初始化,其中n表示输入的数量。这可以保证网络中所有的神经元最初的输出分布大致相同,并在经验上提高收敛速度。