1.14 梯度检验应用的注意事项-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

梯度检验应用的注意事项 (Gradient Checking Implementation Notes)

这节课,分享一些关于如何在神经网络实施梯度检验的实用技巧和注意事项。

1.14 梯度检验应用的注意事项-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

首先,不要在训练中使用梯度检验,它只用于调试。我的意思是,计算所有 ii 值的 dθapprox[i]d\theta_{approx}[i] 是一个非常漫长的计算过程,为了实施梯度下降,你必须使用 wwbb backprop来计算 dθd\theta ,并使用backprop来计算导数,只要调试的时候,你才会计算它,来确认数值是否接近 dθd\theta 。完成后,你会关闭梯度检验,梯度检验的每一个迭代过程都不执行它,因为它太慢了。

第二点,如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug,也就是说,如果 dθapprox[i]d\theta_{approx}[i]dθ[i]dθ[i] 的值相差很大,我们要做的就是查找不同的 ii 值,看看是哪个导致 dθapprox[i]d\theta_{approx}[i]dθ[i]d\theta[i] 的值相差这么多。举个例子,如果你发现,相对某些层或某层的 θ\thetadθd\theta 的值相差很大,但是 dw[l]dw^{[l]} 的各项非常接近,注意 θ\theta 的各项与 bbww 的各项都是一一对应的,这时,你可能会发现,在计算参数 bb 的导数 dbdb 的过程中存在bug。反过来也是一样,如果你发现它们的值相差很大, dθapprox[i]d\theta_{approx}[i] 的值与 dθ[i]d\theta[i] 的值相差很大,你会发现所有这些项目都来自于 dwdw 或某层的 #dw$ ,可能帮你定位bug的位置,虽然未必能够帮你准确定位bug的位置,但它可以帮助你估测需要在哪些地方追踪bug

第三点,在实施梯度检验时,如果使用正则化,请注意正则项。如果代价函数 J(θ)=1mL(y^(i),y(i))+λ2mw[l]2J(\theta)=\frac1m\sum L(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum||w^{[l]}||^2 ,这就是代价函数 JJ 的定义, dθd\theta 等于与 θ\theta 相关的 JJ 函数的梯度,包括这个正则项,记住一定要包括这个正则项。

第四点,梯度检验不能与dropout同时使用,因为每次迭代过程中,dropout会随机消除隐藏层单元的不同子集,难以计算dropout在梯度下降上的代价函数 JJ 。因此dropout可作为优化代价函数 JJ 的一种方法,但是代价函数J被定义为对所有指数极大的节点子集求和。而在任何迭代过程中,这些节点都有可能被消除,所以很难计算代价函数 JJ 。你只是对成本函数做抽样,用dropout,每次随机消除不同的子集,所以很难用梯度检验来双重检验dropout的计算,所以我一般不同时使用梯度检验和dropout。如果你想这样做,可以把dropout中的keepprob设置为1.0,然后打开dropout,并寄希望于dropout的实施是正确的,你还可以做点别的,比如修改节点丢失模式确定梯度检验是正确的。实际上,我一般不这么做,我建议关闭dropout,用梯度检验进行双重检查,在没有dropout的情况下,你的算法至少是正确的,然后打开dropout

最后一点,也是比较微妙的一点,现实中几乎不会出现这种情况。当 wwbb 接近0时,梯度下降的实施是正确的,在随机初始化过程中……,但是在运行梯度下降时, wwbb 变得更大。可能只有在 wwbb 接近0时,backprop的实施才是正确的。但是当 wwbb 变大时,它会变得越来越不准确。你需要做一件事,我不经常这么做,就是在随机初始化过程中,运行梯度检验,然后再训练网络, wwbb 会有一段时间远离0,如果随机初始化值比较小,反复训练网络之后,再重新运行梯度检验。

这就是梯度检验,恭喜大家,这是本周最后一课了。回顾这一周,我们讲了如何配置训练集,验证集和测试集,如何分析偏差和方差,如何处理高偏差或高方差以及高偏差和高方差并存的问题,如何在神经网络中应用不同形式的正则化,如 L2L2 正则化和dropout,还有加快神经网络训练速度的技巧,最后是梯度检验。这一周我们学习了很多内容,你可以在本周编程作业中多多练习这些概念。祝你好运,期待下周再见。

课程PPT

1.14 梯度检验应用的注意事项-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
1.14 梯度检验应用的注意事项-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授