[深度学习] 网络参数初始化

网络参数初始化

神经网络模型一般依靠随机梯度下降进行模型训练和参数更新,网络的最终性能与收敛得到的最优解直接相关,而收敛结果实际上又很大程度取决于网络参数的最开始的初始化。理想的网络参数初始化使模型训练事半功倍,相反,糟糕的初始化方案不仅会影响网络收敛,甚至会导致梯度弥散或爆炸。

网络初始化的方案

全零初始化

当网络达到稳定状态时, 参数(权值)在理想情况下应该保持正负各半(此时期望为0)。因此一种看起来简单的方法,干脆将所有参数都初始化为0, 因为这样可以使得初始化全零时参数的期望与网络稳定时参数期望一致。
但是,参数全是零时网络不同神经元的输出必然相同,相同的输出必然导致梯度更新完全一样,这样会令更新后的参数仍然保持一样的状态。换句话说,如果参数进行了全零的参数化,那么网络神经元将无法训练模型。

随机初始化

我们希望所有参数的期望接近0, 遵循这个原则,可以将参数设置为接近0的很小的随机数(有正有负),在实际中,随机参数服从高斯分布和均匀分布(uniform distribution)都是有效的初始化方法。

ω=0.001×rand(nin,nout)

但是,上述做法依旧有问题,问题在于网络输出数据分布的方差会随着神经元个数改变(原因见7.1~7.5),为了解决问题,会在初始化的同时加上对方差大小的规范化。

ω=0.001×rand(nin,nout)/n

n是输入神经元的个数,或者是(n_in, n_out)/2 ,这便是著名的Xavier参数初始化方法。

实验表明,此初始化方法的网络比未作方差规范化的版本有更快的收敛速度。Xavier这样初始化的原因在于维持了输入输出数据分布方差的一致性。(但是只能用于线性映射)具体而言:
假设 s 为未经线性变化的该层网络的输出结果,w 为该层参数,x 为该层输入数据

Var(s)=Var(inωixi)7.1

=inVar(ωixi)7.2

=in[E(ωi)]2Var(xi)+[E(ωi)]2Var(ωi)+Var(xi)Var(ωi)7.3

=inVar(xi)Var(ωi)7.4

=(nVar(ω))Var(x)7.5

因为 输出 s 未经过非线性变换, s=inωixi。又因为x服从独立分布假设, 可得到式子7.1, 7.2。后由(Product of independent variables)可得7.3。我们之前提到理想情况下处于稳定状态的神经网络参数和数据均值应为0。则E(ωi)=E(xi)=0。故7.3可简化为7.4,最后得到7.5。为了保证输入数据Var(s)和输出数据Var(s)方差一致,需令nVar(ω)=1, 则

Var(ω)=1n=1nin

但是我们还要考虑反向传比的场景,方向传播是正向传播的逆过程,此时的输入是前向传播的输出。

Var(ω)=1n=1nout

综上, 则可得到满足以上要求的权值矩阵的方差为:

Var(ω)=2nin+nout

但是这种方法有着自己的不完美之处,即该方法并未考虑非线性映射对输入s的影响。因为使用如RELU函数等非线性映射后,输出的期望往往不是0,因此He想出改进方法:将非线性映射造成的影响考虑进参数初始化中。它们提出原本Xavier方法中方差规范化分母应为sqrt(n/2)而不是sqrt(n)。那么这种初始化方法叫He initialization.
[深度学习] 网络参数初始化

Batch Normalization

BN是将输入的数据分布变成高斯分布,这样可以保证每一层神经网络的输入保持相同分布。

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

Scale and Shift作用
γβ是学习到的参数,他们可以让标准正态分布变得更高/更胖和向左右偏移。
[深度学习] 网络参数初始化

参考

解析卷积神经网络——深度学习实践手册