深度学习中神经网络的权重初始化方法

在介绍Xavier 之前,我们先来看看四种简单的参数初始化方法:
1) 全部初始化为零;2)初始化为相同的随机数;3)初始化为较小的随机数;4)初始化为较大的随机数;分别分析它们的优缺点,再引出本文要介绍的Xavier Initialization和He initialization。

1) 全部初始化为零;
这种方式最简单,我们在线性回归,logistics回归的时候,经常把参数初始化为0,我们的模型也能够很好的工作。

W = np.zeros(input_layer_neurons, hidden_layer_neurons)

但是将权重w全部初始化为零,那么每一层所学到的参数都是一样的,因为它们的梯度一样,所以在反向传播的过程中,每一层的神经元也是相同的。因此会导致代价函数在开始的一段时间内,明显下降,但是一段时间以后,停止继续下降。
深度学习中神经网络的权重初始化方法_第1张图片
2)初始化为相同的随机数;
其实将权重w初始化为相同的随机数和全部初始化为零是一样的,都会导致同样的问题,即Symmetry problem。

W = np.zeros(input_layer_neurons, hidden_layer_neurons)*T

随机初始化可以打破对称,让我们随机初始化权重。在随机初始化之后,每个神经元可以继续学习其输入的不同功能。这里我们只是随机初始化权重参数,偏差还是继续初始化为零。
3)初始化为较小的随机数;
权重参数随机初始化为服从均值为零和方差为1的高斯分布函数。

W = np.random.randn(input_layer_neurons, hidden_layer_neurons)*0.01

开始模型可以很好的运行一段时间,但是随着时间增加,前向传递时,方差开始减少,梯度也开始向零靠近,会导致Gradient Vanishing。特别地,当激活函数为sigmoid时,梯度接近0.5;当激活函数为时tanh,梯度接近0。

4)初始化为较大的随机数;

W = np.random.randn(input_layer_neurons, hidden_layer_neurons)

反向传播时,倒数趋于零,梯度也会消失。此外,权重较大且当输入也很大时,如果使用sigmoid做激活函数,会使输出趋向于0和1,会导致更多问题。

The above two arguments showed us that in both the cases either initializing weights as small values or large they tend to vanish. In small values, the gradient vanishes because of repeated chain multiplication while in large it vanishes because the derivative itself becomes zero. Hence they both can’t be used.

引出本文正题,上图
深度学习中神经网络的权重初始化方法_第2张图片
为了简化,假设我们的输入x服从均值为0,方差为1的正态分布,那么有
a 1 = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + … . . + w n ∗ x n a1 = w1*x1 + w2*x2 + w3*x3 + ….. + wn*xn a1=w1x1+w2x2+w3x3+..+wnxn
a1的方差
V a r ( a 1 ) = V a r ( ∑ W i X i ) = Σ V a r ( W i X i ) = Σ [ ( E [ W i ] ) ² V a r ( X i ) + ( E [ X i ] ) ² V a r ( W i ) + V a r ( W i ) V a r ( X i ) ] Var(a1) = Var(∑WiXi) = ΣVar(WiXi) = Σ[ (E[Wi])²Var(Xi) + (E[Xi])²Var(Wi) + Var(Wi)Var(Xi) ] Var(a1)=Var(WiXi)=ΣVar(WiXi)=Σ[(E[Wi])²Var(Xi)+(E[Xi])²Var(Wi)+Var(Wi)Var(Xi)]
因为输入均值为0,那么有
V a r ( a 1 ) = Σ V a r ( W i ) V a r ( X i ) Var(a1) = ΣVar(Wi)Var(Xi) Var(a1)=ΣVar(Wi)Var(Xi)
输入方差为1,有
V a r ( a 1 ) = n V a r ( W i ) V a r ( X i ) Var(a1) =nVar(Wi)Var(Xi) Var(a1)=nVar(Wi)Var(Xi)
同理,可以推出ak的方差
V a r ( a k ) = ( [ ( n V a r ( W i ) ) ] k ) V a r ( X i ) Var(ak) = ([(nVar(Wi))]^k)Var(Xi) Var(ak)=([(nVar(Wi))]k)Var(Xi)
很明显,当 n V a r ( W i ) > 1 nVar(Wi)>1 nVar(Wi)>1 时,梯度会爆炸;当 n V a r ( W i ) ) < 1 nVar(Wi))<1 nVar(Wi))<1,梯度会消失。 因此我们需要严格限制 n V a r ( W i ) ) = = 1 nVar(Wi))==1 nVar(Wi))==1或者在1附近波动,有
V a r ( W i ) = 1 / n Var(Wi) = 1/n Var(Wi)=1/n
所以我们有
n V a r ( W i ) = n V a r ( W / √ n ) = n ∗ 1 / n V a r ( W ) = 1 nVar(Wi) = nVar(W/√n)= n * 1/n Var(W)=1 nVar(Wi)=nVar(W/n)=n1/nVar(W)=1,其中n为前一层的神经元个数,这就是Xavier/Glorot Initialization。

1 Xavier/Glorot Initialization(适用于激活函数是sigmoid和tanh)

W = np.random.randn(input_layer_neurons, hidden_layer_neurons)* sqrt(1/input_layer_neurons)

Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,他们的思想很简单,就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。

虽然Xavier initialization能够很好的 tanH 激活函数,但是对于目前神经网络中最常用的ReLU激活函数,还是无能能力,因此引出He initialization。

2 MSRA/He initialization(适用于激活函数relu)

W = np.random.randn(input_layer_neurons,hidden_layer_neurons)* sqrt(2/input_layer_neurons)

基于此,何恺明大神提出了一种针对ReLU的初始化方法,一般称作 He initialization。

你可能感兴趣的:(Deep,Learning,pytorch)