您好,登錄后才能下訂單哦!
在求解機器學習算法的模型參數,即無約束優化問題時,梯度下降(Gradient Descent)是最常采用的方法之一,另一種常用的方法是最小二乘法。這里就對梯度下降法做一個完整的總結。
1. 梯度
在微積分里面,對多元函數的參數求偏導數,把求得的各個參數的偏導數以向量的形式寫出來,就是梯度。比如函數f(x,y), 分別對x,y求偏導數,求得的梯度向量就是(f/x, f/y)T,簡稱grad f(x,y)或者▽f(x,y)。對于在點(x0,y0)的具體梯度向量就是(f/x0, f/y0)T.或者▽f(x0,y0),如果是3個參數的向量梯度,就是(f/x, f/y,f/z)T,以此類推。
那么這個梯度向量求出來有什么意義呢?他的意義從幾何意義上講,就是函數變化增加最快的地方。具體來說,對于函數f(x,y),在點(x0,y0),沿著梯度向量的方向就是(f/x0, f/y0)T的方向是f(x,y)增加最快的地方。或者說,沿著梯度向量的方向,更加容易找到函數的最大值。反過來說,沿著梯度向量相反的方向,也就是 -(f/x0, f/y0)T的方向,梯度減少最快,也就是更加容易找到函數的最小值。
2. 梯度下降與梯度上升
在機器學習算法中,在最小化損失函數時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數,和模型參數值。反過來,如果我們需要求解損失函數的最大值,這時就需要用梯度上升法來迭代了。
梯度下降法和梯度上升法是可以互相轉化的。比如我們需要求解損失函數f(θ)的最小值,這時我們需要用梯度下降法來迭代求解。但是實際上,我們可以反過來求解損失函數 -f(θ)的最大值,這時梯度上升法就派上用場了。
下面來詳細總結下梯度下降法。
3. 梯度下降法算法詳解
3.1 梯度下降的直觀解釋
首先來看看梯度下降的一個直觀的解釋。比如我們在一座大山上的某處位置,由于我們不知道怎么下山,于是決定走一步算一步,也就是在每走到一個位置的時候,求解當前位置的梯度,沿著梯度的負方向,也就是當前最陡峭的位置向下走一步,然后繼續求解當前位置梯度,向這一步所在位置沿著最陡峭最易下山的位置走一步。這樣一步步的走下去,一直走到覺得我們已經到了山腳。當然這樣走下去,有可能我們不能走到山腳,而是到了某一個局部的山峰低處。
從上面的解釋可以看出,梯度下降不一定能夠找到全局的最優解,有可能是一個局部最優解。當然,如果損失函數是凸函數,梯度下降法得到的解就一定是全局最優解。
3.2 梯度下降的相關概念
在詳細了解梯度下降的算法之前,我們先看看相關的一些概念。
1. 步長(Learning rate):步長決定了在梯度下降迭代的過程中,每一步沿梯度負方向前進的長度。用上面下山的例子,步長就是在當前這一步所在位置沿著最陡峭最易下山的位置走的那一步的長度。
2.特征(feature):指的是樣本中輸入部分,比如樣本(x0,y0),(x1,y1),則樣本特征為x,樣本輸出為y。
3. 假設函數(hypothesis function):在監督學習中,為了擬合輸入樣本,而使用的假設函數,記為hθ(x)。比如對于樣本(xi,yi)(i=1,2,...n),可以采用擬合函數如下: hθ(x) = θ0+θ1x。
4. 損失函數(loss function):為了評估模型擬合的好壞,通常用損失函數來度量擬合的程度。損失函數極小化,意味著擬合程度最好,對應的模型參數即為最優參數。在線性回歸中,損失函數通常為樣本輸出和假設函數的差取平方。比如對于樣本(xi,yi)(i=1,2,...n),采用線性回歸,損失函數為:
J(θ0,θ1)=∑i=1m(hθ(xi)yi)2J(θ0,θ1)=∑i=1m(hθ(xi)yi)2
其中xixi表示樣本特征x的第i個元素,yiyi表示樣本輸出y的第i個元素,hθ(xi)hθ(xi)為假設函數。
3.3 梯度下降的詳細算法
梯度下降法的算法可以有代數法和矩陣法(也稱向量法)兩種表示,如果對矩陣分析不熟悉,則代數法更加容易理解。不過矩陣法更加的簡潔,且由于使用了矩陣,實現邏輯更加的一目了然。這里先介紹代數法,后介紹矩陣法。
3.3.1 梯度下降法的代數方式描述
1. 先決條件: 確認優化模型的假設函數和損失函數。
比如對于線性回歸,假設函數表示為 hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxnhθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn, 其中θiθi (i = 0,1,2... n)為模型參數,xixi (i = 0,1,2... n)為每個樣本的n個特征值。這個表示可以簡化,我們增加一個特征x0=1x0=1 ,這樣hθ(x0,x1,...xn)=∑i=0nθixihθ(x0,x1,...xn)=∑i=0nθixi。
同樣是線性回歸,對應于上面的假設函數,損失函數為:
J(θ0,θ1...,θn)=∑i=0m(hθ(x0,x1,...xn)yi)2J(θ0,θ1...,θn)=∑i=0m(hθ(x0,x1,...xn)yi)2
2. 算法相關參數初始化:主要是初始化θ0,θ1...,θnθ0,θ1...,θn,算法終止距離εε以及步長αα。在沒有任何先驗知識的時候,我喜歡將所有的θθ初始化為0, 將步長初始化為1。在調優的時候再 優化。
3. 算法過程:
1)確定當前位置的損失函數的梯度,對于θiθi,其梯度表達式如下:
θiJ(θ0,θ1...,θn)θiJ(θ0,θ1...,θn)
2)用步長乘以損失函數的梯度,得到當前位置下降的距離,即αθiJ(θ0,θ1...,θn)αθiJ(θ0,θ1...,θn)對應于前面登山例子中的某一步。
3)確定是否所有的θiθi,梯度下降的距離都小于εε,如果小于εε則算法終止,當前所有的θiθi(i=0,1,...n)即為最終結果。否則進入步驟4.
4)更新所有的θθ,對于θiθi,其更新表達式如下。更新完畢后繼續轉入步驟1.
θi=θiαθiJ(θ0,θ1...,θn)θi=θiαθiJ(θ0,θ1...,θn)
下面用線性回歸的例子來具體描述梯度下降。假設我們的樣本是(x(0)1,x(0)2,...x(0)n,y0),(x(1)1,x(1)2,...x(1)n,y1),...(x(m)1,x(m)2,...x(m)n,yn)(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),yn),損失函數如前面先決條件所述:
J(θ0,θ1...,θn)=∑i=0m(hθ(x0,x1,...xn)yi)2J(θ0,θ1...,θn)=∑i=0m(hθ(x0,x1,...xn)yi)2。
則在算法過程步驟1中對于θiθi 的偏導數計算如下:
θiJ(θ0,θ1...,θn)=1m∑j=0m(hθ(xj0,xj1,...xjn)yj)xjiθiJ(θ0,θ1...,θn)=1m∑j=0m(hθ(x0j,x1j,...xnj)yj)xij
由于樣本中沒有x0x0上式中令所有的xj0x0j為1.
步驟4中θiθi的更新表達式如下:
θi=θiα1m∑j=0m(hθ(xj0,xj1,...xjn)yj)xjiθi=θiα1m∑j=0m(hθ(x0j,x1j,...xnj)yj)xij
從這個例子可以看出當前點的梯度方向是由所有的樣本決定的,加1m1m 是為了好理解。由于步長也為常數,他們的乘機也為常數,所以這里α1mα1m可以用一個常數表示。
在下面第4節會詳細講到的梯度下降法的變種,他們主要的區別就是對樣本的采用方法不同。這里我們采用的是用所有樣本。
3.3.2 梯度下降法的矩陣方式描述
這一部分主要講解梯度下降法的矩陣方式表述,相對于3.3.1的代數法,要求有一定的矩陣分析的基礎知識,尤其是矩陣求導的知識。
1. 先決條件: 和3.3.1類似, 需要確認優化模型的假設函數和損失函數。對于線性回歸,假設函數hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxnhθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn的矩陣表達方式為:
hθ(x)=Xθhθ(x)=Xθ ,其中, 假設函數hθ(X)hθ(X)為mx1的向量,θθ為nx1的向量,里面有n個代數法的模型參數。XX為mxn維的矩陣。m代表樣本的個數,n代表樣本的特征數。
損失函數的表達式為:J(θ)=12(XθY)T(XθY)J(θ)=12(XθY)T(XθY), 其中YY是樣本的輸出向量,維度為mx1.
2. 算法相關參數初始化: θθ向量可以初始化為默認值,或者調優后的值。算法終止距離εε,步長αα和3.3.1比沒有變化。
3. 算法過程:
1)確定當前位置的損失函數的梯度,對于θθ向量,其梯度表達式如下:
θJ(θ)θJ(θ)
2)用步長乘以損失函數的梯度,得到當前位置下降的距離,即αθJ(θ)αθJ(θ)對應于前面登山例子中的某一步。
3)確定θθ向量里面的每個值,梯度下降的距離都小于εε,如果小于εε則算法終止,當前θθ向量即為最終結果。否則進入步驟4.
4)更新θθ向量,其更新表達式如下。更新完畢后繼續轉入步驟1.
θ=θαθJ(θ)θ=θαθJ(θ)
還是用線性回歸的例子來描述具體的算法過程。
損失函數對于θθ向量的偏導數計算如下:
θJ(θ)=XT(XθY)θJ(θ)=XT(XθY)
步驟4中θθ向量的更新表達式如下:θ=θαXT(XθY)θ=θαXT(XθY)
對于3.3.1的代數法,可以看到矩陣法要簡潔很多。這里面用到了矩陣求導鏈式法則,和兩個矩陣求導的公式。
公式1:X(XXT)=2XX(XXT)=2X
公式2:θ(Xθ)=XTθ(Xθ)=XT
如果需要熟悉矩陣求導建議參考張賢達的《矩陣分析與應用》一書。
3.4 梯度下降的算法調優
在使用梯度下降時,需要進行調優。哪些地方需要調優呢?
1. 算法的步長選擇。在前面的算法描述中,我提到取步長為1,但是實際上取值取決于數據樣本,可以多取一些值,從大到小,分別運行算法,看看迭代效果,如果損失函數在變小,說明取值有效,否則要增大步長。前面說了。步長太大,會導致迭代過快,甚至有可能錯過最優解。步長太小,迭代速度太慢,很長時間算法都不能結束。所以算法的步長需要多次運行后才能得到一個較為優的值。
2. 算法參數的初始值選擇。 初始值不同,獲得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;當然如果損失函數是凸函數則一定是最優解。由于有局部最優解的風險,需要多次用不同初始值運行算法,關鍵損失函數的最小值,選擇損失函數最小化的初值。
3.歸一化。由于樣本不同特征的取值范圍不一樣,可能導致迭代很慢,為了減少特征取值的影響,可以對特征數據歸一化,也就是對于每個特征x,求出它的期望xˉˉˉxˉ和標準差std(x),然后轉化為:
xxˉˉˉstd(x)xxˉstd(x)
這樣特征的新期望為0,新方差為1,迭代次數可以大大加快。
4. 梯度下降法大家族(BGD,SGD,MBGD)
4.1 批量梯度下降法(Batch Gradient Descent)
批量梯度下降法,是梯度下降法最常用的形式,具體做法也就是在更新參數時使用所有的樣本來進行更新,這個方法對應于前面3.3.1的線性回歸的梯度下降算法,也就是說3.3.1的梯度下降算法就是批量梯度下降法。
θi=θiα∑j=0m(hθ(xj0,xj1,...xjn)yj)xjiθi=θiα∑j=0m(hθ(x0j,x1j,...xnj)yj)xij
由于我們有m個樣本,這里求梯度的時候就用了所有m個樣本的梯度數據。
4.2 隨機梯度下降法(Stochastic Gradient Descent)
隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的m個樣本的數據,而是僅僅選取一個樣本j來求梯度。對應的更新公式是:
θi=θiα(hθ(xj0,xj1,...xjn)yj)xjiθi=θiα(hθ(x0j,x1j,...xnj)yj)xij
隨機梯度下降法,和4.1的批量梯度下降法是兩個極端,一個采用所有數據來梯度下降,一個用一個樣本來梯度下降。自然各自的優缺點都非常突出。對于訓練速度來說,隨機梯度下降法由于每次僅僅采用一個樣本來迭代,訓練速度很快,而批量梯度下降法在樣本量很大的時候,訓練速度不能讓人滿意。對于準確度來說,隨機梯度下降法用于僅僅用一個樣本決定梯度方向,導致解很有可能不是最優。對于收斂速度來說,由于隨機梯度下降法一次迭代一個樣本,導致迭代方向變化很大,不能很快的收斂到局部最優解。
那么,有沒有一個中庸的辦法能夠結合兩種方法的優點呢?有!這就是4.3的小批量梯度下降法。
4.3 小批量梯度下降法(Mini-batch Gradient Descent)
小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對于m個樣本,我們采用x個樣子來迭代,1<x<m。一般可以取x=10,當然根據樣本的數據,可以調整這個x的值。對應的更新公式是:
θi=θiα∑j=tt+x1(hθ(xj0,xj1,...xjn)yj)xjiθi=θiα∑j=tt+x1(hθ(x0j,x1j,...xnj)yj)xij
5. 梯度下降法和其他無約束優化算法的比較
在機器學習中的無約束優化算法,除了梯度下降以外,還有前面提到的最小二乘法,此外還有牛頓法和擬牛頓法。
梯度下降法和最小二乘法相比,梯度下降法需要選擇步長,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是計算解析解。如果樣本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有優勢,計算速度很快。但是如果樣本量很大,用最小二乘法由于需要求一個超級大的逆矩陣,這時就很難或者很慢才能求解解析解了,使用迭代的梯度下降法比較有優勢。
梯度下降法和牛頓法/擬牛頓法相比,兩者都是迭代求解,不過梯度下降法是梯度求解,而牛頓法/擬牛頓法是用二階的海森矩陣的逆矩陣或偽逆矩陣求解。相對而言,使用牛頓法/擬牛頓法收斂更快。但是每次迭代的時間比梯度下降法長。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。