1. 程式人生 > >因子分解機(FM) +場感知分解機 (FFM) 入門

因子分解機(FM) +場感知分解機 (FFM) 入門

前言

FM和FFM模型是最近幾年提出的模型,憑藉其在資料量比較大並且特徵稀疏的情況下,仍然能夠得到優秀的效能和效果的特性,屢次在各大公司舉辦的CTR預估比賽中獲得不錯的戰績。在計算廣告領域,點選率CTR(click-through rate)和轉化率CVR(conversion rate)是衡量廣告流量的兩個關鍵指標。準確的估計CTR、CVR對於提高流量的價值,增加廣告收入有重要的指導作用。預估CTR/CVR,業界常用的方法有人工特徵工程 + LR、GBDT+ LR[1][2][3]、FM(Factorization Machine)[2][7]和FFM[9]模型。在這些模型中,FM和FFM近年來表現突出,分別在由Criteo和Avazu舉辦的CTR預測競賽中奪得冠軍

[4][5]

FM原理

FM(Factorization Machine)是由Konstanz大學Steffen Rendle於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的正向相關性在實際問題中是普遍存在的,如“化妝品”類商品與“女”性,“球類運動配件”的商品與“男”性,“電影票”的商品與“電影”品類偏好等。因此,引入兩個特徵的組合是非常有意義的。

多項式模型是包含特徵組合的最直觀的模型。在多項式模型中,特徵 x_i和 x_j的組合採用 x_i x_j表示,即 x_{i}和 x_{j}都非零時,組合特徵x_i x_j才有意義。從對比的角度,本文只討論二階多項式模型。模型的表示式如下

                                                        y(\mathbf{x}) = w_0+ \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n w_{ij} x_i x_j \label{eq:poly}\tag{1}                                             (1)

其中,n代表樣本的特徵數量,x_i是第 i個特徵的值,w_0w_iw_{ij} 是模型引數。

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

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

                                      

類似地,所有二次項引數 w_{ij}可以組成一個對稱陣 W(為了方便說明FM的由來,對角元素可以設定為正實數),那麼這個矩陣就可以分解為 \mathbf{W} = \mathbf{V}^T \mathbf{V}V 的第 j列便是第 j維特徵的隱向量。換句話說,每個引數 w_{ij} = \langle \mathbf{v}_i, \mathbf{v}_j \rangle,這就是FM模型的核心思想。因此,FM的模型方程為(本文不討論FM的高階形式)

                                                 y(\mathbf{x}) = w_0+ \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle \mathbf{v}_i, \mathbf{v}_j \rangle x_i x_j \label{eq:fm}\tag{2}                                   (2)

其中,V_i是第 i維特徵的隱向量,\langle\cdot, \cdot\rangle代表向量點積。隱向量的長度為kk << n),包含 k個描述特徵的因子。根據公式(2),二次項的引數數量減少為 kn個,遠少於多項式模型的引數數量。另外,引數因子化使得 x_h x_i的引數和 x_i x_j的引數不再是相互獨立的,因此我們可以在樣本稀疏的情況下相對合理地估計FM的二次項引數。具體來說,x_h x_i和 x_i x_j的係數分別為 \langle \mathbf{v}_h, \mathbf{v}_i \rangle和 \langle \mathbf{v}_i, \mathbf{v}_j \rangle,它們之間有共同項 \mathbf{v}_i。也就是說,所有包含“x_i的非零組合特徵”(存在某個i\neq j,使得 x_i x_j \neq 0)的樣本都可以用來學習隱向量 \mathbf{v}_i,這很大程度上避免了資料稀疏性造成的影響。而在多項式模型中,w_{hi}和 w_{ij}是相互獨立的。

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

                                     \sum_{i=1}^n \sum_{j=i+1}^n \langle \mathbf{v}_i, \mathbf{v}_j \rangle x_i x_j = \frac{1}{2} \sum_{f=1}^k \left(\left( \sum_{i=1}^n v_{i, f} x_i \right)^2 - \sum_{i=1}^n v_{i, f}^2 x_i^2 \right)                       (3)

下面給出詳細證明過程:

                                    \sum_{i=1}^{n} \sum_{j=i+1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_j \rangle} x_i x_j \\ = \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_j \rangle} x_i x_j - \frac{1}{2} \sum_{i=1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_i \rangle} x_i x_i \\ = \frac{1}{2} \left(\sum_{i=1}^{n} \sum_{j=1}^{n} \sum_{f=1}^{k} v_{i,f} v_{j,f} x_i x_j - \sum_{i=1}^{n} \sum_{f=1}^{k} v_{i,f} v_{i,f} x_i x_i \right) \\ = \frac{1}{2} \sum_{f=1}^{k} {\left \lgroup \left(\sum_{i=1}^{n} v_{i,f} x_i \right) \cdot \left(\sum_{j=1}^{n} v_{j,f} x_j \right) - \sum_{i=1}^{n} v_{i,f}^2 x_i^2 \right \rgroup} \\ = \frac{1}{2} \sum_{f=1}^{k} {\left \lgroup \left(\sum_{i=1}^{n} v_{i,f} x_i \right)^2 - \sum_{i=1}^{n} v_{i,f}^2 x_i^2\right \rgroup}

其中第(1)步到第(2)步,這裡用AA表示係數矩陣VV的上三角元素,BB表示對角線上的交叉項係數。由於係數矩陣VV是一個對稱陣,所以下三角與上三角相等,有下式成立: 

                            A = \frac{1}{2} (2A+B) - \frac{1}{2} B. \quad \underline{ A=\sum_{i=1}^{n} \sum_{j=i+1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_j \rangle} x_i x_j } ; \quad \underline{ B = \frac{1}{2} \sum_{i=1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_i \rangle} x_i x_i }

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

                                                 \frac{\partial}{\partial\theta} y (\mathbf{x}) = \left\{\begin{array}{ll} 1, & \text{if}\; \theta\; \text{is}\; w_0 \\ x_i, & \text{if}\; \theta\; \text{is}\; w_i \\ x_i \sum_{j=1}^n v_{j, f} x_j - v_{i, f} x_i^2, & \text{if}\; \theta\; \text{is}\; v_{i, f} \end{array}\right.                               (4)

其中,v_{j, f} 是隱向量 \mathbf{v}_j 的第 f個元素。由於\sum_{j=1}^n v_{j, f} x_j只與 f有關,而與 i無關,在每次迭代過程中,只需計算一次所有 f 的 \sum_{j=1}^n v_{j, f} x_j,就能夠方便地得到所有 v_{i, f}的梯度。顯然,計算所有f的 \sum_{j=1}^n v_{j, f} x_j的複雜度是O(kn);已知\sum_{j=1}^n v_{j, f} x_j時,計算每個引數梯度的複雜度是 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分改寫為r_{ui} \sim \beta_u + \gamma_i + x_u^T y_i,從公式(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中,每一維特徵 xixi,針對其它特徵的每一種field fjfj,都會學習一個隱向量 vi,fjvi,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(\mathbf{x}) = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle \mathbf{v}_{i, f_j}, \mathbf{v}_{j, f_i} \rangle x_i x_j \label{eq:ffm}\tag{4}                                   (4)

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

下面以一個例子簡單說明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相關的隱向量點積得到的,二次項共有 \frac{n(n-1)}{2}個。

FFM實現

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

                                                            \phi(\mathbf{w}, \mathbf{x}) = \sum_{j_1, j_2 \in \mathcal{C}_2} \langle \mathbf{w}_{j_1, f_2}, \mathbf{w}_{j_2, f_1} \rangle x_{j_1} x_{j_2} \label{eq:phi}\tag{5}                                                (5)

其中,C_2是非零特徵的二元組合,j_1是特徵,屬於field f_1\mathbf{w}_{j_1, f_2}是特徵j_1對field f_2 的隱向量。此FFM模型採用logistic loss作為損失函式,和L2懲罰項,因此只能用於二元分類問題。

                                                        \min_{\mathbf{w}} \sum_{i=1}^L \log \big( 1 + \exp\{ -y_i \phi (\mathbf{w}, \mathbf{x}_i ) \} \big) + \frac{\lambda}{2} \| \mathbf{w} \|^2

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

                                     

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

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

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

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

                           \mathcal{L} = \mathcal{L}_{err} + \mathcal{L}_{reg} = \log \big( 1 + \exp\{ -y_i \phi(\mathbf{w}, \mathbf{x}_i )\} \big) + \frac{\lambda}{2} \| \mathbf{w} \|^2

                                                     \frac{\partial\mathcal{L}}{\partial\mathbf{w}} = \frac{\partial\mathcal{L}_{err}}{\partial\phi}\cdot \frac{\partial\phi}{\partial\mathbf{w}} + \frac{\partial\mathcal{L}_{reg}}{\partial\mathbf{w}}

上面的公式表明,\frac{\partial\mathcal{L}_{err}}{\partial\phi}與具體的模型引數無關。因此,每次更新模型時,只需計算一次,之後直接呼叫 \frac{\partial\mathcal{L}_{err}}{\partial\phi}的值即可。對於更新 nfk個模型引數,這種方式能夠極大提升運算效率。

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

                                                                  w^{'}_{j_1, f_2} = w_{j_1, f_2} - \frac{\eta}{\sqrt{1 + \sum_t (g^t_{w_{j_1, f_2}})^2 }}\cdot g_{w_{j_1, f_2}}

其中,w_{j_1, f_2}是特徵j_1 對field f_2 隱向量的一個元素,元素下標未標出;g_{w_{j_1, f_2}}是損失函式對引數 w_{j_1, f_2}的梯度;g^t_{w_{j_1, f_2}}是第 t 次迭代的梯度;\eta是初始學習率。可以看出,隨著迭代的進行,每個引數的歷史梯度會慢慢累加,導致每個引數的學習率逐漸減小。另外,每個引數的學習率更新速度是不同的,與其歷史梯度有關,根據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指令相加(aa 和 bb 分別包含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訓練預估模型,並測試模型的效能。

#(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)可以看出,零值特徵對模型完全沒有貢獻。包含零值特徵的一次項和組合項均為零,對於訓練模型引數或者目標值預估是沒有作用的。因此,可以省去零值特徵,提高FFM模型訓練和預測的速度,這也是稀疏樣本採用FFM的顯著優勢。

後記

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

參考文獻

相關推薦

因子分解(FM) +感知分解 (FFM) 入門

前言 FM和FFM模型是最近幾年提出的模型,憑藉其在資料量比較大並且特徵稀疏的情況下,仍然能夠得到優秀的效能和效果的特性,屢次在各大公司舉辦的CTR預估比賽中獲得不錯的戰績。在計算廣告領域,點選率CTR(click-through rate)和轉化率CVR(conversi

推薦系統學習筆記之四 Factorization Machines 因子分解 + Field-aware Factorization Machine(FFM) 感知分解

前言 Factorization Machines(FM) 因子分解機是Steffen Rendle於2010年提出,而Field-aware Factorization Machine (FFM) 場感知分解機最初的概念來自於Yu-Chin Juan與其比賽

ML.NET 示例:推薦之感知分解

寫在前面 準備近期將微軟的machinelearning-samples翻譯成中文,水平有限,如有錯漏,請大家多多指正。 如果有朋友對此感興趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn Movie Rec

因子分解FM原理及SGD訓練

1.背景 Steffen Rendle於2010年提出Factorization Machines(下面簡稱FM),併發布開源工具libFM。FM的提出主要對比物件是SVM,與SVM相比,有如下幾個優

因子分解 FMFFM

因子分解機 Factorization Machine 因子分解機主要是考慮了特徵之間的關聯。 FM主要是為了解決資料稀疏的情況下,(而SVM無法解決稀疏問題),特徵怎樣組合的問題。 資料稀疏是指資料的維度很大,但是其中為0的維度很多。推薦系統是常見應用場

Sigmoid非線性啟用函式,FM調頻,膽,HDR的意義

        前幾天家裡買了個二手車子,較老,發現只有FM收音機,但音響效果不錯,車子帶藍芽轉FM,可以手機藍芽播放音樂,但經過幾次轉換以及對FM的質疑,所以懷疑音質是否會劇烈下降,抱著試試的態度放了一個手機上的音樂,結果感動的流淚了,為什麼以前手機帶的高保

查找域內所有的Windows Server 2012 R2的服務器,並區分出哪些是物理,那些是虛擬

powershell 基本命令通過使用Get-Adcomputer和Get-Wmiobject 組合來實現。思路是這樣的,先看一臺服務器的屬性值有什麽可用利用的。[12r2-dc]: PS C:\> Get-ADComputer -Identity 12r2-dc -Properties *Accoun

Hyper-V 2016 系列教程40 使用 PowerShell 實現虛擬自動化和管理虛擬

windows server 2012 2016; hyper-v;虛擬化註:以下內容部分取自微軟官網:可以在 Hyper-V 主機上的 Windows 10 或 Windows Server 技術預覽版虛擬機中使用 PowerShell Direct 運行任意 PowerShell,而無論網絡配置或遠程管理

virtual 將 Ubuntu16.04 設置 網絡橋接,主機與虛擬ping通,虛擬與其他機器ping通

網卡名 拒絕 ati 鏈接 eth0 down inter 技術分享 and http://www.jianshu.com/p/a4dbdb40b72b http://blog.csdn.net/briup_acmer/article/details/72125172

6種品牌打印介紹及打印旗艦店推薦

掃描儀 blank 十大品牌 ron 制造商 lan targe 企業 dia 小朋友上幼兒園了,很開心。老師總是隔三差五的讓帶個照片,做個成長手冊什麽的,這個就老頭疼了,每次都出去打印確實不太方便,要是自己家能有個打印機就好多了,不管什麽時候需要照片,材料什麽的都不必麻煩

51單片和STM32單片的基本命名規則

-m img tex .com ice 目前 集成 閃存 cor 51內核的單片機命名規則,以STC12 5A 60 S2為例 STM32代表ST品牌Cortex-Mx系列內核(ARM)的32位MCU;命名規則如下: STM32 F 103 C 6 T 7 x

Linux虛擬學習環境搭建—虛擬創建

centos6、vmware虛擬機創建 主機環境是Windows8.1,虛擬機軟件用VMware Workstation10,Linux選擇CentOS6.6 x86_64版本。 一:安裝VMware。 準備VMware安裝文件包,點擊安裝,就是在windows環境安裝應用

使用vmware vconverter從物理遷移系統到虛擬P2V(多圖)

ensure 網卡通信 src block 用戶界面 vswitch sp2 winrar select zhuan:https://segmentfault.com/a/1190000002697929 本文完整記錄了如何從物理服務器,保持所有環境配置信息,紋絲不

Linux虛擬學習環境搭建—虛擬安裝

虛擬機安裝接上一篇的Linux虛擬機學習環境搭建—虛擬機創建“ 點擊“開啟此虛擬機”,進入系統安裝界面。Tab鍵可以調整選項,直接選擇第一項,回車。備註:鼠標點擊進入虛擬機,要跳出虛擬機回到主機控制,按下Ctrl+Alt。出現Disc Found界面,用Tab鍵,選擇到Skip選項,回車。備註:此操作是校

獲取本IP及在本IP的基礎上自增1(只針對有一個IP的機器)

turn else data 返回 主機名 add cleanup done get 1、獲取本機IP 1 char* getLocalIP() 2 { 3 WSADATA wsaData; 4 int err = WSAStartup(MAKEW

宿主無法訪問linux虛中的網站

nginx linux 問題現象: Nginx服務已啟動 80端口被nginx監聽 宿主和linux虛機可相互ping通 Linux虛機可用curl訪問網站 宿主無法用瀏覽器訪問網站 排查:1. 查看nginx的access.log發現沒有請求進來由此可判斷是防火墻給擋住了 檢查iptable

來看看最近火爆的在線推幣和在線娃娃

在線推幣機 在線娃娃機 娃娃機 推幣機 遊戲 前端: 成熟的APP+SDK+H5 方案,可定制二次開發硬件:推流方案+硬件主板方案+攝像頭線下:娃娃機 推幣機租賃+娃娃禮品倉儲物流 手機網絡推幣機特點:?1、操作簡單:操作和線下相比簡單一線上抓娃娃機之後,給各大公司帶來的很大的商機,各大公

本地打印和共享打印以及server版本如何創建新用戶

ima 以及 版本 遠程共享 serve 計算機管理 密碼 設備 用戶名 這篇跟大家分享一點打印機的知識內容,我們習慣把打印設備叫打印機,這裏我們按專業角度來講,我們現實中看得見的那是打印設備叫物理打印機,而打印機其實是邏輯驅動,也叫邏輯打印機。首先我們打開兩臺虛擬機,se

virtualBox NAT模式,設置虛擬可上網,宿主可訪問虛擬的方法

設置 PV TP alt mage === box href 想要 環境描述: 宿主機:windows Server 2008 64bit,IPV4地址,有網絡。 宿主機上的主要軟件環境: virtualBox 5.0.24 virtualBox中安裝了

VirtualBox網絡環境配置,宿主與虛擬互聯,同時虛擬也可以使用互聯網

linux image mark 虛擬網卡 pre sco 編輯器 連接 使用 最近在折騰虛擬機,在VirtualBox 上安裝centOS 7 ,安裝過程再次不說互聯網上一大堆,咱們這裏只說虛擬機網絡配置問題。 配置網卡1 在高級裏設置去全部允許 網卡2 高級裏同樣