梯度下降法

求解機器學習演算法的模型參數,即無約束優化問題時,梯度下降法是最常採用的方法之一,另一種常用的方法是最小二乘法。這裡對梯度下降法做簡要介紹。

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)步長:步長決定了在梯度下降迭代的過程中,每一步沿梯度負方向前進的長度。用上面下山的例子,步長就是在當前這一步所在位置沿著最陡峭最易下山的位置走的那一步的長度。

(2)特徵:指的是樣本中輸入部分,比如樣本(x0,y0),(x1,y1),則樣本特徵為x,樣本輸出為y。

(3)假設函數:在監督學習中,為了擬合輸入樣本,而使用的假設函數,記為 h_{	heta}(x) = 	heta_{0}+	heta_{1}x

(4)損失函數:為了評估模型擬合的好壞,通常用損失函數來度量擬合的程度。損失函數極小化,意味著擬合程度最好,對應的模型參數即為最優參數。在線性回歸中,損失函數通常為樣本輸出和假設函數的差取平方。比如,對於樣本 (x_{i},y_{i})(i = 1,2,....,n) ,採用線性回歸,損失函數為:

J(	heta_{0},	heta_{1}) = sum_{i=1}^{n}{(h_{	heta}(x_{i})-y_{i})^{2}}

其中, x_{i} 表示樣本特徵x的第i個元素, y_{i} 表示樣本輸出y的第i個元素, h_{	heta}(x_{i}) 為假設函數。

3.3 梯度下降法的詳細演算法

梯度下降法的演算法可以有代數法和矩陣法(也稱向量法)兩種表示,這裡先介紹代數法,後介紹矩陣法。

3.3.1 梯度下降法的代數方式描述

(1)先決條件:確認優化模型的假設函數和損失函數;

(2)演算法相關參數初始化:主要是初始化參數,演算法終止距離以及步長。在沒有任何先驗知識的時候,可以將所有的參數初始化為0,將步長初始化為1.在調優時再優化;

(3)演算法過程:

1)確定當前位置的損失函數的梯度;

2)用步長乘以損失函數的梯度,得到當前位置下降的距離;

3)確定是否所有的參數,梯度下降的距離都小於閾值,如果是則演算法終止,當前所有的參數即為最終結果,否則進入步驟4;

4)更新所有的參數,對於每一個參數,其更新表達式如下,更新完畢後繼續轉入步驟1

	heta_{i} = 	heta_{i} - alphafrac{partial}{partial 	heta_{i}}J(	heta_{0},	heta_{1},...,	heta_{n})

當前點的梯度方向是由所有的樣本決定的。

3.3.2 梯度下降法的矩陣方式描述

(1)先決條件:需要確認優化模型的假設函數和損失函數;

(2)演算法相關參數初始化:參數向量可以初始化為默認值,或者調優後的值;

(3)演算法過程:

1)確定當前位置的損失函數的梯度,對於 	heta 向量,其梯度表達式為

frac{partial}{partial 	heta}J(	heta)

2)用步長乘以損失函數的梯度,得到當前位置下降的距離,即為

alpha frac{partial}{partial 	heta}J(	heta)

3)確定 	heta 向量裡面的每個值,梯度下降的距離都小於 varepsilon ,如果小於 varepsilon 則演算法終止,當前 	heta 向量即為最終結果,否則進入步驟4;

4)更新 	heta 向量,其更新表達式如下。更新完畢後繼續轉入步驟1.

	heta = 	heta - alpha frac{partial}{partial 	heta} J(	heta)

3.4 梯度下降法的演算法調優

(1)演算法的步長選擇。在前面的演算法描述中,提到取步長為1,但是實際上取值取決於數據樣本,可以多取一些值,從大到小,分別運行演算法,看看迭代效果,如果損失函數在變小,說明取值有效,否則要增大步長。步長太大,會導致迭代過快,甚至有可能錯過最優解。步長太小,迭代速度太慢,很長時間演算法都不能結束。所以演算法的步長需要多次運行後才能得到一個較為優的值。

(2)演算法參數的初始值選擇。初始值不同,獲得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;當然如果損失函數是凸函數則一定是最優解。由於有局部最優解的風險,需要多次用不同初始值運行演算法,關鍵損失函數的最小值,選擇損失函數最小化的初值。

(3)歸一化。由於樣本不同特徵的取值範圍不一樣,可能導致迭代很慢,為了減少特徵取值的影響,可以對特徵數據歸一化。

4 梯度下降法——家族(BGD,SGD,MBGD)

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

批量梯度下降法,是梯度下降法最常用的形式,具體做法也就是在更新參數時使用所有的樣本來進行更新,這個方法對應於前面3.3.1的線性回歸的梯度下降演算法,也就是說3.3.1的梯度下降演算法就是批量梯度下降法。 

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

隨機梯度下降法,和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的m個樣本的數據,而是僅僅選取一個樣本j來求梯度。

隨機梯度下降法和批量梯度下降法是兩個極端,一個採用所有數據來梯度下降,一個用一個樣本來梯度下降。自然各自的優缺點都非常突出。對於訓練速度來說,隨機梯度下降法由於每次僅僅採用一個樣本來迭代,訓練速度很快,而批量梯度下降法在樣本量很大的時候,訓練速度不能讓人滿意。對於準確度來說,隨機梯度下降法由於僅僅用一個樣本決定梯度方向,導致解很有可能不是最優。對於收斂速度來說,由於隨機梯度下降法一次迭代一個樣本,導致迭代方向變化很大,不能很快的收斂到局部最優解。

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

小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對於m個樣本,我們採用x個樣子來迭代,1<x<m。一般可以取x=10,當然根據樣本的數據,可以調整這個x的值。

5 梯度下降法和其他無約束優化演算法的比較

在機器學習中的無約束優化演算法,除了梯度下降以外,還有前面提到的最小二乘法,此外還有牛頓法擬牛頓法

    梯度下降法和最小二乘法相比,梯度下降法需要選擇步長,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是計算解析解。如果樣本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有優勢,計算速度很快。但是如果樣本量很大,用最小二乘法由於需要求一個超級大的逆矩陣,這時就很難或者很慢才能求解解析解了,使用迭代的梯度下降法比較有優勢。

    梯度下降法和牛頓法/擬牛頓法相比,兩者都是迭代求解,不過梯度下降法是梯度求解,而牛頓法/擬牛頓法是用二階的海森矩陣的逆矩陣或偽逆矩陣求解。相對而言,使用牛頓法/擬牛頓法收斂更快。但是每次迭代的時間比梯度下降法長。


推薦閱讀:

十圖詳解tensorflow數據讀取機制(附代碼)
數據學習之路---每周好文分享(第一期)
機器學習在ctrip酒店業務中的應用
驗證式開發——簡論演算法開發的正確姿勢
利用OpenCV開發行人檢測程序,怎樣提高檢測速率呢?

TAG:梯度下降 | 机器学习 | 最小二乘法 |