深入FFM原理與實踐
del2z, 大龍 ·2016-03-03 09:00
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模型,本文章節組織方式如下:
- 首先介紹FM的原理。
- 其次介紹FFM對FM的改進。
- 然後介紹FFM的實現細節。
- 最後介紹模型在DSP場景的應用。
FM原理
FM(Factorization Machine)是由Konstanz大學Steffen Rendle(現任職於Google)於2010年最早提出的,旨在解決稀疏數據下的特徵組合問題[7]。下面以一個示例引入FM模型。假設一個廣告分類的問題,根據用戶和廣告位相關的特徵,預測用戶是否點擊了廣告。源數據如下[8]
Clicked? | Country | Day | Ad_type |
---|---|---|---|
1 | USA | 26/11/15 | Movie |
0 | China | 1/7/14 | Game |
1 | China | 19/2/15 | Game |
"Clicked?"是label,Country、Day、Ad_type是特徵。由於三種特徵都是categorical類型的,需要經過獨熱編碼(One-Hot Encoding)轉換成數值型特徵。
Clicked? | Country=USA | Country=China | Day=26/11/15 | Day=1/7/14 | Day=19/2/15 | Ad_type=Movie | Ad_type=Game |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
由上表可以看出,經過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的正向相關性在實際問題中是普遍存在的,如“化妝品”類商品與“女”性,“球類運動配件”的商品與“男”性,“電影票”的商品與“電影”品類偏好等。因此,引入兩個特徵的組合是非常有意義的。
多項式模型是包含特徵組合的最直觀的模型。在多項式模型中,特徵
其中,
從公式
那麼,如何解決二次項參數的訓練問題呢?矩陣分解提供了一種解決思路。在model-based的協同過濾中,一個rating矩陣可以分解爲user矩陣和item矩陣,每個user和item都可以採用一個隱向量表示[8]。比如在下圖中的例子中,我們把每個user表示成一個二維向量,同時把每個item表示成一個二維向量,兩個向量的點積就是矩陣中user對item的打分。
類似地,所有二次項參數
其中,
顯而易見,公式
我們再來看一下FM的訓練複雜度,利用SGD(Stochastic Gradient Descent)訓練模型。模型各個參數的梯度如下
其中,
FM與其他模型的對比
FM是一種比較靈活的模型,通過合適的特徵變換方式,FM可以模擬二階多項式核的SVM模型、MF模型、SVD++模型等[7]。
相比SVM的二階多項式核而言,FM在樣本稀疏的情況下是有優勢的;而且,FM的訓練/預測複雜度是線性的,而二項多項式核SVM需要計算核矩陣,核矩陣複雜度就是N平方。
相比MF而言,我們把MF中每一項的rating分改寫爲
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中,每一維特徵
假設樣本的
其中,
下面以一個例子簡單說明FFM的特徵組合方式[9]。輸入記錄如下
User | Movie | Genre | Price |
---|---|---|---|
YuChin | 3Idiots | Comedy, Drama | $9.99 |
這條記錄可以編碼成5個特徵,其中“Genre=Comedy”和“Genre=Drama”屬於同一個field,“Price”是數值型,不用One-Hot編碼轉換。爲了方便說明FFM的樣本格式,我們將所有的特徵和對應的field映射成整數編號。
Field name | Field index | Feature name | Feature index |
---|---|---|---|
User | 1 | User=YuChin | 1 |
Movie | 2 | Movie=3Idiots | 2 |
Genre | 3 | Genre=Comedy | 3 |
Price | 4 | Genre=Drama | 4 |
Price | 5 |
那麼,FFM的組合特徵有10項,如下圖所示。
其中,紅色是field編號,藍色是特徵編號,綠色是此樣本的特徵取值。二次項的係數是通過與特徵field相關的隱向量點積得到的,二次項共有
FFM實現
Yu-Chin Juan實現了一個C++版的FFM模型,源碼可從Github下載[10]。這個版本的FFM省略了常數項和一次項,模型方程如下。
其中,
其中,
參考
算法的輸入
- 根據樣本特徵數量(
tr.n tr.n)、field的個數(tr.m tr.m)和訓練參數(pa pa),生成初始化模型,即隨機生成模型的參數; - 如果歸一化參數
pa.norm pa.norm 爲真,計算訓練和驗證樣本的歸一化係數,樣本i i 的歸一化係數爲
R[i]=1∥X[i]∥ R[i]=1∥X[i]∥ - 對每一輪迭代,如果隨機更新參數
pa.rand pa.rand 爲真,隨機打亂訓練樣本的順序; - 對每一個訓練樣本,執行如下操作
- 計算每一個樣本的FFM項,即公式
(5) (5)中的輸出ϕ ϕ; - 計算每一個樣本的訓練誤差,如算法所示,這裏採用的是交叉熵損失函數
log(1+eϕ) log(1+eϕ); - 利用單個樣本的損失函數計算梯度
gΦ gΦ,再根據梯度更新模型參數;
- 計算每一個樣本的FFM項,即公式
- 對每一個驗證樣本,計算樣本的FFM輸出,計算驗證誤差;
- 重複步驟3~5,直到迭代結束或驗證誤差達到最小。
在SGD尋優時,代碼採用了一些小技巧,對於提升計算效率是非常有效的。
第一,梯度分步計算。採用SGD訓練FFM模型時,只採用單個樣本的損失函數來計算模型參數的梯度。
上面的公式表明,
第二,自適應學習率。此版本的FFM實現沒有采用常用的指數遞減的學習率更新策略,而是利用
其中,
第三,OpenMP多核並行計算。OpenMP是用於共享內存並行系統的多處理器程序設計的編譯方案,便於移植和多核擴展[12]。FFM的源碼採用了OpenMP的API,對參數訓練過程SGD進行了多線程擴展,支持多線程編譯。因此,OpenMP技術極大地提高了FFM的訓練效率和多核CPU的利用率。在訓練模型時,輸入的訓練參數ns_threads指定了線程數量,一般設定爲CPU的核心數,便於完全利用CPU資源。
第四,SSE3指令並行編程。SSE3全稱爲數據流單指令多數據擴展指令集3,是CPU對數據層並行的關鍵指令,主要用於多媒體和遊戲的應用程序中[13]。SSE3指令採用128位的寄存器,同時操作4個單精度浮點數或整數。SSE3指令的功能非常類似於向量運算。例如,
除了上面的技巧之外,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訓練預估模型,並測試模型的性能。
#(field) | #(feature) | AUC | Logloss | |
---|---|---|---|---|
站內CTR | 39 | 2456 | 0.77 | 0.38 |
站內CVR | 67 | 2441 | 0.92 | 0.13 |
由於模型是按天訓練的,每天的性能指標可能會有些波動,但變化幅度不是很大。這個表的結果說明,站內CTR/CVR預估模型是非常有效的。
在訓練FFM的過程中,有許多小細節值得特別關注。
第一,樣本歸一化。FFM默認是進行樣本數據的歸一化,即
第二,特徵歸一化。CTR/CVR模型採用了多種類型的源特徵,包括數值型和categorical類型等。但是,categorical類編碼後的特徵取值只有0或1,較大的數值型特徵會造成樣本歸一化後categorical類生成特徵的值非常小,沒有區分性。例如,一條用戶-商品記錄,用戶爲“男”性,商品的銷量是5000個(假設其它特徵的值爲零),那麼歸一化後特徵“sex=male”(性別爲男)的值略小於0.0002,而“volume”(銷量)的值近似爲1。特徵“sex=male”在這個樣本中的作用幾乎可以忽略不計,這是相當不合理的。因此,將源數值型特徵的值歸一化到
第三,省略零值特徵。從FFM模型的表達式
後記
本文主要介紹了FFM的思路來源和理論原理,並結合源碼說明FFM的實際應用和一些小細節。從理論上分析,FFM的參數因子化方式具有一些顯著的優勢,特別適合處理樣本稀疏性問題,且確保了較好的性能;從應用結果來看,站內CTR/CVR預估採用FFM是非常合理的,各項指標都說明了FFM在點擊率預估方面的卓越表現。當然,FFM不一定適用於所有場景且具有超越其他模型的性能,合適的應用場景才能成就FFM的“威名”。
參考文獻
- http://blog.csdn.net/lilyth_lilyth/article/details/48032119
- http://www.cnblogs.com/Matrix_Yao/p/4773221.html
- http://www.herbrich.me/papers/adclicksfacebook.pdf
- https://www.kaggle.com/c/criteo-display-ad-challenge
- https://www.kaggle.com/c/avazu-ctr-prediction
- https://en.wikipedia.org/wiki/Demand-side_platform
- http://www.algo.uni-konstanz.de/members/rendle/pdf/Rendle2010FM.pdf
- http://www.cs.cmu.edu/~wcohen/10-605/2015-guest-lecture/FM.pdf
- http://www.csie.ntu.edu.tw/~r01922136/slides/ffm.pdf
- https://github.com/guestwalk/libffm
- https://en.wikipedia.org/wiki/Stochastic_gradient_descent#AdaGrad
- http://openmp.org/wp/openmp-specifications/
- http://blog.csdn.net/gengshenghong/article/details/7008704
- https://kaggle2.blob.core.windows.net/competitions/kddcup2012/2748/media/Opera.pdf