Neural-Networks
數值梯度檢查:有多接近才足夠接近?
我製作了一個卷積神經網絡,我想使用數值梯度檢查來檢查我的梯度是否正確計算。問題是,有多接近才足夠接近?
我的檢查函數只是吐出計算的導數、數值近似的導數、兩者之間的差異,以及這兩個值是否具有相同的符號(一個是正數,另一個是負數是一個很大的禁忌)重量。
我主要擔心的是,對於除第一個之外的所有全連接層和所有捲積層,差異看起來很相似——兩個數字的前 9-13 個字符將匹配。這聽起來足夠好,對吧?但是對於第一個卷積層的權重,有時我會匹配到小數點後 12 位,但也可能低至 3 位。這是否足夠,或者可能存在錯誤?
需要注意的一件好事是兩個值的符號總是匹配的,這是好的,所以網絡總是會朝著正確的方向移動,即使移動的幅度有點偏離。但這就是問題……它有沒有可能關閉?
我見過的最接近解決這個問題的方法是在斯坦福 UFLDL 教程中的softmax 回歸部分。複製關鍵語句:
數值梯度和分析梯度之間的差異範數應該很小,大約為.
在 python 中,代碼看起來像這樣:
norm(gradients - numericalGradients)/norm(gradients + numericalGradients)
你在哪裡
gradients
是導數的結果,numericalGradients
是近似的梯度。