0
本文作者: 叢末 | 2019-10-14 10:12 |
雷鋒網(wǎng) AI 科技評論按:繼在《要做好深度學(xué)習(xí)任務(wù),不妨先在損失函數(shù)上「做好文章」》一文中為大家深入淺出地介紹了損失函數(shù)的相關(guān)知識后,Deep Learning Demystified 編輯、數(shù)據(jù)科學(xué)家 Harsha Bommana 本次接著從優(yōu)化的角度,結(jié)合數(shù)學(xué)方式和可視化圖,帶大家以「看得見」的方式來了解神經(jīng)網(wǎng)絡(luò)如何一步步找到最小化的損失值,并最終實(shí)現(xiàn)最優(yōu)化。
在前一篇文章《要做好深度學(xué)習(xí)任務(wù),不妨先在損失函數(shù)上「做好文章」》中,我們對損失函數(shù)有了一個比較清晰的認(rèn)知,它能夠讓我們知道模型在某一階段的表現(xiàn)情況?,F(xiàn)在,我們需要使用損失函數(shù)來訓(xùn)練網(wǎng)絡(luò)以提高網(wǎng)絡(luò)的性能。根本上,我們需要做的其實(shí)是獲得損失值并盡可能地將其最小化,因?yàn)閾p失值越小,模型的性能就越高。最小化數(shù)學(xué)表示的這一過程就叫做優(yōu)化,下面我們就看看如何在神經(jīng)網(wǎng)絡(luò)上將這些優(yōu)化方法用其起來~
在神經(jīng)網(wǎng)絡(luò)中,每個層之間都有很多權(quán)重。我們需要了解的是:神經(jīng)網(wǎng)絡(luò)中每層的每個權(quán)重都會以某種方式影響到網(wǎng)絡(luò)的輸出,這是因?yàn)樗鼈內(nèi)贾苯踊蜷g接地與輸出有關(guān)聯(lián)。
因此,我們可以說,如果我們改變神經(jīng)網(wǎng)絡(luò)中的任一特定的權(quán)重,網(wǎng)絡(luò)的輸出也會改變。
如下圖所示,我們嘗試了 3 種不同的場景。在每個場景中,我們都選擇了一些隨機(jī)的權(quán)重,并對其進(jìn)行了更改。同時(shí),下圖也顯示了,改變選擇好的權(quán)重會對神經(jīng)網(wǎng)絡(luò)的哪些部分產(chǎn)生影響以及哪些部分不構(gòu)成影響。在這 3 個場景中,網(wǎng)絡(luò)的最后一層都至少有一個受影響的節(jié)點(diǎn)。由于最后一層的所有節(jié)點(diǎn)都與輸出節(jié)點(diǎn)相連,所以我們可以說,只要最后這層的部分某部分受到權(quán)重變化的影響,那輸出節(jié)點(diǎn)也同樣會受到影響。
網(wǎng)絡(luò)更改特定權(quán)重會對網(wǎng)絡(luò)的哪些部分產(chǎn)生影響的可視化圖
從上圖中,我們同樣可以觀察到,權(quán)重離輸出節(jié)點(diǎn)更遠(yuǎn)(離網(wǎng)絡(luò)的始端更近),會更多地影響到網(wǎng)絡(luò)始端和輸出節(jié)點(diǎn)之間的節(jié)點(diǎn)。因而,我們可以判斷,權(quán)重對輸出的影響是非常間接的,因?yàn)樵谶@些權(quán)重和輸出之間還存在很多權(quán)重。離輸出節(jié)點(diǎn)更近的權(quán)重則會更少地影響到網(wǎng)絡(luò)始端和輸出節(jié)點(diǎn)之間的節(jié)點(diǎn),因此它們會更加直接地影響到輸出節(jié)點(diǎn)。
了解如何通過改變權(quán)重來改變網(wǎng)絡(luò)的輸出后,我們接下來要知道如何最小化損失。改變權(quán)重就會改變輸出,而改變輸出就會改變損失——因?yàn)閾p失就是一個預(yù)測 (Y_pred) 值的函數(shù),而這個值本質(zhì)上就是網(wǎng)絡(luò)的輸出。所以,我們可以得出的結(jié)論是,改變權(quán)重最終會讓損失也發(fā)生改變。
我們已經(jīng)展示了權(quán)重和最終的損失之間的關(guān)系,但是目前為止我們還僅僅探討了改變。改變可以是增加的意思,也可以是減少的意思,而在這里我們需要的是減少損失。所以,我們需要探索以這種方式來改變權(quán)重究竟如何能夠能讓損失減少。這一過程就叫做優(yōu)化。
從數(shù)學(xué)的角度來看,我們可以通過使用偏導(dǎo)數(shù)(Partial Derivatives)來實(shí)現(xiàn)這個過程。偏導(dǎo)數(shù)能夠讓我們理解兩個數(shù)學(xué)表達(dá)式如何相互影響。讓我們先假設(shè) X 和 Y,它們之間存在某些任意的數(shù)學(xué)關(guān)系,如果我們能夠得到 X 對 Y 的偏導(dǎo)數(shù),我們就能夠知道 X 的改變?nèi)绾斡绊?Y。如果偏導(dǎo)數(shù)為正,就意味著 Y 會隨著 X 的增大而增大;如果為負(fù),則意味著 Y 隨 X 的增大而減小。
如此一來,我們需要得到神經(jīng)網(wǎng)絡(luò)中的每個權(quán)重對損失的偏導(dǎo)數(shù)。在某個特定案例中,如果權(quán)重的偏導(dǎo)數(shù)為正,那我們就減小權(quán)重從而減小損失;如果為負(fù),我們就增大權(quán)重以減小損失——畢竟優(yōu)化最終的目標(biāo)就是:減小損失!
優(yōu)化損失的偏導(dǎo)數(shù)可視化圖
對應(yīng)用到的算法就是梯度下降(Gradient Descent)算法,它又名隨機(jī)梯度下降(Stochastic Gradient Descent,SGD),是神經(jīng)網(wǎng)絡(luò)優(yōu)化中最基礎(chǔ)的算法。這一算法執(zhí)行的是一個迭代過程,所以我們要多次更新每個權(quán)重的值,直到損失收斂為一個合適的值。我們不妨將單輪更新用以下數(shù)學(xué)公式來表示:
在這里,alpha 符號表示學(xué)習(xí)率(Learning Rate),它對神經(jīng)網(wǎng)絡(luò)的優(yōu)化速度有影響。如果學(xué)習(xí)率較大,我們就能更快地給損失找到一個最小值,因?yàn)槊看胃碌臋?quán)重跨度夠大,不過,從最終的值來看,我們或許無法找到一個很好的最小值,這是由于每次更新的權(quán)重跨度太大,就有很能會直接跨過這個很好的最小值。而采用更小的學(xué)習(xí)率則能夠解決這一問題,不過這就需要花很多步來讓神經(jīng)網(wǎng)絡(luò)的損失減小到一個不錯的值。所以,我們需要讓學(xué)習(xí)率維持為一個最佳值,一般而言,0.01 是 alpha 的一個比較安全的取值。
然而僅僅使用梯度下降算法存在的一個大問題是,如下圖所示,損失無法趨近于全局最小值,而僅能不斷接近局部最小值。
SGD 局部最小值問題
我們從標(biāo)記的綠點(diǎn)看起,第一個綠點(diǎn)之后的每個綠點(diǎn)都表示依次更新后的新權(quán)重和損失。由于偏導(dǎo)數(shù)(梯度)在無限接近局部最小值時(shí)基本上等于 0,因此梯度下降僅僅在找到局部最小值之前發(fā)生。所以,在求到局部最小值后,梯度下降基本上就會原封不動,并不會繼續(xù)嘗試去找到全局最小值。
上圖非常簡單,而在現(xiàn)實(shí)中,這張圖要復(fù)雜得多,存在很多個局部最小值,所以如果僅僅使用梯度下降算法,并不能確保能夠找到一個不錯的損失。針對這一問題,我們可以采用動量的方法。
在動量中,我們需要做的基本上就是獲取權(quán)重在本次更新之前經(jīng)過的所有更新的一些信息。根本上而言,如果權(quán)重持續(xù)往一個特定方向變化(增大或減?。?,它就會慢慢地積累下該方向的「動量」。因此,當(dāng)權(quán)重遇到一些抵抗力并最終往相反的方向變化時(shí),由于此前積累的動量,它就能夠繼續(xù)按原來的方向變化。
這與物理中的實(shí)際動量類似。我們想象有一個走廊和一個球,當(dāng)我們在走廊的一遍發(fā)球時(shí),它會持續(xù)滾動一段時(shí)間,在此過程中,它就為往該方向的前進(jìn)獲取的動量。最后,當(dāng)球滾動到底時(shí),也不會就停在那里,而是往相反的方向再滾動一會,這是因?yàn)樗诖酥八@得的動量——即便重力會讓它停下來,然而動量會讓它繼續(xù)滾動一會。
我們嘗試從數(shù)學(xué)的角度來再現(xiàn)這一場景,以便讓梯度下降算法能夠在經(jīng)過局部最小值后繼續(xù)嘗試取得全局最小值,公式如下:
動量算法的權(quán)重更新公式
權(quán)重更新公式(動量)
這里的 V 表示的是動量因子(Momentum Factor),如公式所示,在每次更新中,它都會將前一次更新的動量因子加到當(dāng)前導(dǎo)數(shù)上。之后,我們僅需要將這個值加上權(quán)重,即可得出更新后的權(quán)重。其中 n 在這里指的是動量系數(shù)(Coefficient of Momentum),它決定權(quán)重每次往前移動所獲得的動量為多少。
當(dāng)權(quán)重更新后,權(quán)重也會在動量因子中將所有此前的梯度存儲為一個部分。這樣的話,一旦權(quán)重需要往相反的方向變化,例如達(dá)到局部最小值時(shí),它依舊會朝同一個方向變化一段時(shí)間,直到動量因子的數(shù)量逐漸減少,才往相反的方向變化。在多數(shù)情況下,動量因子通常都足以讓權(quán)重解決到了局部最小值便停止的問題。
動量可視化示例
動量算法的另一個附加優(yōu)勢是:由于梯度的積累,權(quán)重會更快地收斂成一個合適的損失值。優(yōu)化中還有哪些能夠讓梯度下降以更精準(zhǔn)的方式執(zhí)行的技術(shù)呢?我們下面來看。
涅斯捷羅夫梯度加速(Nesterov accelerated gradient,NAG)
在 NAG 中,我們要做的不是計(jì)算當(dāng)前位置的梯度,而是計(jì)算與當(dāng)前位置接近的未來位置的梯度。這樣做的原因是我們希望以一種更加精準(zhǔn)的方式來計(jì)算梯度。動量在取得最小值前就會開始減小,因?yàn)槠涫褂玫奶荻仁俏磥砦恢玫奶荻?。這種方法結(jié)果會提高收斂期間的穩(wěn)定性并減少波動,進(jìn)一步,它在實(shí)際應(yīng)用中的表現(xiàn)也比單純用動量算法更好。
接下來我們來看具體如何在神經(jīng)網(wǎng)絡(luò)權(quán)重的優(yōu)化中使用 NAG。
擴(kuò)展后的整個動量方程式如下:
擴(kuò)展后的動量全方程式
這里的下一個權(quán)重值 W 由「n*v_old」和「alpha *當(dāng)前梯度」以及當(dāng)前權(quán)重相加得出。假設(shè)「alpha *當(dāng)前梯度」的值變得很小,我們就能通過僅將「n*v_old」與當(dāng)前權(quán)重值相加來趨近于下一個 W 值。
計(jì)算趨近于未來位置的權(quán)重值
現(xiàn)在,我們要計(jì)算的不是當(dāng)前 W 值的梯度,而是未來 W 值的梯度。這就讓動量因子在真正面臨劇烈的梯度變化前提前適應(yīng),從而其訓(xùn)練期間的穩(wěn)定性得以提高。
涅斯捷羅夫動量公式
這個帶有 NAG 的新的動量方程式顯示,我們采用的是趨近于未來位置的 W 值的梯度而不是當(dāng)前位置的 W 值的梯度。
涅斯捷羅夫可視化示例
如上面使用 NAG 方法的示例所示,我們給當(dāng)前位置的 W 值加上了「n*v_old」以趨近于未來位置的 W 值。然后,我們計(jì)算未來位置的梯度值,并在計(jì)算「v_new」值時(shí)使用該值而非當(dāng)前位置的梯度值。在本示例中,雖然在該場景中,動量在理論上應(yīng)該是增加的,然而它在經(jīng)過該位置時(shí)就開始減小了,這是因?yàn)槲磥砦恢玫?W 值的梯度是指向相反方向的,所以動量值不增反減。
下面我們來看一些自適應(yīng)優(yōu)化方法。
在自適應(yīng)優(yōu)化方法中,學(xué)習(xí)率(alpha)和動量系數(shù)(n)在整個訓(xùn)練過程中都不再是連續(xù)的,而是連續(xù)地適應(yīng)網(wǎng)絡(luò)中的各個權(quán)重,因而會隨權(quán)重一同變化。這些類型的優(yōu)化算法都屬于自適應(yīng)優(yōu)化這類方法。
第一個要介紹的自適應(yīng)優(yōu)化算法是 Adagrad 算法。
Adagrad
涅斯捷羅夫是自適應(yīng)梯度算法的簡稱。在該算法中,我們需要為權(quán)重的每輪更新更改學(xué)習(xí)率(alpha),它們在每輪更新期間的更改方式為:如果權(quán)重在較短時(shí)間內(nèi)被更新的太多次,它就會減?。环粗龃?。
首先,每個權(quán)重都有自身的緩存(Cache)值,新的緩存值由自身原本的緩存值加上其在當(dāng)前位置前的梯度的平方得出。
Adagrad 的緩存更新值
在訓(xùn)練過程中,該緩存值會持續(xù)增大,新的權(quán)重更新公式如下所示:
Adagrad 權(quán)重更新公式
除了學(xué)習(xí)率(alpha)在整個訓(xùn)練過程中會持續(xù)變化外,該公式與原本的梯度下降公式一樣。公式分母中的 E 是一個非常小的值,它是為了確保該公式不會出現(xiàn)「分子除以零」的情況。
具體而言,在該公式中,如果權(quán)重的更新非常大,緩存值就會增大,結(jié)果會導(dǎo)致學(xué)習(xí)率變小,從而讓權(quán)重的更新幅度持續(xù)減小。另一方面,如果權(quán)重并沒有發(fā)生較為明顯的更新,緩存值就會變得很小,結(jié)果會讓學(xué)習(xí)率增大,進(jìn)而會增大權(quán)重的更新幅度。這就是 Adagrad 優(yōu)化器的基本原理。
然而,該算法的缺點(diǎn)就是,無論權(quán)重過去的梯度為多少,緩存值總會增大些,這是因?yàn)楣街械钠椒浇Y(jié)果是非負(fù)數(shù)。這樣的話,每個權(quán)重的學(xué)習(xí)率最終都會減小至一個非常小的值,直到訓(xùn)練過程再也不會發(fā)生較明顯的變化為止。
下一個要介紹的自適應(yīng)優(yōu)化器——RMSProp 則能夠解決這一問題。
RMSProp
與 Adagrad 相比,RMSProp 唯一的不同點(diǎn)就在于它的緩存更新策略。RMSProp 的公式引入了一個新參數(shù)——衰減率(Decay Rate),即 gamma:
RMSProp 的緩存權(quán)重更新公式
這里的 gamma 值一般為 0.9 或 0.99,因此對于每輪更新而言,相比于 Adagrad,公式中相加的與梯度的平方會乘上非常低的比率。這就確保了學(xué)習(xí)率能夠基于此前更新的權(quán)重,像在 Adagrad 算法中一樣持續(xù)變化,但與此同時(shí),該學(xué)習(xí)率不會衰減得很快,因而它的訓(xùn)練過程會持續(xù)更長的時(shí)間。
再接下來,我們要介紹的是 Adam 優(yōu)化器,總體而言,它被廣泛視作深度學(xué)習(xí)優(yōu)化中最佳的優(yōu)化器之一。
Adam
Adam 有點(diǎn)像 RMSProp 和動量(Momentum)方法的結(jié)合體。我們首先計(jì)算 m 值,它表示的是當(dāng)前位置的動量:
Adam 動量權(quán)重更新公式
該公式與動量公式的唯一區(qū)別就是,當(dāng)前梯度值乘以的不是學(xué)習(xí)率(alpha)而是 (1-Beta_1)。
下一步我們計(jì)算累積的緩存值,這跟 RMSProp 中的計(jì)算方法一樣:
最后得到的權(quán)重更新公式如下:
Adam 權(quán)重更新公式
如上公式所示,我們通過計(jì)算動量值來累加梯度值,與此同時(shí),我們可以通過利用緩存值來持續(xù)更改學(xué)習(xí)率。由于這兩個特征,Adam 的性能一般會比本文提到的以外的所有優(yōu)化器都更好,因而在訓(xùn)練神經(jīng)網(wǎng)絡(luò)方面,它也是被開發(fā)人員偏好使用的優(yōu)化器。在 Adam 的相關(guān)論文中,推薦 (Beta_1) 的參數(shù)取值為 0.9、(Beta_2) 的參數(shù)取值為 0.99 、(epsilon)的參數(shù)取值為 1e-08。
在本文中,我提到了多數(shù)深度學(xué)習(xí)從業(yè)者在基本的深度學(xué)習(xí)任務(wù)中最常用的幾個最重要的優(yōu)化器,希望大家能夠通過閱讀本文有所收獲!
注:作者在本文中使用的 a(Loss)/a(Wi) 符號,實(shí)際上表示的是 Wi 值的 a(Loss)/a(W)。
via https://medium.com/deep-learning-demystified/https-medium-com-deep-learning-demystified-understanding-optimizers-313b787a69fe 雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。