梯度下降(Gradient Descent)小結

劉建平Pinard發表於2016-10-17

    在求解機器學習演算法的模型引數,即無約束優化問題時,梯度下降(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):指的是樣本中輸入部分,比如2個單特徵的樣本$(x^{(0)},y^{(0)}),(x^{(1)},y^{(1)})$,則第一個樣本特徵為$x^{(0)}$,第一個樣本輸出為$y^{(0)}$。

    3. 假設函式(hypothesis function):在監督學習中,為了擬合輸入樣本,而使用的假設函式,記為$h_{\theta}(x)$。比如對於單個特徵的m個樣本$(x^{(i)},y^{(i)})(i=1,2,...m)$,可以採用擬合函式如下: $h_{\theta}(x) = \theta_0+\theta_1x$。

    4. 損失函式(loss function):為了評估模型擬合的好壞,通常用損失函式來度量擬合的程度。損失函式極小化,意味著擬合程度最好,對應的模型引數即為最優引數。線上性迴歸中,損失函式通常為樣本輸出和假設函式的差取平方。比如對於m個樣本$(x_i,y_i)(i=1,2,...m)$,採用線性迴歸,損失函式為:

             \(J(\theta_0, \theta_1) = \sum\limits_{i=1}^{m}(h_\theta(x_i) - y_i)^2\)

     其中\(x_i\)表示第i個樣本特徵,\(y_i\)表示第i個樣本對應的輸出,\(h_\theta(x_i)\)為假設函式。   

3.3 梯度下降的詳細演算法

    梯度下降法的演算法可以有代數法和矩陣法(也稱向量法)兩種表示,如果對矩陣分析不熟悉,則代數法更加容易理解。不過矩陣法更加的簡潔,且由於使用了矩陣,實現邏輯更加的一目瞭然。這裡先介紹代數法,後介紹矩陣法。

 

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

    1. 先決條件: 確認優化模型的假設函式和損失函式。

    比如對於線性迴歸,假設函式表示為 \(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}\), 其中\(\theta_i \) (i = 0,1,2... n)為模型引數,\(x_i \) (i = 0,1,2... n)為每個樣本的n個特徵值。這個表示可以簡化,我們增加一個特徵\(x_0 = 1 \) ,這樣\(h_\theta(x_0, x_1, ...x_n) = \sum\limits_{i=0}^{n}\theta_{i}x_{i}\)。

    同樣是線性迴歸,對應於上面的假設函式,損失函式為:

           \(J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)^2\)

 

    2. 演算法相關引數初始化:主要是初始化\(\theta_0, \theta_1..., \theta_n\),演算法終止距離\(\varepsilon\)以及步長\(\alpha\)。在沒有任何先驗知識的時候,我喜歡將所有的\(\theta\)初始化為0, 將步長初始化為1。在調優的時候再 優化。

    3. 演算法過程:

      1)確定當前位置的損失函式的梯度,對於\(\theta_i\),其梯度表示式如下:

        \(\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)

      2)用步長乘以損失函式的梯度,得到當前位置下降的距離,即\(\alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)對應於前面登山例子中的某一步。

      3)確定是否所有的\(\theta_i\),梯度下降的距離都小於\(\varepsilon\),如果小於\(\varepsilon\)則演算法終止,當前所有的\(\theta_i\)(i=0,1,...n)即為最終結果。否則進入步驟4.

      4)更新所有的\(\theta\),對於\(\theta_i\),其更新表示式如下。更新完畢後繼續轉入步驟1.

        \(\theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)

    下面用線性迴歸的例子來具體描述梯度下降。假設我們的樣本是\((x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)\),損失函式如前面先決條件所述:

    \(J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)})- y_j)^2\)。

    則在演算法過程步驟1中對於\(\theta_i\) 的偏導數計算如下:   

     \(\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

    由於樣本中沒有\(x_0\)上式中令所有的\(x_0^{j}\)為1.

    步驟4中\(\theta_i\)的更新表示式如下:

           \(\theta_i = \theta_i - \alpha\frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{j}) - y_j)x_i^{(j)}\)

    從這個例子可以看出當前點的梯度方向是由所有的樣本決定的,加\(\frac{1}{m}\) 是為了好理解。由於步長也為常數,他們的乘機也為常數,所以這裡\(\alpha\frac{1}{m}\)可以用一個常數表示。

    在下面第4節會詳細講到的梯度下降法的變種,他們主要的區別就是對樣本的採用方法不同。這裡我們採用的是用所有樣本。

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

    這一部分主要講解梯度下降法的矩陣方式表述,相對於3.3.1的代數法,要求有一定的矩陣分析的基礎知識,尤其是矩陣求導的知識。

    1. 先決條件: 和3.3.1類似, 需要確認優化模型的假設函式和損失函式。對於線性迴歸,假設函式\(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}\)的矩陣表達方式為:

     \(h_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta}\) ,其中, 假設函式\(h_\mathbf{\theta}(\mathbf{X})\)為mx1的向量,\(\mathbf{\theta}\)為(n+1)x1的向量,裡面有n+1個代數法的模型引數。\(\mathbf{X}\)為mx(n+1)維的矩陣。m代表樣本的個數,n+1代表樣本的特徵數。

             損失函式的表示式為:\(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})\), 其中\(\mathbf{Y}\)是樣本的輸出向量,維度為mx1.

    2. 演算法相關引數初始化: \(\theta\)向量可以初始化為預設值,或者調優後的值。演算法終止距離\(\varepsilon\),步長\(\alpha\)和3.3.1比沒有變化。

    3. 演算法過程:

      1)確定當前位置的損失函式的梯度,對於\(\theta\)向量,其梯度表示式如下:

        \(\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta)\)

      2)用步長乘以損失函式的梯度,得到當前位置下降的距離,即\(\alpha\frac{\partial}{\partial\theta}J(\theta)\)對應於前面登山例子中的某一步。

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

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

        \(\mathbf\theta= \mathbf\theta - \alpha\frac{\partial}{\partial\theta}J(\mathbf\theta)\)

   

    還是用線性迴歸的例子來描述具體的演算法過程。

    損失函式對於\(\theta\)向量的偏導數計算如下:

      \(\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})\)

    步驟4中\(\theta\)向量的更新表示式如下:\(\mathbf\theta= \mathbf\theta - \alpha\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})\)

    對於3.3.1的代數法,可以看到矩陣法要簡潔很多。這裡面用到了矩陣求導鏈式法則,和兩個矩陣求導的公式。

 

    這裡面用到了矩陣求導鏈式法則,和兩個個矩陣求導的公式。

      公式1:\(\frac{\partial}{\partial\mathbf{x}}(\mathbf{x^Tx}) =2\mathbf{x}\;\;x為向量\)

      公式2:\(\nabla_Xf(AX+B) = A^T\nabla_Yf,\;\; Y=AX+B,\;\;f(Y)為標量\)

    如果需要熟悉矩陣求導建議參考張賢達的《矩陣分析與應用》一書。

 

3.4 梯度下降的演算法調優

    在使用梯度下降時,需要進行調優。哪些地方需要調優呢?

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

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

    3.歸一化。由於樣本不同特徵的取值範圍不一樣,可能導致迭代很慢,為了減少特徵取值的影響,可以對特徵資料歸一化,也就是對於每個特徵x,求出它的期望\(\overline{x}\)和標準差std(x),然後轉化為:

      \(\frac{x - \overline{x}}{std(x)}\)

    這樣特徵的新期望為0,新方差為1,迭代次數可以大大加快。

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

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

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

    \(\theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

    由於我們有m個樣本,這裡求梯度的時候就用了所有m個樣本的梯度資料。

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

    隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的m個樣本的資料,而是僅僅選取一個樣本j來求梯度。對應的更新公式是:

    \(\theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

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

    那麼,有沒有一箇中庸的辦法能夠結合兩種方法的優點呢?有!這就是4.3的小批量梯度下降法。

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

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

    \(\theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

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

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

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

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

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

    

相關文章