深入FFM原理與實踐

深入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模型,本文章節組織方式如下:

  1. 首先介紹FM的原理。
  2. 其次介紹FFM對FM的改進。
  3. 然後介紹FFM的實現細節。
  4. 最後介紹模型在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的正向相關性在實際問題中是普遍存在的,如“化妝品”類商品與“女”性,“球類運動配件”的商品與“男”性,“電影票”的商品與“電影”品類偏好等。因此,引入兩個特徵的組合是非常有意義的。

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

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

其中,nn 代表樣本的特徵數量,xixi 是第 ii 個特徵的值,w0w0wiwiwijwij 是模型參數。

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

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

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

y(x)=w0+i=1nwixi+i=1nj=i+1nvi,vjxixj(2)(2)y(x)=w0+∑i=1nwixi+∑i=1n∑j=i+1n⟨vi,vj⟩xixj

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

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

i=1nj=i+1nvi,vjxixj=12f=1k(i=1nvi,fxi)2i=1nv2i,fx2i(3)(3)∑i=1n∑j=i+1n⟨vi,vj⟩xixj=12∑f=1k((∑i=1nvi,fxi)2−∑i=1nvi,f2xi2)

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

θy(x)=1,xi,xinj=1vj,fxjvi,fx2i,ifθisw0ifθiswiifθisvi,f∂∂θy(x)={1,ifθisw0xi,ifθiswixi∑j=1nvj,fxj−vi,fxi2,ifθisvi,f

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

FM與其他模型的對比

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

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

相比MF而言,我們把MF中每一項的rating分改寫爲 ruiβu+γi+xTuyirui∼βu+γi+xuTyi,從公式(2)(2)中可以看出,這相當於只有兩類特徵 uu 和 ii 的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中,每一維特徵 xixi,針對其它特徵的每一種field fjfj,都會學習一個隱向量 vi,fjvi,fj。因此,隱向量不僅與特徵相關,也與field相關。也就是說,“Day=26/11/15”這個特徵與“Country”特徵和“Ad_type"特徵進行關聯的時候使用不同的隱向量,這與“Country”和“Ad_type”的內在差異相符,也是FFM中“field-aware”的由來。

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

y(x)=w0+i=1nwixi+i=1nj=i+1nvi,fj,vj,fixixj(4)(4)y(x)=w0+∑i=1nwixi+∑i=1n∑j=i+1n⟨vi,fj,vj,fi⟩xixj

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

下面以一個例子簡單說明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項,如下圖所示。

v1,2,v2,111+v1,3,v3,111+v1,3,v4,111+v1,4,v5,119.99+v2,3,v3,211+v2,3,v4,211+v2,4,v5,219.99+v3,3,v4,311+v3,4,v5,319.99+v4,4,v5,319.99⟨v1,2,v2,1⟩⋅1⋅1+⟨v1,3,v3,1⟩⋅1⋅1+⟨v1,3,v4,1⟩⋅1⋅1+⟨v1,4,v5,1⟩⋅1⋅9.99+⟨v2,3,v3,2⟩⋅1⋅1+⟨v2,3,v4,2⟩⋅1⋅1+⟨v2,4,v5,2⟩⋅1⋅9.99+⟨v3,3,v4,3⟩⋅1⋅1+⟨v3,4,v5,3⟩⋅1⋅9.99+⟨v4,4,v5,3⟩⋅1⋅9.99

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

FFM實現

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

ϕ(w,x)=j1,j2C2wj1,f2,wj2,f1xj1xj2(5)(5)ϕ(w,x)=∑j1,j2∈C2⟨wj1,f2,wj2,f1⟩xj1xj2

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

minwi=1Llog(1+exp{yiϕ(w,xi)})+λ2w2minw∑i=1Llog⁡(1+exp⁡{−yiϕ(w,xi)})+λ2∥w∥2

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

參考 Algorithm1Algorithm1, 下面簡單解釋一下FFM的SGD優化過程。
算法的輸入 trtrvavapapa 分別是訓練樣本集、驗證樣本集和訓練參數設置。

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

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

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

L=Lerr+Lreg=log(1+exp{yiϕ(w,xi)})+λ2w2L=Lerr+Lreg=log⁡(1+exp⁡{−yiϕ(w,xi)})+λ2∥w∥2

Lw=Lerrϕϕw+Lregw∂L∂w=∂Lerr∂ϕ⋅∂ϕ∂w+∂Lreg∂w

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

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

wj1,f2=wj1,f2η1+t(gtwj1,f2)2gwj1,f2wj1,f2′=wj1,f2−η1+∑t(gwj1,f2t)2⋅gwj1,f2

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

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

第四,SSE3指令並行編程。SSE3全稱爲數據流單指令多數據擴展指令集3,是CPU對數據層並行的關鍵指令,主要用於多媒體和遊戲的應用程序中[13]。SSE3指令採用128位的寄存器,同時操作4個單精度浮點數或整數。SSE3指令的功能非常類似於向量運算。例如,aa 和 bb 採用SSE3指令相加(aa 和 bb 分別包含4個數據),其功能是 aa 中的4個元素與 bb 中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訓練預估模型,並測試模型的性能。

  #(field) #(feature) AUC Logloss
站內CTR 39 2456 0.77 0.38
站內CVR 67 2441 0.92 0.13

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

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

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

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

第三,省略零值特徵。從FFM模型的表達式(4)(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
發佈了33 篇原創文章 · 獲贊 32 · 訪問量 104萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章