擬牛頓法之DFP演算法剖析
DFP擬牛頓法也稱為DFP校正方法,是第一個擬牛頓法,由Davidon最早提出,後經Fletcher和Powell解釋和改進,在命名時以三個人名字的首字母命名。 那擬牛頓法多數時候均為對二階導hessian矩陣或其逆矩陣的近似逼近,DFP所逼近的就是hessian逆矩陣。
其演算法步驟如下: 假設已知目標函數及梯度,迭代輪數n,終止條件.
- 取初始點,精度;
- 計算,若則停止,得到權重;否則轉3;
- 令,;
- 令;
- 求,令;
- 計算,若則停止,得到權重;否則轉7;
- 計算;
- 計算;
- 令,轉4.
求得的X即為每個特徵的權重。一般而言,針對公式會補充一個正定的充要條件:。但是在實際實現中,本人發現很多時候,並不一定大於0,但距離0差距很小,一般在0.0001以內,因此可以將該約束進行放鬆,這樣。
相比於之前介紹的基於GD的方法,二階擬牛頓法要的實現要複雜的多。就以DFP這個演算法為例。首先,其每次所求必須過全量樣本,這就導致其無法執行如minibatch等類似的方式。當然,這本身是SGD或BGD等的優勢所在。 其次,在第5步的求最小步長的過程,該問題本身也是一個優化問題。解決該優化目標的過程叫一維搜索。一維搜索的方法有很多,這裡主要介紹一下採用黃金分割法的實現。主要分為倆步:a. 找出滿足條件的大致下降區間。b. 採用黃金分隔法找出最合適的極小值點。
DFP實現時,在步驟a中,每輪迭代中均採用試探法進行嘗試(假設當前迭代輪數為k):
- 初始設定,前進步長,則;
- 計算,比較和,若,說明前進方向正確,應該再次前進,因此可激進一些,讓下一次直接前進2倍,即;否則,就後退,並和,以保持下降方向。
- 可以再找一個,來把控下一次終點是否合理,以用於終止尋找。那通過剛剛的第二步得知,,這裡比較下和,看看是否符合下降方向,若符合(),則繼續尋找,並更新,,,,這樣的用意是進一步查找到了最小的一個下降區間。這裡如果不滿足下降條件,即(),即認為尋找的方向已經終止了,那麼比較下和即可找到最小區間,因為是在這兩個對應的函數和之間,極小值點應該就存在這樣的區間內,如此即可終止,返回區間結果。
- 重新轉向2,再次進行試探。
針對步驟b,採用黃金分割法要簡單的多。畢竟這是初高中的知識,主要是每次採用黃金分割比例(0.618)不斷的縮小區間,然後看區間起始點的f值是否小於最小閾值,若滿足,則將其中間的點返回,否則繼續查找。整個步驟有點類似二分查找。
okay,這裡主要介紹的是採用黃金分割法的DFP擬牛頓法。本人在之前的scalaML工程中進行了實現,DFP代碼為https://github.com/sloth2012/scalaML/blob/master/src/main/scala/com/lx/algos/ml/optim/newton/DFP.scala,使用樣例在https://github.com/sloth2012/scalaML/blob/master/src/test/scala/com/lx/algos/ml/NewtonTest.scala中。
推薦閱讀:
※深度學習與故障診斷的另一次嘗試
※機器學習入門基礎——邏輯回歸
※超詳細!上線一個機器學習項目你需要哪些準備?
※薦書 | 機器學習、深度學習演算法及其Python實現
TAG:機器學習 |