牛頓法和擬牛頓法 -- BFGS, L-BFGS, OWL-QN
數據、特徵和數值優化算法是機器學習的核心,而牛頓法及其改良(擬牛頓法)是機器最常用的一類數字優化算法,今天就從牛頓法開始,介紹幾個擬牛頓法算法。本博文只介紹算法的思想,具體的數學推導過程不做介紹。
1. 牛頓法
牛頓法的核心思想是”利用函數在當前點的一階導數,以及二階導數,尋找搜尋方向“(回想一下更簡單的梯度下降法,她只用了當前點一階導數信息決定搜索方向)。
牛頓法的迭代公式是(稍微有修改,最原始的牛頓法
其中,
1. 一階導數
2. 當前點泰勒展開(捨棄二階以上項)函數中 當前搜尋點 與 泰勒展開函數極小值連線方向。
2. 擬牛頓算法
上述的牛頓法需要計算Hessian矩陣的逆矩陣,運算複雜度太高。在動輒百億、千億量級特徵的大數據時代,模型訓練耗時太久。因此,很多牛頓算法的變形出現了,這類變形統稱擬牛頓算法。擬牛頓算法的核心思想用一個近似矩陣
下面介紹兩種最常用的擬牛頓算法:
- BFGS
BFGS(Broyden–Fletcher–Goldfarb–Shanno)的算法流程如下:
1. 初始化:初始點
2. 計算線搜索方向:
3. 用”Backtracking line search“算法沿搜索方向找到下一個迭代點:
4. 根據Armijo–Goldstein 準則,判斷是否停止。
5. 計算
6. 迭代近似逆Hessian矩陣:
上式5中的推到方法比較複雜,有興趣的可以搜一下相關文獻。
- L-BFGS
BFGS算法需要存儲近似逆Hessian矩陣
L-BFGS算法不存儲近似逆Hessian矩陣
雖然L-BFGS算法不需要保存
L-BFGS算法的流程如下:
定義:
以上兩個一維數組需要保存每次迭代的結果。
再定義:
L-BFGS算法如下:
1. 初始化:初始點
2. 用”Backtracking line search“算法沿搜索方向找到下一個迭代點:
3. 根據Armijo–Goldstein 準則,判斷是否停止。
4. 更新搜索方向
two loop recursion算法:
- OWQN
OWL-QN算法的全稱是Orthant-Wise Limited-memory Quasi-Newton。從全稱可以看出,該算法是單象限的L-BFGS算法,也就是說,OWL-QN算法每次迭代都不會超出當前象限。
爲什麼要加象限限制呢?L-BFGS算法需要計算函數的導數,這就要求優化函數需要處處可導。對於
觀察式(1),正則項在任意一個象限裏都是線性的,一階導數爲常數,二階導數爲0。OWL-QN算法的核心思想就是將參數每次迭代更新都限制在一個象限內,即每次迭代都不改變參數的正負性。
但是,優化過程中,很多參數的正負肯定是需要改變的。OWL-QN算法通過在下次迭代中選擇合適的象限來改變參數的正負。比如,一個參數在當前點是正相權重,在線搜索時,按照標準的線搜索算法,該參數會變成負。OWL-QN算法限制了符號變換,對於需要變換符號的參數,將其置爲0。待下一次迭代時,再根據情況決定該維度的搜索方向。
與L-BFGS算法相比,OWL-QN算法做了以下幾點調整:
1. 採用僞梯度(pseudo-gradient)
2. 線搜索是,如果某一維度變量需要跨越象限(正負號改變),則該維度值置爲0
其中,1中的僞梯度是這麼算的,不爲0的參數,其偏微分即爲其正負號(線性),若某一位爲0,其梯度也置爲0。
總結OWL-QN算法如下[4]:
參考文獻:
1. http://en.wikipedia.org/wiki/Broyden%E2%80%93Fletcher%E2%80%93Goldfarb%E2%80%93Shanno_algorithm
2. http://en.wikipedia.org/wiki/Limited-memory_BFGS
3. http://aria42.com/blog/2014/12/understanding-lbfgs/
4. Andrew, Galen, and Jianfeng Gao. "Scalable training of L 1-regularized log-linear models." Proceedings of the 24th international conference on Machine learning. ACM, 2007.