深入FFM原理與實踐

      FM和FFM模型是最近幾年提出的模型,憑藉其在數據量比較大並且特徵稀疏的情況下,仍然能夠得到優秀的性能和效果的特性,屢次在各大公司舉辦的CTR預估比賽中獲得不錯的戰績。美團點評技術團隊在搭建DSP的過程中,探索並使用了FM和FFM模型進行CTR和CVR預估,並且取得了不錯的效果。本文旨在把我們對FM和FFM原理的探索和應用的經驗介紹給有興趣的讀者。

前言

      在計算廣告領域,點擊率CTR(click-through rate)和轉化率CVR(conversion rate)是衡量廣告流量的兩個關鍵指標。準確的估計CTR、CVR對於提高流量的價值,增加廣告收入有重要的指導作用。預估CTR/CVR,業界常用的方法有人工特徵工程 + LR(Logistic Regression)、GBDT(Gradient Boosting Decision Tree) + LR[1][2][3]、FM(Factorization Machine)[2][7]和FFM(Field-aware Factorization Machine)[9]模型。在這些模型中,FM和FFM近年來表現突出,分別在由Criteo和Avazu舉辦的CTR預測競賽中奪得冠軍[4][5]

      考慮到FFM模型在CTR預估比賽中的不俗戰績,美團點評技術團隊在搭建DSP(Demand Side Platform)[6]平臺時,在站內CTR/CVR的預估上使用了該模型,取得了不錯的效果。本文是基於對FFM模型的深度調研和使用經驗,從原理、實現和應用幾個方面對FFM進行探討,希望能夠從原理上解釋FFM模型在點擊率預估上取得優秀效果的原因。因爲FFM是在FM的基礎上改進得來的,所以我們首先引入FM模型,本文章節組織方式如下:

  1. 首先介紹FM的原理。
  2. 其次介紹FFM對FM的改進。
  3. 然後介紹FFM的實現細節。
  4. 最後介紹模型在DSP場景的應用。

FM原理

      FM(Factorization Machine)是由Konstanz大學Steffen Rendle(現任職於Google)於2010年最早提出的,旨在解決稀疏數據下的特徵組合問題[7]。下面以一個示例引入FM模型。假設一個廣告分類的問題,根據用戶和廣告位相關的特徵,預測用戶是否點擊了廣告。源數據如下[8]


      "Clicked?"是label,Country、Day、Ad_type是特徵。由於三種特徵都是categorical類型的,需要經過獨熱編碼(One-Hot Encoding)轉換成數值型特徵。


      由上表可以看出,經過One-Hot編碼之後,大部分樣本數據特徵是比較稀疏的。上面的樣例中,每個樣本有7維特徵,但平均僅有3維特徵具有非零值。實際上,這種情況並不是此例獨有的,在真實應用場景中這種情況普遍存在。例如,CTR/CVR預測時,用戶的性別、職業、教育水平、品類偏好,商品的品類等,經過One-Hot編碼轉換後都會導致樣本數據的稀疏性。特別是商品品類這種類型的特徵,如商品的末級品類約有550個,採用One-Hot編碼生成550個數值特徵,但每個樣本的這550個特徵,有且僅有一個是有效的(非零)。由此可見,數據稀疏性是實際問題中不可避免的挑戰。

      One-Hot編碼的另一個特點就是導致特徵空間大。例如,商品品類有550維特徵,一個categorical特徵轉換爲550維數值特徵,特徵空間劇增。

      同時通過觀察大量的樣本數據可以發現,某些特徵經過關聯之後,與label之間的相關性就會提高。例如,“USA”與“Thanksgiving”、“China”與“Chinese New Year”這樣的關聯特徵,對用戶的點擊有着正向的影響。換句話說,來自“China”的用戶很可能會在“Chinese New Year”有大量的瀏覽、購買行爲,而在“Thanksgiving”卻不會有特別的消費行爲。這種關聯特徵與label的正向相關性在實際問題中是普遍存在的,如“化妝品”類商品與“女”性,“球類運動配件”的商品與“男”性,“電影票”的商品與“電影”品類偏好等。因此,引入兩個特徵的組合是非常有意義的。

      多項式模型是包含特徵組合的最直觀的模型。在多項式模型中,特徵 xi xj 的組合採用 xixj 表示,即 xi xj 都非零時,組合特徵 xixj 纔有意義。從對比的角度,本文只討論二階多項式模型。模型的表達式如下

y(x)=w0+i=1nwixi+i=1nj=i+1nwijxixj(1)

      其中,n 代表樣本的特徵數量,xi 是第 i 個特徵的值,w0wiwij 是模型參數。

      從公式(1)可以看出,組合特徵的參數一共有n(n1)2 個,任意兩個參數都是獨立的。然而,在數據稀疏性普遍存在的實際應用場景中,二次項參數的訓練是很困難的。其原因是,每個參數 wij 的訓練需要大量 xi xj 都非零的樣本;由於樣本數據本來就比較稀疏,滿足“xi xj 都非零”的樣本將會非常少。訓練樣本的不足,很容易導致參數 wij 不準確,最終將嚴重影響模型的性能。

      那麼,如何解決二次項參數的訓練問題呢?矩陣分解提供了一種解決思路。在model-based的協同過濾中,一個rating矩陣可以分解爲user矩陣和item矩陣,每個user和item都可以採用一個隱向量表示[8]。比如在下圖中的例子中,我們把每個user表示成一個二維向量,同時把每個item表示成一個二維向量,兩個向量的點積就是矩陣中user對item的打分。

      類似地,所有二次項參數 wij 可以組成一個對稱陣 W(爲了方便說明FM的由來,對角元素可以設置爲正實數),那麼這個矩陣就可以分解爲W=VTVV 的第 j 列便是第 j 維特徵的隱向量。換句話說,每個參數 wij=vi,vj,這就是FM模型的核心思想。因此,FM的模型方程爲(本文不討論FM的高階形式)

y(x)=w0+i=1nwixi+i=1nj=i+1nvi,vjxixj(2)

      其中,vi 是第 i 維特徵的隱向量,, 代表向量點積。隱向量的長度爲 kk<<n),包含k 個描述特徵的因子。根據公式(2),二次項的參數數量減少爲kn個,遠少於多項式模型的參數數量。另外,參數因子化使得xhxi 的參數和 xixj 的參數不再是相互獨立的,因此我們可以在樣本稀疏的情況下相對合理地估計FM的二次項參數。具體來說,xhxi xixj 的係數分別爲 vh,vi vi,vj,它們之間有共同項vi。也就是說,所有包含“xi 的非零組合特徵”(存在某個 ji,使得xixj0)的樣本都可以用來學習隱向量vi,這很大程度上避免了數據稀疏性造成的影響。而在多項式模型中,whi wij 是相互獨立的。

      顯而易見,公式(2)是一個通用的擬合方程,可以採用不同的損失函數用於解決迴歸、二元分類等問題,比如可以採用MSE(Mean Square Error)損失函數來求解迴歸問題,也可以採用Hinge/Cross-Entropy損失來求解分類問題。當然,在進行二元分類時,FM的輸出需要經過sigmoid變換,這與Logistic迴歸是一樣的。直觀上看,FM的複雜度是O(kn2)。但是,通過公式(3)的等式,FM的二次項可以化簡,其複雜度可以優化到O(kn)[7]。由此可見,FM可以在線性時間對新樣本作出預測。

i=1nj=i+1nvi,vjxixj=12f=1k(i=1nvi,fxi)2i=1nv2i,fx2i(3)

      我們再來看一下FM的訓練複雜度,利用SGD(Stochastic Gradient Descent)訓練模型。模型各個參數的梯度如下

θy(x)=1,xi,xinj=1vj,fxjvi,fx2i,ifθisw0ifθiswiifθisvi,f

其中,vj,f 是隱向量 vj 的第 f 個元素。由於 nj=1vj,fxj 只與 f 有關,而與 i 無關,在每次迭代過程中,只需計算一次所有 f nj=1vj,fxj,就能夠方便地得到所有vi,f 的梯度。顯然,計算所有 f nj=1vj,fxj 的複雜度是 O(kn);已知nj=1vj,fxj 時,計算每個參數梯度的複雜度是 O(1);得到梯度後,更新每個參數的複雜度是O(1);模型參數一共有nk+n+1 個。因此,FM參數訓練的複雜度也是 O(kn)。綜上可知,FM可以在線性時間訓練和預測,是一種非常高效的模型。

FM與其他模型的對比

      FM是一種比較靈活的模型,通過合適的特徵變換方式,FM可以模擬二階多項式核的SVM模型、MF模型、SVD++模型等[7]

      相比SVM的二階多項式核而言,FM在樣本稀疏的情況下是有優勢的;而且,FM的訓練/預測複雜度是線性的,而二項多項式核SVM需要計算核矩陣,核矩陣複雜度就是N平方。

      相比MF而言,我們把MF中每一項的rating分改寫爲 ruiβu+γi+xTuyi,從公式(2)中可以看出,這相當於只有兩類特徵u  和 i 的FM模型。對於FM而言,我們可以加任意多的特徵,比如user的歷史購買平均值,item的歷史購買平均值等,但是MF只能侷限在兩類特徵。SVD++與MF類似,在特徵的擴展性上都不如FM,在此不再贅述。

FFM原理

      FFM(Field-aware Factorization Machine)最初的概念來自Yu-Chin Juan(阮毓欽,畢業於中國臺灣大學,現在美國Criteo工作)與其比賽隊員,是他們借鑑了來自Michael Jahrer的論文[14]中的field概念提出了FM的升級版模型。通過引入field的概念,FFM把相同性質的特徵歸於同一個field。以上面的廣告分類爲例,“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”這三個特徵都是代表日期的,可以放到同一個field中。同理,商品的末級品類編碼生成了550個特徵,這550個特徵都是說明商品所屬的品類,因此它們也可以放到同一個field中。簡單來說,同一個categorical特徵經過One-Hot編碼生成的數值特徵都可以放到同一個field,包括用戶性別、職業、品類偏好等。在FFM中,每一維特徵xi,針對其它特徵的每一種fieldfj,都會學習一個隱向量vi,fj。因此,隱向量不僅與特徵相關,也與field相關。也就是說,“Day=26/11/15”這個特徵與“Country”特徵和“Ad_type"特徵進行關聯的時候使用不同的隱向量,這與“Country”和“Ad_type”的內在差異相符,也是FFM中“field-aware”的由來。

      假設樣本的 n 個特徵屬於 f 個field,那麼FFM的二次項有 nf 個隱向量。而在FM模型中,每一維特徵的隱向量只有一個。FM可以看作FFM的特例,是把所有特徵都歸屬到一個field時的FFM模型。根據FFM的field敏感特性,可以導出其模型方程。

y(x)=w0+i=1nwixi+i=1nj=i+1nvi,fj,vj,fixixj(4)

      其中,fj 是第 j 個特徵所屬的field。如果隱向量的長度爲 k,那麼FFM的二次參數有nfk 個,遠多於FM模型的 nk 個。此外,由於隱向量與field相關,FFM二次項並不能夠化簡,其預測複雜度是 O(kn2)

      下面以一個例子簡單說明FFM的特徵組合方式[9]。輸入記錄如下


      這條記錄可以編碼成5個特徵,其中“Genre=Comedy”和“Genre=Drama”屬於同一個field,“Price”是數值型,不用One-Hot編碼轉換。爲了方便說明FFM的樣本格式,我們將所有的特徵和對應的field映射成整數編號。


      那麼,FFM的組合特徵有10項,如下圖所示。


      其中,紅色是field編號,藍色是特徵編號,綠色是此樣本的特徵取值。二次項的係數是通過與特徵field相關的隱向量點積得到的,二次項共有 n(n1)2 個。

FFM實現

      Yu-Chin Juan實現了一個C++版的FFM模型,源碼可從Github下載[10]。這個版本的FFM省略了常數項和一次項,模型方程如下。

ϕ(w,x)=j1,j2C2wj1,f2,wj2,f1xj1xj2(5)

      其中,C2 是非零特徵的二元組合,j1 是特徵,屬於field f1wj1,f2 是特徵 j1 對field f2 的隱向量。此FFM模型採用logistic loss作爲損失函數,和L2懲罰項,因此只能用於二元分類問題。

minwi=1Llog(1+exp{yiϕ(w,xi)})+λ2w2

      其中,yi{1,1} 是第 i 個樣本的label,L 是訓練樣本數量,λ 是懲罰項係數。模型採用SGD優化,優化流程如下。

      參考 Algorithm1, 下面簡單解釋一下FFM的SGD優化過程。

      算法的輸入 trvapa  分別是訓練樣本集、驗證樣本集和訓練參數設置。
  1. 根據樣本特徵數量(tr.n)、field的個數(tr.m)和訓練參數(pa ),生成初始化模型,即隨機生成模型的參數;
  2. 如果歸一化參數 pa.norm  爲真,計算訓練和驗證樣本的歸一化係數,樣本 i 的歸一化係數爲
    R[i]=1X[i]
  3. 對每一輪迭代,如果隨機更新參數 pa.rand 爲真,隨機打亂訓練樣本的順序;
  4. 對每一個訓練樣本,執行如下操作
    • 計算每一個樣本的FFM項,即公式(5)中的輸出ϕ計算每一個樣本的訓練誤差,如算法所示,這裏採用的是交叉熵損失函數
    • 計算每一個樣本的訓練誤差,如算法所示,這裏採用的是交叉熵損失函數 log(1+eϕ)
    • 利用單個樣本的損失函數計算梯度 gΦ,再根據梯度更新模型參數;,再根據梯度更新模型參數;利用單個樣本的損失函數計算梯度gΦ,再根據梯度更新模型參數;,再根據梯度更新模型參數;
  5. 對每一個驗證樣本,計算樣本的FFM輸出,計算驗證誤差;
  6. 重複步驟3~5,直到迭代結束或驗證誤差達到最小。

      在SGD尋優時,代碼採用了一些小技巧,對於提升計算效率是非常有效的。

      第一,梯度分步計算。採用SGD訓練FFM模型時,只採用單個樣本的損失函數來計算模型參數的梯度。

L=Lerr+Lreg=log(1+exp{yiϕ(w,xi)})+λ2w2

Lw=Lerrϕϕw+Lregw

      上面的公式表明,Lerrϕ 與具體的模型參數無關。因此,每次更新模型時,只需計算一次,之後直接調用 Lerrϕ 的值即可。對於更新 nfk 個模型參數,這種方式能夠極大提升運算效率。

      第二,自適應學習率。此版本的FFM實現沒有采用常用的指數遞減的學習率更新策略,而是利用 nfk 個浮點數的臨時空間,自適應地更新學習率。學習率是參考AdaGrad算法計算的[11],按如下方式更新

wj1,f2=wj1,f2η1+t(gtwj1,f2)2gwj1,f2

      其中,wj1,f2 是特徵 j1 對field f2 隱向量的一個元素,元素下標未標出;gwj1,f2 是損失函數對參數 wj1,f2 的梯度;gtwj1,f2 是第 t 次迭代的梯度;η 是初始學習率。可以看出,隨着迭代的進行,每個參數的歷史梯度會慢慢累加,導致每個參數的學習率逐漸減小。另外,每個參數的學習率更新速度是不同的,與其歷史梯度有關,根據AdaGrad的特點,對於樣本比較稀疏的特徵,學習率高於樣本比較密集的特徵,因此每個參數既可以比較快速達到最優,也不會導致驗證誤差出現很大的震盪。

      第三,OpenMP多核並行計算。OpenMP是用於共享內存並行系統的多處理器程序設計的編譯方案,便於移植和多核擴展[12]。FFM的源碼採用了OpenMP的API,對參數訓練過程SGD進行了多線程擴展,支持多線程編譯。因此,OpenMP技術極大地提高了FFM的訓練效率和多核CPU的利用率。在訓練模型時,輸入的訓練參數ns_threads指定了線程數量,一般設定爲CPU的核心數,便於完全利用CPU資源。

      第四,SSE3指令並行編程。SSE3全稱爲數據流單指令多數據擴展指令集3,是CPU對數據層並行的關鍵指令,主要用於多媒體和遊戲的應用程序中[13]。SSE3指令採用128位的寄存器,同時操作4個單精度浮點數或整數。SSE3指令的功能非常類似於向量運算。例如,a b  採用SSE3指令相加(a b 分別包含4個數據),其功能是 a 中的4個元素與 b  中4個元素對應相加,得到4個相加後的值。採用SSE3指令後,向量運算的速度更加快捷,這對包含大量向量運算的FFM模型是非常有利的。

      除了上面的技巧之外,FFM的實現中還有很多調優技巧需要探索。例如,代碼是按field和特徵的編號申請參數空間的,如果選取了非連續或過大的編號,就會造成大量的內存浪費;在每個樣本中加入值爲1的新特徵,相當於引入了因子化的一次項,避免了缺少一次項帶來的模型偏差等。

FFM應用

      在DSP的場景中,FFM主要用來預估站內的CTR和CVR,即一個用戶對一個商品的潛在點擊率和點擊後的轉化率。

      CTR和CVR預估模型都是在線下訓練,然後用於線上預測。兩個模型採用的特徵大同小異,主要有三類:用戶相關的特徵、商品相關的特徵、以及用戶-商品匹配特徵。用戶相關的特徵包括年齡、性別、職業、興趣、品類偏好、瀏覽/購買品類等基本信息,以及用戶近期點擊量、購買量、消費額等統計信息。商品相關的特徵包括所屬品類、銷量、價格、評分、歷史CTR/CVR等信息。用戶-商品匹配特徵主要有瀏覽/購買品類匹配、瀏覽/購買商家匹配、興趣偏好匹配等幾個維度。

      爲了使用FFM方法,所有的特徵必須轉換成“field_id:feat_id:value”格式,field_id代表特徵所屬field的編號,feat_id是特徵編號,value是特徵的值。數值型的特徵比較容易處理,只需分配單獨的field編號,如用戶評論得分、商品的歷史CTR/CVR等。categorical特徵需要經過One-Hot編碼成數值型,編碼產生的所有特徵同屬於一個field,而特徵的值只能是0或1,如用戶的性別、年齡段,商品的品類id等。除此之外,還有第三類特徵,如用戶瀏覽/購買品類,有多個品類id且用一個數值衡量用戶瀏覽或購買每個品類商品的數量。這類特徵按照categorical特徵處理,不同的只是特徵的值不是0或1,而是代表用戶瀏覽或購買數量的數值。按前述方法得到field_id之後,再對轉換後特徵順序編號,得到feat_id,特徵的值也可以按照之前的方法獲得。

      CTR、CVR預估樣本的類別是按不同方式獲取的。CTR預估的正樣本是站內點擊的用戶-商品記錄,負樣本是展現但未點擊的記錄;CVR預估的正樣本是站內支付(發生轉化)的用戶-商品記錄,負樣本是點擊但未支付的記錄。構建出樣本數據後,採用FFM訓練預估模型,並測試模型的性能。


      由於模型是按天訓練的,每天的性能指標可能會有些波動,但變化幅度不是很大。這個表的結果說明,站內CTR/CVR預估模型是非常有效的。

      在訓練FFM的過程中,有許多小細節值得特別關注。

      第一,樣本歸一化。FFM默認是進行樣本數據的歸一化,即 pa.norm 爲真;若此參數設置爲假,很容易造成數據inf溢出,進而引起梯度計算的nan錯誤。因此,樣本層面的數據是推薦進行歸一化的。

      第二,特徵歸一化。CTR/CVR模型採用了多種類型的源特徵,包括數值型和categorical類型等。但是,categorical類編碼後的特徵取值只有0或1,較大的數值型特徵會造成樣本歸一化後categorical類生成特徵的值非常小,沒有區分性。例如,一條用戶-商品記錄,用戶爲“男”性,商品的銷量是5000個(假設其它特徵的值爲零),那麼歸一化後特徵“sex=male”(性別爲男)的值略小於0.0002,而“volume”(銷量)的值近似爲1。特徵“sex=male”在這個樣本中的作用幾乎可以忽略不計,這是相當不合理的。因此,將源數值型特徵的值歸一化到[0,1] 是非常必要的。

      第三,省略零值特徵。從FFM模型的表達式(4)可以看出,零值特徵對模型完全沒有貢獻。包含零值特徵的一次項和組合項均爲零,對於訓練模型參數或者目標值預估是沒有作用的。因此,可以省去零值特徵,提高FFM模型訓練和預測的速度,這也是稀疏樣本採用FFM的顯著優勢。

後記

      本文主要介紹了FFM的思路來源和理論原理,並結合源碼說明FFM的實際應用和一些小細節。從理論上分析,FFM的參數因子化方式具有一些顯著的優勢,特別適合處理樣本稀疏性問題,且確保了較好的性能;從應用結果來看,站內CTR/CVR預估採用FFM是非常合理的,各項指標都說明了FFM在點擊率預估方面的卓越表現。當然,FFM不一定適用於所有場景且具有超越其他模型的性能,合適的應用場景才能成就FFM的“威名”。

參考文獻

  1. http://blog.csdn.net/lilyth_lilyth/article/details/48032119
  2. http://www.cnblogs.com/Matrix_Yao/p/4773221.html
  3. http://www.herbrich.me/papers/adclicksfacebook.pdf
  4. https://www.kaggle.com/c/criteo-display-ad-challenge
  5. https://www.kaggle.com/c/avazu-ctr-prediction
  6. https://en.wikipedia.org/wiki/Demand-side_platform
  7. http://www.algo.uni-konstanz.de/members/rendle/pdf/Rendle2010FM.pdf
  8. http://www.cs.cmu.edu/~wcohen/10-605/2015-guest-lecture/FM.pdf
  9. http://www.csie.ntu.edu.tw/~r01922136/slides/ffm.pdf
  10. https://github.com/guestwalk/libffm
  11. https://en.wikipedia.org/wiki/Stochastic_gradient_descent#AdaGrad
  12. http://openmp.org/wp/openmp-specifications/
  13. http://blog.csdn.net/gengshenghong/article/details/7008704
  14. https://kaggle2.blob.core.windows.net/competitions/kddcup2012/2748/media/Opera.pdf

原文鏈接:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html

發佈了19 篇原創文章 · 獲贊 71 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章