神经网络优化篇:梯度检验应用的注意事项(Gradient Checking Implementation Notes)
梯度檢驗應用的注意事項
分享一些關于如何在神經網絡實施梯度檢驗的實用技巧和注意事項。
首先,不要在訓練中使用梯度檢驗,它只用于調試。意思是,計算所有\(i\)值的\(d\theta_{\text{approx}}\left[i\right]\)是一個非常漫長的計算過程,為了實施梯度下降,必須使用\(W\)和\(b\) backprop來計算\(d\theta\),并使用backprop來計算導數,只要調試的時候,才會計算它,來確認數值是否接近\(d\theta\)。完成后,會關閉梯度檢驗,梯度檢驗的每一個迭代過程都不執行它,因為它太慢了。
第二點,如果算法的梯度檢驗失敗,要檢查所有項,檢查每一項,并試著找出bug,也就是說,如果\(d\theta_{\text{approx}}\left[i\right]\)與dθ[i]的值相差很大,要做的就是查找不同的i值,看看是哪個導致\(d\theta_{\text{approx}}\left[i\right]\)與\(d\theta\left[i\right]\)的值相差這么多。舉個例子,如果發現,相對某些層或某層的\(\theta\)或\(d\theta\)的值相差很大,但是\(\text{dw}^{[l]}\)的各項非常接近,注意\(\theta\)的各項與\(b\)和\(w\)的各項都是一一對應的,這時,可能會發現,在計算參數\(b\)的導數\(db\)的過程中存在bug。反過來也是一樣,如果發現它們的值相差很大,\(d\theta_{\text{approx}}\left[i\right]\)的值與\(d\theta\left[i\right]\)的值相差很大,會發現所有這些項目都來自于\(dw\)或某層的\(dw\),可能幫定位bug的位置,雖然未必能夠幫準確定位bug的位置,但它可以幫助估測需要在哪些地方追蹤bug。
第三點,在實施梯度檢驗時,如果使用正則化,請注意正則項。如果代價函數\(J(\theta) = \frac{1}{m}\sum_{}^{}{L(\hat y^{(i)},y^{(i)})} + \frac{\lambda}{2m}\sum_{}^{}{||W^{[l]}||}^{2}\),這就是代價函數\(J\)的定義,\(d\theta\)等于與\(\theta\)相關的\(J\)函數的梯度,包括這個正則項,記住一定要包括這個正則項。
第四點,梯度檢驗不能與dropout同時使用,因為每次迭代過程中,dropout會隨機消除隱藏層單元的不同子集,難以計算dropout在梯度下降上的代價函數\(J\)。因此dropout可作為優化代價函數\(J\)的一種方法,但是代價函數J被定義為對所有指數極大的節點子集求和。而在任何迭代過程中,這些節點都有可能被消除,所以很難計算代價函數\(J\)。只是對成本函數做抽樣,用dropout,每次隨機消除不同的子集,所以很難用梯度檢驗來雙重檢驗dropout的計算,所以一般不同時使用梯度檢驗和dropout。如果想這樣做,可以把dropout中的keepprob設置為1.0,然后打開dropout,并寄希望于dropout的實施是正確的,還可以做點別的,比如修改節點丟失模式確定梯度檢驗是正確的。實際上,一般不這么做,建議關閉dropout,用梯度檢驗進行雙重檢查,在沒有dropout的情況下,算法至少是正確的,然后打開dropout。
最后一點,也是比較微妙的一點,現實中幾乎不會出現這種情況。當\(w\)和\(b\)接近0時,梯度下降的實施是正確的,在隨機初始化過程中……,但是在運行梯度下降時,\(w\)和\(b\)變得更大。可能只有在\(w\)和\(b\)接近0時,backprop的實施才是正確的。但是當\(W\)和\(b\)變大時,它會變得越來越不準確。需要做一件事,不經常這么做,就是在隨機初始化過程中,運行梯度檢驗,然后再訓練網絡,\(w\)和\(b\)會有一段時間遠離0,如果隨機初始化值比較小,反復訓練網絡之后,再重新運行梯度檢驗。
總結
以上是生活随笔為你收集整理的神经网络优化篇:梯度检验应用的注意事项(Gradient Checking Implementation Notes)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中numpy出现has no
- 下一篇: JavaScript apply、cal