1. 程式人生 > >【機器學習】梯度下降演算法及梯度優化演算法

【機器學習】梯度下降演算法及梯度優化演算法

用於評估機器學習模型的就是損失函式,我們訓練的目的基本上都是最小化損失,這個最小化的方式就要用優化演算法了,機器學習中最常用的就是梯度下降演算法。

導數、方向導數和梯度

要了解梯度下降演算法是什麼首要知道梯度是什麼,導數和方向導數又是瞭解梯度的前提。

導數

 導數反映的是函式y=f(x)在某一點處沿x軸正方向的變化率,如果f’(x)>0,說明f(x)的函式值在x點沿x軸正方向是趨於增加的;如果f’(x)<0,說明f(x)的函式值在x點沿x軸正方向是趨於減少的。

方向導數

方向導數是某一點在某一趨近方向上的導數值,即導數或偏導數是函式在x軸正方向的變化率,而方向導數是函式在其他特定方向上

的變化率。

梯度

梯度的提出只為回答一個問題: 函式在變數空間的某一點處,沿著哪一個方向有最大的變化率?
函式在某一點的梯度是這樣一個向量,它的方向與取得最大方向導數的方向一致,而它的模為方向導數的最大值。
也就是說梯度即函式在某一點最大的方向導數,函式沿梯度方向函式有最大的變化率。

知道了函式沿梯度方向有最大的變化率,那麼在機器學習中我們為了最小化損失,在優化目標函式的時候就可以沿著負梯度方向去減小函式值,以此達到我們的優化目標,這就是梯度下降演算法。

梯度下降演算法

梯度下降演算法(Gradient Descent)是通過沿著目標函式J(θ)引數θ∈ℜ的梯度相反方向−∇θJ(θ)來不斷更新模型引數來到達目標函式的極小值點(收斂),更新步長為η(這個步長又稱為學習率)。
更新引數的公式如下:
∇θJ(θ)為引數的梯度
這裡寫圖片描述

根據計算目標函式J(θ)採用資料量的不同(每次學習(更新模型引數)使用的樣本個數的不同),梯度下降演算法又可以分為批量梯度下降演算法(Batch Gradient Descent),隨機梯度下降演算法(Stochastic Gradient Descent)和小批量梯度下降演算法(Mini-batch Gradient Descent)。

批量梯度下降演算法(Batch Gradient Descent)

每次使用全量的訓練集樣本來更新模型引數。具體做法是:每次使用全部訓練集樣本計算損失函式loss_function的梯度params_grad,然後使用學習速率learning_rate朝著梯度相反方向去更新模型的每個引數params。

優點:

每次更新都會朝著正確的方向進行,最後能夠保證收斂於極值點(凸函式收斂於全域性極值點,非凸函式可能會收斂於區域性極值點)

缺點:

每次學習時間過長,並且如果訓練集很大以至於需要消耗大量的記憶體,並且全量梯度下降不能進行線上模型引數更新。

隨機梯度下降演算法(Stochastic Gradient Descent)

隨機梯度下降演算法每次從訓練集中隨機選擇一個樣本來進行學習

優點:

每次只隨機選擇一個樣本來更新模型引數,因此每次的學習是非常快速的,並且可以進行線上更新(得到了一個樣本,就可以執行一次引數更新)。

缺點:

每次更新可能並不會按照正確的方向進行,因此可以帶來優化波動(擾動)。由於波動,因此會使得迭代次數(學習次數)增多,即收斂速度變慢。不過最終其會和全量梯度下降演算法一樣,具有相同的收斂性,即凸函式收斂於全域性極值點,非凸損失函式收斂於區域性極值點(隨機梯度下降所帶來的波動有個好處就是,對於類似盆地區域(即很多區域性極小值點)那麼這個波動的特點可能會使得優化的方向從當前的區域性極小值點跳到另一個更好的區域性極小值點,這樣便可能對於非凸函式,最終收斂於一個較好的區域性極值點,甚至全域性極值點。 )。

小批量梯度下降演算法(Mini-batch Gradient Descent)

小批量選擇了折中的辦法,每次選擇m個樣本進行學習

相對於隨機梯度下降,Mini-batch梯度下降降低了收斂波動性,即降低了引數更新的方差,使得更新更加穩定。相對於全量梯度下降,其提高了每次學習的速度。並且其不用擔心記憶體瓶頸從而可以利用矩陣運算進行高效計算。

梯度下降演算法的問題

不能保證全域性收斂

梯度下降演算法針對凸優化問題原則上是可以收斂到全域性最優的,因為此時只有唯一的區域性最優點。而實際上深度學習模型是一個複雜的非線性結構,一般屬於非凸問題,這意味著存在很多區域性最優點(鞍點),採用梯度下降演算法可能會陷入區域性最優。

學習率問題

選擇一個合適的學習率很難

如果學習速率過小,則會導致收斂速度很慢。如果學習速率過大,那麼其會阻礙收斂,即在極值點附近會振盪。

學習速率調整無法自適應

學習速率調整(又稱學習速率排程,Learning rate schedules)試圖在每次更新過程中,改變學習速率,如退火。一般使用某種事先設定的策略或者在每次迭代中衰減一個較小的閾值。無論哪種調整方法,都需要事先進行固定設定,這邊便無法自適應每次學習的資料集特點。

模型所有的引數每次更新都是使用相同的學習速率

模型所有的引數每次更新都是使用相同的學習速率。如果資料特徵是稀疏的或者每個特徵有著不同的取值統計特徵與空間,那麼便不能在每次更新中每個引數使用相同的學習速率,那些很少出現的特徵應該使用一個相對較大的學習速率。

梯度下降優化演算法

由於梯度下降演算法存在上述問題,而理想的梯度下降演算法要滿足兩點:收斂速度要快;能全域性收斂。因此出現了很多解決上訴問題的一些梯度優化方法。

其實這些優化演算法都是基於學習率上的改變。

衝量梯度下降演算法 Momentum

衝量梯度演算法引數更新時不僅考慮當前梯度值,動量在引數更新項中加上一次更新量(即動量項),在學習率上來講就是不進加這一次的學習率還要加上以前的,所以會更快的到達global minimum。公式如下:

νt=γνt1+ηθJ(θ)

θ=θνt 其中動量項超引數γ<1一般是小於等於0.9。

momentum基於這樣一個物理事實:將一個小球從山頂滾下,其初始速率很慢,但在加速度作用下速率很快增加(也就是累積了前面的動量(動量不斷增加),因此速度變得越來越快),並最終由於阻力的存在達到一個穩定速率。
在更新模型引數時,對於那些當前的梯度方向與上一次梯度方向相同的引數,那麼進行加強,即這些方向上更快了;對於那些當前的梯度方向與上一次梯度方向不同的引數,那麼進行削減,即這些方向上減慢了。因此可以獲得更快的收斂速度與減少振盪。

動量能夠解決的問題:
如果在峽谷地區(某些方向較另一些方向上陡峭得多,常見於區域性極值點),SGD會在這些地方附近振盪,從而導致收斂速度慢。這種情況下,可用動量解決。

NAG演算法 (Nesterov Accelerated Gradient)

NAG演算法是衝量梯度下降演算法的改進版本,其速度更快。其變化之處在於計算“超前梯度”(下一次引數在的位置)更新衝量項,也就是加上動量項的基礎上,在計算引數的梯度時,在損失函式中減去了動量項,即計算θJ(θγνt1),這種方式預估了下一次引數所在的位置。遵循的原理為:從山頂往下滾的球會盲目地選擇斜坡。更好的方式應該是在遇到傾斜向上之前應該減慢速度。
具體公式如下:

νt=γνt1+ηθJ(θγνt1)
θ=θνt

Adagrad

Adagrad是一種學習速率自適應的梯度下降演算法。在訓練迭代過程,其學習速率是逐漸衰減的,經常更新的引數其學習速率衰減更快。

在前述中,每個模型引數θi使用相同的學習速率η,而Adagrad在每一個更新步驟中對於每一個模型引數θi使用不同的學習速率ηi,設第t次更新步驟中,目標函式的引數θi梯度為gt,i,即:
gt,i=θJ(θi)
Adagrad對每一個引數使用不同的學習速率,其更新方程為:
θt+1,i=θt,iηGt,ii+ϵgt,i

其中,Gtd×d是一個對角矩陣,其中第i行的對角元素eii為過去到當前第i個引數θi的梯度的平方和,ϵ是一個平滑引數,為了使得分母不為0(通常ϵ=1e−8)
寫成向量點乘為:
這裡寫圖片描述

s就是梯度平方的積累量,在進行引數更新時,學習速率要除以這個積累量的平方根,其中加上一個很小值是為了防止除0的出現。由於是該項逐漸增加的,那麼學習速率是衰減的。

由於比較陡的方向梯度比較大,其學習速率將衰減得更快,這有利於引數沿著更接近坡底的方向移動,從而加速收斂。但是,學習速率實際上是不斷衰減的,這會導致一個很大的問題,就是訓練後期學習速率很小,導致訓練過早停止,因此在實際中AdaGrad一般不會被採用。

Adadelta和RMSprop

Adadelta和RMSprop都是針對Adagrad學習速率衰減過快問題作出的改進

RMSprop

RMSprop類似Momentum思想,引入一個超引數,在積累梯度平方項進行衰減:
這裡寫圖片描述
可以認為僅僅對距離時間較近的梯度進行積累,其中一般取值0.9,其實這樣就是一個指數衰減的均值項,減少了出現的爆炸情況,因此有助於避免學習速率很快下降的問題。同時Hinton也建議學習速率設定為0.001。

Adadelta

改進思路和RMSprop很像,但是其背後是基於一次梯度近似代替二次梯度的思想。
其改進了三處,一是使用了視窗w;二是對於引數梯度歷史視窗序列(不包括當前)不再使用平方和,而是使用均值代替;三是最終的均值是歷史視窗序列均值與當前梯度的時間衰減加權平均。

Adam (Adaptive Moment Estimation)

Adam也是一種不同引數自適應不同學習速率方法,其結合了Momentum和RMSprop演算法的思想。相比Momentum演算法,其學習速率是自適應的,而相比RMSprop,其增加了衝量項。如下:
這裡寫圖片描述
可見,第一個m的公式就是之前momentum的衝量項,s是RMSprop的,由於和的初始值一般設定為0,在訓練初期其可能較小,第三和第四項主要是為了放大它們。最後一項是引數更新。其中超引數的建議值是:β1=0.9,