为何进行梯度检验?
神经网络算法使用反向传播计算目标函数关于每个参数的梯度,可以看做解析梯度。由于计算过程中涉及到的参数很多,反向传播计算的梯度很容易出现误差,导致最后迭代得到效果很差的参数值。
为了确认代码中反向传播计算的梯度是否正确,可以采用梯度检验(gradient check)的方法。通过计算数值梯度,得到梯度的近似值,然后和反向传播得到的梯度进行比较,若两者相差很小的话则证明反向传播的代码是正确无误的。
对于一个函数来说,通常有两种计算梯度的方式:
数值梯度(numerical gradient);
解析梯度(analytic gradient);
我们都知道,求梯度类似于求导数,所以可以通过理解解析导数和数值导数,进而理解什么是解析梯度,什么是数值导数。
数值梯度的优点是容易编程实现,不要求函数可微,然而,数值梯度缺点很明显,通常是近似解,同时求解速度很慢,因此在设计机器学习目标函数时,通常设计成可微的函数,可以快速地求解其解析梯度,同时这个梯度是确切解。
梯度的数值检验(Numerical Gradient Checking)
数值检验估计梯度的方法类似于求数值导数的方式。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ,我们计算出在 θ-ε 处和 θ+ε 的代价值(ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ 处的代价值。
J(θ)是代价函数
当 θ 是一个向量时,我们则需要对偏导数进行检验。最后我们还需要与通过反向传播方法计算出的偏导数进行检验对比。
梯度检测方法的开销是非常大的,比反向传播算法的开销都大,所以一旦用梯度检测方法确认了梯度下降算法算出的梯度(或导数)值是正确的,那么就及时关闭它。
参考资料:
https://blog.csdn.net/kyang624823/article/details/78900043
http://bbs.keinsci.com/thread-1169-1-1.html
网友评论