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

网络参数初始化

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

网络初始化的方案

全零初始化

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

随机初始化

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

ω = 0.001 × r a n d ( n i n , n o u t )

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

ω = 0.001 × r a n d ( n i n , n o u t ) / n

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

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

V a r ( s ) = V a r ( i n ω i x i ) 7.1

= i n V a r ( ω i x i ) 7.2

= i n [ E ( ω i ) ] 2 V a r ( x i ) + [ E ( ω i ) ] 2 V a r ( ω i ) + V a r ( x i ) V a r ( ω i ) 7.3

= i n V a r ( x i ) V a r ( ω i ) 7.4

= ( n V a r ( ω ) ) V a r ( x ) 7.5

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

V a r ( ω ) = 1 n = 1 n i n

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

V a r ( ω ) = 1 n = 1 n o u t

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

V a r ( ω ) = 2 n i n + n o u t

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

Batch Normalization

改变初始化方法的目的就是为了让网络达到更好的效果。
一种简单粗暴但十分有效的方法来削弱bad initialization, 其基本思想是: If you want it, just make it! 我们想要在非线性activation之前,输出值应该有更好的分布,以便于back propagation时计算gradient,更新weight。BN相当于对输出值强制做一次高斯平滑和线性变换。

参考

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

猜你喜欢

转载自blog.csdn.net/siyue0211/article/details/80384951
今日推荐