一、Gradient check
在深度学习里面,我们算完了梯度可以对其进行检验求导是否正确
1、参数拼接
在深度网络里面有很多参数,$w^{1}$, $b^{1}$, $w^{2}$, $b^{2}$.... $w^{l}$, $b^{l}$,把他们拼接成一个向量$ heta$。其中l代表第几个隐藏层。
因此J($w^{1}$, $b^{1}$,..., $w^{l}$, $b^{l}$) = J($ heta$)
把$dw^{1}$, $db^{1}$, ..., $dw^{l}$, $db^{l}$ 同样用一个大的向量表示 d$ heta$
J($ heta$)= J($ heta$1, $ heta$2, $ heta$3, $ heta$4, ...)
2、那么如何验证 d$ heta$ 是否是 J的梯度呢?
for each i:
$$d heta_{approx}^{i} = frac{J( heta1, heta2, ..., heta[i]+varepsilon,... ) - J( heta1, heta2, ... heta[i]-varepsilon) }{2varepsilon} \ approx d heta[i]=frac{partial J}{partial heta}$$
检验$$frac{left | d heta_{approx} -d heta ight |_{2}}{left | d heta_{approx} ight |_{2} + left|d heta ight |_{2}}$$
令$varepsilon=10^{-7}$,如果上式约等于$10^{-7}$ 则梯度的误差很小, 如果小于$10^{-5}$次方则可能有问题。
3、检查的点
- 如果根据第2个检查到计算的梯度是有问题的,如果db相差比较大,但是$dw$相差不大,则问题很可能出现在db。因此需要检查下db的计算方法。对于$dw$反之亦然
- 先关闭dropout,再打开dropout
- 先让w,b迭代几轮至比较小的数值
二、Momentum
在t轮迭代中,令$domega$、$db$为mimi batch中的梯度。则
- $Vdomega =eta Vdomega+(1-eta )domega$
- $Vdb =eta Vdb+(1-eta )db$
- $omega =omega - alpha Vdomega$
- $b = b - alpha Vdb$
也可以理解为这使当前更新的梯度不要距离历史的梯度太远
三、Exponentially Weighted Averages
$$ V_{t}=eta V_{t-1} + (1-eta ) heta_{t} $$
作用跟Momentum差不多,整体上是使得当前更新的梯度不要距离历史的梯度太远,因此利用更新梯度的时候会比较稳定
四、bias correction
在指数平均中,当 $t=0$并且$eta$比较小的时候,$V_{0}$是一个比较小的值,但是我们现在想修正这一情况,即当迭代次数t比较小时,V与本身偏差不太大。
令$V_{t}=frac{V_{t}}{1-eta^{t}}$
随着t的增加,分母逐渐变大趋向于1,因此$V_{t}$逐渐趋向于本身