1. 程式人生 > >各大公司廣泛使用的線上學習演算法FTRL詳解

各大公司廣泛使用的線上學習演算法FTRL詳解

現在做線上學習和CTR常常會用到邏輯迴歸( Logistic Regression),而傳統的批量(batch)演算法無法有效地處理超大規模的資料集和線上資料流,google先後三年時間(2010年-2013年)從理論研究到實際工程化實現的FTRL(Follow-the-regularized-Leader)演算法,在處理諸如邏輯迴歸之類的帶非光滑正則化項(例如1範數,做模型複雜度控制和稀疏化)的凸優化問題上效能非常出色,據聞國內各大網際網路公司都第一時間應用到了實際產品中,我們的系統也使用了該演算法。這裡對FTRL相關發展背景和工程實現的一些指導點做一些介紹,凸優化的理論細節不做詳細介紹,感興趣可以去查閱相應paper,相關paper列表會在文後附上。機器學習並非本人在校時的專業方向,不過在校期間積累的基礎不算太差,而且很多東西也是相通的,鑽研一下基本意思都還能搞明白。當然,有不準確的地方歡迎大家討論指正。

      本文主要會分三個部分介紹,如果對理論產生背景不感興趣的話,可以直接看第3部分的工程實現(這一部分google13年那篇工程化的paper介紹得很詳細):

  1. 相關背景:包括通用性的問題描述、批量演算法、傳統線上學習演算法等
  2. 簡單介紹與FTRL關係比較密切的Truncated Gradient、FOBOS以及RDA(Regularized Dual Averaging)等演算法
  3. FTRL理論公式以及工程實現(對前因後果和理論方面不感興趣的可以直接看這一小節的工程實現部分)

一、相關背景

  【問題描述】

     對於loss函式+正則化的結構風險最小化的優化問題(邏輯迴歸也是這種形式)有兩種等價的描述形式,以1範數為例,分別是:

   a、無約束優化形式的soft regularization formulation:

      b、帶約束項的凸優化問題convex constraint formulation:

       當合理地選擇g時,二者是等價的。這裡提這兩種形式的問題描述,原因在於引出下面無約束優化和帶約束優化問題的不同演算法,對於不同的描述形式,會有一系列相關演算法。

   【批量(batch)演算法】

      批量演算法中每次迭代對全體訓練資料集進行計算(例如計算全域性梯度),優點是精度和收斂還可以,缺點是無法有效處理大資料集(此時全域性梯度計算代價太大),且沒法應用於資料流做線上學習。這裡分無約束優化形式和約束優化(與上面問題描述可以對應起來)兩方面簡單介紹一下一些傳統批量演算法。

      a、無約束優化形式:1、全域性梯度下降,很常用的演算法,就不細說了,每一步求一個目標函式的全域性梯度,用非增學習率進行迭代;2、牛頓法(切線近似)、LBFGS(割線擬牛頓,用之前迭代結果近似Hessian黑塞矩陣的逆矩陣,BFGS似乎是幾個人名的首字母的簡稱)等方法。牛頓和擬牛頓等方法一般對於光滑的正則約束項(例如2範數)效果很好,據說是求解2範數約束的邏輯迴歸類問題最好的方法,應用也比較廣,但是當目標函式帶L1非光滑、帶不可微點的約束項後,牛頓類方法比較無力,理論上需要做修改。感興趣的可以去查查無約束優化的相關數值計算的書,我也沒有更深入研究相關細節,這裡不做重點關注。

      b、不等式約束凸優化形式:1、傳統的不等式約束優化演算法內點法等;2、投影梯度下降(約束優化表示下),gt是subgradient,直觀含義是每步迭代後,迭代結果可能位於約束集合之外,然後取該迭代結果在約束凸集合上的投影作為新的迭代結果(第二個公式中那個符號標識向X的投影):

  【線上演算法】

  如上所述,批量演算法有自身的侷限性,而線上學習演算法的特點是:每來一個訓練樣本,就用該樣本產生的loss和梯度對模型迭代一次,一個一個數據地進行訓練,因此可以處理大資料量訓練和線上訓練。常用的有線上梯度下降(OGD)和隨機梯度下降(SGD)等,本質思想是對上面【問題描述】中的未加和的單個數據的loss函式 L(w,zi)做梯度下降,因為每一步的方向並不是全域性最優的,所以整體呈現出來的會是一個看似隨機的下降路線。典型迭代公式如下:

這裡使用混合正則化項:,例如可能是1範數與2範數強凸項的混合(後面會看到其實很多都是這種混合正則化的格式,而且是有一定直觀含義的)。迭代公式中:gt是loss函式(單點的loss,未加和)的subgradient,與gt相加的那一項是混合正則化項中的第二項的梯度,投影集合C是約束空間(例如可能是1範數的約束空間),跟上面介紹的投影梯度下降類似的做法。

  梯度下降類的方法的優點是精度確實不錯,但是不足相關paper主要提到兩點:

  1、簡單的線上梯度下降很難產生真正稀疏的解,稀疏性在機器學習中是很看重的事情,尤其我們做工程應用,稀疏的特徵會大大減少predict時的記憶體和複雜度。這一點其實很容易理解,說白了,即便加入L1範數(L1範數能引入稀疏解的簡單示例可以產看PRML那本書的第二章,我前面一篇blog的ppt裡也大概提了),因為是浮點運算,訓練出的w向量也很難出現絕對的零。到這裡,大家可能會想說,那還不容易,當計算出的w對應維度的值很小時,我們就強制置為零不就稀疏了麼。對的,其實不少人就是這麼做的,後面的Truncated Gradient和FOBOS都是類似思想的應用;

  2、對於不可微點的迭代會存在一些問題,具體有什麼問題,有一篇paper是這麼說的:the iterates of the subgradient method are very rarely at the points of non-differentiability。我前後看了半天也沒看明白,有熟悉的同學可以指導一下。

二、Truncated Gradient、FOBOS以及RDA(Regularized Dual Averaging)

  上面提到了,稀疏性在機器學習中是很重要的一件事情,下面給出常見的三種做稀疏解的途徑:

  1)、簡單加入L1範數

    –侷限如上面所提,a+b兩個float數很難絕對等於零,無法產生真正稀疏的特徵權重

  2)、在1範數的基礎上做截斷,最直觀沒技術含量的思路,那就設定一個閾值,做截斷來保證稀疏,可以結合L1範數

    –簡單截斷方法,每online訓練K個數據截斷一次,對OGD的迭代結果,每K步做一次截斷置零:

    但是簡單截斷方法有問題:權重小,可能是確實是無用特徵,還或者可能是該特徵才剛被更新一次(例如訓練剛開始的階段、或者訓練資料中包含該特徵的樣本數本來就很少),另外,簡單rounding技術太aggressive了,可能會破壞線上訓練演算法的理論完備性。

    -簡單截斷基礎上,不太aggressive的Truncated gradient (09年的工作),其實後面的FOBOS也可以歸為這一類:

  3)、Black-box wrapper approaches:

    –黑盒的方法去除一些特徵,然後重新訓練的看被消去的特徵是否有效。

    –需要在資料集上對演算法跑多次,所以不太實用

      下面會提一下FOBOS(Forward-Backward Splitting method ,其實應該叫FOBAS的,歷史原因)以及RDA,因為後面的FTRL其實相當於綜合了這兩種演算法的優點:

  a、FOBOS,google和伯克利09年的工作:

    –可以看作truncated gradient的一種特殊形式

    –基本思想:跟projected subgradient方法類似,不過將每一個數據的迭代過程,分解成一個經驗損失梯度下降迭代和一個最優化問題。分解出的第二個最優化問題,有兩項:第一項2範數那一項表示不能離第一步loss損失迭代結果太遠,第二項是正則化項,用來限定模型複雜度抑制過擬合和做稀疏化等。這個最優化問題有一些特殊的性質,從而保證了最終結果的稀疏性和理論上的完備,具體細節感興趣的可以檢視對應paper。我這裡更多關注直觀含義和工程實現,忽略理論方面的內容。

  b、RDA(Regularized dual averaging),微軟10年的工作,更加理論性一些,這裡就直接略過去了,僅對其特點做一個簡單介紹:

    –非梯度下降類方法,屬於更加通用的一個primal-dual algorithmic schema的一個應用

    –克服了SGD類方法所欠缺的exploiting problem structure,especially for problems with explicit regularization。

    –能夠更好地在精度和稀疏性之間做trade-off

  ok,背景和一些鋪墊終於完成了,下面重點進入FTRL的部分。。。

三、FTRL (Follow-the-regularized-Leader)

【發展歷程】

  FTRL的理論推進和工程應用首先要感謝這個人:H. Brendan McMahan, google這哥們兒護了三年的坑,直到13年工程性paper出來。發展歷程和基本說明如下:

    –10年理論性paper,但未顯式地支援正則化項迭代;11年證明regret bound以及引入通用的正則化項;11年另一篇的paper揭示OGD、FOBOS、RDA等演算法與FTRL關係;13年的paper給出了工程性實現,並且附帶了詳細的虛擬碼,開始被大規模應用。

    –可以看作RDA和FOBOS的混合,但在L1範數或者其他非光滑的正則項下,FTRL比前兩者更加有效

【基本思想及迭代公式】

  我簡單畫了個圖:

  與其他線上演算法的迭代公式的對比(其實OGD如何一步步到類似形式的迭代公式的過程,限於時間,這裡就不細說了,最後我會附一篇自己做分享會時做的ppt,裡面有,感興趣的可以下載看看),不同的方法在這種統一的描述形式下,區別點僅在第二項和第三項的處理方式:

  –第一項:梯度或累積梯度;

  –第二項:L1正則化項的處理;

  –第三項:這個累積加和限定了新的迭代結果x不要離已迭代過的解太遠(也即FTRL-Proximal中proximal的含義),或者離0太遠(central),這一項其實也是low regret的需求

【工程實現】

  大家對上面那一大坨前因後果和公式都不感興趣,ok,沒關係,google非常貼心地在13年給出了一篇工程性很強的paper,其實大部分公司使用FTRL的,根本不會關心上面那一大段東西,直接按著虛擬碼寫,調調參,看結果很不錯就可以了。我們公司開始就是這麼搞的,哈哈,不過人總是要有點兒好奇心的不是,深究一下前因後果和基本的理論公式感覺還是挺不同的。

  邏輯迴歸下的per-coordinate FTRL_Proximal的虛擬碼如下,在公式表達的基礎上做了一些變換和實現上的trick,細節paper裡有,大家在自己做實現的時候,可以在實際資料集上再並行加加速:

  四個引數的設定結合paper裡的指導意見以及反覆實驗測試,找一組適合自己問題的引數就可以了。這裡我想提一點,即上面所謂的per-coordinate,其意思是FTRL是對w每一維分開訓練更新的,每一維使用的是不同的學習速率,也是上面程式碼中lamda2之前的那一項。與w所有特徵維度使用統一的學習速率相比,這種方法考慮了訓練樣本本身在不同特徵上分佈的不均勻性,如果包含w某一個維度特徵的訓練樣本很少,每一個樣本都很珍貴,那麼該特徵維度對應的訓練速率可以獨自保持比較大的值,每來一個包含該特徵的樣本,就可以在該樣本的梯度上前進一大步,而不需要與其他特徵維度的前進步調強行保持一致。

【工程實現中的memory saving策略】

  這裡對google所提的一些節省記憶體的實現細節做一個介紹

  • Predict時的memory saving:

    –L1範數加策略,訓練結果w很稀疏,在用w做predict的時候節省了記憶體,很直觀,不細說了

  • Training時的memory saving:
  1. 線上丟棄訓練資料中很少出現的特徵(probabilistic feature inclusion),但是對於online set,對全資料進行pre-process檢視哪些特徵出現地很少、或者哪些特徵無用,是代價很大的事情,所以要想訓練的時候就做稀疏化,就要想一些線上的方法(FTRL分開更新的w各維度,每一維不同的步長,per-coordinate)

    1)Poisson Inclusion:對某一維度特徵所來的訓練樣本,以p的概率接受並更新模型;

    2)Bloom Filter Inclusion:用bloom filter從概率上做某一特徵出現k次才更新

  2. 浮點數重新編碼

    1)特徵權重不需要用32bit或64bit的浮點數儲存,儲存浪費空間

    2)16bit encoding,但是要注意處理rounding技術對regret帶來的影響

  3. 訓練若干相似model

    1)對同一份訓練資料序列,同時訓練多個相似的model

    2)這些model有各自獨享的一些feature,也有一些共享的feature

    3)出發點:有的特徵維度可以是各個模型獨享的,而有的各個模型共享的特徵,可以用同樣的資料訓練。

  4. Single Value Structure(據說有公司已經在實際中這麼搞,大資料量下也能夠保證不錯的auc)

      1)多個model公用一個feature儲存(例如放到cbase或redis中),各個model都更新這個共有的feature結構

      2)對於某一個model,對於他所訓練的特徵向量的某一維,直接計算一個迭代結果並與舊值做一個平均

  5.  使用正負樣本的數目來計算梯度的和(所有的model具有同樣的N和P)

  6. Subsampling Training Data

    1)在實際中,CTR遠小於50%,所以正樣本更加有價值。通過對訓練資料集進行subsampling,可以大大減小訓練資料集的大小

    2)正樣本全部採(至少有一個廣告被點選的query資料),負樣本使用一個比例r取樣(完全沒有廣告被點選的query資料)。但是直接在這種取樣上進行訓練,會導致比較大的biased prediction

    3)解決辦法:訓練的時候,對樣本再乘一個權重。權重直接乘到loss上面,從而梯度也會乘以這個權重。

    先採樣減少負樣本數目,在訓練的時候再用權重彌補負樣本,非常不錯的想法。

【References】

我大概標註了一下各篇paper的主要內容,感興趣的可以有選擇性地看一下,如果只關注工程實現,看標紅的那篇就ok了:

[1] J. Langford, L. Li, and T. Zhang. Sparse online learning via truncated gradient.JMLR, 10, 2009. (截斷梯度的paper)

[2] H. B. McMahan. Follow-the-regularized-leader and mirror descent: Equivalence theorems and L1 regularization. In AISTATS, 2011 (FOBOS、RDA、FTRL等各種方法對比的paper)

[3] L. Xiao. Dual averaging method for regularized stochastic learning and online optimization. In NIPS, 2009 (RDA方法)

[4] J. Duchi and Y. Singer. Efficient learning using forward-backward splitting. In Advances in Neural Information Processing Systems 22, pages 495{503. 2009. (FOBOS方法)

[5] H. Brendan McMahan, Gary Holt, D. Sculley, Michael Young, Dietmar Ebner, Julian Grady, Lan Nie, Todd Phillips, Eugene Davydov, Daniel Golovin, Sharat Chikkerur, Dan Liu, Martin Wattenberg, Arnar Mar Hrafnkelsson, Tom Boulos, Jeremy Kubica, Ad Click Prediction: a View from the Trenches, Proceedings of the 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD) (2013)(這篇是那篇工程性的paper)

[6] H. Brendan McMahan. A unied analysis of regular-ized dual averaging and composite mirror descent with implicit updates. Submitted, 2011 (FTRL理論發展,regret bound和加入通用正則化項)

[7] H. Brendan McMahan and Matthew Streeter. Adap-tive bound optimization for online convex optimiza-tion. InCOLT, 2010 (開始的那篇理論性paper)