關於機器學習的方法,大多算法都用到了最優化求最優解問題。梯度下降法(gradient descent)是求解無約束最優化問題的一種最常用的方法。它是一種最簡單,歷史悠長的算法,但是它應用非常廣。下面主要在淺易的理解:
一、梯度下降的初步認識
先理解下什么是梯度,用通俗的話來說就是在原變量的基礎上每次迭代增加一定的量,比較各個變量下目標函數的大小。
例如有一個目標函數 y = 2χ2 ,那么求目標函數的最小值,我們先給x賦一個值-5,然后每次給x加一個值(有正負方向的值),這樣y每次都會有一個值,當值減小幅度達到一定精確度時停止,這是的x就是我們求的最優解。
是不是有一點感覺了,上面的例子比較簡單,通常在求解最優解的時候,目標函數就是我們要優化的,找出滿足目標函數的最優解。有時候目標函數是比較復雜的,這時候梯度下降法就比較有用了。
所謂梯度,如果目標函數可微,我們把目標函數的各個變量的偏導組成一個向量,既是梯度。主要是在優化過程中,我們怎么給變量增加還是減少的方向變量。如上例中我們怎么知道給x增加一定的量的,就是靠方向變量了。
二、梯度下降法的概念
梯度:即對變量的偏微分的組成的向量,(∂f/∂x1,∂f/∂x2 ...)。
步長:即每次迭代給變量增加的值,通常是一個值*梯度
梯度下降法就是沿着負方向迭代,直到找到最小值。
與之相反的是梯度上升法,沿着梯度正方向迭代。
梯度下降法的有缺點:
優點:實現比較簡單,當目標函數是凸函數可以找到全局最優解。
缺點:容易陷入局部最優,靠近極小值時收斂速度會變慢,可能成之字下降,直線搜索可能會產生一些問題。
三、具體實現的算法例子
我們以邏輯回歸的參數最大似然估計為例。
目標函數:求目標函數的極大值。我們要對式中的w進行參數估計。
(1)我們這里初始化w1,w2 , ... wN 都為0
(2)計算梯度,即各個w的偏導∂L(w)/∂w
(3) gi+1= L(w)i+1-L(w)i ,i表示第i次迭代,gi+1代表第i+1次的目標函數和第i次的差
(4)對變量進行迭代 wij=wi+1j+∂L(w)i/∂wj ...
代入計算wij,再計算gi+1,若gi+1大於閾值,重復3、4,直至g小於閾值,既是我們要的最優解。
四、梯度下降算法的調優
1、步長。在設定步長的時候如果設置過大收斂較快但是可能錯過最優解,步長太小收斂較慢。實際用法中可以根據樣本進行決定。設置多組步長實驗。
2、初始值。初始值不同不僅影響算法的收斂速度,還影響變量的是否陷入局部最優。需要多次用不同的初始值進行運算,選擇目標最優的一組解。
3、特征歸一化:由於不同的特征取值范圍不一樣,可能導致迭代很慢,可以參數歸一化解決。
五、梯度下降算法的衍生
下面摘自:https://baijiahao.baidu.com/s?id=1613121229156499765&wfr=spider&for=pc
1、全量梯度下降法(Batch gradient descent)
全量梯度下降法每次學習都使用整個訓練集,因此每次更新都會朝着正確的方向進行,最后能夠保證收斂於極值點,凸函數收斂於全局極值點,非凸函數可能會收斂於局部極值點,缺陷就是學習時間太長,消耗大量內存。
2、隨機梯度下降法(Stochastic Gradient Descent)
SGD一輪迭代只用一條隨機選取的數據,盡管SGD的迭代次數比BGD大很多,但一次學習時間非常快。
SGD的缺點在於每次更新可能並不會按照正確的方向進行,參數更新具有高方差,從而導致損失函數劇烈波動。不過,如果目標函數有盆地區域,SGD會使優化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣對於非凸函數,可能最終收斂於一個較好的局部極值點,甚至全局極值點。
缺點是,出現損失函數波動,如下圖所示,並且無法判斷是否收斂。
3、小批量梯度下降法(Mini-Batch Gradient Descent)
SGD相比BGD收斂速度快,然而,它也的缺點,那就是收斂時浮動,不穩定,在最優解附近波動,難以判斷是否已經收斂。這時折中的算法小批量梯度下降法,MBGD就產生了,道理很簡單,SGD太極端,一次一條,為何不多幾條?MBGD就是用一次迭代多條數據的方法。
並且如果Batch Size選擇合理,不僅收斂速度比SGD更快、更穩定,而且在最優解附近的跳動也不會很大,甚至得到比Batch Gradient Descent 更好的解。這樣就綜合了SGD和Batch Gradient Descent 的優點,同時弱化了缺點。總之,Mini-Batch比SGD和Batch Gradient Descent都好。
4、第四、Momentum梯度下降法
·
SGD、BSGD兩種改進方法都存在不同程度的震盪,如何避免震盪?或者說震盪是怎么產生的?震盪,從可視圖表現來看,就是頻繁更改方向,所以,如果能夠把之前下降的方向考量進來,那么將會減少振盪。


上邊第二個圖是帶動量的梯度下降法。
下面推導動量下降法。
在普通的梯度下降法W -= V中,每次W的更新量V為V = dW * λ;
當使用沖量時,V考慮為本次的梯度下降量與部分上次更新量的矢量和,即-dW*λ與上次x的更新量V乘以一個介於[0, 1]的系數momemtum的和,即:
V = dW * λ+ V*momemtum。
當本次梯度下降方向與上次更新量的方向相同時,上次的更新量能夠對本次的搜索起到一個正向加速的作用。當本次梯度下降方向與上次更新量的方向相反時,上次的更新量能夠對本次的搜索起到一個減速的作用。下面兩個圖,第一圖是沒有動量的梯度下降法,第二圖是有動量的梯度下降法,很明顯減少了震盪。
既減少震盪,又大方向不變(本次梯度下降方向),從而保證了效率和正確的收斂。
5、第五、NAG梯度下降法
NAG(Nesterov Accelerated Gradient)不僅僅把SGD梯度下降以前的方向考慮,還將Momentum梯度變化的幅度也考慮了進來。

上圖是Momentum的優化軌跡,下圖是NAG的優化軌跡:

在給出公式之前,先看一個向量圖:

這個圖來源於 G. Hinton’s的文章,網上對這個圖的解釋大都來源於《An overview of gradient descent optimizationalgorithms》中文翻譯,其實並沒有真正講解清楚。本文嚴格按照願意解釋一下:
Momentum梯度法首先計算的是當前的梯度(圖中的小藍色向量)然后沿着更新的累積梯度的方向來一個大的跳躍(圖中大藍色向量),而NAG梯度法首先沿着先前的累積梯度方向(棕色向量)實現一個大的跳躍,然后加上一個小的按照動量梯度法計算的當前梯度(上圖紅色向量)進行修正得到上圖綠色的向量。此處我拋出一個問題,上圖為什么畫了兩個三角形?如果能理解第二個矢量三解形的意義,才能正在理解NAG。注意第二個矢量三角形的棕色向量與前一個的綠色向量方向一致,因為上一個矢量三角形的結果是綠色向量,而棕色代表的是先前的累積梯度,方向就應該和綠色的一樣。然后,再加上當前按照動量梯度法計算出的梯度,就得到第二個三角形的綠色向量。
給出公式表達:

我們先給出類似生活體驗的通俗的解釋:我們要讓算法要前瞻性,提前看到前方的地形梯度,如果前面的梯度比當前位置的梯度大,那我就可以把步子邁得比原來大一些,如果前面的梯度比現在的梯度小,那我就可以把步子邁得小一些。這個大一些、小一些,都是相對於原來不看前方梯度、只看當前位置梯度的情況來說的。
NAG的另一個等效形式為(下文會詳細推導):

這個NAG的等效形式與Momentum的區別在於,本次更新方向多加了一個,注意到沒有,這項其實就是目標函數的二階導數!所以NAG本質上是多考慮了目標函數的二階導信息,讀過《一篇中矣:徹底理解XGBoost!》一文的讀者,是不是覺得很面熟,二階導數再次發揮作用!其實所謂“往前看”的說法,在牛頓法這樣的二階方法中經常提到,形象說“往前看”,數學思維則是利用了目標函數的二階導信息。
現在我們由NAG原始形式來推導NAG的等效形式:
為了出現二階形式,將原始形式按照遞推展開:

我們觀察這個等式,並對應原始公式

觀察對比這個長等式:
等式相當於參數在更新量更新基礎上的更新,所以為了看上去更有意義,對應的形式,我們作如下記號:
我們在猜想一個形式:
則可作記號:
也就是有:
為了變換形式,我們作如下展開:

繼續推導:
到此為止NAG證明就結束,邏輯、意義非常完美!這就是數學之美!
限於篇幅其他非常重要的梯度法AdaGrad、AdaDelta、RMSProp、Adam等在后續文章在詳加闡述。
參考網址:https://baijiahao.baidu.com/s?id=1613121229156499765&wfr=spider&for=pc