在計算廣告中,CTR是非常重要的一環。對於特征組合來說,業界通用的做法主要有兩大類:FM系列和Tree系列。這里我們來介紹一下FM系列。
在傳統的線性模型中,每個特征都是獨立的,如果需要考慮特征與特征之間的相互作用,可能需要人工對特征進行交叉組合。非線性SVM可以對特征進行核變換,但是在特征高度稀疏的情況下,並不能很好的進行學習。現在有很多分解模型可以學習到特征之間的交互隱藏關系,基本上每個模型都只適用於特定的輸入和場景。推薦系統是一個高度稀疏的數據場景,由此產生了FM系列算法。
本文主要涉及四種FM系列算法:FM,FFM,DeepFM,DeepFFM
因子分解機 (Factorization Machine,簡稱FM)
FM算法用於解決大規模稀疏數據下的特征組合問題。FM可以看做帶特征交叉的LR。
考慮兩階多項式模型,也就是特征兩兩組合的問題,模型表達如下:
其中\(n\)表示樣本的特征數量,這里的特征是離散化后的特征。
然而,在數據稀疏性普遍存在的實際應用場景中,二次項參數的訓練是很困難的。其原因是,每個參數 \(w_ij\) 的訓練需要大量 \(x_i\) 和 \(x_j\) 都非零的樣本;由於樣本數據本來就比較稀疏,滿足“\(x_i\) 和 \(x_j\) 都非零”的樣本將會非常少。訓練樣本的不足,很容易導致參數 \(w_{ij}\) 不准確,最終將嚴重影響模型的性能。
為了解決二階交叉項參數的學習問題,把多項式模型中二階交叉項參數\(w_{ij}\)組成一個對稱矩陣\(W\)(對角元素設為正實數),那么這個矩陣就可以分解。
將每個交叉項參數\(w_{ij}\)用隱向量的內積\(⟨vi,vj⟩\)表示,是FM模型的核心思想。
以二階為例,FM模型表達式:
其中\(v_i\)表示第\(i\)特征的隱向量,\(<\cdot,\cdot>\)表示兩個長度為\(k\)的向量的內積,計算公式為:
參數因子化表示后,使得\(x_h x_i\)的參數與\(x_i x_j\)的參數不再相互獨立。這樣我們就可以在樣本稀疏情況下相對合理的估計FM模型交叉項的參數。
FM模型的復雜度為\(O(kn^2)\),但是通過下面的等價轉換,可以將FM的二次項化簡,其復雜度可優化到\(O(kn)\)。即:
詳細推導如下:
解讀第(1)步到第(2)步,這里用\(A\)表示系數矩陣\(V\)的上三角元素,\(B\)表示對角線上的交叉項系數。由於系數矩陣\(V\)是一個對稱陣,所以下三角與上三角相等,有下式成立:
如果用隨機梯度下降(Stochastic Gradient Descent)法學習模型參數。那么,模型各個參數的梯度如下:
由於\(\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是一個非常高效的模型。
損失函數
- 回歸問題
對於回歸問題,損失函數可取為最小平方誤差,即
- 二分類問題
對於二分類問題(其中標簽$y \in {+1,-1} $),損失函數可取為hinge loss函數 或 logit loss函數
- hinge loss函數
當\(y=+1\)時,
當\(y=-1\)時,
模型訓練好后,就可以利用\(\hat y(x)\)的正負符號來預測\(x\)的分類了。
- logit loss函數
其中\(\sigma(x)=\frac{1}{1+e^{-x}}\)為\(sigmoid\)函數,可見\(\hat y\)和\(y\)越接近,損失$loss(\hat y,y) $就越小。
此外,為了防止過擬合,我們通常會在優化目標函數中加入正則項(如L2正則)。
總結:
-
FM降低了交叉項參數學習不充分的影響
one-hot編碼后的樣本數據非常稀疏,組合特征更是如此。為了解決交叉項參數學習不充分、導致模型有偏或不穩定的問題。作者借鑒矩陣分解的思路:每一維特征用\(k\)維的隱向量表示,交叉項的參數\(w_{ij}\)用對應特征隱向量的內積表示,即\(⟨v_i,v_j\)(也可以理解為平滑技術)。這樣參數學習由之前學習交叉項參數\(w_{ij}\)的過程,轉變為學習\(n\)個單特征對應\(k\)維隱向量的過程。
很明顯,單特征參數(\(k\)維隱向量\({v_i}\))的學習要比交叉項參數\(wij\)學習得更充分。 -
FM提升了模型預估能力
由於FM學習的參數就是單特征的隱向量,那么交叉項的預估結果可以用隱向量內積得到。這樣,即便訓練集中沒有出現交叉項的樣本,FM模型仍然可以用來預估,提升了預估能力。 -
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特征可以包括用戶屬性信息(年齡、性別、職業、收入、地域等),用戶行為信息(興趣、偏好、時間等),上下文信息(位置、內容等)以及其它信息(天氣、交通等)。
其模型表達式為:
其中,\(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兩部分組成,底部共享同樣的輸入。模型可以表示為:
- FM部分
數學表達為:
FM模型可以用神經網絡進行表示,模型輸入\(x=[x_{field1},x_{field2},⋯,x_{fieldm}]\),這是一個\(d\)維的向量,其中\(x_{fieldi}\)即為第\(i\)個\(field\)的特征表示,如果是類別,則為one-hot編碼后的向量,連續值則為它本身。然后對每個field分別進行embedding
值得注意的是,即使各個field的維度是不一樣的,但是它們embedding后長度均為k。
接着FM層即為embedding后結果的內積和一次項的和,最后一層sigmoid后再輸出結果。
- 深度部分
是一個前饋神經網絡,與圖像或語音類的輸入不同,CTR的輸入一般是極其稀疏的,因此需要重新設計網絡結構。在第一層隱藏層之前,引入一個嵌入層來完成輸入向量壓縮到低位稠密向量:
嵌入層的輸出為\(a(0)=[e1,e2,...,em]\),其中\(e_i\)是嵌入的第i個filed,m是field的個數,前向過程將嵌入層的輸出輸入到隱藏層為
其中\(l\)是層數,\(σ\)是激活函數,\(W(l)\)是模型的權重,\(b(l)\)是\(l\)層的偏置
因此,DNN得預測模型表達為:
\(|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的個數)