Day 3: 参数初始化
神经网络参数初始化
神经网络结构图神经网络的参数主要是权重(weights):W, 和偏置项(bias):b
1) 0初始化
不管是哪个神经元,它的前向传播和反向传播的算法都是一样的,如果初始值也一样的话,不管训练多久,它们最终都一样,都无法打破对称(fail to break the symmetry),那每一层就相当于只有一个神经元,最终L层神经网络就相当于一个线性的网络,如Logistic regression
因此,我们决不能把所有参数初始化为0,同样也不能初始化为任何相同的值,因为我们必须“打破对称性”!
2)随机初始化
b不用随机初始化,因为w随机之后,已经打破对称,b就一个常数,无所谓了
random.rand()是在0~1之间随机,random.randn()是标准正态分布中随机,有正有负
np.zeros(())这里是两个括号,random.randn()是一个括号
sigmoid函数(1)放大版随机初始化(w*10)
效果不好,因为sigmoid函数中间的斜率大,两边的斜率小还趋于零。所以当我们把随机的值乘以10了之后,我们的初值会往两边跑,那么我们的梯度下降就会显著变慢,可能迭代半天,才下降一点点
(2)缩小版随机初始化(w/10)
我们把w都除以10,实际上就接近0了,深度学习中我们认为参数越大,模型越复杂;参数越小,模型越简单。所以除以10之后,参数太小了,模型就too simple了,效果当然不好。
3) 何氏初试法(He Initialization)
在我们随机初始化了之后,乘以
,这样就避免了参数的初始值过大或者过小
W = np.random.randn(num_of_dim[l],num_of_dim[l-1])*np.sqrt(2/num_of_dim[l-1]) # W的维度是(当前层单元数,上一层单元数)
推荐针对使用ReLU激活函数的神经网络使用的
4) Xavier Initialization
推荐给sigmoid的Xavier Initialization