FM系列


在計算廣告中,CTR是非常重要的一環。對於特征組合來說,業界通用的做法主要有兩大類:FM系列和Tree系列。這里我們來介紹一下FM系列。
在傳統的線性模型中,每個特征都是獨立的,如果需要考慮特征與特征之間的相互作用,可能需要人工對特征進行交叉組合。非線性SVM可以對特征進行核變換,但是在特征高度稀疏的情況下,並不能很好的進行學習。現在有很多分解模型可以學習到特征之間的交互隱藏關系,基本上每個模型都只適用於特定的輸入和場景。推薦系統是一個高度稀疏的數據場景,由此產生了FM系列算法。
本文主要涉及四種FM系列算法:FM,FFM,DeepFM,DeepFFM

因子分解機 (Factorization Machine,簡稱FM)

FM算法用於解決大規模稀疏數據下的特征組合問題。FM可以看做帶特征交叉的LR。
考慮兩階多項式模型,也就是特征兩兩組合的問題,模型表達如下:

\[\hat y(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 \]

其中\(n\)表示樣本的特征數量,這里的特征是離散化后的特征。
然而,在數據稀疏性普遍存在的實際應用場景中,二次項參數的訓練是很困難的。其原因是,每個參數 \(w_ij\) 的訓練需要大量 \(x_i\)\(x_j\) 都非零的樣本;由於樣本數據本來就比較稀疏,滿足“\(x_i\)\(x_j\) 都非零”的樣本將會非常少。訓練樣本的不足,很容易導致參數 \(w_{ij}\) 不准確,最終將嚴重影響模型的性能。
為了解決二階交叉項參數的學習問題,把多項式模型中二階交叉項參數\(w_{ij}\)組成一個對稱矩陣\(W\)(對角元素設為正實數),那么這個矩陣就可以分解。

將每個交叉項參數\(w_{ij}\)用隱向量的內積\(⟨vi,vj⟩\)表示,是FM模型的核心思想。

以二階為例,FM模型表達式:

\[\hat y(x) = w_0+\sum_{i=1}^n w_i x_i +\sum_{i=1}^n \sum_{j=i+1}^n ⟨vi,vj⟩ x_i x_j \]

其中\(v_i\)表示第\(i\)特征的隱向量,\(<\cdot,\cdot>\)表示兩個長度為\(k\)的向量的內積,計算公式為:

\[⟨vi,vj⟩:=\sum_{f=1}^k v_{i,f} \cdot v_{j,f} \]

參數因子化表示后,使得\(x_h x_i\)的參數與\(x_i x_j\)的參數不再相互獨立。這樣我們就可以在樣本稀疏情況下相對合理的估計FM模型交叉項的參數。
FM模型的復雜度為\(O(kn^2)\),但是通過下面的等價轉換,可以將FM的二次項化簡,其復雜度可優化到\(O(kn)\)。即:

\[\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 \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} \qquad \]

詳細推導如下:

\[\begin{aligned} & \sum_{i=1}^{n} \sum_{j=i+1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_j \rangle} x_i x_j \qquad\qquad\qquad\qquad\qquad\qquad(1)\\ = & \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 \qquad\qquad\;\;(2)\\ = & \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) \qquad\,(3) \\ = & \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} \quad\;\;\,(4) \\ = & \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} \qquad\qquad\qquad\;\;(5) \end{aligned} \]

解讀第(1)步到第(2)步,這里用\(A\)表示系數矩陣\(V\)的上三角元素,\(B\)表示對角線上的交叉項系數。由於系數矩陣\(V\)是一個對稱陣,所以下三角與上三角相等,有下式成立:

\[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 } \quad \]

如果用隨機梯度下降(Stochastic Gradient Descent)法學習模型參數。那么,模型各個參數的梯度如下:

\[\frac{\partial}{\partial \theta} y(\mathbf{x}) = \begin{cases} 1, & \text{if}\; \theta\; \text{is}\; w_0 \text{(常數項)} \\ x_i & \text{if}\; \theta\; \text{is}\; w_i \text{(線性項)} \\ 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} \text{(交叉項)} \end{cases} \]

由於\(\sum_{j=1}^{n} v_{j,f} x_j\)只與\(f\)有關,在參數迭代過程中,只需要計算第一次所有\(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(n)\);得到梯度后,更新每個參數的復雜度是 \(O(1)\);模型參數一共有\(nk+n+1\)個。因此,FM參數訓練的時間復雜度為\(O(kn)\)
綜上可知,FM算法可以在線性時間內完成模型訓練,以及對新樣本做出預測,所以說FM是一個非常高效的模型。

損失函數

  • 回歸問題
    對於回歸問題,損失函數可取為最小平方誤差,即

\[loss(\hat y,y) = (\hat y -y)^2 \]

  • 二分類問題
    對於二分類問題(其中標簽$y \in {+1,-1} $),損失函數可取為hinge loss函數 或 logit loss函數
  1. hinge loss函數

\[loss(\hat y,y) = max \{ 0,1-y \hat y \}, \]

\(y=+1\)時,

\[loss(\hat y,y) = max \{ 0,1- \hat y \}= \begin{cases} 0,\ \ \ \ \ \ \ \ \ \ \ \ \hat y \geq 1; \\ 1-\hat y,\ \ \ \ \ \hat y < 1; \end{cases} \]

\(y=-1\)時,

\[loss(\hat y,y) = max \{ 0,1+ \hat y \}= \begin{cases} 0,\ \ \ \ \ \ \ \ \ \ \ \ \hat y \leq -1; \\ 1+\hat y,\ \ \ \ \ \hat y > -1; \end{cases} \]

模型訓練好后,就可以利用\(\hat y(x)\)的正負符號來預測\(x\)的分類了。

  1. logit loss函數

\[loss(\hat y,y) = - \ln \sigma (\hat y y) \]

其中\(\sigma(x)=\frac{1}{1+e^{-x}}\)\(sigmoid\)函數,可見\(\hat y\)\(y\)越接近,損失$loss(\hat y,y) $就越小。

此外,為了防止過擬合,我們通常會在優化目標函數中加入正則項(如L2正則)。

總結:

  1. FM降低了交叉項參數學習不充分的影響
    one-hot編碼后的樣本數據非常稀疏,組合特征更是如此。為了解決交叉項參數學習不充分、導致模型有偏或不穩定的問題。作者借鑒矩陣分解的思路:每一維特征用\(k\)維的隱向量表示,交叉項的參數\(w_{ij}\)用對應特征隱向量的內積表示,即\(⟨v_i,v_j\)(也可以理解為平滑技術)。這樣參數學習由之前學習交叉項參數\(w_{ij}\)的過程,轉變為學習\(n\)個單特征對應\(k\)維隱向量的過程。
    很明顯,單特征參數(\(k\)維隱向量\({v_i}\))的學習要比交叉項參數\(wij\)學習得更充分。

  2. FM提升了模型預估能力
    由於FM學習的參數就是單特征的隱向量,那么交叉項的預估結果可以用隱向量內積得到。這樣,即便訓練集中沒有出現交叉項的樣本,FM模型仍然可以用來預估,提升了預估能力。

  3. FM提升了參數學習效率
    這個顯而易見,參數個數由\((n^2+n+1)\)變為\((nk+n+1)\)個,模型訓練復雜度也由\(O(mn^2)\))變為\(O(mnk)\)\(m\)為訓練樣本數。對於訓練樣本和特征數而言,都是線性復雜度。
    此外,就FM模型本身而言,它是在多項式模型基礎上對參數的計算做了調整,因此也有人把FM模型稱為多項式的廣義線性模型,也是恰如其分的。

FM模型對稀疏數據有更好的學習能力,通過交互項可以學習特征之間的關聯關系,並且保證了學習效率和預估能力。

FM vs SVM

SVM和FM的主要區別在於:

  • SVM的二元特征交叉參數是獨立的,而FM的二元特征交叉參數是兩個k維的向量\(v_i\)\(v_j\),交叉參數就不是獨立的,而是相互影響的。
  • FM可以在原始形式下進行優化學習,而基於kernel的非線性SVM通常需要在對偶形式下進行
  • FM的模型預測是與訓練樣本獨立,而SVM則與部分訓練樣本有關,即支持向量

FM vs LR

Fm學習的是特征的隱向量,沒有出現的特征也可以通過隱向量內積得到,打破了特征之間的獨立性。LR學習的是組合特征的權重,沒有出現的組合特征,權重無法學習。簡單理解就是數據太稀疏了,\(x_i*x_j\)的樣本不一定存在,LR就無法學習\(w_{ij}\)

場感知分解機(Field-aware Factorization Machine ,簡稱FFM)

在CTR預估中,通常會遇到one-hot類型的變量,會導致數據特征的稀疏。未解決這個問題,FFM在FM的基礎上進一步改進,在模型中引入類別的概念,即field。將同一個field的特征單獨進行one-hot,因此在FFM中,每一維特征都會針對其他特征的每個field,分別學習一個隱變量,該隱變量不僅與特征相關,也與field相關。假設樣本的n個特征屬於f個field,那么FFM的二次項有nf個隱向量。而在FM模型中,每一維特征的隱向量只有一個。FM可以看做FFM的特例,把所有特征都歸屬到一個field的FFM模型。通過引入field的概念,FFM把相同性質的特征歸於同一個field。
同一個categorical特征可以包括用戶屬性信息(年齡、性別、職業、收入、地域等),用戶行為信息(興趣、偏好、時間等),上下文信息(位置、內容等)以及其它信息(天氣、交通等)。

其模型表達式為:

\[\hat{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 \qquad \]

其中,\(fj\)是第\(j\)個特征所屬的field。如果隱向量的長度為\(k\),那么FFM的二交叉項參數就有n\(fk\)個,遠多於FM模型的\(nk\)個。此外,由於隱向量與field相關,FFM的交叉項並不能夠像FM那樣做化簡,其預測復雜度為\(O(kn^2)\)

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,特征的值也可以按照之前的方法獲得。

實踐注意項

  • 樣本歸一化:FFM默認是進行樣本數據的歸一化,即 為真;若此參數設置為假,很容易造成數據inf溢出,進而引起梯度計算的nan錯誤。因此,樣本層面的數據是推薦進行歸一化的。
  • 特征歸一化:CTR/CVR模型采用了多種類型的源特征,包括數值型和categorical類型等。但是,categorical類編碼后的特征取值只有0或1,較大的數值型特征會造成樣本歸一化后categorical類生成特征的值非常小,沒有區分性。例如,一條用戶-商品記錄,用戶為“男”性,商品的銷量是5000個(假設其它特征的值為零),那么歸一化后特征“sex=male”(性別為男)的值略小於0.0002,而“volume”(銷量)的值近似為1。特征“sex=male”在這個樣本中的作用幾乎可以忽略不計,這是相當不合理的。因此,將源數值型特征的值歸一化到 是非常必要的。
  • 省略零值特征:從FFM模型的表達式可以看出,零值特征對模型完全沒有貢獻。包含零值特征的一次項和組合項均為零,對於訓練模型參數或者目標值預估是沒有作用的。因此,可以省去零值特征,提高FFM模型訓練和預測的速度,這也是稀疏樣本采用FFM的顯著優勢。

實現FM & FFM的最流行的python庫有:LibFM、LibFFM、xlearn和tffm。其中,xLearn是一款高性能,易於使用且可擴展的機器學習軟件包,包括FM和FFM模型,可用於大規模解決機器學習問題。xlearn比libfm和libffm庫快得多,並為模型測試和調優提供了更好的功能。

DeepFM

FM通過對於每一位特征的隱變量內積來提取特征組合,最后的結果也不錯,雖然理論上FM可以對高階特征組合進行建模,但實際上因為計算復雜度原因,一般都只用到了二階特征組合。對於高階特征組合來說,我們很自然想到多層神經網絡DNN。
DeepFM目的是同時學習低階和高階的特征交叉,主要由FM和DNN兩部分組成,底部共享同樣的輸入。模型可以表示為:

\[\hat{y} = sigmoid(y_{FM}+y_{DNN}) \]

DeepFM

  1. FM部分
    數學表達為:

\[y_{FM} = w_0+\sum_{i=1}^n w_i x_i +\sum_{i=1}^n \sum_{j=i+1}^n ⟨vi,vj⟩ x_i x_j \]

FM模型可以用神經網絡進行表示,模型輸入\(x=[x_{field1},x_{field2},⋯,x_{fieldm}]\),這是一個\(d\)維的向量,其中\(x_{fieldi}\)即為第\(i\)\(field\)的特征表示,如果是類別,則為one-hot編碼后的向量,連續值則為它本身。然后對每個field分別進行embedding
DeepFM FM部分
值得注意的是,即使各個field的維度是不一樣的,但是它們embedding后長度均為k。
接着FM層即為embedding后結果的內積和一次項的和,最后一層sigmoid后再輸出結果。

  1. 深度部分
    是一個前饋神經網絡,與圖像或語音類的輸入不同,CTR的輸入一般是極其稀疏的,因此需要重新設計網絡結構。在第一層隱藏層之前,引入一個嵌入層來完成輸入向量壓縮到低位稠密向量:

嵌入層的輸出為\(a(0)=[e1,e2,...,em]\),其中\(e_i\)是嵌入的第i個filed,m是field的個數,前向過程將嵌入層的輸出輸入到隱藏層為

\[a(l+1)=σ(W^{(l)}a^{(l)}+b^{(l)}) \]

其中\(l\)是層數,\(σ\)是激活函數,\(W(l)\)是模型的權重,\(b(l)\)\(l\)層的偏置
因此,DNN得預測模型表達為:

\[y_{DNN} = W^{|H|+1} \cdot a^{|H|} + b^{|H|+1} \]

\(|H|\)為隱藏層層數

有兩個有趣的特性:
1) 盡管不同field的輸入長度不同,但是embedding之后向量的長度均為k
2) 在FM中得到的隱變量\(V_{ik}\)現在作為嵌入層網絡的權重

Embedding層的隱式向量在(殘差反向傳播)訓練時可以同時接受到深度部分和FM部分的信息,從而使Embedding層的信息表達更加准確而最終提升推薦效果。
需要指出的是,FM部分與深度部分共享相同的embedding帶來了兩個好處:
1.從原始數據中同時學習到了低維與高維特征
2.不再需要特征工程。而Wide&Deep Model需要

DeepFFM

類似於FFM對於FM模型來說,划分了field,對於不同的field內積時采用對應的隱向量。同樣可以把DeepFM進行進化為DeepFFM,即將每一個field embedding為m個維度為k的隱向量(m為field的個數)


免責聲明!

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



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