標籤:

L-BFGS演算法剖析

在BFGS演算法或者DFP演算法中,需要保存一個N	imes N的矩陣,該矩陣用於表示Hessian的逆矩陣的近似。其中N表示特徵維度。當特徵維度較高時,這個矩陣會超級佔用內存。例如在CTR預估等場景中,特徵動輒百w到千w,存儲這樣一個巨大的矩陣,需要的內存往往一般伺服器都無法滿足。因此研究者們提出了一種近似方法來解決這個問題,這就是L-BFGS,L表示limited-memory或者limited-storage。

其基本思想是,不再存儲Hessian矩陣(其實是逆矩陣),轉而存儲中間的一些信息,當然中間的信息量可能也很大,那就只保存最新的一些,通過他們推導計算出Hessian矩陣。這樣,其與原有的實現邏輯丟失了一些,所以只能是近似演算法,但是怎麼佔用的資源由O(N^2)降到了O(mN),其中m表示最新的m個中間變數。

前面說過,BFGS的最後一步更新的公式為:H_{k+1}=(I-frac{{s_k}{{y_k}^T}}{{{y_k}^T}{s_k}})D_k(I -frac{{y_k}{{s_k}^T}}{{{y_k}^T}{s_k}})+frac{{s_k}{{s_k}^T}}{{{y_k}^T}{s_k}}

可以看到,整個過程只與y_ks_k有關,每次保存這倆個變數,就能恢復每一輪的H_ky_ks_k就是中間保存的變數,其都是n*1的向量。相比巨大的N,其一般小很多,一般在實踐中m多取3到20之間

保存的邏輯很簡單,但是實際操作中,由於最後更新的為特徵的權重x_k,其一般更新形式為x_{k+1}=x_k-{lambda_k}{H_k}{g_k},其中{lambda_k}為更新的一個步長,一般通過一維搜索或信賴域等演算法求得,可參照擬牛頓法之DFP演算法剖析一維搜索部分求得。因此一般,均是採用高效方式求得{H_k}{g_k}

在Numerical Optimization的第7章講述了兩步循環求得{H_k}{g_k}的過程,主要是將遞推的方式進行了公式推導。其步驟如下:

這裡的Lambda f_k即是我們所的g_k,其中
ho是前面H_{k+1}=(I-frac{{s_k}{{y_k}^T}}{{{y_k}^T}{s_k}})D_k(I -frac{{y_k}{{s_k}^T}}{{{y_k}^T}{s_k}})+frac{{s_k}{{s_k}^T}}{{{y_k}^T}{s_k}}中的分母部分,即
ho_k=frac{1}{{{y_k}^T}{s_k}}。 如此更新完後,更新x_{k+1},其它就與BFGS一樣了。

總結

自己在實驗完後,簡單測試幾把,發現其實相較於BFGS,其準確度並沒降低太多。此外,在特徵維度較低時,其實質上每步多了一個恢復H_k的操作,因此效率也並不見得比BFGS高效。但是在特徵維度較高時,其優勢體現就明顯很多。 最後,代碼在github.com/sloth2012/sc,使用仍在github.com/sloth2012/sc。熟悉前面BFGS代碼可以發現,僅是在更新H_k的部分做了些更改,其它部分完全一致。


推薦閱讀:

學一學Transfer Learning
第一章:機器學習在能源互聯網中的應用綜述(一)
self-attention! A Structured Self-attentive Sentence Embedding
A Hierarchical Model of Reviews for Aspect-based Sentiment Analysis
機器學習筆記037 | 多元高斯分布(Multivariate Gaussian Distribution)

TAG:機器學習 |