2020-5-24 吴恩达-改善深层NN-w1 深度学习的实用层面(1.11 神经网络的权重初始化--减少梯度爆炸或过快消失-初始化权重矩阵的方差公式)

274 篇文章 24 订阅
233 篇文章 0 订阅

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

1.11 神经网络的权重初始化 Weight Initialization for Deep NetworksVanishing / Exploding gradients

【本节内容似懂非懂,还需要扩展研究一下】

3.11 随机初始化 中使用的是随机数乘以一个小常数,例如0.01,避免隐藏单元完全对称,失去多隐藏单元的意义
本节根据不同激活函数使用随机数乘以一个公式,除了避免隐藏单元完全对称,还可以减少梯度爆炸或过快消失

针对深度NN的梯度消失和梯度爆炸问题,我们想出了一个不完整的解决方案,虽然不能彻底解决问题,却很有用,有助于我们为NN更谨慎地选择随机初始化参数。

先以单个神经元为例。
在这里插入图片描述
上图是单个神经元。
有4个输入特征x1,x2,x3,x4,激活函数a=g(z),预测值 y ^ \hat y y^

和上节课一样,还是先忽略b,b=0,可以得到
z = w 1 x 1 + w 2 x 2 + w 3 x 3 + . . . . . . + w n x n z=w_1x_1+w_2x_2+w_3x_3+......+w_nx_n z=w1x1+w2x2+w3x3+......+wnxn
为了预防z值过大或过小,由于z是 w i x i w_ix_i wixi的和,如果你把很多此类项相加,那每项 w x wx wx乘积值应该更小,所以n越大,你希望 w i w_i wi越小。

最合理的方法就是设置方差 w i = 1 n w_i=\frac1n wi=n1,n表示神经元的输入特征数量。
实际上,你要做的就是设置某层权重矩阵
w [ l ] = n p . r a n d o m . r a n d n ( s h a p e ) ∗ n p . s q r t ( 1 n [ l − 1 ] ) w^{[l]}=np.random.randn(shape)*np.sqrt(\frac 1{n^{[l-1]}}) w[l]=np.random.randn(shape)np.sqrt(n[l1]1)
1 n [ l − 1 ] \frac 1{n^{[l-1]}} n[l1]1是第l层每个神经单元特征数量分之一。 n [ l − 1 ] n^{[l-1]} n[l1]是l层拟合的单元数量(即第l-1层神经单元数量,l层每个神经单元特征数量=l-1层神经单元数量)。

如果你使用的是Relu激活函数,方差 w i = 2 n w_i=\frac2n wi=n2,效果会比 1 n \frac1n n1更好。

你常常发现,初始化时,尤其是使用Relu激活函数时,即 g [ l ] = R e l u ( z ) g^{[l]}=Relu(z) g[l]=Relu(z),它取决于你对随机变量的熟悉程度。

【补充】
—————————————— begin ——————————————————————
参考 https://blog.csdn.net/zenghaitao0128/article/details/78556535
重点

  • np.random.randn()函数可以返回一个或一组服从标准正态分布的随机样本值。
  • 当randn()有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵。
  • 标准正态分布是正态分布(高斯分布)的一种,具有正态分布的所有特征。
  • 在NN构建中,权重参数W通常采用该函数进行初始化,当然需要注意的是,通常会在生成的矩阵后面乘以小数,比如0.01,目的是为了提高梯度下降算法的收敛速度。
W = np.random.randn(2,2)*0.01 #产生参数为(2,2)的高斯分布随机变量,再乘以0.01可以生成一个很小随机数
  • 该函数在前面已经介绍随机初始化时候也提到过,参考链接
    —————————————— end ——————————————————————

所以, n p . r a n d o m . r a n d n ( s h a p e ) ∗ n p . s q r t ( 2 n [ l − 1 ] ) np.random.randn(shape)*np.sqrt(\frac 2{n^{[l-1]}}) np.random.randn(shape)np.sqrt(n[l1]2)表示高斯分布随机变量乘以 2 n [ l − 1 ] \frac 2{n^{[l-1]}} n[l1]2的平方根,也就是方差 w i = 2 n w_i=\frac 2n wi=n2。这里我们用的是 n [ l − 1 ] {n^{[l-1]}} n[l1],因为本例中,逻辑回归的特征是不变的。但一般情况下l层上的每个神经元都有 n [ l − 1 ] {n^{[l-1]}} n[l1]个输入。

如果激活函数的输入特征被零均值和标准方差化,方差是1,即归一化输入,z也会调整到相似范围,这就没解决梯度消失和爆炸问题。

但它确实降低了梯度消失和爆炸问题,因为它给权重矩阵w设置了合理值,你也知道,它不能比1大很多,也不能比1小很多,所以梯度没有爆炸或消失过快。

我们已经看到,这里的Relu函数用的是公式 n p . s q r t ( 2 n [ l − 1 ] ) np.sqrt(\frac 2{n^{[l-1]}}) np.sqrt(n[l1]2)初始化权重的方差。
对于tanh激活函数,常量1比常量2的效率更高,使用的是公式 1 n [ l − 1 ] \sqrt{\frac 1{n^{[l-1]}}} n[l1]1 ,作用和Relu函数的 n p . s q r t ( 2 n [ l − 1 ] ) np.sqrt(\frac 2{n^{[l-1]}}) np.sqrt(n[l1]2)一样,它被成为被称为Xavier初始化。

实际上,我认为上面的这些公式只是给你一个起点,它们给出初始化权重矩阵的方差的默认值。
如果你想添加方差,方差参数则是另一个你需要调整的超级参数。
可以给公式 1 n [ l − 1 ] \sqrt{\frac 1{n^{[l-1]}}} n[l1]1 添加一个乘数参数,调优作为超级参数激增一份子的乘子参数。

有时调优该超级参数效果一般,这并不是我想调优的首要超级参数,但我发现调优过程中产生的问题,虽然调优该参数能起到一定作用,但考虑到相比调优,其它超级参数的重要性,我通常把它的优先级放得比较低。

通过本节介绍,希望你现在对梯度消失或爆炸问题以及如何为权重初始化合理值已经有了一个直观认识,希望你设置的权重矩阵既不会增长过快,也不会太快下降到0,从而训练出一个权重或梯度不会增长或消失过快的深度网络。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值