网站首页 > 技术文章 正文
随机初始化(Random+Initialization)
当你训练神经网络时,权重随机初始化是很重要的。
对于逻辑回归,把权重初始化为0当然也是可以的。
但是对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。
让我们看看这是为什么?
有两个输入特征,n^([0])=2,2个隐藏层单元n^([1])就等于2。 因此与一个隐藏层相关的矩阵,或者说W^([1])是2*2的矩阵,假设把它初始化为0的2*2矩阵,b^([1])也等于 [0?0]^T,把偏置项b初始化为0是合理的,但是把w初始化为0就有问题了。
那这个问题如果按照这样初始化的话,你总是会发现a_1^([1]) 和 a_2^([1])相等,这个激活单元和这个激活单元就会一样。因为两个隐含单元计算同样的函数,当你做反向传播计算时,这会导致dz_1^([1]) 和 dz_2^([1])也会一样,对称这些隐含单元会初始化得一样,这样输出的权值也会一模一样,由此W^([2])等于[0?0];
如果你这样初始化这个神经网络,那么这两个隐含单元就会完全一样,因此他们完全对称,也就意味着计算同样的函数,并且肯定的是最终经过每次训练的迭代,这两个隐含单元仍然是同一个函数,令人困惑。
dW会是一个这样的矩阵,每一行有同样的值因此我们做权重更新
把权重W^([1])?W^([1])-adW每次迭代后的W^([1]),第一行等于第二行。
由此可以推导,如果你把权重都初始化为0,
那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。
一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。
通过推导,两次、三次、无论多少次迭代,不管你训练网络多长时间,隐含单元仍然计算的是同样的函数。
因此这种情况下超过1个隐含单元也没什么意义,因为他们计算同样的东西。当然更大的网络,比如你有3个特征,还有相当多的隐含单元。
如果你要初始化成0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数,
这个问题的解决方法就是随机初始化参数。
你应该这么做:
把W^([1])设为np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如0.01,这样把它初始化为很小的随机数。
然后b没有这个对称的问题(叫做symmetry breaking problem),所以可以把 b 初始化为0,因为只要随机初始化W你就有不同的隐含单元计算不同的东西,因此不会有symmetry breaking问题了。相似的,对于W^([2])你可以随机初始化,b^([2])可以初始化为0。
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])=0
你也许会疑惑,这个常数从哪里来,为什么是0.01,而不是100或者1000。
我们通常倾向于初始化为很小的随机数。因为如果你用tanh或者sigmoid激活函数,或者说只在输出层有一个Sigmoid,如果(数值)波动太大,
当你计算激活值时z^([1])=W^([1]) x+b^([1])?,?a^([1])=σ(z^([1]))=g^([1]) (z^([1]))
如果W很大,z就会很大。z的一些值a就会很大或者很小,因此这种情况下你很可能停在tanh/sigmoid函数的平坦的地方(见下图),
这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢。
回顾一下:
如果w很大,那么你很可能最终停在(甚至在训练刚刚开始的时候)z很大的值,这会造成tanh/Sigmoid激活函数饱和在龟速的学习上,
如果你没有sigmoid/tanh激活函数在你整个的神经网络里,就不成问题。
但如果你做二分类并且你的输出单元是Sigmoid函数,那么你不会想让初始参数太大,因此这就是为什么乘上0.01或者其他一些小数是合理的尝试。对于w^([2])一样,就是np.random.randn((1,2)),我猜会是乘以0.01。
事实上有时有比0.01更好的常数,当你训练一个只有一层隐藏层的网络时(相对浅的神经网络,没有太多的隐藏层),设为0.01可能也可以。
但当你训练一个非常非常深的神经网络,你可能会选择一个不同于的常数而不是0.01。
那么如何设置常数呢?这个等下一章深度学习网络时再做进一步说明!
点击关注,持续更新中……
猜你喜欢
- 2024-09-25 应聘机器学习工程师?这是你需要知道的12个基础面试问题
- 2024-09-25 Richard Sutton 直言卷积反向传播已经落后,AI 突破要有新思路:持续反向传播
- 2024-09-25 深度学习常用概念总结(一) 人工智能中深度学习的概念
- 2024-09-25 特斯拉AI芯片深度解读 特斯拉车规级芯片
- 2024-09-25 5分钟理解RELU以及他在深度学习中的作用
- 2024-09-25 局部响应归一化与批归一化的区别 批归一化层作用
- 2024-09-25 看完立刻理解GAN!初学者也没关系 初学者的好处和坏处
- 2024-09-25 计算机视觉的核心——CNN卷积神经网络
- 2024-09-25 人工智能神经网络中的基础概念有哪些?
- 2024-09-25 步长?填充?池化?教你从读懂词语开始了解计算机视觉识别最火模型|CNN入门手册(中)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)