在求解機器學習算法的模型參數,即無約束優化問題時,梯度降低(Gradient Descent)是最常採用的方法之一,另外一種經常使用的方法是最小二乘法。這裏就對梯度降低法作一個完整的總結。算法
在微積分裏面,對多元函數的參數求∂偏導數,把求得的各個參數的偏導數以向量的形式寫出來,就是梯度。好比函數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的方向,梯度減小最快,也就是更加容易找到函數的最小值。函數
在機器學習算法中,在最小化損失函數時,能夠經過梯度降低法來一步步的迭代求解,獲得最小化的損失函數,和模型參數值。反過來,若是咱們須要求解損失函數的最大值,這時就須要用梯度上升法來迭代了。學習
梯度降低法和梯度上升法是能夠互相轉化的。好比咱們須要求解損失函數f(θ)的最小值,這時咱們須要用梯度降低法來迭代求解。可是實際上,咱們能夠反過來求解損失函數 -f(θ)的最大值,這時梯度上升法就派上用場了。優化
下面來詳細總結下梯度降低法。 blog
首先來看看梯度降低的一個直觀的解釋。好比咱們在一座大山上的某處位置,因爲咱們不知道怎麼下山,因而決定走一步算一步,也就是在每走到一個位置的時候,求解當前位置的梯度,沿着梯度的負方向,也就是當前最陡峭的位置向下走一步,而後繼續求解當前位置梯度,向這一步所在位置沿着最陡峭最易下山的位置走一步。這樣一步步的走下去,一直走到以爲咱們已經到了山腳。固然這樣走下去,有可能咱們不能走到山腳,而是到了某一個局部的山峯低處。it
從上面的解釋能夠看出,梯度降低不必定可以找到全局的最優解,有多是一個局部最優解。固然,若是損失函數是凸函數,梯度降低法獲得的解就必定是全局最優解。io
在詳細瞭解梯度降低的算法以前,咱們先看看相關的一些概念。ast
1. 步長(Learning rate):步長決定了在梯度降低迭代的過程當中,每一步沿梯度負方向前進的長度。用上面下山的例子,步長就是在當前這一步所在位置沿着最陡峭最易下山的位置走的那一步的長度。function
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)\)爲假設函數。
梯度降低法的算法能夠有代數法和矩陣法(也稱向量法)兩種表示,若是對矩陣分析不熟悉,則代數法更加容易理解。不過矩陣法更加的簡潔,且因爲使用了矩陣,實現邏輯更加的一目瞭然。這裏先介紹代數法,後介紹矩陣法。
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.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)爲標量\)
若是須要熟悉矩陣求導建議參考張賢達的《矩陣分析與應用》一書。
在使用梯度降低時,須要進行調優。哪些地方須要調優呢?
1. 算法的步長選擇。在前面的算法描述中,我提到取步長爲1,可是實際上取值取決於數據樣本,能夠多取一些值,從大到小,分別運行算法,看看迭代效果,若是損失函數在變小,說明取值有效,不然要增大步長。前面說了。步長太大,會致使迭代過快,甚至有可能錯過最優解。步長過小,迭代速度太慢,很長時間算法都不能結束。因此算法的步長鬚要屢次運行後才能獲得一個較爲優的值。
2. 算法參數的初始值選擇。 初始值不一樣,得到的最小值也有可能不一樣,所以梯度降低求得的只是局部最小值;固然若是損失函數是凸函數則必定是最優解。因爲有局部最優解的風險,須要屢次用不一樣初始值運行算法,關鍵損失函數的最小值,選擇損失函數最小化的初值。
3.歸一化。因爲樣本不一樣特徵的取值範圍不同,可能致使迭代很慢,爲了減小特徵取值的影響,能夠對特徵數據歸一化,也就是對於每一個特徵x,求出它的指望\(\overline{x}\)和標準差std(x),而後轉化爲:
\(\frac{x - \overline{x}}{std(x)}\)
這樣特徵的新指望爲0,新方差爲1,迭代速度能夠大大加快。
批量梯度降低法,是梯度降低法最經常使用的形式,具體作法也就是在更新參數時使用全部的樣原本進行更新,這個方法對應於前面3.3.1的線性迴歸的梯度降低算法,也就是說3.3.1的梯度降低算法就是批量梯度降低法。
\(\theta_i = \theta_i - \alpha\sum\limits_{j=1}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)
因爲咱們有m個樣本,這裏求梯度的時候就用了全部m個樣本的梯度數據。
隨機梯度降低法,其實和批量梯度降低法原理相似,區別在與求梯度時沒有用全部的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的小批量梯度降低法。
小批量梯度降低法是批量梯度降低法和隨機梯度降低法的折衷,也就是對於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)}\)
在機器學習中的無約束優化算法,除了梯度降低之外,還有前面提到的最小二乘法,此外還有牛頓法和擬牛頓法。
梯度降低法和最小二乘法相比,梯度降低法須要選擇步長,而最小二乘法不須要。梯度降低法是迭代求解,最小二乘法是計算解析解。若是樣本量不算很大,且存在解析解,最小二乘法比起梯度降低法要有優點,計算速度很快。可是若是樣本量很大,用最小二乘法因爲須要求一個超級大的逆矩陣,這時就很難或者很慢才能求解解析解了,使用迭代的梯度降低法比較有優點。
梯度降低法和牛頓法/擬牛頓法相比,二者都是迭代求解,不過梯度降低法是梯度求解,而牛頓法/擬牛頓法是用二階的海森矩陣的逆矩陣或僞逆矩陣求解。相對而言,使用牛頓法/擬牛頓法收斂更快。可是每次迭代的時間比梯度降低法長。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)