基于机器学习的梯度检验技术验证神经网络的反向传播是否正常运行
为什么要使用梯度检测
我们需要使用反向传播算法完成神经网络的训练任务,反向传播算法是不能出现错误的,一旦出现错误那么神经网络的训练就会出现意想不到的问题。我们一般不能根据反向传播算法的运行结果判断反向传播算法是否执行正确,也就是反向传播算法是否执行正确,我们也不知道。那么既然反向传播算法的正确这么重要,那么我们就应该能够通过一种方式来判断神经网络的反向传播算法是否执行正确,我们可以使用梯度检测完成这个任务。
梯度检测的原理
假如此时的神经网络的损失函数如上所示,θ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 同时使用
- 零基础神经网络实战(2):理解并实现反向传播及验证神经网络是否正确
- 机器学习笔记1:神经网络 反向传播(Backpropagation) week5
- 神经网络之梯度下降与反向传播(上)
- 浅谈神经网络反向传播的梯度丢失问题
- 神经网络之梯度下降与反向传播(下)
- 基于反向传播的多层神经网络训练原理
- 吴恩达机器学习代码及相关知识点总结--ex4(NN back propagation(神经网络反向传播))
- 神经网络反向传播时的梯度到底怎么求?
- 吴恩达机器学习 EX4 作业 神经网络反向传播 手写数字
- Python神经网络代码实现流程(三):反向传播与梯度下降
- 神经网络之梯度下降法和反向传播BP
- 神经网络反向传播时的梯度
- Ng机器学习系列补充:7、神经网络反向传播BP算法(Back Propagation)
- 基于反向传播的多层神经网络训练原理(翻译)
- 机器学习第五周神经网络 反向传播 嗷嗷好
- 基于深度学习神经网络等机器学习技术实现一个医学辅助诊断的专家系统原型
- 神经网络系列之二 -- 反向传播与梯度下降
- 【机器学习】反向传播神经网络推导
- 神经网络反向传播梯度计算数学原理
- 吴恩达机器学习练习4:神经网络学习(反向传播)