OWL-QN演算法
一、BFGS演算法
演算法思想如下:
Step1 取初始點,初始正定矩陣,允許誤差,令;
Step2 計算;
Step3 計算,使得
;
Step4 令;
Step5 如果,則取為近似最優解;否則轉下一步;
Step6 計算
,,
令,轉Step2.
優點:
1、不用直接計算Hessian矩陣;
2、通過迭代的方式用一個近似矩陣代替Hessian矩陣的逆矩陣。
缺點:
1、矩陣儲存量為,因此維度很大時記憶體不可接受;
2、矩陣非稀疏會導致訓練速度慢。
二、L-BFGS演算法
針對BFGS的缺點,主要在於如何合理的估計出一個Hessian矩陣的逆矩陣,L-BFGS的基本思想是隻儲存最近的m次迭代資訊,從而大大降低資料儲存空間。對照BFGS,我重新整理一下用到的公式:
於是估計的Hessian矩陣逆矩陣如下:
把
帶入上式,得:
假設當前迭代為k,只儲存最近的m次迭代資訊,(即:從k-m~k-1),依次帶入,得到:
公式1:
演算法第二步表明了上面推導的最終目的:找到第k次迭代的可行方向,滿足:
為了求可行方向p,有下面的:
two-loop recursion演算法
該演算法的正確性推導:
1、令: ,遞迴帶入q:
相應的:
2、令:
於是:
這個two-loop recursion演算法的結果和公式1*初始梯度的形式完全一樣,這麼做的好處是:
1、只需要儲存、(i=1~m);
2、計算可行方向的時間複雜度從O(n*n)降低到了O(n*m),當m遠小於n時為線性複雜度。
總結L-BFGS演算法的步驟如下:
Step1: 選初始點,允許誤差,儲存最近迭代次數m(一般取6);
Step2: ;
Step3: 如果 則返回最優解,否則轉Step4;
Step4: 計算本次迭代的可行方向:;
Step5: 計算步長,對下面式子進行一維搜尋:
;
Step6: 更新權重x:
;
Step7: if k > m
只保留最近m次的向量對,需要刪除();
Step8: 計算並儲存:
;
Step9: 用two-loop recursion演算法求得:
;
k=k+1,轉Step3。
需要注意的地方,每次迭代都需要一個,實踐當中被證明比較有效的取法為:
三、OWL-QN演算法
1、問題描述
對於類似於Logistic Regression這樣的Log-Linear模型,一般可以歸結為最小化下面這個問題:
其中,第一項為loss function,用來衡量當訓練出現偏差時的損失,可以是任意可微凸函式(如果是非凸函式該演算法只保證找到區域性最優解),後者為regularization term,用來對模型空間進行限制,從而得到一個更“簡單”的模型。
根據對模型引數所服從的概率分佈的假設的不同,regularization term一般有:L2-norm(模型引數服從Gaussian分佈);L1-norm(模型引數服從Laplace分佈);以及其他分佈或組合形式。
L2-norm的形式類似於:
L1-norm的形式類似於:
L1-norm和L2-norm之間的一個最大區別在於前者可以產生稀疏解,這使它同時具有了特徵選擇的能力,此外,稀疏的特徵權重更具有解釋意義。
對於損失函式的選取就不在贅述,看兩幅圖:
圖1 - 紅色為Laplace Prior,黑色為Gaussian Prior
圖2 直觀解釋稀疏性的產生
對LR模型來說損失函式選取凸函式,那麼L2-norm的形式也是的凸函式,根據最優化理論,最優解滿足KKT條件,即有:,但是L1-norm的regularization term顯然不可微,怎麼辦呢?
2、Orthant-Wise Limited-memory Quasi-Newton
OWL-QN主要是針對L1-norm不可微提出的,它是基於這樣一個事實:任意給定一個維度象限,L1-norm 都是可微的,因為此時它是一個線性函式:
圖3 任意給定一個象限後的L1-norm
OWL-QN中使用了次梯度決定搜尋方向,凸函式不一定是光滑而處處可導的,但是它又符合類似梯度下降的性質,在多元函式中把這種梯度叫做次梯度,見維基百科http://en.wikipedia.org/wiki/Subderivative
舉個例子:
圖4 次導數
對於定義域中的任何x0,我們總可以作出一條直線,它通過點(x0, f(x0)),並且要麼接觸f的影象,要麼在它的下方。這條直線的斜率稱為函式的次導數,推廣到多元函式就叫做次梯度。
次導數及次微分:
凸函式f:I→R在點x0的次導數,是實數c使得:
對於所有I內的x。可以證明,在點x0的次導數的集合是一個非空閉區間[a, b],其中a和b是單側極限
它們一定存在,且滿足a ≤ b。所有次導數的集合[a, b]稱為函式f在x0的次微分。
OWL-QN和傳統L-BFGS的不同之處在於:
1)、利用次梯度的概念推廣了梯度
定義了一個符合上述原則的虛梯度,求一維搜尋的可行方向時用虛梯度來代替L-BFGS中的梯度:
怎麼理解這個虛梯度呢?見下圖:
對於非光滑凸函式,那麼有這麼幾種情況:
圖5
圖6
圖7 otherwise
2)、一維搜尋要求不跨越象限
要求更新前權重與更新後權重同方向:
圖8 OWL-QN的一次迭代
總結OWL-QN的一次迭代過程:
–Find vector of steepest descent
–Choose sectant
–Find L-BFGS quadratic approximation
–Jump to minimum
–Project back onto sectant
–Update Hessian approximation using gradient of loss alone
最後OWL-QN演算法框架如下:
與L-BFGS相比,第一步用虛梯度代替梯度,第二、三步要求一維搜尋不跨象限,也就是迭代前的點與迭代後的點處於同一象限,第四步要求估計Hessian矩陣時依然使用loss function的梯度(因為L1-norm的存在與否不影響Hessian矩陣的估計)。
四、參考資料
1、Galen Andrew and Jianfeng Gao. 2007. 《Scalable training of L1-regularized log-linear models》. In Proceedings of ICML, pages 33–40.
3、http://research.microsoft.com/en-us/downloads/b1eb1016-1738-4bd5-83a9-370c9d498a03/default.aspx
from: http://www.cnblogs.com/vivounicorn/archive/2012/06/25/2561071.html
相關文章
- 【演算法】KMP演算法演算法KMP
- 演算法-回溯演算法演算法
- 【JAVA演算法】圖論演算法 -- Dijkstra演算法Java演算法圖論
- 演算法(2)KMP演算法演算法KMP
- 【演算法】遞迴演算法演算法遞迴
- 演算法題:洗牌演算法演算法
- [演算法之回溯演算法]演算法
- Manacher演算法、KMP演算法演算法KMP
- 【演算法】KMP演算法解析演算法KMP
- 介面限流演算法:漏桶演算法&令牌桶演算法演算法
- 前端演算法:快速排序演算法前端演算法排序
- 演算法初探--遞迴演算法演算法遞迴
- BP演算法和LMBP演算法演算法
- 隨機演算法 概率演算法隨機演算法
- STL::演算法::常見演算法演算法
- 常用演算法 插值演算法演算法
- 前向分步演算法 && AdaBoost演算法 && 提升樹(GBDT)演算法 && XGBoost演算法演算法
- c/c++ 通用的(泛型)演算法 之 只讀演算法,寫演算法,排序演算法C++泛型演算法排序
- 介面限流演算法:漏桶演算法&令牌桶演算法&redis限流演算法Redis
- 什麼是演算法?如何學習演算法?演算法入門演算法
- 演算法金 | 突破最強演算法模型,決策樹演算法!!演算法模型
- 分類演算法-AdaBoot 演算法演算法boot
- 演算法(八):圖解KNN演算法演算法圖解KNN
- 演算法那些事之冒泡演算法演算法
- 基礎演算法之排序演算法演算法排序
- 最短路-SPFA演算法&Floyd演算法演算法
- 複習常用演算法_冒泡演算法演算法
- 常用演算法之貪心演算法演算法
- 演算法修養--A*尋路演算法演算法
- 演算法進階(8): EM演算法演算法
- 【JAVA演算法】排序演算法 -- 快速排序Java演算法排序
- 非對稱演算法----RSA演算法演算法
- 演算法篇---氣泡排序演算法演算法排序
- 演算法系列:求冪演算法演算法
- PageRank演算法和HITS演算法演算法
- 最短路演算法之:floyd 演算法演算法
- python機器學習演算法——KNN演算法Python機器學習演算法KNN
- A*演算法演算法