反向傳播是訓(xùn)練神經(jīng)網(wǎng)絡(luò)的最常用方法之一。Rumelhart、Hinton和Williams(1986)引入了反向傳播,該方法到今天仍然很流行。程序員經(jīng)常使用反向傳播訓(xùn)練深層神經(jīng)網(wǎng)絡(luò),因?yàn)樵趫D形處理單元上運(yùn)行時(shí),它的伸縮性很好。要了解這種用于神經(jīng)網(wǎng)絡(luò)的算法,我們必須探討如何訓(xùn)練它,以及它如何處理模式。
經(jīng)典的反向傳播已得到擴(kuò)展和修改,產(chǎn)生了許多不同的訓(xùn)練算法。本章中將討論神經(jīng)網(wǎng)絡(luò)最常用的訓(xùn)練算法。我們從經(jīng)典的反向傳播開始,然后以隨機(jī)梯度下降結(jié)束本章。
6.1 理解梯度
反向傳播是梯度下降的一種,許多教科書中通常互換使用這兩個(gè)術(shù)語。梯度下降是指針對每個(gè)訓(xùn)練元素,在神經(jīng)網(wǎng)絡(luò)中的每個(gè)權(quán)重上計(jì)算一個(gè)梯度。由于神經(jīng)網(wǎng)絡(luò)不會(huì)輸出訓(xùn)練元素的期望值,因此每個(gè)權(quán)重的梯度將為你提示如何修改權(quán)重以實(shí)現(xiàn)期望輸出。如果神經(jīng)網(wǎng)絡(luò)確實(shí)輸出了預(yù)期的結(jié)果,則每個(gè)權(quán)重的梯度將為0,這表明無需修改權(quán)重。
梯度是權(quán)重當(dāng)前值下誤差函數(shù)的導(dǎo)數(shù)。誤差函數(shù)用于測量神經(jīng)網(wǎng)絡(luò)輸出與預(yù)期輸出的差距。實(shí)際上,我們可以使用梯度下降,在該過程中,每個(gè)權(quán)重的梯度可以讓誤差函數(shù)達(dá)到更低值。
梯度實(shí)質(zhì)上是誤差函數(shù)對神經(jīng)網(wǎng)絡(luò)中每個(gè)權(quán)重的偏導(dǎo)數(shù)。每個(gè)權(quán)重都有一個(gè)梯度,即誤差函數(shù)的斜率。權(quán)重是兩個(gè)神經(jīng)元之間的連接。計(jì)算誤差函數(shù)的梯度可以確定訓(xùn)練算法應(yīng)增加,還是減小權(quán)重。反過來,這種確定將減小神經(jīng)網(wǎng)絡(luò)的誤差。誤差是神經(jīng)網(wǎng)絡(luò)的預(yù)期輸出和實(shí)際輸出之間的差異。許多不同的名為“傳播訓(xùn)練算法”的訓(xùn)練算法都利用了梯度。總的來說,梯度告訴神經(jīng)網(wǎng)絡(luò)以下信息:
- 零梯度——權(quán)重不會(huì)導(dǎo)致神經(jīng)網(wǎng)絡(luò)的誤差;
- 負(fù)梯度——應(yīng)該增加權(quán)重以減小誤差;
- 正梯度——應(yīng)當(dāng)減小權(quán)重以減小誤差。
由于許多算法都依賴于梯度計(jì)算,因此我們從分析這個(gè)過程開始。
6.1.1 什么是梯度
首先,讓我們探討一下梯度。本質(zhì)上,訓(xùn)練是對權(quán)重集的搜索,這將使神經(jīng)網(wǎng)絡(luò)對于訓(xùn)練集具有最小的誤差。如果我們擁有無限的計(jì)算資源,那么只需嘗試各種可能的權(quán)重組合,來確定在訓(xùn)練期間提供最小誤差的權(quán)重。
因?yàn)槲覀儧]有無限的計(jì)算資源,所以必須使用某種快捷方式,以避免需要檢查每種可能的權(quán)重組合。這些訓(xùn)練算法利用了巧妙的技術(shù),從而避免對所有權(quán)重進(jìn)行蠻力搜索。但這種類型的窮舉搜索將是不可能的,因?yàn)榧词剐⌒途W(wǎng)絡(luò)也具有無限數(shù)量的權(quán)重組合。
請考慮一幅圖像,它展示每個(gè)可能權(quán)重的神經(jīng)網(wǎng)絡(luò)誤差。圖6-1展示了單個(gè)權(quán)重的誤差。

圖6-1 單個(gè)權(quán)重的誤差
從圖6-1中很容易看到,最佳權(quán)重是曲線的

(

)值最低的位置。問題是我們只看到當(dāng)前權(quán)重的誤差;我們看不到整幅圖像,因?yàn)樵撨^程需要窮盡的搜索。但是,我們可以確定特定權(quán)重下誤差曲線的斜率。在圖6-1中,我們看到誤差曲線在

=1.5處的斜率。與誤差曲線相切(在

=1.5處)的直線給出了斜率。在這個(gè)例子中,斜率或梯度為−0.562 2。負(fù)斜率表示增大權(quán)重會(huì)降低誤差。
梯度是指在特定權(quán)重下誤差函數(shù)的瞬時(shí)斜率。誤差曲線在該點(diǎn)的導(dǎo)數(shù)給出了梯度。這條線的傾斜程度告訴我們特定權(quán)重下誤差函數(shù)的陡峭程度。
導(dǎo)數(shù)是微積分中最基本的概念之一。對于本書,你只需要了解導(dǎo)數(shù)在特定點(diǎn)處提供函數(shù)的斜率即可。訓(xùn)練技巧和該斜率可以為你提供信息,用于調(diào)整權(quán)重,從而降低誤差。現(xiàn)在,利用梯度的實(shí)用定義,我們將展示如何計(jì)算它。
6.1.2 計(jì)算梯度
我們將為每個(gè)權(quán)重單獨(dú)計(jì)算一個(gè)梯度。我們不僅關(guān)注方程,也關(guān)注梯度在具有真實(shí)數(shù)值的實(shí)際神經(jīng)網(wǎng)絡(luò)中的應(yīng)用。圖6-2展示了我們將使用的神經(jīng)網(wǎng)絡(luò)——XOR神經(jīng)網(wǎng)絡(luò)。

圖6-2 XOR神經(jīng)網(wǎng)絡(luò)
此外,本書線上資源(見引言)的幾個(gè)示例中使用了相同的神經(jīng)網(wǎng)絡(luò)。在本章中,我們將展示一些計(jì)算,說明神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。我們必須使用相同的起始權(quán)重,讓這些計(jì)算保持一致。但是,上述權(quán)重沒有什么特征,是由該程序隨機(jī)生成的。
前面提到的神經(jīng)網(wǎng)絡(luò)是典型的三層前饋神經(jīng)網(wǎng)絡(luò),就像我們之前研究的那樣,圓圈表示神經(jīng)元,連接圓圈的線表示權(quán)重,連接線中間的矩形給出每個(gè)連接的權(quán)重。
我們現(xiàn)在面臨的問題是,計(jì)算神經(jīng)網(wǎng)絡(luò)中每個(gè)權(quán)重的偏導(dǎo)數(shù)。當(dāng)一個(gè)方程具有多個(gè)變量時(shí),我們使用偏導(dǎo)數(shù)。每個(gè)權(quán)重均被視為變量,因?yàn)檫@些權(quán)重將隨著神經(jīng)網(wǎng)絡(luò)的變化而獨(dú)立變化。每個(gè)權(quán)重的偏導(dǎo)數(shù)僅顯示每個(gè)權(quán)重對誤差函數(shù)的獨(dú)立影響。該偏導(dǎo)數(shù)就是梯度。
可以用微積分的鏈?zhǔn)揭?guī)則來計(jì)算每個(gè)偏導(dǎo)數(shù)。我們從一個(gè)訓(xùn)練集元素開始。對于圖6-2,我們提供[1,0]作為輸入,并期望輸出是1。你可以看到我們將輸入應(yīng)用于圖6-2。第一個(gè)輸入神經(jīng)元的輸入為1.0,第二個(gè)輸入神經(jīng)元的輸入為0.0。
該輸入通過神經(jīng)網(wǎng)絡(luò)饋送,并最終產(chǎn)生輸出。第4章“前饋神經(jīng)網(wǎng)絡(luò)”介紹了計(jì)算輸出與總和的確切過程。反向傳播既有前向,也有反向。計(jì)算神經(jīng)網(wǎng)絡(luò)的輸出時(shí),就會(huì)發(fā)生前向傳播。我們僅針對訓(xùn)練集中的這個(gè)數(shù)據(jù)項(xiàng)計(jì)算梯度,訓(xùn)練集中的其他數(shù)據(jù)項(xiàng)將具有不同的梯度。在后文,我們將討論如何結(jié)合各個(gè)訓(xùn)練集元素的梯度。
現(xiàn)在我們準(zhǔn)備計(jì)算梯度。下面總結(jié)了計(jì)算每個(gè)權(quán)重的梯度的步驟:
- 根據(jù)訓(xùn)練集的理想值計(jì)算誤差;
- 計(jì)算輸出節(jié)點(diǎn)(神經(jīng)元)的增量;
- 計(jì)算內(nèi)部神經(jīng)元節(jié)點(diǎn)的增量;
- 計(jì)算單個(gè)梯度。
我們將在隨后的內(nèi)容中討論這些步驟。
6.2 計(jì)算輸出節(jié)點(diǎn)增量
為神經(jīng)網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)(神經(jīng)元)計(jì)算一個(gè)常數(shù)值。我們將從輸出節(jié)點(diǎn)開始,然后逐步通過神經(jīng)網(wǎng)絡(luò)反向傳播。“反向傳播”一詞就來自這個(gè)過程。我們最初計(jì)算輸出神經(jīng)元的誤差,然后通過神經(jīng)網(wǎng)絡(luò)向后傳播這些誤差。
節(jié)點(diǎn)增量是我們將為每個(gè)節(jié)點(diǎn)計(jì)算的值。層增量也描述了該值,因?yàn)槲覀兛梢砸淮斡?jì)算一層的增量。在計(jì)算輸出節(jié)點(diǎn)或內(nèi)部節(jié)點(diǎn)時(shí),確定節(jié)點(diǎn)增量的方法可能會(huì)有所不同。首先計(jì)算輸出節(jié)點(diǎn),并考慮神經(jīng)網(wǎng)絡(luò)的誤差函數(shù)。在本書中,我們將研究二次誤差函數(shù)和交叉熵誤差函數(shù)。
6.2.1 二次誤差函數(shù)
神經(jīng)網(wǎng)絡(luò)的程序員經(jīng)常使用二次誤差函數(shù)。實(shí)際上,你可以在網(wǎng)絡(luò)上找到許多使用二次誤差函數(shù)的示例。如果你正在閱讀一個(gè)示例程序,但未提及具體的誤差函數(shù),那么該程序可能使用了二次誤差函數(shù),也稱為MSE函數(shù),我們在第5章“訓(xùn)練和評(píng)估”中討論過。公式6-1展示了MSE函數(shù):

(6-1)
公式6-1將神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出(

)與預(yù)期輸出(

)進(jìn)行了比較。變量

為訓(xùn)練元素的數(shù)量乘以輸出神經(jīng)元的數(shù)量。MSE將多個(gè)輸出神經(jīng)元處理為單個(gè)輸出神經(jīng)元的情況。公式6-2展示了使用二次誤差函數(shù)的節(jié)點(diǎn)增量:

(6-2)
二次誤差函數(shù)非常簡單,因?yàn)樗×松窠?jīng)網(wǎng)絡(luò)的預(yù)期輸出與實(shí)際輸出之間的差。

′表示激活函數(shù)的導(dǎo)數(shù)。
6.2.2 交叉熵誤差函數(shù)
二次誤差函數(shù)有時(shí)可能需要很長時(shí)間才能正確調(diào)整權(quán)重。公式6-3展示了交叉熵誤差(Cross-entropy Error,CE)函數(shù):

(6-3)
如公式6-4所示,采用交叉熵誤差函數(shù)的節(jié)點(diǎn)增量計(jì)算要比采用MSE函數(shù)簡單得多。

(6-4)
交叉熵誤差函數(shù)通常會(huì)比二次誤差函數(shù)結(jié)果更好,因?yàn)槎握`差函數(shù)會(huì)為誤差創(chuàng)建一個(gè)陡峭的梯度。我們推薦采用交叉熵誤差函數(shù)。
6.3 計(jì)算剩余節(jié)點(diǎn)增量
既然已經(jīng)根據(jù)適當(dāng)?shù)恼`差函數(shù)計(jì)算了輸出節(jié)點(diǎn)的增量,我們就可以計(jì)算內(nèi)部節(jié)點(diǎn)的增量,如公式6-5所示:

(6-5)
我們將為所有隱藏和無偏置神經(jīng)元計(jì)算節(jié)點(diǎn)增量,但無須為輸入和偏置神經(jīng)元計(jì)算節(jié)點(diǎn)增量。即使我們可以使用公式6-5輕松計(jì)算輸入和偏置神經(jīng)元的節(jié)點(diǎn)增量,梯度計(jì)算也不需要這些值。你很快會(huì)看到,權(quán)重的梯度計(jì)算僅考慮權(quán)重所連接的神經(jīng)元。偏置和輸入神經(jīng)元只是連接的起點(diǎn),它們從來不是終點(diǎn)。
如果你希望看到梯度計(jì)算過程,有幾個(gè)JAVAScript示例顯示了這些計(jì)算過程。這些示例可以在以下URL中找到:
http://www.heatonresearch.com/aifh/vol3/
6.4 激活函數(shù)的導(dǎo)數(shù)
反向傳播過程需要激活函數(shù)的導(dǎo)數(shù),它們通常確定反向傳播過程將如何執(zhí)行。大多數(shù)現(xiàn)代深度神經(jīng)網(wǎng)絡(luò)都使用線性、Softmax和ReLU激活函數(shù)。我們還會(huì)探討S型和雙曲正切激活函數(shù)的導(dǎo)數(shù),以便理解ReLU激活函數(shù)為何表現(xiàn)如此出色。
6.4.1 線性激活函數(shù)的導(dǎo)數(shù)
線性激活函數(shù)被認(rèn)為不是激活函數(shù),因?yàn)樗皇欠祷亟o定的任何值。因此,線性激活函數(shù)有時(shí)稱為一致激活函數(shù)。該激活函數(shù)的導(dǎo)數(shù)為1,如公式6-6所示:

(6-6)
如前文所述,希臘字母

表示激活函數(shù),在

右上方的撇號(hào)表示我們正在使用激活函數(shù)的導(dǎo)數(shù)。這是導(dǎo)數(shù)的幾種數(shù)學(xué)表示形式之一。
6.4.2 Softmax激活函數(shù)的導(dǎo)數(shù)
在本書中,Softmax激活函數(shù)和線性激活函數(shù)僅在神經(jīng)網(wǎng)絡(luò)的輸出層上使用。如第1章“神經(jīng)網(wǎng)絡(luò)基礎(chǔ)”所述,Softmax激活函數(shù)與其他激活函數(shù)的不同之處在于,其值還取決于其他輸出神經(jīng)元,而不僅僅取決于當(dāng)前正在計(jì)算的輸出神經(jīng)元。方便起見,公式6-7再次展示了Softmax激活函數(shù):

(6-7)

向量代表所有輸出神經(jīng)元的輸出。公式6-8展示了該激活函數(shù)的導(dǎo)數(shù):

(6-8)
對于上述導(dǎo)數(shù),我們使用了稍微不同的符號(hào)。帶有草書風(fēng)格的∂符號(hào)的比率表示偏導(dǎo)數(shù),當(dāng)你對具有多個(gè)變量的方程進(jìn)行微分時(shí)會(huì)使用這個(gè)符號(hào)。要取偏導(dǎo)數(shù),可以將方程對一個(gè)變量微分,而將所有其他變量保持不變。上部的∂指出要微分的函數(shù)。在這個(gè)例子中,要微分的函數(shù)是激活函數(shù)

。下部的∂表示偏導(dǎo)數(shù)的分別微分。在這個(gè)例子中,我們正在計(jì)算神經(jīng)元的輸出,所有其他變量均視為常量。微分是瞬時(shí)變化率:一次只有一個(gè)變量能變化。
如果使用交叉熵誤差函數(shù),就不會(huì)使用線性或Softmax激活函數(shù)的導(dǎo)數(shù)來計(jì)算神經(jīng)網(wǎng)絡(luò)的梯度。通常你只在神經(jīng)網(wǎng)絡(luò)的輸出層使用線性和Softmax激活函數(shù)。因此,我們無須擔(dān)心它們對于內(nèi)部節(jié)點(diǎn)的導(dǎo)數(shù)。對于使用交叉熵誤差函數(shù)的輸出節(jié)點(diǎn),線性和Softmax激活函數(shù)的導(dǎo)數(shù)始終為1。因此,你幾乎不會(huì)對內(nèi)部節(jié)點(diǎn)使用線性或Softmax激活函數(shù)的導(dǎo)數(shù)。
6.4.3 S型激活函數(shù)的導(dǎo)數(shù)
公式6-9展示了S型激活函數(shù)的導(dǎo)數(shù):

(6-9)
機(jī)器學(xué)習(xí)經(jīng)常利用公式6-9中表示的S型激活函數(shù)。我們通過對S型函數(shù)的導(dǎo)數(shù)進(jìn)行代數(shù)運(yùn)算來導(dǎo)出該公式,以便在其自身的導(dǎo)數(shù)計(jì)算中使用S型激活函數(shù)。為了提高計(jì)算效率,上述激活函數(shù)中的希臘字母

表示S型激活函數(shù)。在前饋過程中,我們計(jì)算了S型激活函數(shù)的值。保留S型激活函數(shù)的值使S型激活函數(shù)的導(dǎo)數(shù)易于計(jì)算。如果你對如何得到公式6-9感興趣,可以參考以下網(wǎng)址:
http://www.heatonresearch.com/aifh/vol3/deriv_sigmoid.html
6.4.4 雙曲正切激活函數(shù)的導(dǎo)數(shù)
公式6-10給出了雙曲正切激活函數(shù)的導(dǎo)數(shù):

(6-10)
在本書中,我們建議使用雙曲正切激活函數(shù),而不是S型激活函數(shù)。
6.4.5 ReLU激活函數(shù)的導(dǎo)數(shù)
公式6-11展示了ReLU激活函數(shù)的導(dǎo)數(shù):

(6-11)
嚴(yán)格來說,ReLU激活函數(shù)在0處沒有導(dǎo)數(shù),但是,由于約定,當(dāng)

為0時(shí),0處的梯度被替換。具有S型和雙曲正切激活函數(shù)的深層神經(jīng)網(wǎng)絡(luò)可能難以通過反向傳播進(jìn)行訓(xùn)練。造成這一困難的因素很多,梯度消失問題是最常見的原因之一。圖6-3展示了雙曲正切激活函數(shù)及其梯度/導(dǎo)數(shù)。

圖6-3 雙曲正切激活函數(shù)及其梯度/導(dǎo)數(shù)
圖6-3表明,當(dāng)雙曲正切激活函數(shù)(實(shí)線)接近−1和1時(shí),雙曲正切激活(虛線)的導(dǎo)數(shù)消失為0。S型和雙曲正切激活函數(shù)都有這個(gè)問題,但ReLU激活函數(shù)沒有。圖6-4展示了S型激活函數(shù)及其消失的導(dǎo)數(shù)。

圖6-4 S型激活函數(shù)及其消失的導(dǎo)數(shù)
6.5 應(yīng)用反向傳播
反向傳播是一種簡單的訓(xùn)練算法,可以利用計(jì)算出的梯度來調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重。該方法是梯度下降的一種形式,因?yàn)槲覀儗⑻荻冉档捷^低的值。隨著程序調(diào)整這些權(quán)重,神經(jīng)網(wǎng)絡(luò)將產(chǎn)生更理想的輸出。神經(jīng)網(wǎng)絡(luò)的整體誤差應(yīng)隨著訓(xùn)練而下降。在探討反向傳播權(quán)重的更新過程之前,我們必須先探討更新權(quán)重的兩種不同方式。
6.5.1 批量訓(xùn)練和在線訓(xùn)練
我們已經(jīng)展示了如何為單個(gè)訓(xùn)練集元素計(jì)算梯度。在本章的前面,我們對神經(jīng)網(wǎng)絡(luò)輸入[1,0]并期望輸出1的情況計(jì)算了梯度。對于單個(gè)訓(xùn)練集元素,這個(gè)結(jié)果是可以接受的,但是,大多數(shù)訓(xùn)練集都有很多元素。因此,我們可以通過兩種方式來處理多個(gè)訓(xùn)練集元素,即在線訓(xùn)練和批量訓(xùn)練。
在線訓(xùn)練意味著你需要在每個(gè)訓(xùn)練集元素之后修改權(quán)重。利用在第一個(gè)訓(xùn)練集元素中獲得的梯度,你可以計(jì)算權(quán)重并對它們進(jìn)行更改。訓(xùn)練進(jìn)行到下一個(gè)訓(xùn)練集元素時(shí),也會(huì)計(jì)算并更新神經(jīng)網(wǎng)絡(luò)。訓(xùn)練將繼續(xù)進(jìn)行,直到你用完每個(gè)訓(xùn)練集元素為止。至此,訓(xùn)練的一個(gè)迭代或一輪(epoch)已經(jīng)完成。
批量訓(xùn)練也利用了所有訓(xùn)練集元素,但是,我們不著急更新所有權(quán)重。作為替代,我們對每個(gè)訓(xùn)練集元素的梯度求和。一旦我們完成了對訓(xùn)練集元素梯度的求和,就可以更新神經(jīng)網(wǎng)絡(luò)權(quán)重。至此,迭代完成。
有時(shí),我們可以設(shè)置批量的大小。如你的訓(xùn)練集可能有10 000個(gè)元素,此時(shí)可選擇每1 000個(gè)元素更新一次神經(jīng)網(wǎng)絡(luò)的權(quán)重,從而使神經(jīng)網(wǎng)絡(luò)權(quán)重在訓(xùn)練迭代期間更新10次。
在線訓(xùn)練是反向傳播的最初方式。如果要查看該程序批處理版本的計(jì)算,請參考以下在線示例:
http://www.heatonresearch.com/aifh/vol3/xor_batch.html
6.5.2 隨機(jī)梯度下降
批量訓(xùn)練和在線訓(xùn)練不是反向傳播的僅有選擇。隨機(jī)梯度下降(SGD)是反向傳播算法中最受歡迎的算法。SGD可以用批量或在線訓(xùn)練模式工作。在線SGD簡單地隨機(jī)選擇訓(xùn)練集元素,然后計(jì)算梯度并執(zhí)行權(quán)重更新。該過程一直持續(xù)到誤差達(dá)到可接受的水平為止。與每次迭代遍歷整個(gè)訓(xùn)練集相比,選擇隨機(jī)訓(xùn)練集元素通常會(huì)更快收斂到可接受的權(quán)重。
批量SGD可通過選擇批量大小來實(shí)現(xiàn)。對于每次迭代,隨機(jī)選擇數(shù)量不應(yīng)超過所選批量大小的訓(xùn)練集元素,因此選擇小批量。更新時(shí)像常規(guī)反向傳播批量處理更新一樣,將小批量處理中的梯度相加。這種更新與常規(guī)批量處理更新非常相似,不同之處在于,每次需要批量時(shí)都會(huì)隨機(jī)選擇小批量。迭代通常以SGD處理單個(gè)批量。批量大小通常比整個(gè)訓(xùn)練集小得多。批量大小的常見選擇是600。
6.5.3 反向傳播權(quán)重更新
現(xiàn)在,我們準(zhǔn)備更新權(quán)重。如前所述,我們將權(quán)重和梯度視為一維數(shù)組。給定這兩個(gè)數(shù)組,我們準(zhǔn)備為反向傳播訓(xùn)練的迭代計(jì)算權(quán)重更新。公式6-12給出了為反向傳播更新權(quán)重的公式:

(6-12)
公式6-12計(jì)算權(quán)重?cái)?shù)組中每個(gè)元素的權(quán)重變化。你也會(huì)注意到,公式6-12要求對來自上一次迭代的權(quán)重進(jìn)行改變。你必須將這些值保存在另一個(gè)數(shù)組中。如前所述,權(quán)重更新的方向與梯度的符號(hào)相反:正梯度會(huì)導(dǎo)致權(quán)重減小,反之負(fù)梯度會(huì)導(dǎo)致權(quán)重增大。由于這種相反關(guān)系,公式6-12以負(fù)號(hào)開始。
公式6-12將權(quán)重增量計(jì)算為梯度與學(xué)習(xí)率(以ε表示)的乘積。此外,我們將之前的權(quán)重變化與動(dòng)量值(以α表示)的乘積相加。學(xué)習(xí)率和動(dòng)量是我們必須提供給反向傳播算法的兩個(gè)參數(shù)。選擇學(xué)習(xí)率和動(dòng)量的值對訓(xùn)練的表現(xiàn)非常重要。不幸的是,確定學(xué)習(xí)率和動(dòng)量主要是通過反復(fù)試驗(yàn)實(shí)現(xiàn)的。
學(xué)習(xí)率對梯度進(jìn)行縮放,可能減慢或加快學(xué)習(xí)速度。低于1.0的學(xué)習(xí)率會(huì)減慢學(xué)習(xí)速度。如學(xué)習(xí)率為0.5會(huì)使每個(gè)梯度減少50%;高于1.0的學(xué)習(xí)率將加速訓(xùn)練。實(shí)際上,學(xué)習(xí)率幾乎總是低于1。
選擇過高的學(xué)習(xí)率會(huì)導(dǎo)致你的神經(jīng)網(wǎng)絡(luò)無法收斂,并且會(huì)產(chǎn)生較高的全局誤差,而不會(huì)收斂到較低值。選擇過低的學(xué)習(xí)率將導(dǎo)致神經(jīng)網(wǎng)絡(luò)花費(fèi)大量時(shí)間實(shí)現(xiàn)收斂。
和學(xué)習(xí)率一樣,動(dòng)量也是一個(gè)縮放因子。盡管是可選的,但動(dòng)量確定了上一次迭代的權(quán)重變化中有百分之多少應(yīng)該應(yīng)用于這次迭代。如果你不想使用動(dòng)量,只需將它的值指定為0。
動(dòng)量是用于反向傳播的一項(xiàng)技術(shù),可幫助訓(xùn)練逃避局部最小值,這些最小值是誤差圖上的低點(diǎn)所標(biāo)識(shí)的值,而不是真正的全局最小值。反向傳播傾向于找到局部最小值,而不能再次跳出來。這個(gè)過程導(dǎo)致訓(xùn)練收斂誤差較高,這不是我們期望的。動(dòng)量可在神經(jīng)網(wǎng)絡(luò)當(dāng)前變化的方向上對它施加一些力,讓它突破局部最小值。
6.5.4 選擇學(xué)習(xí)率和動(dòng)量
動(dòng)量和學(xué)習(xí)率有助于訓(xùn)練的成功,但實(shí)際上它們并不是神經(jīng)網(wǎng)絡(luò)的一部分。一旦訓(xùn)練完成,訓(xùn)練后的權(quán)重將保持不變,不再使用動(dòng)量或?qū)W習(xí)率。它們本質(zhì)上是一種臨時(shí)的“腳手架”,用于創(chuàng)建訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)。選擇正確的動(dòng)量和學(xué)習(xí)率會(huì)影響訓(xùn)練的效果。
學(xué)習(xí)率會(huì)影響神經(jīng)網(wǎng)絡(luò)訓(xùn)練的速度,降低學(xué)習(xí)率會(huì)使訓(xùn)練更加細(xì)致。較高的學(xué)習(xí)率可能會(huì)跳過最佳權(quán)重設(shè)置,較低的學(xué)習(xí)率總是會(huì)產(chǎn)生更好的結(jié)果,但是,降低訓(xùn)練速度會(huì)大大增加運(yùn)行時(shí)間。在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中降低學(xué)習(xí)率可能是一種有效的技術(shù)。
你可以用動(dòng)量來對抗局部最小值。如果你發(fā)現(xiàn)神經(jīng)網(wǎng)絡(luò)停滯不前,則較高的動(dòng)量值可能會(huì)使訓(xùn)練超出其遇到的局部最小值。歸根結(jié)底,為動(dòng)量和學(xué)習(xí)率選擇好的值是一個(gè)反復(fù)試驗(yàn)的過程。你可以根據(jù)訓(xùn)練的進(jìn)度進(jìn)行調(diào)整。動(dòng)量通常設(shè)置為0.9,學(xué)習(xí)率通常設(shè)置為0.1或更低。
6.5.5 Nesterov動(dòng)量
由于小批量引入的隨機(jī)性,SGD算法有時(shí)可能產(chǎn)生錯(cuò)誤的結(jié)果。權(quán)重可能會(huì)在一次迭代中獲得非常有益的更新,但是訓(xùn)練元素的選擇不當(dāng)會(huì)使其在下一個(gè)小批量中被撤銷。因此,動(dòng)量是一種資源豐富的工具,可以減輕這種不穩(wěn)定的訓(xùn)練結(jié)果。
Nesterov動(dòng)量是Yu Nesterov在1983年發(fā)明的一種較新的技術(shù)應(yīng)用,該技術(shù)在他的Introductory Lectures on Convex Optimization: A Basic Course一書中得到了更新[1]。有時(shí)將該技術(shù)稱為Nesterov的加速梯度下降。盡管對Nesterov動(dòng)量的完整數(shù)學(xué)解釋超出了本書的范圍,但我們將針對權(quán)重進(jìn)行詳細(xì)介紹,以便你可以實(shí)現(xiàn)它。本書的示例(包括在線JavaScript的示例)包含Nesterov動(dòng)量的實(shí)現(xiàn)。此外,本書的線上資源包含一些針對Nesterov動(dòng)量權(quán)重更新的JavaScript示例程序。
公式6-13基于學(xué)習(xí)率(ε)和動(dòng)量(α)計(jì)算部分權(quán)重更新:

(6-13)
當(dāng)前迭代用

表示,前一次迭代用

−1表示。這種部分權(quán)重更新稱為

,最初從0開始。部分權(quán)重更新的后續(xù)計(jì)算基于部分權(quán)重更新的先前值。公式6-13中的偏導(dǎo)數(shù)是當(dāng)前權(quán)重下誤差函數(shù)的梯度。公式6-14展示了Nesterov動(dòng)量更新,它代替了公式6-12中展示的標(biāo)準(zhǔn)反向傳播權(quán)重更新:

(6-14)
上面的權(quán)重更新的計(jì)算,是部分權(quán)重更新的放大。公式6-14中顯示增量權(quán)重已添加到當(dāng)前權(quán)重中。具有Nesterov動(dòng)量的SGD是深度學(xué)習(xí)最有效的訓(xùn)練算法之一。
6.6 本章小結(jié)
本章介紹了經(jīng)典的反向傳播和SGD。這些方法都基于梯度下降。換言之,它們用導(dǎo)數(shù)優(yōu)化了單個(gè)權(quán)重。對于給定的權(quán)重,導(dǎo)數(shù)向程序提供誤差函數(shù)的斜率。斜率允許程序確定如何更新權(quán)重。每個(gè)訓(xùn)練算法對斜率或梯度的解釋不同。
盡管反向傳播是最古老的訓(xùn)練算法之一,但它仍然是最受歡迎的算法之一。反向傳播就是將梯度添加到權(quán)重中,負(fù)梯度將增大權(quán)重,正梯度將減小權(quán)重。我們通過學(xué)習(xí)率來縮放權(quán)重,防止權(quán)重變化過快。0.5的學(xué)習(xí)率意味著將權(quán)重增加一半的梯度,而2.0的學(xué)習(xí)率意味著將權(quán)重增加2倍的梯度。
反向傳播算法有多種變體,其中一些變體(如彈性傳播)頗受歡迎。第7章將介紹一些反向傳播的變體。盡管了解這些變體很有用,但是SGD仍然是最常見的深度學(xué)習(xí)訓(xùn)練算法之一。
本文摘自《人工智能算法(卷3):深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)》