权重矩阵的随机初始化
当训练神经网络的时候,权重随机初始化是非常重要的。对于逻辑回归,把权重初始化为0是可以正常运行的。
但是对于一个神经网络,如果把权重或者参数全部初始化为0,那么梯度下降是不会起作用的。
我们来看看这是为什么,在讨论的时候先忽略b的影响,因此设 b = 0 b=0 b=0。
假设我们的网络只有两层,输入层的神经元个数有4个,输出层的神经元个数有3个,那么我们的权重矩阵W为维数为
(
3
,
4
)
(3,4)
(3,4),如果将其全部初始化为0的话,那么其所有行就是一样的,假设对于这些行都用一个向量
m
m
m来表示,那么权重矩阵可以写成下面这种形式:
W
=
[
m
m
m
]
W= \left[ \begin{array}{c} m\\ m\\ m \end{array} \right]
W=⎣⎡mmm⎦⎤
那么我们得到的下一层神经元的输入值每一行也都是一样的:
z
=
W
x
=
[
m
x
m
x
m
x
]
z=Wx= \left[ \begin{array}{c} mx\\ mx\\ mx \end{array} \right]
z=Wx=⎣⎡mxmxmx⎦⎤
经过一次梯度下降的迭代之后,我们可以得到新的W:
W
=
W
−
α
d
W
W = W - \alpha \ dW
W=W−α dW
而对于
d
W
dW
dW来说,其取值如下:
d
W
=
[
(
a
−
y
)
x
1
(
a
−
y
)
x
2
(
a
−
y
)
x
3
(
a
−
y
)
x
4
(
a
−
y
)
x
1
(
a
−
y
)
x
2
(
a
−
y
)
x
3
(
a
−
y
)
x
4
(
a
−
y
)
x
1
(
a
−
y
)
x
2
(
a
−
y
)
x
3
(
a
−
y
)
x
4
]
dW = \left[ \begin{array}{cccc} (a-y)x_1 & (a-y)x_2 & (a-y)x_3 & (a-y)x_4\\ (a-y)x_1 & (a-y)x_2 & (a-y)x_3 & (a-y)x_4\\ (a-y)x_1 & (a-y)x_2 & (a-y)x_3 & (a-y)x_4\\ \end{array} \right]
dW=⎣⎡(a−y)x1(a−y)x1(a−y)x1(a−y)x2(a−y)x2(a−y)x2(a−y)x3(a−y)x3(a−y)x3(a−y)x4(a−y)x4(a−y)x4⎦⎤
由于
W
W
W的初值是一样的,并且每次训练时减去的值也是样的,我们可以发现,每一层的更新之后仍然是一样的值,也就是意味着每一个神经元都在进行相同的函数计算,他们的功能是一模一样的。
由此可以推导,如果把权重都初始化为0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有着同样的影响。一次迭代之后同样的表示是结果仍然是相同的,即隐含单元是完全对称的。无论通过多少次迭代,隐含单元计算的仍然是相同的函数,这种情况下一直添加神经元的个数是没有帮助的,因为他们一直都是在计算相同的东西。
正确的做法应该是使用随机初始化参数,也就是将每个参数都进行随机初始化。
在代码中可以这样计算:
W = np.random.randn((3,4)) * 0.01
至于为什么这里会需要乘一个0.01呢?为什么不是其他的数,100或者1000?
因为如果你用tanh
或者simoid
激活函数,或者说只在输出层有一个sigmoid,对于这两个函数来说,当他们的
z
z
z取值很大的时候,函数的值下降的就会非常的慢,也就是说当
z
z
z比较大的时候,导数值会非常的小,我们在训练时候往往是期望尽快获得一些效果的,因此就尽量保证我们的初始值可以使得
z
z
z的取值比较小,这样导数值在开始就会比较大,学习速度也会比较快,模型就会较快的收敛。
但是不是说0.01就是一个最好的值,对于不同的模型来说这里的取值可以不同,也是学习中一个不太重要的超参数。