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

为什么要使用梯度检测

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

在这里插入图片描述

梯度检测的原理

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

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

神经网络中使用梯度检测

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

把 W[1],b[1],…,W[L],b[L]全部展开转化成向量 θ
同样把 dW[1],db[1],…,dW[L],db[L]全部展开转化成向量 dθ,dθ是反向传播算法得到的。(θ和dθ的维度相同)
对每一个参数θi估算导数,从而得到 dθapprox[i]
比较dθapprox与 dθ是否大致相等,主要是计算两个向量之间的欧式距离
一般我们设置一个阈值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

梯度检测的注意事项

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幻风_huanfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值