在機器學習的核心內容就是把資料餵給一個人工設計的模型,然後讓模型自動的“學習”,從而優化模型自身的各種引數,最終使得在某一組引數下該模型能夠最佳的匹配該學習任務。那麼這個“學習”的過程就是機器學習演算法的關鍵。梯度下降法就是實現該“學習”過程的一種最常見的方式,尤其是在深度學習(神經網路)模型中,BP反向傳播方法的核心就是對每層的權重引數不斷使用梯度下降來進行優化。另一種常用的方法是最小二乘法。本文詳細介紹梯度下降法。
一、 梯度下降法演算法詳解
1.1 梯度下降的直觀解釋
首先來看看梯度下降的一個直觀的解釋。比如我們在一座大山上的某處位置,由於我們不知道怎麼下山,於是決定走一步算一步,也就是在每走到一個位置的時候,求解當前位置的梯度,沿著梯度的負方向,也就是當前最陡峭的位置向下走一步,然後繼續求解當前位置梯度,向這一步所在位置沿著最陡峭最易下山的位置走一步。這樣一步步的走下去,一直走到覺得我們已經到了山腳。當然這樣走下去,有可能我們不能走到山腳,而是到了某一個區域性的山峰低處。
從上面的解釋可以看出,梯度下降不一定能夠找到全域性的最優解,有可能是一個區域性最優解。當然,如果損失函式是凸函式,梯度下降法得到的解就一定是全域性最優解。
1.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 _{1}x$
4、損失函式(loss function):為了評估模型擬合的好壞,通常用損失函式來度量擬合的程度。損失函式極小化,意味著擬合程度最好,對應的模型引數即為最優引數。線上性迴歸中,損失函式通常為樣本輸出和假設函式的差取平方。比如對於m個樣本(xi,yi)(i=1,2,..m),採用線性迴歸,損失函式為:
$J(\theta _{0},\theta _{1})=\sum_{i=1}^{m}(h_{\theta }(x_{i})-y_{i})^{2}$
其中xi表示第i個樣本特徵,yi表示第i個樣本對應的輸出,$h_{\theta }(x_{i})$為假設函式。
1.3 梯度下降的詳細演算法
梯度下降法的演算法可以有代數法和矩陣法(也稱向量法)兩種表示,如果對矩陣分析不熟悉,則代數法更加容易理解。不過矩陣法更加的簡潔,且由於使用了矩陣,實現邏輯更加的一目瞭然。這裡先介紹代數法,後介紹矩陣法。
1.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_{i=0}^{n}\theta _{i}x_{i}$。
同樣是線性迴歸,對應於上面的假設函式,損失函式為:
$J(\theta _{0},\theta _{1}...,\theta _{n})=\frac{1}{2m}\sum_{j=1}^{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}$初始化為0,將步長初始化為1,在調優的時候再優化。
3、 演算法過程:
1)確定當前位置的損失函式的梯度,對於$\theta _{i}$,其梯度表示式如下:
$\frac{\partial }{\partial \theta _{i}}J(\theta _{0},\theta _{1}...,\theta _{n})$
2)用步長乘以損失函式的梯度,得到當前位置下降的距離,即$a\frac{\partial }{\partial \theta _{i}}J(\theta _{0},\theta _{1}...,\theta _{n})$對應前面登山例子中的某一步。
3)確定是否所有的$\theta _{i}$,梯度下降的距離都小於$\varepsilon $,如果小於$\varepsilon $則演算法終止,當前所有的$\theta _{i}(i=0,1,2...n)$即為最終結果。否則進入步驟4.
4)更新所有的$\theta $,對於$\theta _{i}$,其更新表示式如下。更新完畢後繼續轉入步驟1.
$J(\theta _{0},\theta _{1}...,\theta _{n})=\frac{1}{2m}\sum_{j=1}^{m}(h_{\theta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)})-y_{j})^{2}$
下面用線性迴歸的例子來具體描述梯度下降。假設我們的樣本是$(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}{m}\sum_{j=1}^{m}(h_{\theta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)}-y_{j})^{2}$
則在演算法過程步驟1中對於$\theta _{i}$的偏導數計算如下:
$\frac{\partial }{\partial \theta _{t}}J(\theta _{0},\theta _{1}...,\theta _{n})=\frac{1}{m}\sum_{j=1}^{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}-a\frac{1}{m}\sum_{j=1}^{m}(h_{\theta }(x_{0}^{(j)},x_{1}^{(j)},...x_{n}^{(j)})-y_{j})x_{i}^{(j)}$
從這個例子可以看出當前點的梯度方向是由所有的樣本決定的,加$\frac{1}{m}$是為了好理解。由於步長也為常數,他們的乘積也為常數,所以這裡$a\frac{1}{m}$可以用一個常數表示。
1.3.2 梯度下降法的矩陣方式描述
這一部分主要講解梯度下降法的矩陣方式表述,相對於1.3.1的代數法,要求有一定的矩陣分析的基礎知識,尤其是矩陣求導的知識。
1、 先決條件: 和1.3.1類似, 需要確認優化模型的假設函式和損失函式。對於線性迴歸,假設函式$h_{\theta }(x_{1},x_{2},...x_{n})=\theta _{0}+\theta _{1}x_{1}+...+\theta _{n}x_{n}$的矩陣表達方式為:$h_{\theta }(X)=X\theta $,其中,假設函式$h_{\theta }(X)$為m*1的向量,$h_{\theta }$為(n+1)*1的向量,裡面n+1個代數法的模型引數。X為m*(n+1)維的矩陣。m代表樣本的個數,n+1代表樣本的特徵數。
損失函式的表示式為:$J(\theta )=\frac{1}{2}(X\theta -Y)^{T}(X\theta -Y)$,其中Y是樣本的輸出向量,維度為m*1.
2、演算法相關引數初始化: $\theta $向量可以初始化為預設值,或者調優後的值。演算法終止距離$\varepsilon $,步長$\alpha$和1.3.1比沒有變化。
3、演算法過程:
1)確定當前位置的損失函式的梯度,對於$\theta $向量,其梯度表示式如下:
$\frac{\partial }{\partial \theta }J(\theta )$
2)用步長乘以損失函式的梯度,得到當前位置下降的距離,即$a\frac{\partial }{\partial \theta }J(\theta )$對應於前面登山例子中的某一步。
3)確定$\theta $向量裡面的每個值,梯度下降的距離都小於$\varepsilon $,如果小於$\varepsilon $則演算法終止,當前$\theta $向量即為最終結果。否則進入步驟4.
4)更新$\theta $向量,其更新表示式如下。更新完畢後繼續轉入步驟1.
$\theta =\theta -a\frac{\partial }{\partial \theta }J(\theta )$
還是用線性迴歸的例子來描述具體的演算法過程。
損失函式對於$\theta $向量的偏導數計算如下:
$\frac{\partial }{\partial \theta }J(\theta )=X^{T}(X\theta -Y)$
步驟4中$\theta $向量的更新表示式如下:$\theta =\theta -aX^{T}(X\theta -Y)$
對於3.3.1的代數法,可以看到矩陣法要簡潔很多。這裡面用到了矩陣求導鏈式法則,和兩個矩陣求導的公式。
這裡面用到了矩陣求導鏈式法則,和兩個個矩陣求導的公式。
公式1:$\frac{\partial }{\partial x}(X^{T}X)=2X$ x為向量
公式2:$\bigtriangledown _{\chi }f(AX+B)=A^{T}\bigtriangledown _{Y}f$,$Y=AX+B$,$f(Y)$為標量
如果需要熟悉矩陣求導建議參考張賢達的《矩陣分析與應用》一書。
1.4 梯度下降的演算法調優
在使用梯度下降時,需要進行調優。哪些地方需要調優呢?
1. 演算法的步長選擇。在前面的演算法描述中,我提到取步長為1,但是實際上取值取決於資料樣本,可以多取一些值,從大到小,分別執行演算法,看看迭代效果,如果損失函式在變小,說明取值有效,否則要增大步長。前面說了。步長太大,會導致迭代過快,甚至有可能錯過最優解。步長太小,迭代速度太慢,很長時間演算法都不能結束。所以演算法的步長需要多次執行後才能得到一個較為優的值。
2. 演算法引數的初始值選擇。 初始值不同,獲得的最小值也有可能不同,因此梯度下降求得的只是區域性最小值;當然如果損失函式是凸函式則一定是最優解。由於有區域性最優解的風險,需要多次用不同初始值執行演算法,關鍵損失函式的最小值,選擇損失函式最小化的初值。
3.歸一化。由於樣本不同特徵的取值範圍不一樣,可能導致迭代很慢,為了減少特徵取值的影響,可以對特徵資料歸一化,也就是對於每個特徵$x$,求出它的期望$\bar{x}$和標準差std(x),然後轉化為:
$\frac{x-\bar{x}}{std(x)}$
這樣特徵的新期望為0,新方差為1,迭代速度可以大大加快。
二、梯度下降法的分類與對比
根據梯度下降時使用資料量的不同,梯度下降可以分為3類:批量梯度下降(Batch Gradient Descent,BGD)、隨機梯度下降(Stochastic Gradient Descent, SGD)和小批量梯度下降(Mini-Batch Gradient Descent, MBGD)。
批量梯度下降(SGD)
批量梯度下降每次都使用訓練集中的所有樣本來更新引數,也就是
$L(w)=\frac{1}{2N}\sum_{i=1}^{N}(f_{M}(x,w)-y)^{2}$
更新方法為
$w^{(k+1)}=w^{k}-a*\frac{\partial L(w)}{\partial w}$
當樣本資料集很大時,批量梯度下降的速度就會非常慢。
優點:可以得到全域性最優解
缺點:訓練時間長
隨機梯度下降(SGD)
每次梯度下降過程都使用全部的樣本資料可能會造成訓練過慢,隨機梯度下降(SGD)每次只從樣本中選擇1組資料進行梯度下降,這樣經過足夠多的迭代次數,SGD也可以發揮作用,但過程會非常雜亂。“隨機”的含義是每次從全部資料中中隨機抽取一個樣本。這樣損失函式就變為:
$L(w)=\frac{1}{2}(f_{M}(x,w)-y)^{2}$
引數更新方法同上:
$w^{(k+1)}=w^{k}-a*\frac{\partial L(w)}{\partial w}$
優點:訓練速度快
缺點:準確度下降,得到的可能只是區域性最優解
小批量梯度下降(MBGD)
小批量梯度下降是 BGD 和 SGD 之間的折中,MBGD 通常包含 10-1000 個隨機選擇的樣本。MBGD降低了了SGD訓練過程的雜亂程度,同時也保證了速度。
三、總結
梯度下降法是一種常用的優化器,梯度可以理解為多元函式偏導陣列成的向量(一元函式就是導數),沿著梯度方向函式增加最快,在梯度下降中要沿著梯度相反的方向。根據訓練週期使用的資料量的不同,梯度下降可以分為批量梯度下降(BGD)、隨機梯度下降(SGD)和小批量梯度下降(MBGD)。
在機器學習中的無約束優化演算法,除了梯度下降以外,還有前面提到的最小二乘法,此外還有牛頓法和擬牛頓法。
梯度下降法和最小二乘法相比,梯度下降法需要選擇步長,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是計算解析解。如果樣本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有優勢,計算速度很快。但是如果樣本量很大,用最小二乘法由於需要求一個超級大的逆矩陣,這時就很難或者很慢才能求解解析解了,使用迭代的梯度下降法比較有優勢。
梯度下降法和牛頓法/擬牛頓法相比,兩者都是迭代求解,不過梯度下降法是梯度求解,而牛頓法/擬牛頓法是用二階的海森矩陣的逆矩陣或偽逆矩陣求解。相對而言,使用牛頓法/擬牛頓法收斂更快。但是每次迭代的時間比梯度下降法長。
參考:
https://zhuanlan.zhihu.com/p/36564434
https://www.jianshu.com/p/c7e642877b0e