C1 - week3 - part7 随机初始化 Random Initialization

当你训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为0,当然也是可以的。但是对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。

让我们来看看这是为什么。有两个输入特征, n [ 0 ] = 2 n^{[0]} = 2 n[0]=2,2个隐藏单元 n [ 1 ] n^{[1]} n[1]就等于2.因此与一个隐藏层相关的矩阵,或者说 W [ 1 ] W^{[1]} W[1] 2 ∗ 2 2*2 22的矩阵。假设我们把它初始化为 0 0 0 2 ∗ 2 2*2 22矩阵,那么b^{[1]}也等于 [ 0 , 0 ] T [0, 0]^T [0,0]T,把偏置项 b b b初始化为0是合理的,但是把 w w w初始化为0就有问题了

如果按照这样初始化的话,你总是会发现 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 2 [ 1 ] dz^{[1]}_2 dz2[1]也一样,这样输出的权值也会一样,因此 W [ 2 ] W^{[2]} W[2]等于 [ 0 , 0 ] [0, 0] [0,0]

由此可以推导,如果你把权重都初始化为 0 0 0,那么由于隐含单元开始计算同一个函数,所有的隐藏单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同 的,即隐含单元仍是对称的。通过推导,两次、三次、无论多少次迭代,不管你训练网络多 长时间,隐含单元仍然计算的是同样的函数。因此在这种情况下,多个隐藏单元并没有什么意义,因为他们计算着同样的东西。

如果你要初始化成 0 0 0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数, 这个问题的解决方法就是随机初始化参数

你应该把 𝑊[1] 设 为 np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它初始化为很小的随机数。然后 b b b没有对称的问题(叫做 symmetry breaking problem),所以可以把 𝑏 初始化为 0 0 0,因为只要随机初始化 W W W你就有不同的隐含单元计算不同的东西, 因此不会有 symmetry breaking 问题了。相似的,对于𝑊[2]你可以随机初始化,𝑏 [2]可以初始化为 0。

W1 = np.random.randn(2,2) * 0.01
b1 = np.zeros((2,1))
w2 = np.random.randn(2,2) * 0.01
b2 = 0

我们通常倾向于将参数初始化胃很小的随机数。因为如果你使用tanh或者sigmoid激活函数,或者说只在输出层有一个Sigmoid,如果数值波动太大,当你计算激活值时 z [ 1 ] = W [ 1 ] x + b [ 1 ] z^{[1]} = W^{[1]}x + b^{[1]} z[1]=W[1]x+b[1] a [ 1 ] = σ ( z [ 1 ] ) a^{[1]} = \sigma(z^{[1]}) a[1]=σ(z[1]),如果 W W W很大, z z z就会很大, a a a就可能会很大或很小(sigmoid函数的两端)。因此这种情况下你的梯度下降很可能会停在tanh/sigmoid函数的平坦的地方,这些地方梯度很小也就意味着梯度下降很慢,算法的学习也就很慢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值