2020-5-27 吳恩達-改善深層NN-w1 深度學習的實用層面(1.14 關於梯度檢驗實現的注意事項)

1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai

本節將介紹一些關於如何在NN實施梯度檢驗的實用技巧和注意事項。

1.不要在訓練中使用梯度檢驗,它只用於調試。

前面已經介紹過,梯度檢驗是對比 dθapprox[i]d\theta_{approx}[i]dθd\theta
計算所有ii值的 dθapprox[i]d\theta_{approx}[i] 是一個非常漫長的計算過程。
爲了實施梯度下降,你必須使用反向傳播backprop來計算 dθd\theta 和導數。

所以只有調試的時候,你才計算dθapprox[i]d\theta_{approx}[i],來確認數值是否接近dθd\theta
完成後,你會關閉梯度檢驗,梯度檢驗的每一個迭代過程都不執行它,因爲它太慢了。

2.如果算法的梯度檢驗失敗,要檢查每一項,並試着找出bug。

如果dθapprox[i]d\theta_{approx}[i]dθ[i]d\theta[i] 的值相差很大,我們要做的就是查找不同的ii值,看看是哪個導致值相差很大。

例如,某些層或者某一層的對應θ\theta或者說dθd\thetadb[l]db^{[l]}的值相差很大,但是dW[l]dW^{[l]}的各項非常接近。注意:θ\theta的各項與W和b的各項都是一一對應的。這時,你可能會發現,在計算參數b的導數dbdb的過程中存在bug。

對於dWdW的情況也是一樣的。你可能會發現所有這些項目都來自於dWdW或某層的dWdW,這可能幫你定位bug的位置。

雖然有可能未必能夠幫你準確定位bug的位置,但它可以幫助你估測需要在哪些地方追蹤bug。

3.在實施梯度檢驗時,如果使用正則化,請注意正則項。

我們已經學習過使用L2正則的代價函數J公式
J(θ)=1mi=1mL(y^(i),y(i))+λ2mi=1mW[l]F2J(\theta)=\frac 1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{i=1}^m||W^{[l]}||_F^2

dθd\thetaθ\theta關於函數J的梯度,包含正則項。一定不要忘記正則項。

4.梯度檢驗不能與dropout同時使用

dropout是化代價函數的一種方法。

每次迭代過程中,dropout會隨機消除隱藏層單元的不同子集,難以計算dropout在梯度下降上的代價函數J。代價函數J被定義爲對所有指數極大的節點子集求和,在任何迭代過程中,這些節點都有可能被消除,所以很難計算代價函數J。

使用dropout,你只是對成本函數做抽樣,每次隨機消除不同的子集,所以很難用梯度檢驗來雙重檢驗dropout的計算。

建議關閉dropout,用梯度檢驗進行檢查,確保在沒有dropout的情況下,你的算法至少是正確的,然後再打開dropout。

5.隨機初始化,可能需要反覆訓練網絡,再運行梯度檢驗

這一點比較微妙,現實中幾乎不會出現這種情況。

當隨機初始化開始時候,w和b接近0(隨機初始化的值要小,原因參見鏈接),梯度下降的實施是正確的。但是梯度下降運行一段時間後,w和b變得更大。

可能只有在w和b接近0時,反向傳播backprop的實施纔是正確的。但是當w和b變大時,它會變得越來越不準確。你需要做一件事,我不經常這麼做,就是在隨機初始化過程中,運行梯度檢驗,然後再訓練網絡,w和b會有一段時間遠離0,如果隨機初始化值比較小,反覆訓練網絡之後,再重新運行梯度檢驗。

意思就是w和b變大,就檢查一下梯度檢驗,沒有問題,再訓練。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章