神經(jīng)網(wǎng)絡(luò)的奧秘之優(yōu)化器的妙用
之前的文章介紹了,我可以只使用 Numpy 來(lái)創(chuàng)建神經(jīng)網(wǎng)絡(luò)。這項(xiàng)挑戰(zhàn)性工作極大地加深了我對(duì)神經(jīng)網(wǎng)絡(luò)內(nèi)部運(yùn)行流程的理解,還使我意識(shí)到影響神經(jīng)網(wǎng)表現(xiàn)的因素有很多。精選的網(wǎng)絡(luò)架構(gòu)、合理的超參數(shù),甚至準(zhǔn)確的參數(shù)初始化,都是其中一部分。本文將關(guān)注能夠顯著影響學(xué)習(xí)過(guò)程速度與預(yù)測(cè)準(zhǔn)確率的決策──優(yōu)化策略的選擇。本文挑選了一些常用優(yōu)化器,研究其內(nèi)在工作機(jī)制并進(jìn)行對(duì)比。
注:由于我想覆蓋的學(xué)習(xí)材料范圍太大,因此文中未列出任何代碼段。不過(guò),大家可以在 GitHub 上找到所有用于創(chuàng)建可視化的代碼。此外,我還準(zhǔn)備了一些 notebook,幫助大家更好地理解本文所討論的問(wèn)題。
代碼地址: https://github.com/SkalskiP/ILearnDeepLearning.py
優(yōu)化
優(yōu)化是不斷搜索參數(shù)以最小化或***化目標(biāo)函數(shù)的過(guò)程。我們通常使用間接優(yōu)化方法訓(xùn)練機(jī)器學(xué)習(xí)模型,選擇一個(gè)評(píng)價(jià)指標(biāo)(如準(zhǔn)確率、精度或召回率)表明模型求解給定問(wèn)題的優(yōu)良程度。但是,我們一直在優(yōu)化不同的成本函數(shù) J(θ),希望最小化成本函數(shù)以改善評(píng)價(jià)指標(biāo)。毫無(wú)疑問(wèn),成本函數(shù)的選擇通常與需要解決的具體問(wèn)題相關(guān)。本質(zhì)上,這種「有意設(shè)計(jì)」表明我們與理想解決方案有多遠(yuǎn)。正如大家所知,這個(gè)問(wèn)題相當(dāng)復(fù)雜,可以再另寫一篇主題文章。
沿途陷阱
結(jié)果證明,尋找非凸成本函數(shù)最小值通常不太容易,本文應(yīng)用高級(jí)優(yōu)化策略去定位最小值。如果你學(xué)過(guò)微積分,就一定知道局部極小值──優(yōu)化器極易落入的***陷阱之一。對(duì)于那些還不了解局部極小值之美的讀者,我只能說(shuō)局部極小值是給定區(qū)域內(nèi)函數(shù)取最小值的點(diǎn)集。如上圖左半部分所示,優(yōu)化器定位的點(diǎn)并非是全局***解。
而「鞍點(diǎn)」問(wèn)題則被人們認(rèn)為更具挑戰(zhàn)性。當(dāng)成本函數(shù)值幾乎不再變化時(shí),就會(huì)形成平原(plateau),如上圖右半部分所示。在這些點(diǎn)上,任何方向的梯度都幾乎為零,使得函數(shù)無(wú)法逃離該區(qū)域。
有時(shí)候,尤其是在多層網(wǎng)絡(luò)中,我們必須處理成本函數(shù)的陡峭區(qū)域。陡峭區(qū)域中的梯度增長(zhǎng)迅速(也就是梯度爆炸)會(huì)引起大步躍遷,通常會(huì)破壞先前的優(yōu)化結(jié)果。不過(guò),該問(wèn)題可以通過(guò)梯度裁剪輕松解決。
梯度下降
在學(xué)習(xí)高級(jí)算法前,我們先來(lái)了解一些基本策略。最直接有效的方法之一是向函數(shù)上當(dāng)前點(diǎn)對(duì)應(yīng)梯度的反方向前進(jìn),公式如下:
超參數(shù) α 表示學(xué)習(xí)率,代表算法每次迭代過(guò)程的前進(jìn)步長(zhǎng)。學(xué)習(xí)率的選擇一定程度上代表了學(xué)習(xí)速度與結(jié)果準(zhǔn)確率之間的權(quán)衡。選擇步長(zhǎng)過(guò)小不利于算法求解,且增加迭代次數(shù)。反之,選擇步長(zhǎng)過(guò)大則很難發(fā)現(xiàn)最小值。具體過(guò)程見(jiàn)圖 2,圖中展示了不穩(wěn)定的迭代過(guò)程。而選擇合適步長(zhǎng)后,模型幾乎立即發(fā)現(xiàn)最小點(diǎn)。
圖 2
圖 2. 大、小學(xué)習(xí)率條件下梯度下降過(guò)程的可視化。為了易于觀察,圖中僅展示了*** 10 步的可視化情況。
此外,該算法很容易受鞍點(diǎn)問(wèn)題的影響。因?yàn)楹罄m(xù)迭代過(guò)程的步長(zhǎng)與計(jì)算得到的梯度成比例,所以我們無(wú)法擺脫 plateau。
最重要的是,算法由于每次迭代過(guò)程中都需要使用整個(gè)訓(xùn)練集而變得低效。這意味著,在每個(gè) epoch 中我們都必須考慮所有樣本,以確保執(zhí)行下輪優(yōu)化。對(duì)于只有幾千個(gè)樣本的訓(xùn)練集來(lái)說(shuō),這也許不是問(wèn)題。但是,擁有數(shù)百萬(wàn)樣本的神經(jīng)網(wǎng)絡(luò)才能表現(xiàn)***?;诖耍看蔚际褂萌繑?shù)據(jù)集令人難以想象,既浪費(fèi)時(shí)間又占用內(nèi)存。上述原因致使純粹的梯度下降無(wú)法應(yīng)用于大部分情況。
小批量梯度下降
圖 3. 梯度下降與小批量梯度下降對(duì)比圖。
我們首先嘗試解決上一節(jié)提到的***一個(gè)問(wèn)題──低效性。盡量向量化通過(guò)單次處理多個(gè)訓(xùn)練樣本來(lái)加速計(jì)算,但在使用百萬(wàn)量級(jí)的數(shù)據(jù)集時(shí)優(yōu)化過(guò)程還是需要花費(fèi)很長(zhǎng)時(shí)間。此處,我們?cè)囉靡粋€(gè)簡(jiǎn)單的方法──將完整數(shù)據(jù)集切分成許多小批量以完成后續(xù)訓(xùn)練。小批量梯度下降的可視化動(dòng)圖見(jiàn)圖 3。假設(shè)左圖的等高線象征需要優(yōu)化的成本函數(shù)。如圖所示,由于新算法的待處理數(shù)據(jù)較少,它能夠快速完成優(yōu)化。我們?cè)倏纯磧蓚€(gè)模型的移動(dòng)軌跡對(duì)比。當(dāng)噪音較少時(shí),梯度下降采取較少步和相對(duì)較大的步長(zhǎng)。另一方面,小批量梯度下降前進(jìn)更頻繁,但由于數(shù)據(jù)集的多樣性,噪聲更多。甚至可能在某次迭代過(guò)程中,算法移動(dòng)的方向與預(yù)計(jì)方向相反。不過(guò),小批量梯度下降通常一直朝向最小值移動(dòng)。
圖 4. 將數(shù)據(jù)集劃分為多個(gè)批量。
大家肯定想知道如何選擇批量大小?以深度學(xué)習(xí)為例,批量大小通常不是絕對(duì)的,應(yīng)參照具體情況。如果批量與整體數(shù)據(jù)集大小相等,那它就與普通梯度下降無(wú)異。另一方面,如果批量為 1,那么算法每次迭代僅適用數(shù)據(jù)集中的 1 個(gè)樣本,這也失去了向量化的意義,該方法有時(shí)被稱為隨機(jī)梯度下降。實(shí)際情況下,我們通常會(huì)選擇中間值──64 至 512 個(gè)樣本。
指數(shù)加權(quán)平均
指數(shù)加權(quán)平均應(yīng)用廣泛,如統(tǒng)計(jì)學(xué)、經(jīng)濟(jì)學(xué),甚至深度學(xué)習(xí)。即便給定點(diǎn)的梯度為 0,指數(shù)加權(quán)平均仍能持續(xù)優(yōu)化,所以許多高級(jí)神經(jīng)網(wǎng)絡(luò)優(yōu)化算法都采用此概念。
圖 5. 不同 β值的指數(shù)加權(quán)平均(EWA)圖示。
指數(shù)加權(quán)平均本質(zhì)上是對(duì)之前的數(shù)值求平均值,避免局部波動(dòng),關(guān)注整體趨勢(shì)。指數(shù)加權(quán)平均的計(jì)算公式如上所示,其中參數(shù) β 控制待平均的數(shù)的范圍。后續(xù)迭代過(guò)程中,算法將使用 1/(1 - β) 個(gè)樣本。β 值越大,平均的樣本數(shù)越多,圖像越平滑。另一方面,圖像緩慢右移是因?yàn)?,平均時(shí)間范圍較長(zhǎng)會(huì)使指數(shù)加權(quán)平均適應(yīng)新趨勢(shì)較慢。如圖 5 所示,股票實(shí)際收盤價(jià)與另外 4 條曲線展示了不同 β 值條件下的指數(shù)加權(quán)平均值。
動(dòng)量梯度下降
動(dòng)量梯度下降利用指數(shù)加權(quán)平均,來(lái)避免成本函數(shù)的梯度趨近于零的問(wèn)題。簡(jiǎn)單說(shuō),允許算法獲得動(dòng)量,這樣即使局部梯度為零,算法基于先前的計(jì)算值仍可以繼續(xù)前進(jìn)。所以,動(dòng)量梯度下降幾乎始終優(yōu)于純梯度下降。
如以往一樣,我們使用反向傳播計(jì)算網(wǎng)絡(luò)各層的 dW 和 db 值。然而,這次我們沒(méi)有直接使用計(jì)算梯度來(lái)更新神經(jīng)網(wǎng)絡(luò)參數(shù),我們首先計(jì)算 VdW 和 Vdb 的中間值。然后在梯度下降中使用 VdW 和 Vdb。值得注意的是,實(shí)現(xiàn)該方法需要記錄迭代過(guò)程中的指數(shù)加權(quán)平均值。大家可以在 Github 中看到全部過(guò)程。
圖 6. 動(dòng)量梯度下降。
我們嘗試想象下指數(shù)加權(quán)平均對(duì)模型行為的影響,再想象下成本函數(shù)的等高線。上圖對(duì)比展示了標(biāo)準(zhǔn)梯度下降與動(dòng)量梯度下降。我們可以看到成本函數(shù)圖的形態(tài)使得優(yōu)化非常緩慢。以股市價(jià)格為例,使用指數(shù)加權(quán)平均使得算法專注于未來(lái)走勢(shì)而非噪聲。最小值分量被放大,振蕩分量逐漸消失。此外,如果后續(xù)更新過(guò)程中所得梯度指向類似方向,則學(xué)習(xí)率將增加,進(jìn)而實(shí)現(xiàn)更快收斂并減少振蕩。然而,動(dòng)量梯度下降的不足之處在于,每當(dāng)臨近最小點(diǎn),動(dòng)量就會(huì)增加。如果動(dòng)量增加過(guò)大,算法將無(wú)法停在正確位置。
RMSProp
RMSProp(Root Mean Squared Propagation)是另一種改善梯度下降性能的策略,是最常用的優(yōu)化器。該算法也使用指數(shù)加權(quán)平均。而且,它具備自適應(yīng)性──其允許單獨(dú)調(diào)整模型各參數(shù)的學(xué)習(xí)率。后續(xù)參數(shù)值基于為特定參數(shù)計(jì)算的之前梯度值。
運(yùn)用圖 6 及上述公式,大家來(lái)思考下該策略背后的邏輯。顧名思義,每次迭代我們都要計(jì)算特定參數(shù)的成本函數(shù)的導(dǎo)數(shù)平方。此外,使用指數(shù)加權(quán)平均對(duì)近期迭代獲取值求平均。最終,在更新網(wǎng)絡(luò)參數(shù)之前,相應(yīng)的梯度除以平方和的平方根。這表示梯度越大,參數(shù)學(xué)習(xí)率下降越快;梯度越小,參數(shù)學(xué)習(xí)率下降越慢。該算法用這種方式減少振蕩,避免支配信號(hào)而產(chǎn)生的噪聲。為了避免遇到零數(shù)相除的情況(數(shù)值穩(wěn)定性),我們給分母添加了極小值 ɛ。
必須承認(rèn),在本篇文章的寫作過(guò)程中,我有兩次異常興奮的時(shí)刻──本文所提及優(yōu)化器的快速革新讓我震驚不已。***次是當(dāng)我發(fā)現(xiàn)標(biāo)準(zhǔn)梯度下降和小批量梯度下降訓(xùn)練時(shí)間的差異。第二次就是現(xiàn)在,比較 RMSprop 與我知道的所有優(yōu)化器。然而,RMSprop 也有缺點(diǎn)。由于每次迭代過(guò)程中公式的分母都會(huì)變大,學(xué)習(xí)率會(huì)逐漸變小,最終可能會(huì)使模型完全停止。
圖 7. 優(yōu)化器對(duì)比。
Adam
***,我再說(shuō)說(shuō) ADAM。與 RMSProp 類似,ADAM 應(yīng)用廣泛且表現(xiàn)不俗。它利用了 RMSProp 的***優(yōu)點(diǎn),且與動(dòng)量?jī)?yōu)化思想相結(jié)合,形成快速高效的優(yōu)化策略。上圖展示了本文討論的幾類優(yōu)化器在處理函數(shù)困難部分的優(yōu)化過(guò)程。Adam 的優(yōu)異表現(xiàn)一目了然。
不幸的是,隨著優(yōu)化方法有效性的提高,計(jì)算復(fù)雜度也會(huì)增加。上面列了 10 個(gè)描述優(yōu)化過(guò)程單次迭代的矩陣公式。我知道那些數(shù)學(xué)基礎(chǔ)薄弱的讀者情緒肯定不高。但是不要擔(dān)心,它們并不是什么新內(nèi)容。這里的公式和前文給出的動(dòng)量梯度下降和 RMSProp 一樣。不過(guò)這里我們需要一次性運(yùn)用這兩個(gè)策略的思路。
總結(jié)
希望本文能夠深入淺出地解釋所有難點(diǎn)。在這篇文章的寫作過(guò)程中,我明白了選擇合適優(yōu)化器的重要性。理解上述算法才能自如地運(yùn)用優(yōu)化器,理解每個(gè)超參數(shù)如何改變整個(gè)模型的性能。
原文鏈接:
https://towardsdatascience.com/how-to-train-neural-network-faster-with-optimizers-d297730b3713
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】