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