学习目标
掌握DNN参数初始化的三种常见方式及应用场景。
笔记
1.为什么要初始化
权重初始化很重要,因为初始化不当可能造成梯度爆炸和梯度消失问题。
注:b一般只用零初始化,因其影响较小。所以这里只讨论权重W的初始化。
2. 三种初始化方法
2.1 零初始化
首先说明的是将W初始化为0的操作在神经网络训练中不可取,因为权重的零初始化不能打破对称性。这意味着每一层的每个神经元都学习一样的东西。举个例子:
当W,b均初始化为0时,
z
=
W
x
+
b
=
0
z = Wx+b = 0
z=Wx+b=0
a
=
R
e
L
U
(
z
)
=
m
a
x
(
0
,
z
)
=
0
a = ReLU(z) = max(0, z) = 0
a=ReLU(z)=max(0,z)=0
σ
(
z
)
=
1
1
+
e
−
(
z
)
=
1
2
=
y
p
r
e
d
\sigma(z) = \frac{1}{ 1 + e^{-(z)}} = \frac{1}{2} = y_{pred}
σ(z)=1+e−(z)1=21=ypred
可见,此时
y
p
r
e
d
y_{pred}
ypred变成0.5了。当
y
=
1
y=1
y=1时,Loss function变成:
L ( 0 , 1 ) = − ( 1 ) ln ( 1 2 ) = 0.6931471805599453 \mathcal{L}(0, 1) = - (1) \ln(\frac{1}{2}) = 0.6931471805599453 L(0,1)=−(1)ln(21)=0.6931471805599453
当 y = 0 y=0 y=0时,Loss function变成:
L
(
0
,
0
)
=
−
(
1
)
ln
(
1
2
)
=
0.6931471805599453
\mathcal{L}(0, 0) = - (1) \ln(\frac{1}{2}) = 0.6931471805599453
L(0,0)=−(1)ln(21)=0.6931471805599453
可见此时无论
y
=
1
y=1
y=1还是
y
=
0
y=0
y=0,损失函数都一样,权重无法继续调整下去。在这种情况下,最终的预测结果都是“0”。
2.2 随机初始化
权重随机初始化会导致损失比较大。尤其当随机初始的W值非常大的时候,输出层的激活函数的结果会非常接近0或1。结合Loss function(下式),当
log
(
a
[
L
]
)
=
log
(
0
)
\log(a^{[L]}) = \log(0)
log(a[L])=log(0)时,损失无穷大。
L
(
a
,
y
)
=
−
y
ln
(
y
p
r
e
d
)
−
(
1
−
y
)
ln
(
1
−
y
p
r
e
d
)
\mathcal{L}(a, y) = - y \ln(y_{pred}) - (1-y) \ln(1-y_{pred})
L(a,y)=−yln(ypred)−(1−y)ln(1−ypred)
所以在使用随机初始化时,一般都再乘一个0.01,使初始化的值较小,即:
for l in range(1, L):
parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l-1])*0.01
注:随机初始化为什么要用randn()?
numpy.random.rand() 产生服从于均匀分布(uniform distribution)的数;numpy.random.randn() 产生服从于正态分布normal distribution的数。在进行权重随机初始化时,randn() 生成的权重数值大多分布在区间的中部,避免生成极端值,这样做可以加快收敛。
2.3 He初始化
该方法由He et al.( 2015)提出,就是在随机初始化的基础上乘一个scaling factor,即 2 dimension of the previous layer \sqrt{\frac{2}{\text{dimension of the previous layer}}} dimension of the previous layer2,在Python中表示为:
for l in range(1, L + 1):
parameters['W' + str(l)] = np.random.randn(layers_dims[l],layers_dims[l-1])*np.sqrt(2./layers_dims[l-1])
2.4 三种初始化方法比较
学习时间
2.22.6.27