最近回顧神經網絡的知識,簡單作一些整理,歸檔一下神經網絡優化算法的知識。關於神經網絡的優化,吳恩達的深度學習課程講解得很是通俗易懂,有須要的能夠去學習一下,本人只是對課程知識點作一個總結。吳恩達的深度學習課程放在了網易雲課堂上,連接以下(免費):
https://mooc.study.163.com/smartSpec/detail/1001319001.htm算法
神經網絡最基本的優化算法是反向傳播算法加上梯度降低法。經過梯度降低法,使得網絡參數不斷收斂到全局(或者局部)最小值,可是因爲神經網絡層數太多,須要經過反向傳播算法,把偏差一層一層地從輸出傳播到輸入,逐層地更新網絡參數。因爲梯度方向是函數值變大的最快的方向,所以負梯度方向則是函數值變小的最快的方向。沿着負梯度方向一步一步迭代,便能快速地收斂到函數最小值。這就是梯度降低法的基本思想,從下圖能夠很直觀地理解其含義。
網絡
梯度降低法的迭代公式以下:函數
其中w是待訓練的網絡參數,\(\alpha\)是學習率,是一個常數,dw是梯度。以上是梯度降低法的最基本形式,在此基礎上,研究人員提出了其餘多種變種,使得梯度降低法收斂更加迅速和穩定,其中最優秀的表明即是Mommentum, RMSprop和Adam等。學習
Momentum算法又叫作衝量算法,其迭代更新公式以下:優化
光看上面的公式有些抽象,咱們先介紹一下指數加權平均,再回過頭來看這個公式,會容易理解得多。spa
假設咱們有一年365天的氣溫數據\(\theta_1,\theta_2,...,\theta_{365}\),把他們化成散點圖,以下圖所示:
htm
這些數據有些雜亂,咱們想畫一條曲線,用來表徵這一年氣溫的變化趨勢,那麼咱們須要把數據作一次平滑處理。最多見的方法是用一個華東窗口滑過各個數據點,計算窗口的平均值,從而獲得數據的滑動平均值。但除此以外,咱們還可使用指數加權平均來對數據作平滑。其公式以下:blog
v就是指數加權平均值,也就是平滑後的氣溫。\(\beta\)的典型值是0.9,平滑後的曲線以下圖所示:
get
對於\(v_k=\beta v_{k-1}+(1-\beta)\theta_k\),咱們把它展開,能夠獲得以下形式:深度學習
可見,平滑後的氣溫,是以往每一天原始氣溫的加權平均值,只是這個權值是隨時間的遠近而變化的,離今天越遠,權值越小,且呈指數衰減。從今天往前數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比較小時,須要作以下修正:
\(1-\beta^k\)是全部權重的和,這至關於對權重作了一個歸一化處理。下面的圖中,紫色的線就是沒有作修正的結果,修正以後就是綠色曲線。兩者在前面幾個數據點之間相差較大,後面則基本重合了。
如今再回過頭來看Momentum算法的迭代更新公式:
\(dw\)是咱們計算出來的原始梯度,\(v\)則是用指數加權平均計算出來的梯度。這至關於對原始梯度作了一個平滑,而後再用來作梯度降低。實驗代表,相比於標準梯度降低算法,Momentum算法具備更快的收斂速度。爲何呢?看下面的圖,藍線是標準梯度降低法,能夠看到收斂過程當中產生了一些震盪。這些震盪在縱軸方向上是均勻的,幾乎能夠相互抵消,也就是說若是直接沿着橫軸方向迭代,收斂速度能夠加快。Momentum經過對原始梯度作了一個平滑,正好將縱軸方向的梯度抹平了(紅線部分),使得參數更新方向更多地沿着橫軸進行,所以速度更快。
對於上面的這個橢圓形的拋物面(圖中的橢圓表明等高線),沿着橫軸收斂速度是最快的,因此咱們但願在橫軸(假設記爲w1)方向步長大一些,在縱軸(假設記爲w2)方向步長小一些。這時候能夠經過RMSprop實現,迭代更新公式以下:
觀察上面的公式能夠看到,s是對梯度的平方作了一次平滑。在更新w時,先用梯度除以\(\sqrt{s_1+\epsilon}\),至關於對梯度作了一次歸一化。若是某個方向上梯度震盪很大,應該減少其步長;而震盪大,則這個方向的s也較大,除完以後,歸一化的梯度就小了;若是某個方向上梯度震盪很小,應該增大其步長;而震盪小,則這個方向的s也較小,歸一化的梯度就大了。所以,經過RMSprop,咱們能夠調整不一樣維度上的步長,加快收斂速度。把上式合併後,RMSprop迭代更新公式以下:
\(\beta\)的典型值是0.999。公式中還有一個\(\epsilon\),這是一個很小的數,典型值是\(10^{-8}\)。
Adam算法則是以上兩者的結合。先看迭代更新公式:
典型值:\(\beta_1=0.9, \quad \beta_2=0.999, \quad \epsilon=10^{-8}\)。Adam算法至關於先把原始梯度作一個指數加權平均,再作一次歸一化處理,而後再更新梯度值。