当你训练神经网络的时候,随机初始化权重非常重要,对于逻辑回归,可以将权重初始化为零,但如果将神经网络的各参数数组全部初始化为0,再使用梯度下降算法那会完全无效,让我们看看是什么原因。
如上图,神经网络有两个输入特征,所以
n
[
0
]
=
2
n^{[0]}=2
n[0]=2,有两个隐藏单元,所以
n
[
1
]
=
2
n^{[1]}=2
n[1]=2,所以和隐藏层相关的矩阵
W
[
1
]
W^{[1]}
W[1]是
(
2
,
2
)
(2,2)
(2,2),如果将其全部初始化为0,同时令
b
[
1
]
=
0
b^{[1]}=0
b[1]=0,
b
[
1
]
b^{[1]}
b[1]的维度是
(
2
,
1
)
(2,1)
(2,1)的。将偏置项初始化为0实际上是可行的,但是将W初始化为全零就成问题了。
这种初始化形式的问题在于,给网络输入任何样本得到 a 1 [ 1 ] a^{[1]}_1 a1[1]和 a 2 [ 1 ] a^{[1]}_2 a2[1]是一样的,得到的两个激活函数结果是一样的,因为两个隐藏单元都在做一样的计。
当计算反向传播的时候,事实证明,出于对称性, d z 1 [ 1 ] dz^{[1]}_1 dz1[1]和 d z 1 [ 2 ] dz^{[2]}_1 dz1[2]也是相同的,这两个隐藏单元也会以同样的方式初始化。假设输出的权重也是一样的,即 W [ 2 ] = [ 0 , 0 ] W^{[2]}=[0 ,0] W[2]=[0,0]。以这种方式初始化神经网络,隐藏单元 a 1 [ 1 ] a^{[1]}_1 a1[1]和隐藏单元 a 2 [ 1 ] a^{[1]}_2 a2[1]就完全一样了,所以这就是所谓的完全对称,意味着节点计算完全一样的函数。我们可以通过归纳法证明,在每次训练迭代之后,两个隐藏单元仍然在计算完全相同的函数。
两个隐藏单元一开始就在做同样的计算,两个隐藏单元对输出单元的影响也一样大,在一次迭代之后,同样的对称性仍然存在,两个隐藏单元仍然是对称的。无论训练神经网络多长时间,两个隐藏单元仍然在计算完全一样的函数。所以在这种情况下,多个隐藏单元真的没有意义,因为这些隐藏单元都在计算相同的东西。
对于更大的神经网络,或者输入有三个特征,或者隐藏单元的数目非常多,用类似的方法可以证明,这样的神经网络,如果把所有的权重都初始化为0,那么所有隐藏单元都是对称的,不管进行多少次迭代,网络都是在计算完全一样的函数,所以没有一点用处,因为我们需要两个不同的隐藏单元去计算不同的函数。
这个问题的解决方案是随机初始化所有参数,对于下图中的神经网络,可以令 W [ 1 ] = n p . r a n d o m . r a n d n ( ( 2 , 2 ) ) W^{[1]}=np.random.randn((2,2)) W[1]=np.random.randn((2,2)),这样可以产生参数为(2,2)的高斯分布随机变量,然后再乘于一个很小的数字,比如0.01,这样就将权重初始化为很小的随机数。
对于参数b,b完全没有对称性这个问题,即所谓的破坏对称性问题,把b初始化为0是可以的,即 b [ 1 ] = n p . z e r o s ( ( 2 , 1 ) ) b^{[1]}=np.zeros((2,1)) b[1]=np.zeros((2,1))。只要W随机初始化,一开始还是用不同的隐藏单元计算不同的函数,这里并不需要破坏对称性。
类似地,对于 W [ 2 ] W^{[2]} W[2]也可以随机初始化, b [ 2 ] b^{[2]} b[2]可以初始化为0,。
可能有一个疑惑,初始化W时的0.01是怎么得到的,为什么不用其它的数值。实际上,我们通常喜欢把权重矩阵初始化为非常非常小的随机值。因为如果用的是tanh或者是sigmoid激活函数,如果权重太大,当计算激活函数值时函数值可能落在激活函数的平缓部分,梯度的斜率非常小。意味着梯度下降会非常慢,学习会变得很慢。如果神经网络中没有任何sigmoid或者tanh激活函数,那问题可能没那么大。但如果在做二元分类,输出单元是sigmoid函数,那么你就不希望初始参数太大,所以用0.01是比较合理的,或者任意其它小数字,初始化
W
[
2
]
W^{[2]}
W[2]也一样,可能用命令np.random.randn
。
实际上,有时有比0.01更好用的常数,当训练一个单隐层神经网络时,这是一个相对比较浅的神经网络,没有太多的隐藏层,设为0.01应该还是可以的。但是当训练一个很深的神经网络时,可能就得试试0.01以外的常数。不管怎样,初始化参数一般都很小