1-14 梯度检验应用的注意事项

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

首先,不要在训练中使用梯度检验,它只用于调试。我的意思是,计算所有 i值的 $d{\theta _{approx}}[i]$是一个非常漫长的计算过程,为了实施梯度下降,你必须使用 W和bbackprop 来计算$d\theta$,并使用 backprop 来计算导数,只有调试的时候,你才会计算它,来确认数值是否接近$d\theta$,完成后,你会关闭梯度检验,梯度检验的每一个迭代过程都不执行它,因为它太慢了。
第二点,如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug,也就是说,如果$d{\theta _{approx}}[i]$与 $d\theta$的值相差很大,我们要做的就是查找不同的i值,看看是哪个导致两者相差这么大。举个例子,如果你发现,相对某些层或某层的$\theta$或$d\theta$ 的值相差很大,但是$d{W^{[l]}}$的各项非常接近,这时,你可能会发现,在计算参数b的导数db的过程中存在 bug
第三点,在实施梯度检验时,如果使用正则化,请注意正则项。如果代价函数 $J(\theta ) = \frac{1}{m}\sum {L({{\hat y}^{(i)}},{y^{(i)}})}  + \frac{\lambda }{{2{\rm{m}}}}{\sum {\left\| {{{\rm{W}}^{[l]}}} \right\|} ^2}$这就是代价函数 J的定义$d\theta$等于与 $\theta$相关的 J函数的梯度,
包括这个正则项,记住一定要包括这个正则项。 
第四点,梯度检验不能与 dropout 同时使用,因为每次迭代过程中, dropout 会随机消除隐藏层单元的不同子集,难以计算 dropout 在梯度下降上的代价函数J。建议关闭 dropout,用梯度检验进行双重检查,在没有 dropout 的情况下,你的算法至少是正确的,然后打开 dropout。 
最后一点,也是比较微妙的一点,现实中几乎不会出现这种情况。可能只有当w和b接近 0 时,backprop 的实施才是正确的。 但是当 W和b变大时,它会变得越来越不准确。你需要做一件事,我不经常这么做,就是在随机初始化过程中,运行梯度
检验,然后再训练网络,w和b有一段时间远离 0如果随机初始化值比较小,反复训练网络之后,再重新运行梯度检验。 

 

posted @ 2018-09-12 22:35  刘-皇叔  阅读(685)  评论(0编辑  收藏  举报