本文為博主原創文章,未經授權禁止轉載。
我再csdn也同步發布了本文,歡迎大家訪問 https://blog.csdn.net/umbrellalalalala/article/details/80249485
什么是梯度檢測
概述
實現神經網絡的反向傳播算法含有許多細節,在編程實現中很容易出現一些
微妙的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\)的偏導數。
使用時的注意事項
梯度檢測方法的開銷是非常大的,比反向傳播算法的開銷都大,所以一旦用梯度檢測方法確認了梯度下降算法算出的梯度(或導數)值是正確的,那么就及時關閉它。
一般來說ε的值選\(10^{-4}\),注意並不是越小越好。
Enjoy the symphony of the storm. ——umbrellalalalala