0. 引言
对于一个函数来说,通常有两种计算梯度的方式:
- 数值梯度(numerical gradient);
- 解析梯度(analytic gradient);
数值梯度的优点是容易编程实现,不要求函数可微,然而,数值梯度缺点很明显,通常是近似解,同时求解速度很慢,因此在设计机器学习目标函数时,通常设计成可微的函数,可以快速地求解其解析梯度,同时这个梯度是确切解。
1. 为何进行梯度检验?
神经网络算法使用反向传播计算目标函数关于每个参数的梯度,可以看做解析梯度。由于计算过程中涉及到的参数很多,反向传播计算的梯度很容易出现误差,导致最后迭代得到效果很差的参数值。
为了确认代码中反向传播计算的梯度是否正确,可以采用梯度检验(gradient check)的方法。通过计算数值梯度,得到梯度的近似值,然后和反向传播得到的梯度进行比较,若两者相差很小的话则证明反向传播的代码是正确无误的。
2. 数值梯度计算
对于函数 J(θ) 在 θ 点处的梯度值,其数学定义为:
ddθJ(θ)=limε→0J(θ+ε)−J(θ−