建議:可以查看吳恩達的深度學習視頻,里面對這幾個算法有詳細的講解。
一、指數加權平均
說明:在了解新的算法之前需要先了解指數加權平均,這個是Momentum、RMSprop、Adam三個優化算法的基礎。
1、指數加權平均介紹:
這里有一個每日溫度圖(華氏攝氏度℉),右邊是每日溫度,$\theta _{i}$表示第i天的溫度:
這個時候我們要用一個曲線來擬合這個散點圖,則曲線某一天的$y$值可以用某一天的溫度的局部平均值來替代,假設我們有前i-1天的溫度,這時候要來估計第$i$天的溫度$\theta _{i}$,我們可以用第$i$天的前$k$天的平均溫度替代,如:$\theta _{i}^{'}=\frac{\theta _{i}+...+\theta _{i-k}}{k}$。
但是這樣的數據容易出現一個問題,當前5天的數值為10、11、12、13、14、30,可以看到第五天的數據異常偏大,如果用一般均值計算的話會導致波動特別大,擬合值容易出錯。
解決方法是我們計算均值的時候,考慮前面k天的影響,對前面的k天加上權值,就能夠抵消由於異常值導致數據的過分誤差,這就有了指數加權平均,公式如下:
$$V_{i}=\beta V_{i-1}+(1-\beta )\theta _{i}$$
$V_{i}$為第$i$天的溫度的擬合值,規定$V_{0}=0$,$\theta _{i}$是當天的實際溫度,$\beta$是權重,一般設置為0.9,這里列出第$0$天計算到第$i$天的擬合值$V_{i}$的計算公式:
\begin{matrix}
& V_{0}=0 \\&V_{1}=\beta V_{0}+(1-\beta )\theta _{1} \\&V_{2}=\beta V_{1}+(1-\beta )\theta _{2} \\& ... \\& V_{i}=\beta V_{i-1}+(1-\beta )\theta _{i}
\end{matrix}
所以:
\begin{align*}
V_{i} &= \beta V_{i-1}+(1-\beta )\theta _{i}\\
&= \beta \left (\beta V_{i-2}+(1-\beta )\theta _{i-1} \right )+(1-\beta )\theta _{i}\\
&= \beta^{2}V_{i-2}+\beta(1-\beta )\theta _{i-1}+1(1-\beta )\theta _{i}\\
&= \beta^{2}\left (\beta V_{i-3}+(1-\beta )\theta _{i-2} \right )+\beta(1-\beta )\theta _{i-1}+\beta^{0}(1-\beta )\theta _{i}\\
&= \beta^{3}V_{i-3}+\beta^{2}(1-\beta )\theta _{i-2}+\beta(1-\beta )\theta _{i-1}+\beta^{0}(1-\beta )\theta _{i}\\
&= \beta^{i}V_{0}+\beta^{i-1}(1-\beta )\theta_{1}+...+\beta^{0}(1-\beta )\theta _{i}\\
&= \beta^{i-1}(1-\beta )\theta_{1}+...+\beta^{0}(1-\beta )\theta _{i}\\
&=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}\\
&=(1-\beta )\sum_{k=1}^{i}\beta^{i-k}\theta_{k}
\end{align*}
這樣我們就得到了$V_{i}$的最終等式,把所有的點求解出來然后連線,可以得到一個擬合度較好的紅色曲線,這個曲線比較平滑:
2、為什么這個方法會叫做指數加權平均呢?
我們這里考慮第$i$天的擬合值$V_{i}$的計算,下圖左邊是溫度散點圖,右邊是指數函數的圖:
所以$V_{i}=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}$可以看成是第$i$天之前每一天對應散點值乘以對應低數為$\beta$的指數函數的值求和,這個就是指數加權。
現在再來看平均的推導:
\begin{align*}V_{i}
&= \sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}\\
&= (1-\beta )\sum_{k=1}^{i}\beta^{i-k}\theta_{k}\\
&= (1-\beta )\left ( \beta^{0}\theta_{i}+\beta^{1}\theta_{i-1}+...+\beta^{i-1}\theta_{1}+\beta^{i}\theta_{0} \right )\\
\end{align*}
這里引入一個等比求和公式:
\begin{matrix}
& summation formula of geometric progression:\\
& beta ^{0}+\beta ^{1}+\beta ^{2}+...+\beta ^{i-1}=\frac{1-\beta ^{i}}{1-\beta} \\
& \lim_{i\rightarrow \infty }\frac{1-\beta ^{i}}{1-\beta}\sim 1
\end{matrix}
可以看出,當$i$足夠大的時候,所有權重相加為1,所以這個就是平均,進而$V_{i}=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}$就是指數加權平均。
3、指數加權平均加權個數k的確定
當計算低$i$天的時候,如果前面所有的數據進行加權平均,會有這兩個問題:當$i=10000$,$\theta ^{10000}\approx 0$,這樣會使得$\beta^{10000}(1-\beta )\theta _{i-10000}$趨近於0,對估計值$V_{i}$的影響可以忽略不計。
那么加權的樣本量怎么確定呢,一般是做如下限定:權值為$\beta^{k}< \frac{1}{e}=0.367879$的數據不加入到加權中,$e$為自然對數的底數。這樣限制之后指數函數的曲線在第$k$天之后高度會降到原來的$\frac{1}{e}$。樣本量可以根據$k=\frac{1}{1-\beta }$來求。這個公式的推導如下:
\begin{matrix}
\because \lim_{x \rightarrow \infty}\left ( 1-\frac{1}{x} \right )^{x}\sim \frac{1}{e}
\\
\therefore \lim_{x \rightarrow 0}\left ( 1-x \right )^{\frac{1}{x}}\sim \frac{1}{e}
\\
\therefore \lim_{x \rightarrow 1}\left (x \right )^{\frac{1}{1-x}}\sim \frac{1}{e}
\\
\therefore \lim_{\beta \rightarrow 1}\left (\beta \right )^{\frac{1}{1-\beta}}\sim \frac{1}{e}
\\
\because \beta\geq 0.9
\\
\therefore k\approx \frac{1}{1-\beta}
\end{matrix}
當$\beta=0.9$,$\frac{1}{1-\beta}=10$,所以取樣本量為k=10,即只取前十個數據來加權平均。
4、偏差修正
首先來下圖,紅色曲線是$\beta=0.9$,紫色曲線是$\beta=0.98$,綠色曲線是$\beta=0.98$並進行了偏差修正的:
會發現沒有進行偏差修正的紫色曲線在開始的位置偏下,遠離真實值,這里以前兩個點$i=1,2$為例看怎么造成的,設:$\theta _{1}=40,\theta _{2}=50,\beta=0.98$:
\begin{matrix}
V_{0}=0\\
V_{1}=0.98V_{0}+0.02\theta _{1}=0.02\theta _{1}=0.8\\
V_{2}=0.98V_{1}+0.02\theta _{2}=0.0169\theta _{1}+ 0.02\theta _{2}=1.676
\end{matrix}
由於$1-\beta=0.02$所以導致了第一個估計值$V_{1}$遠小於真實值,為了避免初期的估計值與真實值差距過大,需要進行修正,修正方法是對原先計算得到的每一個$V_{i}$都除以$1-\beta ^{i}$來作為新的估計值$V_{i}^{'}$,即:$V_{i}^{'}=\frac{V_{i}}{1-\beta ^{i}}$,這樣處理之后的真實值的估計為:
\begin{matrix}
V_{0}^{'}=0\\
V_{1}^{'}=\frac{V_{1}}{1-0.98}=40\\
V_{2}^{'}=\frac{V_{2}}{1-0.98^{2}}=42.3232232...
\end{matrix}
可以發現這樣就解決了初期數據不夠估計與真實差距過大的問題,而對於后期的數據,有如下情況:
\begin{matrix}
\lim_{i\rightarrow \infty }\beta ^{i}\sim 0\\
\lim_{i\rightarrow \infty }V_{i}^{'}=\lim_{i\rightarrow \infty }\frac{V_{i}}{1-\beta^{i}}\sim V_{i}
\end{matrix}
所以當$i$足夠大的時候,新的估計$V_{i}^{'}$等於原先的估計值$V_{i}$,所以只要在需要考慮初期的估計需要准確定時候才需要進行偏差修正,其他時候可以選擇不修正。
5、總結
指數加權平均公式:
$$V_{i}= \beta V_{i-1}+(1-\beta )\theta _{i}=\sum_{k=1}^{i}\beta^{i-k}(1-\beta )\theta_{k}$$
一般對於指數加權平均的參數有的建議如下設置:
- $\beta\geqslant 0.9$
- 樣本量$k\approx \frac{1}{1-\beta }$
指數加權平均的作用:
- 減少噪音影響,撫平短期波動,起到了平滑的作用。
- 刻畫了原數據的趨勢,能夠將長線趨勢或周期趨勢顯現出來。
偏差修正公式:
$$V_{i}^{'}=\frac{V_{i}}{1-\beta ^{i}}$$
二、Momentum、RMSprop、ADAM梯度下降
1、普通梯度下降的缺點
回顧一下普通的梯度下降的缺點(以Mini-batch gradient descent為例):
- 不能保證很好的收斂性,learning rate 如果選擇的太小,收斂速度會很慢,如果太大,loss function 就會在極小值處不停地震盪甚至偏離。(有一種措施是先設定大一點的學習率,當兩次迭代之間的變化低於某個閾值后,就減小 learning rate,不過這個閾值的設定需要提前寫好,這樣的話就不能夠適應數據集的特點)。對於非凸函數,還要避免陷於局部極小值處,或者鞍點處,因為鞍點周圍所有維度的梯度都接近於0,SGD 很容易被困在這里(會在鞍點或者局部最小點震盪跳動,因為在此點處,如果是訓練集全集帶入即BGD,則優化會停止不動,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就會發生震盪,來回跳動)。
- SGD對所有參數更新時應用同樣的 learning rate,如果我們的數據是稀疏的,我們更希望對出現頻率低的特征進行大一點的更新。LR會隨着更新的次數逐漸變小。
鞍點就是:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。例如這個二維圖形,像個馬鞍:在x-軸方向往上曲,在y-軸方向往下曲,鞍點就是(0,0),紅色線為擬合曲線,最后會在紅點處震盪,如下圖。
再來看看普通的提低下降法的擬合軌跡圖,紅點為擬合的損失函數最小點,藍色線為梯度下降的過程曲線:
可以看到正常梯度下降在擬合過程中出現較大的波動,而這種縱向的較大的波動會影響學習速度,這個無法通過較大的學習率來解決,因為較大的學習率可能會偏離函數范圍(如紫色線)。所以我們想要的目的是,使擬合軌跡在縱軸上學習得慢一點,減少這些擺動,但是在橫軸上,學習得快一些,快速地從左向右移移向紅點最小值,那么訓練的速度就可以加快很多,所以這就是momentum梯度下降要做的事情。
2、momentum梯度下降
momentum梯度梯度公式:
$$V_{dW^{l}}^{t}=\beta V_{dW}^{t-1}+\left ( 1-\beta \right )dW^{l}$$
$$V_{db^{l}}^{t}=\beta V_{db}^{t-1}+\left ( 1-\beta \right )db^{l}$$
其中$\beta$
迭代更新公式變為:
$$W^{l}=W^{l}-\alpha V_{dW^{l}}^{t}$$
$$b^{l}=b^{l}-\alpha V_{db^{l}}^{t}$$
以隱藏層第$l$層的權重矩陣$W^{l}$為例(偏置b同理,但是一般可以不對b進行momentum梯度下降),在第$t$步的迭代中, 權重$W$的真實梯度為$dw^{l}$,我們這里利用指數加權平均梯度$V_{dw^{l}}^{t}$來代替第$t$次迭代的真實梯度。
如果把梯度下降看成是一個球從山上往下滾動,那么$V_{dw^{l}}^{t}$可以看成是在時刻$t$的速度,$V_{dw^{l}}^{t}$受到上一時刻的速度、摩擦力以及加速的影響,則$V_{dw^{l}}^{t-1}$為上一時刻的速度;$V_{dw^{l}}^{t-1}$乘以$\beta$是因為有摩擦力,下一時刻的速度縮小成上一刻的速度的$\beta$倍;而由於重力提供了加速度$\left ( 1-\beta \right )dW^{l}$,所以這種梯度下降稱之為momentum梯度下降。
momentum梯度下降的梯度擬合軌跡可以看成是下圖的紅色線,參考指數加權平均的作用是使得數據更平滑,所以可以使得藍色曲線在縱向上的波動更小,因為縱向上的加權平均有很大一部分可以相互抵消(梯度是矢量,方向相反的梯度可以相互抵消),而在水平方向上的速度不變,效果比普通的梯度下降好。
3、RMSprop梯度下降
Adagrad梯度下降:
在了解RMSprop算法之前先來了解一下Adagrad梯度下降,Adagrad梯度下降的更新公式為:
$$W_{t}^{l}=W_{t-1}^{l}- \frac{\alpha}{\sqrt{\sum_{i=1}^{t-1}\left (dW_{i} \right )^{2} }+\varepsilon }\cdot dW_{t-1}^{l}$$
$$b_{t}^{l}=b_{t-1}^{l}- \frac{\alpha}{\sqrt{\sum_{i=1}^{t-1}\left (db_{i} \right )^{2} }+\varepsilon }\cdot db_{t-1}^{l}$$
$$\left (dW_{i} \right )^{2} = W_{i}\bigodot W_{i},\left (db_{i} \right )^{2} = b_{i}\bigodot b_{i}$$
其中,t為當前迭代次數,$\bigodot$是hadamard積(是矩陣的一類運算,若A=(aij)和B=(bij)是兩個同階矩陣,若cij=aij×bij,則稱矩陣C=(cij)為A和B的哈達瑪積,或稱基本積)。$\sum_{i=1}^{t-1}\left (dW_{i} \right )^{2} $與$\sum_{i=1}^{t-1}\left (db_{i} \right )^{2} $分別表示歷史前t-1個權重梯度$dW$的hadamard求和與前t-1個偏置梯度$db$的hadamard求和。$\varepsilon$是一個平滑參數(通常取$\varepsilon=1e−8$),用來避免出現分母為0的情況。
優點:由於學習率$\alpha$除以了一個前$t-1$個梯度的和,所以每次迭代的學習率都會不同,且因為梯度會累加得越來越大,也就可以達到衰減學習率的效果,可以避免在最后收斂的時候學習率過大導致一直在最優點附近震盪。
缺點:需要計算參數梯度序列平方和,並且學習速率趨勢會較快衰減達到一個非常小的值。
RMSprop梯度下降:
在Adagrad的啟發下,為了緩解Adagrad學習率衰減過快,首先想到降低分子里的平方和項,由此引申出了RMSprop梯度下降(全稱為root mean square prop),RMSprop是通過將平方和變為加權平方和.也就是說平方和項隨着時間不斷衰減,過遠的梯度將不影響學習率。
RMSprop的加權平方和公式為:
$$S_{dW_{t}^{l}}=\beta S_{dW_{t-1}^{l}}+\left ( 1-\beta \right )*\left ( dW \right )^{2}=\beta S_{dW_{t-1}^{l}}+\left ( 1-\beta \right )*dW\bigodot dW$$
$$S_{db_{t}^{l}}=\beta S_{db_{t-1}^{l}}+\left ( 1-\beta \right )*\left ( db \right )^{2}=\beta S_{db_{t-1}^{l}}+\left ( 1-\beta \right )*db\bigodot db$$
其中$\beta=0.999$
RMSprop的迭代更新公式為:
$$W_{t}=W_{t-1}-\frac{\alpha }{\sqrt{S_{dW_{t-1}^{l}}}+\varepsilon }\cdot dW_{t}$$
$$b_{t}=b_{t-1}-\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }\cdot db_{t}$$
RMSprop梯度的作用:
我們先來看一下用普通梯度下降的圖:
藍色線為梯度下降軌跡,紅點為最優點,假設縱向為偏置b橫向為權重W(這里只是為了便於理解做假設,實際情況可能縱向為W1、W2橫向為W3、W4),縱向上波動較大,或者說梯度較大,而在橫向上梯度正常或者較小。那么我們希望達到這么一個效果,縱向b的為了消除擺動我們希望學習率較低,而橫向W我們希望每次迭代的學習率足夠大。
對於於縱向b,由於每一次迭代的梯度較大,所以$S_{db_{t}^{l}}$會比較大,這時候我們更新b的時候學習率會除以一個較大的$S_{db_{t}^{l}}$,從而我們的學習率$\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }$會變小,所以在縱向b前進的幅度減小。
對於於縱向W,由於每一次迭代的梯度較小,所以$S_{db_{t}^{l}}$會比較小,這時候我們更新b的時候學習率會除以一個較小的$S_{db_{t}^{l}}$,從而我們的學習率$\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }$會變大,所以在縱向b前進的幅度減大。
通過對學習率的除以一個平方和加權值,我們減緩了縱向的學習進度而加大了橫向的學習進度,所以我們可以得到如下的迭代軌跡,如綠色線:
優勢:我們可以設置一個較大的學習率,因為算法會自適應的調整學習率。
4、Adam梯度下降
在學習了前兩種算法之后,將兩個算法結合起來就是Adam,Adam已被證明適用於不同的深度學習結構,對於第$t$次迭代Adam公式如下:
梯度的指數加權平均(Momentum):
$$V_{dW_{t}^{l}}=\beta_{1} V_{dW}^{t-1}+\left ( 1-\beta_{1} \right )dW_{t}^{l}$$
$$V_{db_{t}^{l}}=\beta_{1} V_{db}^{t-1}+\left ( 1-\beta_{1} \right )db_{t}^{l}$$
加權平方和(RMSprop):
$$S_{dW_{t}^{l}}=\beta_{2} S_{dW_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*\left ( dW \right )^{2}=\beta_{2} S_{dW_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*dW\bigodot dW$$
$$S_{db_{t}^{l}}=\beta_{2} S_{db_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*\left ( db \right )^{2}=\beta_{2} S_{db_{t-1}^{l}}+\left ( 1-\beta_{2} \right )*db\bigodot db$$
迭代更新公式:
$$W_{t}=W_{t-1}-\frac{\alpha }{\sqrt{S_{dW_{t-1}^{l}}}+\varepsilon }\cdot V_{dW_{t}^{l}}$$
$$b_{t}=b_{t-1}-\frac{\alpha }{\sqrt{S_{db_{t-1}^{l}}}+\varepsilon }\cdot V_{db_{t}^{l}}$$
Adam 超參數設置建議:
- 學習率 α:需要嘗試一系列的值,來尋找比較合適的;
- β1:常用的缺省值為 0.9;
- β2:Adam 算法的作者建議為 0.999;
- ϵ:不重要,不會影響算法表現,Adam 算法的作者建議為 10−8;
- β1、β2、ϵ 通常不需要調試。