1. 程式人生 > >機器學習中常見的優化算法

機器學習中常見的優化算法

泰勒展開 應該 inf 擬牛頓法 roman 影響 牛頓法 目前 減少

  在機器學習中,有很多的問題並沒有解析形式的解,或者有解析形式的解但是計算量很大(譬如,超定問題的最小二乘解),對於此類問題,通常我們會選擇采用一種叠代的優化方式進行求解。
??這些常用的優化算法包括:梯度下降法(Gradient Descent),共軛梯度法(Conjugate Gradient),Momentum算法及其變體,牛頓法和擬牛頓法(包括L-BFGS),AdaGrad,Adadelta,RMSprop,Adam及其變體,Nadam。

1.梯度下降法

  梯度下降法的核心思想就是:通過每次在當前梯度方向(最陡的方向)向前前進一步,來逐漸逼近函數的最小值。類似於你站在山峰上,怎樣才能最快的下到山腳呢?當然是選擇坡度最陡的方向下山最快,這個坡度最陡正是數學上的“導數”概念,但導數沒有方向,對此出來了“梯度”z,所以才叫做“梯度下降法”

  首先對於機器學習而言,存在模型函數h(θ),以及損失函數J(θ)

技術分享圖片

  我們將損失函數在θi進行一階泰勒展開:

  技術分享圖片

  對於大多數博文而言,對應的梯度下降函數會是

  技術分享圖片

  可能大家沒有註意到,這裏為什麽後面變成了的導數,不應該是正的嘛,這是為什麽呢?????其實這裏存在的負號很重要

  首先,對於損失函數而言,我們的目標是減小損失函數的值,上式中,前面一項不需要解釋,後面一項是梯度下降的系數*導數。

  損失函數是關於θ的函數,當導數大於0時,損失函數隨著θ的減小而減小。對上式而言,此時θ在減小(後面一項小於0),那麽相應的損失函數也會相應的減小。

  當導數小於0時,損失函數隨著θ的增大而減小。對上式而言,此時的θ是在增大的(後面一項大於0),那麽相應的損失函數也會相應的減小。

  所以這就是為什麽這個地方一定是負號,看似簡單的數學推到,實則裏面蘊藏著數學家很多的心血。

  對於梯度下降法,它其實就是在m個樣本中,找尋那個使得當前損失函數(不管以後,只看眼睛前)下降最快的方向來進行θ參數的叠代。

  但是這種梯度下降法目前使用不多了,因為當數據量非常大時,那麽相應的進行一步叠代會非常吃力(需要遍歷所有樣本,每一次叠代時,每一個樣本都要計算,成本太高了)。相應的便產生了隨機梯度下降法和批量梯度下降法。引入隨機梯度下降法與批量梯度下降法是為了應對大數據量的計算而實現一種快速的求解。

  隨機梯度下降法:在梯度下降法的基礎上,它在每次叠代時,只找一個樣本來進行叠代,這樣計算量就會減少很多。比如對於一個有幾十萬的大數據集,使用隨機梯度下降法,或許只需要使用幾千個數據就可以得到最優的θ,那麽此時計算就會快很多,但相應的也存在噪音的幹擾,如果出現一些臟數據樣本,那麽就會對θ的優化產生影響。這種做法相對於梯度下降而言十分極端,因此現在普遍使用批量梯度下降法。

  批量梯度下降法:批量梯度下降法中m替換成mini-batch,在此將mini-bach的size遠小於m的大小,同時m也是遠大於1的。

  (1)首先J(θ)對θ求導,得到每個θ對應的梯度:

   技術分享圖片

  (2)由於最小化損失函數,座椅按照每個參數θ的梯度負方向,來更新θ:

    技術分享圖片

  從上面的公式可以看出,每次叠代的時候都是得到局部最優的近似解,然後在進行下一輪的叠代,雖然不是得到全局最優,但是從計算力上卻減小了不少的計算量,方便實際操作。(不要太理想化,要投入到實際中去)。

機器學習中常見的優化算法