本文算是對常用梯度圖下降的算法綜述,從方向導數開始得到梯度下降的原始算法,接着描述了動量梯度下降算法。 而由於超參數學習率對梯度下降的重要性,所以梯度算法就有多個自適應梯度下降算法。 主要有以下內容:
- 方向導數和梯度下降
- 梯度下降的形式,批量梯度下降,SGD以及mini-batch 梯度下降
- 梯度下降的進化,主要是幾種自適應梯度下降算法:AdaGrad,RMSprop,AdaDelta,Adam
方向導數和梯度
方向導數
方向導數指的是函數\(z=f(x,y)\)在某一點\(P\)沿某一方向的變化率,其表示形式為$$\frac{\partial f}{\partial l}$$其中\(l\)表示變換的方向。
設函數\(z=f(x,y)\)在點\(P(x,y)\)的某一鄰域\(U(p)\)內有定義。自點\(P\)處引射線\(l\),設射線\(l\)和\(X\)軸正向的夾角為\(\theta\),並且假定射線\(l\)與函數\(z = f(x,y)\)的交點為\(P'(x+\Delta x,y + \Delta y)\)。則函數在\(P,P'\)的增量為\(f(x+\Delta x , y + \Delta y) - f(x,y)\),兩點之間的距離為\(\rho = \sqrt{(\Delta x)^2 + (\Delta y)^2}\),當\(P'\)沿着\(l\)趨近於\(P\)時,如果函數增量和兩點距離的比值的極限存在,則稱這個極限為函數\(f(x,y)\)在點\(P\)沿方向\(l\)的方向導數,記為\(\frac{\partial f}{\partial l}\),即
假設,函數\(z=f(x,y)\)在點\(P(x,y)\)可微,則有:
將上式的左右兩邊同時除以\(\rho\)
取極限有
梯度
梯度是和方向導數相關的一個概念。
假設函數\(z=f(x,y)\)在平面區域內\(D\)內具有一階連續偏導數,則對每一點\((x,y) \in D\),都可得到一個向量,
該向量就稱為函數\(z=f(x,y)\)在點\((x,y)\)處的梯度,記為\(grad f(x,y)\),即
那么梯度和方向導數,有什么樣的關系呢。
設,向量\(e = \cos \theta i + \sin \theta j\)是與\(l\)同向的單位向量,則有方向導數的計算公式可知,
$\cos <\nabla f,e> $表示梯度 \(\nabla f\) 與 \(e\)的夾角,當方向向量的方向\(l\)的方向與梯度一致時,方向導數\(\frac{\partial f}{\partial l}\)達到最大值,也就是說函數沿着梯度的方向增長最快。
函數在某點的梯度是一個向量,在該點沿着梯度方向的方向導數取得最大值,方向導數的最大值為梯度的模。
梯度的方向由梯度向量相對於\(x\)軸的角度給出,
也就是說,一個函數在某點沿着梯度的方向增長最快,而逆着梯度的方向則減小最快。
梯度下降優化算法
在復雜函數求最小值的優化問題中,通常利用上面描述的梯度的性質,逆着梯度的方向不斷下降,來找到函數的極小值。
以進行一個線性回歸的批量梯度下降為例,描述下梯度下降方法的過程
其目標函數為:
其中,\(i = 1,2,\cdots,m\)為第\(i\)個樣本。這里的目標函數是所有樣本誤差和的均值。
則使用梯度下降進行優化時,有以下步驟
- 求目標函數的導數
\(i = 1,2,\cdots,m\)為樣本數。
- 利用上述樣本更新參數
其中,\(\alpha\)是每次下降的步長。
梯度下降中的幾個基本概念:
- 假設模型,上面線性回歸中使用函數\(h_{\theta}(x^i) = \theta_1 x^i + \theta_0\)作為訓練集的擬合函數。在深度學習中,可以將整個神經網絡看着一個復雜的非線性函數,作為訓練樣本的擬合模型。
- 目標函數,也稱為損失函數(loss function)。使用該函數的值來評估假設的模型的好壞,目標函數的值越小,假設模型擬合訓練數據的程度就越好。使用梯度下降,實際就是求目標函數極小值的過程。上述線性回歸中,使用模型預測值和真實數據的差值的平方作為目標函數\(J(\theta_0,\theta_1) = \frac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^i) - y^i)^2\),前面乘以\(\frac{1}{2}\)是為了求梯度方便。
- 步長\(\alpha\),超參數步長值的設定在梯度下降算法中是很重要的。目標函數的梯度只是指明了下降的方向,而步長則是每次迭代下降的距離多少。過小的步長,則會導致訓練時間過長,收斂慢;而過大的步長則會導致訓練震盪,而且有可能跳過極小值點,導致發散。
梯度下降的形式
梯度下降是機器學習的常用優化方法,根據每次使用的樣本的數據可以將梯度下降分為三種形式:批量梯度下降(Batch Gradient Descent),隨機梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-batch Gradient Descent)。
以進行一個線性回歸為例:
其目標函數為:
其中,\(i = 1,2,\cdots,m\)為第\(i\)個樣本。這里的目標函數是所有樣本誤差和的均值。
則目標函數與參數\((\theta_0,\theta_1)\)之間關系為
在上圖中,使用梯度下降的方法,求得最低位置的\((\theta_0,\theta_1)\)即為所求。
批量梯度下降
批量梯度下降是最原始的形式,它指的是每一次迭代時使用說有樣本的數據進行梯度更新.
- 求目標函數的導數
\(i = 1,2,\cdots,m\)為樣本數。
- 利用上述樣本更新參數
批量梯度下降算法的優缺點都很明顯:
- 優點 每次更是時使用了全部的樣本數據,能更准確地朝向極值所在的方向。
- 缺點 當樣本很多時,每次都是用所有的樣本,訓練時每輪的計算量會很大。
從迭代次數來說,批量梯度下降迭代次數較少。對於凸誤差函數,批量梯度下降法能夠保證收斂到全局最小值,對於非凸函數,則收斂到一個局部最小值。
隨機梯度下降 SGD
不同於批量梯度下降,隨機梯度下降,每次只用要給樣本進行梯度更新,這樣訓練的速度快上不少。
其目標函數為
- 目標函數求導
- 梯度更新
隨機梯度下降每次只是用一個樣本,其訓練速度快。 但是在更新參數的時候,由於每次只有一個樣本,並不能代表全部的訓練樣本,在訓練的過程中SGD會一直的波動,這就使得要收斂某個最小值較為困難。不過,已經有證明緩慢減小學習率,SGD與批梯度下降法具有相同的收斂行為,對於非凸優化和凸優化,可以分別收斂到局部最小值和全局最小值。
小批量梯度下降,也稱為隨機批量梯度下降
在深度學習中,最常用的優化方法就是小批量梯度下降。 小批量下降是對批量梯度下降和隨機梯度下降兩種方法的中和,每次隨機的使用batch_size個樣本進行參數更新,也可以稱為隨機批量梯度下降。(batch_size是一個超參數)。
- 優點 算是對上面兩種方法均衡,即有SGD訓練快的優點,每次更新參數時使用多個樣本,在訓練的過程中較為穩定。
- 確定 batch_size是一個超參數,需要手動的指定。過大和過小的batch_size會帶來一定的問題。
通常,小批量數據的大小在50到256之間,也可以根據不同的應用有所變化。在一定范圍內,一般來說batch_Size越大,其確定的下降方向越准,引起訓練震盪越小。但是,batch_size增大到一定程度后,其確定的下降方向並不會改變了,所以,過大的batch_size對訓練精度已經幫助不大,只會增加訓練的計算量。
梯度下降的難點
梯度下降的難點:
- 學習率的設置
- 極小值點,鞍點
梯度下降優化中的第一個難點就是上面提到的,學習率的設置問題。學習速率過小時收斂速度慢,而過大時導致訓練震盪,而且可能會發散。
而非凸誤差函數普遍出現在神經網絡中,在優化這類函數時,另一個難點是梯度下降的過程中有可能陷入到局部極小值中。也有研究指出這種困難實際上並不是來自局部最小值,而更多的來自鞍點,即那些在一個維度上是遞增的,而在另一個維度上是遞減的。這些鞍點通常被具有相同誤差的點包圍,因為在任意維度上的梯度都近似為0,所以SGD很難從這些鞍點中逃開。
鞍點(Saddle point)在微分方程中,沿着某一方向是穩定的,另一條方向是不穩定的奇點,叫做鞍點。對於擁有兩個以上變量的曲線,它的曲面在鞍點好像一個馬鞍,在某些方向往上曲,在其他方向往下曲。由於鞍點周圍的梯度都近似為0,梯度下降如果到達了鞍點就很難逃出來。下圖是\(z = x^2 - y^2\)圖形,在x軸方向向上曲,在y軸方向向下曲,像馬鞍,鞍點為\((0,0)\)
另外,在梯度平坦的維度下降的非常慢,而在梯度較大的維度則有容易發生抖動。
梯度下降的算法的進化
理想的梯度下降算法要滿足兩點:收斂速度要快;而且能全局收斂。所以就有各種梯度算法的變種。
動量梯度下降
基於動量的梯度下降是根據指數加權平均來的,首先要了解下指數加權平均。
指數加權平均
指數加權平均(exponentially weighted averges),也稱為指數加權移動平均,是常用的一種序列數據的處理方法。設在\(t\)時刻數據的觀測值是\(\theta_t\),在\(t\)時刻的移動平均值為\(v_t\),則有
其中,\(\beta v_{t-1}\)是上一時刻的移動平均值,也看着一個歷史的積累量。通常設\(v_0 = 0\),\(\beta\)是一個參數,其值在\((0,1)\)之間。動平均值實際是按比例合並歷史量與當前觀測量,將上述遞推公司展開
展開后可以發現,在計算某時刻的\(v_t\)時,其各個時刻觀測值\(\theta_t\)的權值是呈指數衰減的,離當前時刻\(t\)越近的\(\theta_t\),其權值越大,也就是說距離當前時刻越近的觀測值對求得移動平均值的影響越大,這樣得到的平均值的會比較平穩。由於權重指數衰減,所以移動平均數只是計算比較相近時刻數據的加權平均數,一般認為這個時刻的范圍為\(\frac{1}{1-\beta}\),例如\(\beta=0.9\),可以認為是使用距離當前時刻之前10時刻內的\(\theta_t\)的觀測值,再往前由於權重值國小,影響較小。
指數加權平均例子
下面是倫敦一年中每天的溫度,使用指數加權平均的方法,來表示其溫度的變化趨勢
計算其各個時刻的移動品均值,設\(\beta = 0.9\)
將移動平均值即每日溫度的指數加權平均值的曲線圖
上圖的 \(\beta=0.9\),也就是近10天的加權平均值。設\(\beta =0.98\),也就是近50天的加權均值,可以得到如下曲線(綠色)
相比於紅色曲線,綠色曲線更為平坦,因為使用50天的溫度,所以這個曲線,波動更小,更加平坦,缺點是曲線進一步右移,因為現在平均的溫度值更多,要平均更多的值,指數加權平均公式在溫度變化時,適應地更緩慢一些,所以會出現一定延遲。而且\(\beta = 0.98\)給歷史積累量的權值過多,而給當前量權值僅為0.02過少。
那如果平均過少的天數呢,比如\(\beta = 0.5\)只使用2天內的溫度
可以看到黃色曲線波動較大,有可能出現異常值,但是這個曲線能夠更快適應溫度變化。
參數\(\beta\)的選擇較為重要,不能過大或者國小。在本例中,\(\beta = 0.9\)取得的紅色曲線,顯然更能表示溫度變化的趨勢。
動量梯度下降
動量梯度下降算法是Boris Polyak在1964年提出的,其基於這樣一個物理事實:將一個小球從山頂滾下,其初始速率很慢,但在加速度作用下速率很快增加,並最終由於阻力的存在達到一個穩定速率。
可以看到,在更新權值時,不僅僅使用當前位置的梯度,還加入了一個累計項:動量,多了也給超參數\(\gamma\)。
動量梯度下降,實際上是引入了指數加權平均,在更新參數時不僅僅的只考慮當前梯度的值,還要考慮前幾次梯度的值。
將學習速率\(\alpha\)整合到第一個式子中,更簡潔一些
在進行參數更新時,使用當前的\(v_t\)移動平均值來代替當前的梯度,進行參數更新。所謂的動量,也就是近幾次的梯度加權移動平均。例如,通常有\(\beta = 0.9\),也就是當前時刻最近的10次梯度做加權平均,然后用次平均值更新參數。
如下圖,紅點代表最小值的位置
原始的梯度下降算法,會在縱軸上不斷的擺動,這種波動就就減慢了梯度下降的速度。理想情況是,在縱軸上希望學習的慢一點,而在橫軸上則要學習的快一點,盡快的達到最小值。 要解決這個問題有兩種思路:
- 縱軸方向和橫軸方向設置不同的學習率,這是自適應學習速率算法的方法。后面會說到,這里先不提。
- 帶動量的梯度下降。
如上圖,在縱軸方向其每次的梯度搖擺不定,引入動量后,每次使用一段時間的梯度的平均值,這樣不同方向的梯度就會相互抵消,從而減緩縱軸方向的波動。而在,橫軸方向,由於每次梯度的方向都指向同一個位置,引入動量后,其平均后的均值仍然指向同一個方向,並不會影響其下降的速度。
動量梯度下降,每一次梯度下降都會累積之前的速度的作用,如果這次的梯度方向與之前相同,則會因為之前的速度繼續加速;如果這次的方向與之前相反,則會由於之前存在速度的作用不會產生一個急轉彎,而是盡量把路線向一條直線拉過去,這樣就減緩的波動。
Nesterov Accelerated Gradient,NAG
球從山上滾下的時候,盲目地沿着斜率方向,往往並不能令人滿意。我們希望有一個智能的球,這個球能夠知道它將要去哪,以至於在重新遇到斜率上升時能夠知道減速。
NAG算法是Yurii Nesterov在1983年提出的對沖量梯度下降算法的改進版本,其速度更快。其變化之處在於計算“超前梯度”更新沖量項。
在動量梯度下降中,使用動量項\(\gamma v_{t-1}\)來更新參數\(\theta\),通過計算\(\theta - \gamma v_{t-1}\)能夠大體預測更新后參數所在的位置,也就是參數大致將更新為多少。通過計算關於參數未來的近似位置的梯度,而不是關於當前的參數的梯度位置
如下圖
動量梯度下降,首先計算當前的梯度項,上圖的藍色小向量;然后加上累積的動量項,得到大藍色向量,在改方向上前進一步。
NAG則首先在之前累積的動量項(棕色向量)前進一步,計算梯度值,然后做一個修正(綠色的向量)。這個具有預見性的更新防止我們前進得太快,同時增強了算法的響應能力。
直觀想象下這個過程,就像騎一輛自行車向下沖。一般的動量下降,就像騎到某一個地方,然后根據當前的坡度,決定往那個方向拐。而NAG則是首先判斷下前方的坡度,然后根據前方的坡度決定往那個方向拐。也就是預判下一個位置的坡度,對當前下降的方向進行修正,避免走冤枉路。
AdaGrad
在基本的梯度優化算法中,有個常見問題是,要優化的變量對於目標函數的依賴是不相同的。有些變量,已經優化到極小值附近,但是有些變量仍然離極小值很遠,位於梯度較大的地方。這時候如果對所有的變量都使用同一個全局的優學習速率就有可能出現問題,學習率太小,則梯度很大的變量就會收斂的很慢;如果梯度很大,已經優化的差不多的變量可能會不穩定。
針對這個問題,Jhon Duchi提出了AdaGrad(Adaptive Gradient),自適應學習速率。AdaGrad的基本思想是對每個變量使用不同的學習率。在最初,學習速率較大,用於快速下降。隨着優化過程的進行,對於已經下降很多的變量,則減小學習率;對於沒有怎么下降的變量,則仍保持大的學習率。
AdaGrad對每個變量更新時,利用該變量歷史積累的梯度來修正其學習速率。這樣,已經下降的很多的變量則會有小的學習率,而下降較少的變量則仍然保持較大的學習率。基於這個更新規則,其針對變量\(\theta_i\)的更新
其中,\(\nabla J(\theta_i)_t\)表示t時刻變量\(\theta_i\)的梯度。\(\sum_{\tau =1}^t \nabla J(\theta_i)_\tau\)就表示變量\(\theta_i\)歷史累積的梯度值 ,用來修正學習率。加上很小的值\(\tau\)是為了防止0的出現。
AdaGrad雖然能夠動態調整變量的學習率,但是其有兩個問題:
- 仍然需要手動的設置一個初始的全局學習率
- 使用變量的歷史累積梯度來調整學習率,這就導致其學習率是不斷衰減的,訓練后期學習速率很小,導致訓練過早停止。
后面的幾種自適應算法都是對AdaGrad存在的上述問題進行修改.
RMSprop
RMSprop是Hinton在他的課程上講到的,其算是對Adagrad算法的改進,主要是解決學習速率過快衰減的問題。其思路引入了動量(指數加權移動平均數)的方法,引入了超參數\(\gamma\),在累積梯度的平方項近似衰減:
其中,\(i\)表示第\(i\)個變量,\(t\)表示\(t\)時刻更新,\(\gamma\)是超參數通常取\(\gamma=0.9\)。\(s_{(t,i)}\)表示梯度平方的指數加權移動平均數,用來代替AdaGrad中不斷累加的歷史梯度,有助於避免學習速率衰減過快的問題。同時Hinton也建議將全局的學習率\(\eta\)設置為0.001。
AdaDelta
AdaDelta對AdaGrad進行兩方面的改進:
- 學習率衰減過快
- 全局學習率超參數問題
針對學習率衰減過快的問題,其思路和RMSprop一樣,不在累積所有的歷史梯度,而是引入指數加權平均數,只計算一定時間段的梯度。
為了解決學習率超參數的問題,AdaDelta維護了一個額外的狀態變量\(\Delta \theta_t\),根據上面的公式有
上述使用的是梯度平方的指數加權移動平均數,在AdaDelta中作者又定義了:每次參數的更新值\(\Delta \theta\)的平方的指數加權移動平均數
因此每次更新時,更新值的均方根(Root Mean Squard,RMS)
使用\(RMS(\Delta \theta)_{t-1}\)來近似更新\(t\)時刻的學習速率\(\eta\),這樣可以得到其更新的規則為
設初始的\(RMS(\Delta \theta)_0 = 0\),這樣就不用設置默認的學習速率了。 也就是,AdaDelta和RMSprop唯一的區別,就是使用\(RMS(\Delta \theta)_{t-1}\)來代替超參數學習速率。 至於為什么可以代替,使用牛頓迭代的思想,這里不再說明,有興趣可以參看原始論文ADADELTA: An Adaptive Learning Rate Method 。
Adam
Adaptive moment estimation,Adam 是Kingma等在2015年提出的一種新的優化算法,其結合了Momentum和RMSprop算法的思想。相比Momentum算法,其學習速率是自適應的,而相比RMSprop,其增加了沖量項。所以,Adam是兩者的結合體。
Adam不只使用梯度平方的指數加權移動平均數\(v_t\),還使用了梯度的指數加權移動平均數\(m_t\),類似動量。
可以看到前兩項和Momentum和RMSprop是非常一致的, 由於和的初始值一般設置為0,在訓練初期其可能較小,需要對其進行放大
這樣就得到了更新的規則
作者建議\(\beta_1\)設置為0.9,\(\beta_2\)設置為0.999,取\(\epsilon = 10^{-8}\)。
Summary
下圖給出各個梯度下降算法的可視化下降過程
本文綜述了一些常見的梯度下降方法,主要是自適應梯度下降。 由於超參數學習速率的難以設定,自適應梯度下降有很好的實用價值。除了使用自適應梯度下降算法外,也可以手動的設定學習速率的自適應過程,例如學習速率的多項式衰減等。