基于机器学习的梯度检验技术验证神经网络的反向传播是否正常运行

葫芦与瓢 2018-12-03

为什么要使用梯度检测

我们需要使用反向传播算法完成神经网络的训练任务,反向传播算法是不能出现错误的,一旦出现错误那么神经网络的训练就会出现意想不到的问题。我们一般不能根据反向传播算法的运行结果判断反向传播算法是否执行正确,也就是反向传播算法是否执行正确,我们也不知道。那么既然反向传播算法的正确这么重要,那么我们就应该能够通过一种方式来判断神经网络的反向传播算法是否执行正确,我们可以使用梯度检测完成这个任务。

基于机器学习的梯度检验技术验证神经网络的反向传播是否正常运行

神经网络

梯度检测的原理

基于机器学习的梯度检验技术验证神经网络的反向传播是否正常运行

神经网络的损失函数J(θ)

假如此时的神经网络的损失函数如上所示,θ0处的导数,也就是上图中的蓝色直线的斜率,我们可以看到蓝色直线和红色直线的斜率很相似。所以我们可以认为J(θ)在θ处的导数几乎可以使用红色直线的斜率表示,红色直线的斜率为:

基于机器学习的梯度检验技术验证神经网络的反向传播是否正常运行

红色直线在θ的斜率

实际上,这个式子很好地表示了θ0点导数的近似值。所以我们就可以使用这种方法来计算损失函数J(θ)在某点的导数,然后用这个导数和反向传播算法算出来的导数类比,如果二者差距不大,那么我们就可以认为反向传播算法正确,如果二者差距很大,那么我们就认为反向传播算法出现了错误,此时我们就应该寻找错误,而不是继续向下执行神经网络的反向传播算法。

神经网络中使用梯度检测

神经网络中有很多参数w[L],b[L],L表示神经网络的层数,神经网络中做梯度检测的步骤通常为:

  1. 把 W[1],b[1],......,W[L],b[L]全部展开转化成向量 θ
  2. 同样把 dW[1],db[1],......,dW[L],db[L]全部展开转化成向量 dθ,是反向传播算法得到的。(θ和dθ的维度相同)
  3. 对每一个参数θi估算导数,从而得到 dθapprox[i]
  4. 比较dθapprox与 dθ是否大致相等,主要是计算两个向量之间的欧式距离
  5. 一般我们设置一个阈值10e-4(threshold),如果欧式距离大于阈值,那么我们需要检测反向传播算法是否正确,如果小于阈值,我们可以认为反向传播算法执行没有问题。

基于机器学习的梯度检验技术验证神经网络的反向传播是否正常运行

第三、四步

梯度检测代码实现

for i =1 :n,
 thetaPlus = theta;
 thetaPlus(i) = thetaPlus(i);
 thetaMinus = theta;
 thetaMinus(i) =thetaMinus(i) - EPSILON;
 gradApprox(i) = (J(thetaPlus) - J(thetaMinus)) / (2*EPSILON);
END

梯度检测的注意事项

  1. 不要在训练中使用梯度检验,它只用于调试
  2. 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出错误具体位置
  3. 在实施梯度检验时,如果使用正则化,请注意正则项
  4. 梯度检验不能与 dropout 同时使用

相关推荐