在深度学习里面,我们算完了梯度可以对其进行检验求导是否正确
1、参数拼接
在深度网络里面有很多参数,$w^{1}$, $b^{1}$, $w^{2}$, $b^{2}$.... $w^{l}$, $b^{l}$,把他们拼接成一个向量$\theta$。其中l代表第几个隐藏层。
因此J($w^{1}$, $b^{1}$,..., $w^{l}$, $b^{l}$) = J($\theta$)
把$dw^{1}$, $db^{1}$, ..., $dw^{l}$, $db^{l}$ 同样用一个大的向量表示 d$\theta$
J($\theta$)= J($\theta$1, $\theta$2, $\theta$3, $\theta$4, ...)
2、那么如何验证 d$\theta$ 是否是 J的梯度呢?
for each i:
d$\theta_{approx}^{i}$=$\frac{J(\theta1, \theta2, ..., \theta[i]+\varepsilon,... ) - J(\theta1, \theta2, ... \theta[i]-\varepsilon) }{2\varepsilon}$
$\approx d\theta[i]=\frac{\partial J}{\partial \theta}$
检验$\frac{\left \| d\theta_{approx} -d\theta\right \|_{2}}{\left \| d\theta_{approx} \right \|_{2} + \left\|d\theta \right \|_{2}}$
令$\varepsilon=10^{-7}$,如果上式约等于$10^{-7}$ 则梯度的误差很小, 如果小于$10^{-5}$次方则可能有问题。
3、检查的点
- 如果根据第2个检查到计算的梯度是有问题的,如果db相差比较大,但是$dw$相差不大,则问题很可能出现在db。因此需要检查下db的计算方法。对于$dw$反之亦然
- 先关闭dropout,再打开dropout
- 先让w,b迭代几轮至比较小的数值