←上一篇 ↓↑ 下一篇→
3.10 直观理解反向传播 回到目录 3.12 总结习题

随机初始化 (Radom Initialization)

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

让我们看看这是为什么。有两个输入特征, n[0]=2n^{[0]}=2n[0]=2 ,2个隐藏层单元 n[1]n^{[1]}n[1] 就等于2。 因此与一个隐藏层相关的矩阵,或者 W[1]W^{[1]}W[1] 说是22的矩阵,假设把它初始化为0的22矩阵, b[1]b^{[1]}b[1] 也等于 [0,0]T[0,0]^T[0,0]T ,把偏置项 bbb 初始化为0是合理的,但是把 www 初始化为0就有问题了。 那这个问题如果按照这样初始化的话,你总是会发现 a1[1]a^{[1]}_1a1[1]​ 和 a2[1]a^{[1]}_2a2[1]​ 相等,这个激活单元和这个激活单元就会一样。因为两个隐含单元计算同样的函数,当你做反向传播计算时,这会导致 dz1[1]dz^{[1]}_1dz1[1]​ 和 dz2[1]dz^{[1]}_2dz2[1]​ 也会一样,对称这些隐含单元会初始化得一样,这样输出的权值也会一模一样,由此 W[2]W^{[2]}W[2] 等于 [0,0][0,0][0,0] ;


图3.11.1 但是如果你这样初始化这个神经网络,那么这两个隐含单元就会完全一样,因此他们完全对称,也就意味着计算同样的函数,并且肯定的是最终经过每次训练的迭代,这两个隐含单元仍然是同一个函数,令人困惑。 dWdWdW 会是一个这样的矩阵,每一行有同样的值因此我们做权重更新把权重 W[1]⇒W[1]−adWW^{[1]}\Rightarrow W^{[1]}-adWW[1]⇒W[1]−adW 每次迭代后的 W[1]W^{[1]}W[1] ,第一行等于第二行。

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

如果你要初始化成0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数,这个问题的解决方法就是随机初始化参数。你应该这么做:把 W[1]W^{[1]}W[1] 设为np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如0.01,这样把它初始化为很小的随机数。然后 bbb 没有这个对称的问题(叫做symmetry breaking problem),所以可以把 bbb 初始化为0,因为只要随机初始化 WWW 你就有不同的隐含单元计算不同的东西,因此不会有symmetry breaking问题了。相似的,对于 W[2]W^{[2]}W[2] 你可以随机初始化, b[2]b^{[2]}b[2] 可以初始化为0。

W[1]=np.random.randn(2,2)∗0.01,b[1]=np.zeros((2,1))W^{[1]}=np.random.randn(2,2)*0.01,b^{[1]}=np.zeros((2,1))W[1]=np.random.randn(2,2)∗0.01,b[1]=np.zeros((2,1))W[2]=np.random.randn(2,2)∗0.01,b[2]=0W^{[2]}=np.random.randn(2,2)*0.01,b^{[2]}=0W[2]=np.random.randn(2,2)∗0.01,b[2]=0

你也许会疑惑,这个常数从哪里来,为什么是0.01,而不是100或者1000。我们通常倾向于初始化为很小的随机数。因为如果你用tanh或者sigmoid激活函数,或者说只在输出层有一个Sigmoid,如果(数值)波动太大,当你计算激活值时 z[1]=W[1]x+b[1],a[1]=σ(z[1])=g[1](z[1])z^{[1]}=W^{[1]}x+b^{[1]},a^{[1]}=\sigma(z^{[1]})=g^{[1]}(z^{[1]})z[1]=W[1]x+b[1],a[1]=σ(z[1])=g[1](z[1]) 如果 WWW 很大, zzz 就会很大或者很小,因此这种情况下你很可能停在tanh/sigmoid函数的平坦的地方(见图3.8.2),这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢。

回顾一下:如果 www 很大,那么你很可能最终停在(甚至在训练刚刚开始的时候) zzz 很大的值,这会造成tanh/Sigmoid激活函数饱和在龟速的学习上,如果你没有sigmoid/tanh激活函数在你整个的神经网络里,就不成问题。但如果你做二分类并且你的输出单元是Sigmoid函数,那么你不会想让初始参数太大,因此这就是为什么乘上0.01或者其他一些小数是合理的尝试。对于 w[2]w^{[2]}w[2] 一样,就是np.random.randn((1,2)),我猜会是乘以0.01。

事实上有时有比0.01更好的常数,当你训练一个只有一层隐藏层的网络时(这是相对浅的神经网络,没有太多的隐藏层),设为0.01可能也可以。但当你训练一个非常非常深的神经网络,你可能要试试0.01以外的常数。下一节课我们会讨论怎么并且何时去选择一个不同于0.01的常数,但是无论如何它通常都会是个相对小的数。

好了,这就是这周的视频。你现在已经知道如何建立一个一层的神经网络了,初始化参数,用前向传播预测,还有计算导数,结合反向传播用在梯度下降中。

课程PPT




←上一篇 ↓↑ 下一篇→
3.10 直观理解反向传播 回到目录 3.12 总结习题

3.11 随机初始化-深度学习-Stanford吴恩达教授相关推荐

  1. 2.19 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.18 Logistic 损失函数的解释 回到目录 3.1 神经网络概览 文章目录 总结 习题 第 11 题 第 12 题 第 13 题 第 14 题 第 15 题 第 1 ...

  2. 3.12 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 随机初始化 回到目录 4.1 深层神经网络 文章目录 总结 习题 第 21 题 第 22 题 第 23 题 第 24 题 第 25 题 第 26 题 第 27 题 ...

  3. 3.10 直观理解反向传播-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.9 神经网络的梯度下降法 回到目录 3.11 随机初始化 直观理解反向传播 (Backpropagation Intuition (Optional)) 这个视频主要是推 ...

  4. 3.5 向量化实现的解释-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.4 多个例子中的向量化 回到目录 3.6 激活函数 向量化实现的解释 (Explanation for Vectorized Implementation) 在上一个视频 ...

  5. 2.11 向量化-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.10 m 个样本的梯度下降 回到目录 2.12 向量化的更多例子 向量化 (Vectorization) 向量化是非常基础的去除代码中for循环的艺术,在深度学习安全领域 ...

  6. 4.1 深层神经网络-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.12 总结习题 回到目录 4.2 深层网络中的前向传播 深层神经网络 (Deep L-layer Neural Network) 目前为止我们学习了只有一个单独隐藏层的神 ...

  7. 3.9 神经网络的梯度下降法-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.8 激活函数的导数 回到目录 3.10 直观理解反向传播 神经网络的梯度下降法 (Gradient Descent for Neural Networks) 在这个视频中 ...

  8. 3.6 激活函数-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.5 向量化实现的解释 回到目录 3.7 为什么需要非线性激活函数 激活函数 (Activation Function) 使用一个神经网络时,需要决定使用哪种激活函数用隐藏 ...

  9. 2.10 m 个样本的梯度下降-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.9 Logistic 回归的梯度下降法 回到目录 2.11 向量化 mmm 个样本的梯度下降 (Gradient Descent on mmm example) 在之前的 ...

最新文章

  1. TVM,Relay,Pass
  2. Windows Phone 7 IEnumerableT.Select和SelectMany的区别
  3. [codevs 1912] 汽车加油行驶问题
  4. JQuery中元素的数据存储
  5. java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务
  6. 进阶的Redis之数据持久化RDB与AOF
  7. HDU1556 Color the ball【差分数组+线段树】
  8. java如何验证手机号码_Java 手机号码正则表达式验证
  9. 超酷!极通EWEBS竟然不需微软终端服务支持
  10. 怎么将kux格式视频转换成MP4格式
  11. 浙大计算机系课本,浙大计算机系毕业的一个理工男 找遍西湖边所有亭子写成了书...
  12. iTween基础之Move(移动)
  13. Windows server 2022安装与激活
  14. SDJZU_新生_递推动规_HDU 2569 彼岸
  15. 大数据项目之电商数据仓库系统回顾
  16. selenium对接代理与seleniumwire访问开发者工具NetWork
  17. 卡瓦格博[梅里雪山]之日照金山美景全纪录
  18. YV12和YUY2的基本知识
  19. Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)
  20. js动态修改@keyframes

热门文章

  1. 使用Windbg调试StackOverflowException异常
  2. 12 信息2班 《基于Android的软件开发》课程成绩
  3. VC++中操作XML(MFC、SDK)
  4. date制作电子时钟
  5. 动态改变select 宽度
  6. 初步了解OpenSSL命令
  7. 了解 Apache ActiveMQ
  8. 超图数据集管理基本操作和添加删除属性表字段
  9. powerdesigner使用vba脚本创建物理模型的表和列
  10. 掌握测试驱动开发的3个关键因素(译)