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


 轉載請注明本文鏈接:http://www.cnblogs.com/EE-NovRain/p/3810737.html 

  現在做在線學習和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)

 

后面附上我在組里分享時做的ppt,感興趣的可以看看:http://pan.baidu.com/s/1eQvfo6e 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM