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


←上一篇↓↑下一篇→
1.13 梯度检验回到目录1.15 总结

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

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

在这里插入图片描述

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

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

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

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

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

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

课程PPT

在这里插入图片描述
在这里插入图片描述


←上一篇↓↑下一篇→
1.13 梯度检验回到目录1.15 总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值