深度學習優化算法最耳熟能詳的就是GD(Gradient Descend)梯度降低,而後又有一個所謂的SGD(Stochastic Gradient Descend)隨機梯度降低,其實仍是梯度降低,只不過每次更新梯度不用整個訓練集而是訓練集中的隨機樣本。梯度降低的好處就是用到了當前迭代的一些性質,以致於總能較快找到駐點。而像遺傳算法等智能優化算法,則是基於巨大的計算資源上的。它們並不使用函數特性,一般須要「種羣」幾乎遍及整個參數空間才能進行有效的優化,更像是一種暴力搜索。而由於神經網絡參數量太大,幾百萬維的參數量不可能讓種羣達到「密佈」(即便每一個維度兩個「個體」,種羣規模也是2的百萬次冪),因此神經網絡優化一般都用基於梯度降低的算法。算法
如今,神經網絡優化經常使用的都是梯度降低算法的變體,下面介紹Momentum, RMSProp, Adam這三種最經常使用的。它們都對梯度降低的某些不足作出了改進。網絡
Momentum是動量的意思。它對每次迭代進行平滑處理,以致於不會像GD同樣,當梯度很大時一會兒跳地太遠,在梯度較小時又跳得太少。定義很簡單,就比GD多了一步:函數
$V_t = \beta V_{t-1} + (1-\beta) \nabla \theta_t$學習
$\theta_{t+1} = \theta_t - \eta V_t$優化
其中$\theta_t$表示第$t$次迭代的參數張量,$\nabla \theta_t$表示關於它的梯度。$\eta$是模型學習率。$\beta$是平滑因子,也就是積累梯度的權重,越大則以前的梯度對當前影響越大,越小則這次迭代的梯度對當前影響越大,而等於0時Momentum就退化成GD了。$V_{t-1}$表示第$t$步迭代之前累積的梯度動量。blog
相較GD,加上平滑的概念之後,Momentum會更加註重優化的全局性,這是由於它每次迭代都取決於以前全部梯度的加權和。拿跑步來舉例,GD的每一步都是當前地面坡度最陡的方向,而Momentum則是添加了慣性,每一步都將跑步速度向坡度最陡的方向調整。資源
RMSProp改進了GD的擺動幅度過大的問題,從而加快收斂速度。迭代式以下:深度學習
$\begin{gather}S_t = \beta S_{t-1} + (1-\beta)( \nabla \theta_t)^2 \label{}\end{gather}$ast
$\begin{gather}\displaystyle \theta_{t+1} = \theta_t - \eta \frac{\nabla \theta_t}{\sqrt{S_t}+\varepsilon}||\sqrt{S_t}||\label{}\end{gather}$效率
$(1)$式中的$( \nabla \theta_t)^2$和$(2)$式中的分式分別表示按元素進行的平方操做和除法操做。$(2)$式中的$\varepsilon$是爲了防止除數爲0而設置的較小數,它和張量$S_t$執行的加法就是把它加到$S_t$的每一個元素。$||\sqrt{S_t}||$是二範數(我本身加的,爲了不梯度值改變太大,能夠無視)。
按迭代式能夠看出,RMSProp對梯度的方向進行了較弱的規範化,讓梯度的每個元素向單位值1或-1靠近,這樣一來,優化時的擺動幅度就會減少一些。而又爲了避免至於靠得太近而直接變成全1和-1,用於規範化的是以前梯度平方的累積量而不是直接用當前梯度的平方。固然,若是$\beta=0$,那就是當前梯度的平方來規範化了,這樣一來,每次更新方向的每一個元素值就都是1和-1了。下面來分析各類狀況。
如下是分別用GD、Momentum、RMSProp對二元函數$z = x^2+10y^2$進行優化的例子。初始點位於$(250,-150)$,學習率爲0.02,Momentum和RMSProp的$\beta$都爲0.9。它們分別迭代了11三、7八、65次:
能夠看出RMSProp少走了不少彎路,路線更平緩。Momentum雖然比GD多走不少彎路,可是迭代的次數仍是有所下降的。可是,當把初始點改爲$(350,1)$時,EMSProp的表現就不太好了,三者的迭代次數分別爲12二、7八、293:
這回Momentum迭代效率最高(次數最少),反而是RMSProp走了不少彎路迭代次數也多效率最低,這是由於梯度張量的各個元素都向1和-1靠近的緣故。
以上介紹的兩個優化算法在不一樣的起始位置彷佛各有優缺點,而Adam就是將Momentum和RMSProp的優點結合起來的算法。下面是迭代式:
$\begin{gather}V_t =\beta_1 V_{t-1} + (1-\beta_1) \nabla \theta_t\label{}\end{gather}$
$\begin{gather}S_t =\beta_2 S_{t-1} + (1-\beta_2)( \nabla \theta_t)^2 \label{}\end{gather}$
$\begin{gather}\hat{V_t} =\frac{V_t}{1-\beta_1^t}\label{}\end{gather}$
$\begin{gather}\hat{S_t} =\frac{S_t}{1-\beta_2^t} \label{}\end{gather}$
$\begin{gather}\theta_{t+1} = \theta_t - \eta \frac{\hat{V_t}}{\sqrt{\hat{S_t}}+\varepsilon}\left\|\sqrt{\hat{S_t}}\right\|\label{}\end{gather}$
Adam實際上就是前面兩個算法的簡單結合,但能夠發現它多除了一個$1-\beta^t$($\beta^t$表示$\beta$的$t$次方),這是爲了讓開始的幾回更新不至於過小(由於乘了$1-\beta$)。隨着迭代日後,$1-\beta^t$接近於1。
下面對以上算法作個比較。依舊是對二元函數$z = x^2+10y^2$進行優化,初始點位於$(250,-150)$,學習率爲0.02。Momentum和RMSProp的$\beta=0.9$,Adam的$\beta_1=0.9$,$\beta_2=0.999$。Adam的迭代次數爲207,另外三個算法迭代次數沒變:
Adam繞得厲害,迭代次數也比另外三個算法多。把$\beta1$改爲0.5後,Adam的迭代次數變爲了40:
$\beta1$越小,Adam是越退化爲RMSProp的。若是設置$\beta1=0$退化爲RMSProp,迭代次數又上升到了61(比上面的RMSProp效率高是由於$\beta2=0.999$而不是$0.9$)。說明不一樣狀況下Adam的參數設置會直接影響迭代效率。
總的來講,Adam就是加上動量的同時,又使用了規範化,讓每次迭代能用上以前的梯度,而且更新步伐的每一個元素稍微靠近1和-1一些。而這樣有什麼好處,只能實踐出真知。
這些基於梯度降低的優化算法都大同小異,它們在不一樣狀況下發揮時好時壞,有的改良算法在某些狀況下效果可能比原始的GD還差。因此選擇優化算法仍是要視狀況而定,咱們應該選擇對高几率狀況優化效果好的算法。另外,我上面用迭代次數來比較算法的優劣性不夠嚴謹,由於不一樣算法每次迭代的計算量都不一樣。像Adam的計算量差很少是Momentum和RMSProp的兩倍,若是要嚴謹,仍是得用計算時間做比較。