梯度下降法原理及小結


  在機器學習的核心內容就是把數據喂給一個人工設計的模型,然后讓模型自動的“學習”,從而優化模型自身的各種參數,最終使得在某一組參數下該模型能夠最佳的匹配該學習任務。那么這個“學習”的過程就是機器學習算法的關鍵。梯度下降法就是實現該“學習”過程的一種最常見的方式,尤其是在深度學習(神經網絡)模型中,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

https://blog.csdn.net/qq_41800366/article/details/86583789

https://www.cnblogs.com/pinard/p/5970503.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM