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