1-13 梯度检验

梯度检验( Gradient checking

梯度检验有助于发现 backprop 实施过程中的 bug。
假设你的网络中的参数:${{\rm{W}}^{[1]}},{b^{[1]}}......{W^{[l]}},{b^{[l]}}$,为了执行梯度检验,首先要做的就是,把所有参数转换成一个巨大的向量数据用$\theta$表示,则:
$J({{\rm{W}}^{[1]}},{b^{[1]}}......{W^{[l]}},{b^{[l]}}) = J(\theta )$
同样${\rm{d}}{{\rm{W}}^{[1]}},d{b^{[1]}}......d{W^{[l]}},d{b^{[l]}}$可以转换成一个向量使用$d\theta$表示,它与 $\theta$具有相同的维度。
J是超参数$\theta$的一个函数,为了实施梯度检验,你要做的就是循环执行,从而对每个 i也就是对每个$\theta$组成元素计算$d{\theta _{approx}}[i]$,我使用双边误差,也就是:
$d{\theta _{approx}}[i] = \frac{{J({\theta _1},{\theta _2},...{\theta _i} + \varepsilon ) - J({\theta _1},{\theta _2},...{\theta _i} - \varepsilon )}}{{2\varepsilon }}$
只对${{\theta _i}}$增加$\varepsilon$其它项保持不变,因为我们使用的是双边误差,对另一边做同样的操作,只不过是减去 $\varepsilon$,$\theta$其它项全都保持不变。
$d{\theta _{approx}}[i]$的值应该逼近 $d\theta [i] = \frac{{\partial J}}{{\partial {\theta _i}}}$,$d\theta [i]$是代价函数的偏导数,然后你需要对 i的每个值都执行这个运算,最后得到两个向量,得到 $d\theta$的逼近值 $d{\theta _{approx}}$。
 $d\theta$,$d{\theta _{approx}}$,$\theta$具有相同维度,你要做的就是验证这些向量是否彼此接近 。

检查:
$\frac{{{{\left\| {d{\theta _{approx}} - d\theta } \right\|}_2}}}{{{{\left\| {d{\theta _{approx}}} \right\|}_2} + {{\left\| {d\theta } \right\|}_2}}}$
$\varepsilon$可能为 ${10^{ - 7}}$使用这个取值范围内的$\varepsilon$如果你发现计算方程式得到的值为 ${10^{ - 7}}$ 或更小,这就很好,这就意味着导数逼近很有可能是正确的,它的值非常小。
如果它的值在  ${10^{ - 5}}$范围内,我就要小心了,也许这个值没问题,但我会再次检查这个向量的所有项,确保没有一项误差过大,可能这里有 bug
如果这个方程式结果是  ${10^{ - 3}}$我就会担心是否存在 bug,计算结果应该比${10^{ - 3}}$ 小很多。这时应该仔细检查所有i值,使得$d{\theta _{approx}}[i]$与 $d\theta [i]$大不相同,并用它来追踪一些求导计算是否正确。
在实施神经网络时,我经常需要执行 foreprop backprop,然后我可能发现这个梯度检验有一个相对较大的值,我会怀疑存在 bug,然后开始调试,调试,调试,调试一段时间后,我得到一个很小的梯度检验值,现在我可以很自信的说,神经网络实施是正确的。
 

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