3.10 随机初始化(Random+Initialization)

神经网络模型中的参数权重WW不能全部初始化为零

如果权重W[1]W^{[1]}W[2]W^{[2]}都初始化为零,即:

W[1]=[0000]W^{[1]}= \left[ \begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right]
W[2]=[00]W^{[2]}= \left[ \begin{matrix} 0 & 0 \end{matrix} \right]

这样使得隐藏层第一个神经元的输出等于第二个神经元的输出,即a1[1]=a2[1]a_1^{[1]}=a_2^{[1]}。经过推导得到dz1[1]=dz2[1]dz_1^{[1]}=dz_2^{[1]}dW1[1]=dW2[1]dW_1^{[1]}=dW_2^{[1]},这样的结果是隐藏层两个神经元对应的权重行向量W1[1]W_1^{[1]}W2[1]W_2^{[1]}每次迭代更新都会得到完全相同的结果,W1[1]W_1^{[1]}始终等于W2[1]W_2^{[1]},完全对称。这样隐藏层设置多个神经元就没有任何意义

权重WW全部初始化为零带来的问题称为symmetry breaking problem

随机初始化:

W_1 = np.random.randn((2,2))*0.01
b_1 = np.zero((2,1))
W_2 = np.random.randn((1,2))*0.01
b_2 = 0

WW比较小,是因为如果使用sigmoidsigmoid函数或者tanhtanh函数作为激活函数的话,WW比较小,得到的z|z|也比较小(靠近零点),而零点区域的梯度比较大,这样能大大提高梯度下降算法的更新速度,尽快找到全局最优解

如果WW较大,得到的z|z|也比较大,附近曲线平缓,梯度较小,训练过程会慢很多

如果激活函数是ReLUReLU或者LeakyLeaky ReLUReLU函数,则不需要考虑这个问题

如果输出层是sigmoidsigmoid函数,则对应的权重WW最好初始化到比较小的值

Last updated