梯度检验

梯度检验

梯度检验的实现原理,是根据导数的定义,对成本函数求导,有:

\[J’(\theta) = \frac{\partial J(\theta)}{\partial \theta}= \lim_{\epsilon\rightarrow 0}\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon} \]

则梯度检验公式:

\[J’(\theta) = \frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon} \]

其中当\(ϵ\)越小时,结果越接近真实的导数也就是梯度值。可以使用这种方法,来判断反向传播进行梯度下降时,是否出现了错误。
梯度检验的过程,是对成本函数的每个参数\(\theta_{[i]}\)加入一个很小的\(ϵ\),求得一个梯度逼近值\(d\theta_{approx[i]}\)

\[d\theta_{approx[i]} = \frac{J(\theta_{[1]},\theta_{[2]},…,\theta_{[i]}+\epsilon)-J(\theta_{[1]},\theta_{[2]},…,\theta_{[i]}-\epsilon)}{2\epsilon} \]

以解析方式求得\(J′(θ)\)\(θ\)时的梯度值\(dθ\),进而再求得它们之间的欧几里得距离:

\[\frac{||d\theta_{approx[i]}-d\theta||_2}{||d \theta_{approx[i]}||_2+||dθ||_2} \]

其中\(||x||_2\)表示向量x的2范数.
当计算的距离结果与\(ϵ\)的值相近时,即可认为这个梯度值计算正确,否则就需要返回去检查代码中是否存在bug。
需要注意的是:

  • 不要在训练模型时进行梯度检验.
  • 当成本函数中加入了正则项时,也需要带上正则项进行检验.
  • 不要在使用随机失活后使用梯度检验。
posted @ 2019-04-10 14:46  youngliu91  阅读(821)  评论(0编辑  收藏  举报