葫芦与瓢 2018-12-03
我们需要使用反向传播算法完成神经网络的训练任务,反向传播算法是不能出现错误的,一旦出现错误那么神经网络的训练就会出现意想不到的问题。我们一般不能根据反向传播算法的运行结果判断反向传播算法是否执行正确,也就是反向传播算法是否执行正确,我们也不知道。那么既然反向传播算法的正确这么重要,那么我们就应该能够通过一种方式来判断神经网络的反向传播算法是否执行正确,我们可以使用梯度检测完成这个任务。
神经网络
神经网络的损失函数J(θ)
假如此时的神经网络的损失函数如上所示,θ0处的导数,也就是上图中的蓝色直线的斜率,我们可以看到蓝色直线和红色直线的斜率很相似。所以我们可以认为J(θ)在θ处的导数几乎可以使用红色直线的斜率表示,红色直线的斜率为:
红色直线在θ的斜率
实际上,这个式子很好地表示了θ0点导数的近似值。所以我们就可以使用这种方法来计算损失函数J(θ)在某点的导数,然后用这个导数和反向传播算法算出来的导数类比,如果二者差距不大,那么我们就可以认为反向传播算法正确,如果二者差距很大,那么我们就认为反向传播算法出现了错误,此时我们就应该寻找错误,而不是继续向下执行神经网络的反向传播算法。
神经网络中有很多参数w[L],b[L],L表示神经网络的层数,神经网络中做梯度检测的步骤通常为:
第三、四步
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