神經網絡優化算法:梯度下降法、Momentum、RMSprop和Adam


最近回顧神經網絡的知識,簡單做一些整理,歸檔一下神經網絡優化算法的知識。關於神經網絡的優化,吳恩達的深度學習課程講解得非常通俗易懂,有需要的可以去學習一下,本人只是對課程知識點做一個總結。吳恩達的深度學習課程放在了網易雲課堂上,鏈接如下(免費):
https://mooc.study.163.com/smartSpec/detail/1001319001.htm

神經網絡最基本的優化算法是反向傳播算法加上梯度下降法。通過梯度下降法,使得網絡參數不斷收斂到全局(或者局部)最小值,但是由於神經網絡層數太多,需要通過反向傳播算法,把誤差一層一層地從輸出傳播到輸入,逐層地更新網絡參數。由於梯度方向是函數值變大的最快的方向,因此負梯度方向則是函數值變小的最快的方向。沿着負梯度方向一步一步迭代,便能快速地收斂到函數最小值。這就是梯度下降法的基本思想,從下圖可以很直觀地理解其含義。

梯度下降法的迭代公式如下:

\[w=w-\alpha* dw \]

其中w是待訓練的網絡參數,\(\alpha\)是學習率,是一個常數,dw是梯度。以上是梯度下降法的最基本形式,在此基礎上,研究人員提出了其他多種變種,使得梯度下降法收斂更加迅速和穩定,其中最優秀的代表便是Mommentum, RMSprop和Adam等。

Momentum算法

Momentum算法又叫做沖量算法,其迭代更新公式如下:

\[\begin{cases} v=\beta v+(1-\beta)dw \\ w=w-\alpha v \end{cases} \]

光看上面的公式有些抽象,我們先介紹一下指數加權平均,再回過頭來看這個公式,會容易理解得多。

指數加權平均

假設我們有一年365天的氣溫數據\(\theta_1,\theta_2,...,\theta_{365}\),把他們化成散點圖,如下圖所示:

這些數據有些雜亂,我們想畫一條曲線,用來表征這一年氣溫的變化趨勢,那么我們需要把數據做一次平滑處理。最常見的方法是用一個華東窗口滑過各個數據點,計算窗口的平均值,從而得到數據的滑動平均值。但除此之外,我們還可以使用指數加權平均來對數據做平滑。其公式如下:

\[\begin{cases} v_0=0 \\ v_k=\beta v_{k-1}+(1-\beta)\theta_k, \quad k=1,2,...,365 \end{cases} \]

v就是指數加權平均值,也就是平滑后的氣溫。\(\beta\)的典型值是0.9,平滑后的曲線如下圖所示:

對於\(v_k=\beta v_{k-1}+(1-\beta)\theta_k\),我們把它展開,可以得到如下形式:

\[\begin{split} v_k&=\beta v_{k-1}+(1-\beta)\theta_k \\ &=\beta^kv_0+\beta^{k-1}(1-\beta)\theta_1+\beta^{k-2}(1-\beta)\theta_2+\dots+\beta(1-\beta)\theta_{k-1}+(1-\beta)\theta_k \\ &=\beta^{k-1}(1-\beta)\theta_1+\beta^{k-2}(1-\beta)\theta_2+\dots+\beta(1-\beta)\theta_{k-1}+(1-\beta)\theta_k \end{split} \]

可見,平滑后的氣溫,是以往每一天原始氣溫的加權平均值,只是這個權值是隨時間的遠近而變化的,離今天越遠,權值越小,且呈指數衰減。從今天往前數k天,它的權值為\(\beta^k(1-\beta)\)。當\(\beta=\frac{1}{1-\beta}\)時,由於\(\underset{\beta \rightarrow 1}{lim}\beta^k(1-\beta)=e^{-1}\),權重已經非常小,更久遠一些的氣溫數據權重更小,可以認為對今天的氣溫沒有影響。因此,可以認為指數加權平均計算的是最近\(\frac{1}{1-\beta}\)個數據的加權平均值。通常\(\beta\)取值為0.9,相當於計算10個數的加權平均值。但是按照原始的指數加權平均公式,還有一個問題,就是當k比較小時,其最近的數據太少,導致估計誤差比較大。例如\(v_1=0.9 v_0 + (1-0.9)\theta_1=0.1\theta_1\)。為了減小最初幾個數據的誤差,通常對於k比較小時,需要做如下修正:

\[v_k=\frac{\beta v_{k-1}+(1-\beta)\theta_k}{1-\beta^k} \]

\(1-\beta^k\)是所有權重的和,這相當於對權重做了一個歸一化處理。下面的圖中,紫色的線就是沒有做修正的結果,修正之后就是綠色曲線。二者在前面幾個數據點之間相差較大,后面則基本重合了。

回看Momentum算法

現在再回過頭來看Momentum算法的迭代更新公式:

\[\begin{cases} v=\beta v+(1-\beta)dw \\ w=w-\alpha v \end{cases} \]

\(dw\)是我們計算出來的原始梯度,\(v\)則是用指數加權平均計算出來的梯度。這相當於對原始梯度做了一個平滑,然后再用來做梯度下降。實驗表明,相比於標准梯度下降算法,Momentum算法具有更快的收斂速度。為什么呢?看下面的圖,藍線是標准梯度下降法,可以看到收斂過程中產生了一些震盪。這些震盪在縱軸方向上是均勻的,幾乎可以相互抵消,也就是說如果直接沿着橫軸方向迭代,收斂速度可以加快。Momentum通過對原始梯度做了一個平滑,正好將縱軸方向的梯度抹平了(紅線部分),使得參數更新方向更多地沿着橫軸進行,因此速度更快。

RMSprop算法

對於上面的這個橢圓形的拋物面(圖中的橢圓代表等高線),沿着橫軸收斂速度是最快的,所以我們希望在橫軸(假設記為w1)方向步長大一些,在縱軸(假設記為w2)方向步長小一些。這時候可以通過RMSprop實現,迭代更新公式如下:

\[\begin{cases} s_1=\beta_1 s_1+(1-\beta_1)dw_1^2 \\ s_2=\beta_2 s_2+(1-\beta_2)dw_2^2 \end{cases} \]

\[\begin{cases} w_1=w_1-\alpha \frac{dw_1}{\sqrt{s_1+\epsilon}} \\ w_2=w_2-\alpha \frac{dw_2}{\sqrt{s_2+\epsilon}} \end{cases} \]

觀察上面的公式可以看到,s是對梯度的平方做了一次平滑。在更新w時,先用梯度除以\(\sqrt{s_1+\epsilon}\),相當於對梯度做了一次歸一化。如果某個方向上梯度震盪很大,應該減小其步長;而震盪大,則這個方向的s也較大,除完之后,歸一化的梯度就小了;如果某個方向上梯度震盪很小,應該增大其步長;而震盪小,則這個方向的s也較小,歸一化的梯度就大了。因此,通過RMSprop,我們可以調整不同維度上的步長,加快收斂速度。把上式合並后,RMSprop迭代更新公式如下:

\[\begin{cases} s=\beta s+(1-\beta)dw^2 \\ w=w-\alpha\frac{dw}{\sqrt{s+\epsilon}} \end{cases} \]

\(\beta\)的典型值是0.999。公式中還有一個\(\epsilon\),這是一個很小的數,典型值是\(10^{-8}\)

Adam算法

Adam算法則是以上二者的結合。先看迭代更新公式:

\[\begin{cases} v=\beta_1 v+(1-\beta_1)dw \\ s=\beta_2 s+(1-\beta_2)dw^2 \\ w=w-\alpha\frac{v}{\sqrt{s+\epsilon}} \end{cases} \]

典型值:\(\beta_1=0.9, \quad \beta_2=0.999, \quad \epsilon=10^{-8}\)。Adam算法相當於先把原始梯度做一個指數加權平均,再做一次歸一化處理,然后再更新梯度值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM