概述
实现神经网络的反向传播算法含有许多细节,在编程实现中很容易出现一些
微妙的bug,但往往这些bug并不会影响你的程序运行,而且你的损失函数看样子也在不断变小。但最终,你的程序得出的结果误差将会比那些无bug的程序高出一个数量级
***
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误(比如难以发现的bug),虽然在训练过程中,代价函数在变小,但最终的结果可能并不是最优解。
所以我们采用一种叫梯度检测的思想,它可以通过估计梯度(或导数)的近似值来估算我们的梯度下降算法算出的梯度(或导数)是否为正确的。
梯度检测的原理梯度检测会估计梯度(或导数)值,然后和你程序计算出来的梯度(导数)的值
进行对比,以判断程序算出的梯度(导数)值是否正确
***
上图中,我们关注\(θ_0\)点的函数的导数,即\(θ_0\)点切线(图中蓝线)的斜率,现在我们在\(θ_0-ε\)和\(θ_0+ε\)两点连一条线(图中红线),我们发现红线的斜率和蓝线斜率很相似。
红线的斜率可以用以下式子表示:
\(\frac{J(θ_0+ε)-J(θ_0-ε)}{2ε}\)
实际上,以上的式子很好地表示了\(θ_0\)点导数的近似值。
在实际的应用中,θ往往是一个向量,梯度下降算法要求我们对向量中的每一个分量进行偏导数的计算,对于偏导数,我们同样可以用以下式子进行近似计算:
\(\frac{J(θ_1+ε,θ_2,θ_3...θ_n)-J(θ_1-ε,θ_2,θ_3...θ_n)}{2ε}\)
上式很好地估计了损失函数对\(θ_1\)的偏导数。
梯度检测方法的开销是非常大的,比反向传播算法的开销都大,所以一旦用梯度检测方法确认了梯度下降算法算出的梯度(或导数)值是正确的,那么就及时关闭它。
Enjoy the symphony of the storm. ——umbrellalalalala