1 梯度检验
1.1 为什么要使用梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
1.2 梯度检验原理
我们通过计算数值梯度并比较数值梯度和根据反向传播求出的梯度(解析梯度)间的差异,来测试我们的实现代码。这里有两种数值梯度的计算方法:
- 右边形式:
[ J ( θ + ϵ ) − J ( θ ) ] / ϵ [J(\theta+\epsilon)-J(\theta)]/\epsilon [J(θ+ϵ)−J(θ)]/ϵ - 双边形式(见图):
[ J ( θ + ϵ ) − J ( θ − ϵ ) ] / 2 ϵ [J(\theta+\epsilon)-J(\theta-\epsilon)]/2\epsilon [J(θ+ϵ)−J(θ−ϵ)]/2ϵ
逼近导数的双边形式比右边形式更接近真实值。
我们以 f ( x ) =