Deeplearning.ai第二门课第一周11-14笔记

1.11 神经网络的权重初始化

神经网络的参数初始化是很重要的一项能力,为了更好地理解它,我们首先举一个例子来说明它。
我们来看看只有一个神经元的状况。
在这里插入图片描述
首先来看它的结构,输入有四个单元,输出 y ^ \hat{y} y^,而这里,   z = w 1 x 1 + w 2 x 2 + … … … … + w n x n \ z=w_1x_1+w_2x_2+…………+w_nx_n  z=w1x1+w2x2++wnxn我们可以暂时忽略b对z的影响。所以z就变成了一个由w和x决定的数值,为了预防z过大或者过小,n越大,你希望相应的w越小。此时理所当然的想法是设置   w = 1 / n \ w = 1/n  w=1/n.
但其实实际上,你要做的就是设置某层权重矩阵   W \ W  W,用python来表示就是:
W = np.random.randn(shape func)*np.sqrt(1/(n^(l-1)))
这就是l层上拟合的单元数量。
但实验结果表明,如果你用的是Relu函数,也就是方差设置为2/n,效果会更好。不过这并没有完全解决初始化问题。如果激活函数的输入特征被零均值化,方差就变成了1,这会是z也调整到相应的范围。   R e l u \ Relu  Relu函数的使用,或者设置方差的操作,只是单纯降低了坡度消失和爆炸的问题出现概率。因为它给权重矩阵   W \ W  W设置了合理的初值。使得它的速度不会过快或者过慢。
当然还有其他的激活函数,比如   T a n h \ Tanh  Tanh函数,有篇论文证明上面的数字为1时效果会更好,也就是   T a n h = 1 n [ l − 1 ] \ Tanh = \sqrt{\frac 1{n^{[l-1]}}}  Tanh=n[l1]1 .这个过程叫做   X a v i e r \ Xavier  Xavier初始化。
另一种方法是: 2 n [ l − 1 ] + n [ l ] \sqrt{\frac 2{n^{[l-1]}+n^{[l]}}} n[l1]+n[l]2 .
如果你想使用   R e l u \ Relu  Relu激活函数,也是最常用的激活函数,或者什么其他的函数,我认为这些所有的公式只是给了你一个起点,它们给出初始化权重矩阵的方差默认值,如果你想使用方差的话,方差参数将是另一个你需要调整的超级参数。你可以选择给根号下面的部分乘上一个数来作为超级参数的调优,但有时调优效果一般。考虑到它的不怎么重要性,我们一般把它的优先级放得比较低。

1.12 梯度的数值逼近

这一小节主要讲了双边误差相对于单边误差对于求梯度的效果更好。它的证明类似于导数定义,所以原谅刚考完复变的我在此就先略过了……
此处上图:
在这里插入图片描述

1.13 梯度检验

吴老师说梯度检验在帮他检查backprop的bug方面有很大作用,我们来康一下吧(

为了实现梯度检验,首先要做的就是把所有参数转换成一个巨大的向量数据。
我们把   w [ 1 ] , b [ 1 ] , … … w [ l ] , b [ l ] \ w^{[1]},b^{[1]},…… w^{[l]},b^{[l]}  w[1],b[1],w[l],b[l]转成矩阵,再做连接运算,就会得到一个巨型向量 θ \theta θ,代价函数J是所有W和b的函数,所以现在代价函数可以写成   J ( θ ) \ J(\theta)  J(θ)了。
根据上面的操作,你也同样可以把   d w [ 1 ] , d b [ 1 ] , … … d w [ l ] , d b [ l ] \ dw^{[1]},db^{[1]},…… dw^{[l]},db^{[l]}  dw[1],db[1],dw[l],db[l]转成矩阵做连接运算等等,用它来初始化向量 d θ d\theta dθ,它与 θ \theta θ有相同的维度。
根据我们所学到的知识, d θ d\theta dθ,也就是 θ \theta θ的导数,跟 θ \theta θ的梯度的值应该是一样的,或者说,是极度相似的。这就是实施梯度下降的方法了,我们通常称为“grad check".
为了实施梯度检验,你要做的就是循环执行,对于每一个 i,计算   D θ a p p r o x [ i ] \ D\theta approx[i]  Dθapprox[i]的值,当然要使用双边误差的方法了(毕竟上节刚新鲜地证明完)。但每一次只对一个 θ \theta θ做双边误差,也就是:
在这里插入图片描述
而这个值,理论上是与当前点的导数值 d θ [ i ] d\theta [i] dθ[i]相似。
我们所要做的就是,验证这些向量是否彼此接近。具体说来就是,计算这两个向量的距离,就是俩个向量之差的欧几里得范数(就是绝对值……我不太懂为什么字幕翻译要坚持用这个生僻而又装逼的描述),然后用向量长度做归一化,最后式子为:
∣ D θ a p p r o x − d θ ∣ ∣ D θ a p p r o x ∣ + ∣ d θ ∣ \frac{|D\theta approx-d\theta|}{|D\theta approx|+|d\theta| } Dθapprox+dθDθapproxdθ
之所以要做归一化处理,就是避免分子过大或者过小。正常的数据大约是   1 0 − 7 \ 10^{-7}  107左右,如果是   1 0 − 5 \ 10^{-5}  105,那可能其中某一项存在问题,如果是   1 0 − 3 \ 10^{-3}  103,那么就大概是哪里存在bug了。
现在你已经知道了梯度检验的基本原理了,在第一遍跑完梯度检验之后,根据所得的值,会怀疑有相应的bug,然后开始调试调试调试,调试一段时间后,最后得到了一个很小的梯度检验值。等到最后的数据在大概   1 0 − 7 \ 10^{-7}  107左右时,我就可以自信地说,我的神经网络实施是正确的。

1.14 关于梯度检验实现的注记

  T i p 1 \ Tip 1  Tip1 梯度检验不要用于实际训练,只用于调试
用双边误差去计算每一个点的梯度是一个耗时非常长的运算,为了实施梯度下降,你必须用backprop来计算 d θ d\theta dθ,只有在你验证时需要用到梯度检验,来一点点计算梯度是否贴近它。完成之后,你会关闭梯度检验,之后的每一个迭代过程都不执行它(因为实在是太慢了

  T i p 2 \ Tip 2  Tip2 如果算法的梯度检验失败,要检查所有项,试着去定为bug的位置
如果 d θ d\theta dθ   D θ a p p r o x \ D\theta approx  Dθapprox的值相差过大,我们要做的就是查找不同的i值,看看是哪个导致   D θ a p p r o x [ i ] \ D\theta approx[i]  Dθapprox[i]   d θ [ i ] \ d\theta[i]  dθ[i]的值相差这么多。

  T i p 3 \ Tip 3  Tip3 如果在实施梯度检验中使用正则化,那么要注意一下正则项
记得在求取梯度和导数时,不要忘了加上正则项,否则会造成比较大的误差。

  T i p 4 \ Tip 4  Tip4 梯度检验不能与dropout一同使用
因为在每次迭代过程中,dropout会随机消除隐层单元的不同子集,这会造成我们很难计算在梯度下降上的代价函数J。dropout就像是对函数单元做抽样,你无法保证在抽样过程中,你的代价函数J会保持相对稳定而精确的数值。所以很难用梯度检验来检验你dropout的计算是否精确。如果你非要这样做的话,那不妨把keep.prob设置为1,然后寄希望于你的dropout正确运行(

  T i p 5 \ Tip 5  Tip5在随机初始化过程中,运行梯度检验
这当然不是在大多数情况下。在极少数情况下,backprop只在w和b接近于0的过程中效果比较好,在w和b越来越大的过程中,back prop会变得越来越不准确,这时候就要采取这种方法了。在随机初始化过程中,运行梯度检验,这样w和b会有一段时间远离0了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值