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