機器學習之優化算法

        在機器學習中,由於問題解的計算量通常很大,一般會採用迭代的方式來進行優化求解。最常用的優化算法包括:梯度下降法(BGD、SGD、MBGD)、座標上升法(Coordinate Ascent)、牛頓法和擬牛頓法等。

1、梯度下降法(Gradient Descent)

        梯度下降法是最簡單常用的最優化方法之一。梯度下降法的優化思想是用當前位置負梯度方向作爲搜索方向,因爲該方向爲當前位置的最快下降方向。梯度下降法越接近目標值,步長越小,前進越慢。
        一種直觀解釋:比如我們在一座大山上的某處位置,由於我們不知道怎麼下山,於是決定走一步算一步,也就是在每走到一個位置的時候,求解當前位置的梯度,沿着梯度的負方向,也就是當前最陡峭的位置向下走一步,然後繼續求解當前位置梯度,向這一步所在位置沿着最陡峭最易下山的位置走一步。這樣一步步的走下去,一直走到覺得我們已經到了山腳。當然這樣走下去,有可能我們不能走到山腳,而是到了某一個局部的山峯低處。
        梯度下降法不一定能找到全局最優解,速度也未必是最快的,但當目標函數(損失函數)是凸函數時,梯度下降法的解一定是全局最優解。

        梯度下降法根據每次迭代時訓練樣本的參與情況,可以分爲三種:批量梯度下降法(Batch Gradient Descent)、隨機梯度下降法(Stochastic Gradient Descent)、小批量梯度下降法(Mini-batch Gradient Descent)。
        拿線性迴歸模型爲例,假設下面的h是要擬合的函數,J爲損失函數,theta是需要求解的向量參數,要迭代求解的值。其中m是訓練集的樣本個數,n是特徵的個數。


1.1、批量梯度下降法(BGD)

        將J對theta求偏導,得到每個theta分量對應的的梯度:

       設alpha爲迭代步長,每個theta分量的更新如下:


       從上式可以看出,每迭代一步,都要用到所有訓練樣本,當m很大時,迭代速度會相當的慢,計算量爲m*n*n。所以,由此產生了隨機梯度下降法。

1.2、隨機梯度下降法(SGD)

       alpha任爲迭代步長,每個theta分量的更新改爲如下:

       可以從上式看出,隨機梯度下降法每次迭代只使用一個訓練樣本,其計算量只需n*n,所以隨機梯度下降法迭代一次的速度要遠快於批量梯度下降法。但是SGD帶來的問題是收斂速度不如梯度下降,也就是說爲了達到同樣的精度,SGD需要的總迭代次數要大於梯度下降,但是,單次迭代的計算量要小得多。SGD最小化每個樣本的損失函數,雖然不是每次迭代得到的損失函數都向着全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近,適用於大規模訓練樣本情況。所以:如果想快速得到一個可以勉強接受的解,SGD比BGD更加合適,但是如果想得到一個精確度高的解,應當選擇BGD。

1.3、小批量梯度下降法(MBGD)

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

2、座標上升法(Coordinate Ascent)

      考慮如下無約束優化問題:

        其中,W是向量α 的函數。參數α的更新如下,直到算法收斂:

        在該算法的內循環中,除了α 的第i個分量當做變量,其它值都固定,使用前一次迭代的值。座標上升法的迭代過程如下圖所示:

       上圖中一圈一圈的橢圓表示優化函數或損失函數的輪廓。由於每一步值優化一個變量,所以座標上升法的每一步在圖中的連接線都平行於優化變量所對應的座標軸。

3、牛頓法和擬牛頓法

       牛頓法使用函數f (x)的泰勒展開來尋找方程f (x) = 0的根。將 f (x)在 x0 做一階Taylor展開:

        則有:

        所以:

        只要不停的迭代,x的值便會不斷接近最優解。因此,x的迭代公式可以寫成:

        牛頓法的迭代過程如下圖所示:

        對於損失函數L(theta),最小化L也就是求L的導數爲0的解。所以,參數theta的更新公式如下:

        當theta是一個向量時,牛頓法在此時關於theta的更新公式可以表示爲:

         其中,H表示Hessian矩陣:

         牛頓法具有二階收斂性,每一輪迭代會讓誤差的數量級呈平方衰減。即在某一迭代中誤差的數量級爲0.01,則下一次迭代誤差爲0.0001,再下一次爲0.00000001。而梯度下降是一階收斂,所以牛頓法收斂速度更快,但是大規模數據時,Hession矩陣的計算與存儲將是性能的瓶頸所在。如果更通俗地說的話,比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之後,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。
         針對Hession矩陣的計算與存儲問題,提出了擬牛頓法。擬牛頓法的本質思想是改善牛頓法每次需要求解複雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的複雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優於最速下降法,尤其對於困難的問題。另外,因爲擬牛頓法不需要二階導數的信息,所以有時比牛頓法更爲有效。常用的擬牛頓法例如:DFP算法、BFGS算法。

參考文獻:

1、吳恩達機器學習
2、http://blog.csdn.net/owen7500/article/details/51601627
3、https://zhuanlan.zhihu.com/p/22402784
4、http://blog.csdn.net/qsczse943062710/article/details/76763739
發佈了37 篇原創文章 · 獲贊 88 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章