FM理論與實踐

背景

FM算法(Factor Machine),又叫因子分解機算法。在推薦系統和點擊率預估(CTR預估)中,FM算法有很廣泛的應用。這兩個場景的實質都是根據所提供的一些特徵信息來判斷用戶是否會有點擊行爲,或者說點擊的概率。在推薦系統和CTR預估任務中,通常把LR作爲baseline。

如果直接利用所提供的特徵信息,線性模型將是最簡單直接的方法。如下圖所示,xi 就是某個特徵值,線性模型需要爲每一個特徵值學習一個權重wi,最終的模型預測值就是所有的特徵值乘以這個權重,加起來求和。 公式如下:

如果是邏輯迴歸(LR),需要在上面求和的基礎上套一個sigmoid函數,也就是圖中的黃色曲線。直觀上很好理解,使用sigmoid將線性模型的取值範圍壓縮到0-1,這 樣就可以很容易的判斷是正面的結果還是負面的結果(對應着點擊與不點擊)。

 

在使用LR解決推薦和CTR預估問題中,常常對數據進行大量的特徵工程,構造出大量的單特徵,編碼後送入LR模型,從而預估點擊率。這種線性模型的優勢在於,運算速度快,可解釋性強,在特徵挖掘完備且訓練數據充分的前提下,能夠達到一定的精度。但線性模型的缺點也很多,如:

  1. 模型並未考慮到特徵之間的組合關係。而特徵交叉組合在推薦系統和CTR任務中往往能夠更好地提升模型效果。
  2. 對於類別型(categorical)特徵進行one-hot編碼,具有高度稀疏性,一方面會帶來維度災難問題,另一方面會由於特徵高度稀疏,導致模型無法充分利用這些稀疏特徵。

要使用特徵兩兩交叉組合,最直觀的做法就是直接引入兩兩組合特徵融入到模型中,在線性模型的基礎上得到,可以使用下面的公式表示:

 

然而這樣有兩個比較大的問題,第一,這樣處理組合特徵的參數個數爲n(n-1)/2,如果n=1000(對原始數據連續特徵離散化,並且one-hot編碼,特徵很容易達到此量級),那麼參數個數將達到50w,參數量巨大;第二,由於對原始數據的one-hot處理,數據將特別稀疏,滿足xi,xj都不等於0的個數很少,這樣就很難去學習到參數wij,導致組合特徵的泛化能力差(詳細解釋:由於xi和xj大部分爲0,所以xi*xj也會大部分爲0,假設X=xi*xj,則dy/dwij=X,又因爲X=0,所以w=w+αX=w,梯度爲0,參數無法更新)。

         導致這種情況出現的根源在於:特徵過於稀疏。需要找到一種方法,使得wij的求解不受特徵稀疏性的影響。

FM算法

FM以特徵組合爲切入點,在線性模型的基礎上引入特徵交叉項,彌補了一般線性模型未考慮特徵間關係的缺憾。FM(Factorization Machine)模型對每個特徵學習一個隱向量,由兩個隱向量的內積表示兩個特徵交叉的權重,公式如下:

 

FM算法的本質是利用近似矩陣分解,將參數權重矩陣W分解成兩個向量相乘,從而將參數從平方級別減少到線性級別。

 

vi和vj分別是對於xi這個特徵來說它會學到一個embedding向量,特徵組合權重是通過兩個單特徵各自的embedding的內積呈現的,因爲它內積就是個數值,可以代表它的權重,這就是FM算法。

FM算法最核心的就是後面這個交叉項,爲了計算方便,對該交叉項進行化簡得到:

按照這種化簡之後,FM的最終形式如下:

 

這樣化簡之後,計算就會簡單多了,改寫前,計算y的複雜度爲 ,改寫後計算y的複雜度變爲 O(kn) ,大大提高了模型預測的速度。

FM算法自被提出以來,在推薦系統、CTR和廣告等相關領域取得了巨大突破,由於FM優越的性能表現,後續出現了一系列FM變種模型(如FFM、FNN、AFM、DeepFM、xDeepFM等),從淺層模型到深度推薦模型中都有FM的影子。

 

FM求解

         這裏闡述如何求解FM的模型參數。

         求解FM參數的過程可以採用梯度下降法,爲了對參數進行梯度下降更新,需要計算模型各參數的梯度表達式。

當參數是w0時,

當參數是wi時,

當參數爲vif時,只需要關注模型的高階項,此時,其餘無關的參數可以看作常數:

 

其中:

 

性能分析

FM進行推斷的時間複雜度爲O(kn)。依據參數的梯度表達式,與i無關,在參數更新時可以首先將所有的計算出來,複雜度爲O(kn),後續更新所有參數的時間複雜度均爲O(1),參數量爲1 + k + kn,所以最終訓練的時間複雜度同樣爲O(kn),其中n爲特徵數,k爲隱向量維數。

FM訓練與預測的時間複雜度均爲O(kn),是一種十分高效的模型。

FM缺點

每個特徵只引入了一個隱向量,不同類型特徵之間交叉沒有區分性。FFM模型正是以這一 點作爲切入進行改進。

實踐

FM既可以應用在迴歸任務,也可以應用在分類任務。在分類任務中只需在上面的公式最外層套上sigmoid函數即可,上述解析都是基於迴歸任務來進行推導的。

代碼請參考:https://github.com/jpegbert/code_study/tree/master/FM

注:

  1. 對於迴歸任務,損失函數可以用MSE,對於分類任務損失函數可以用交叉熵(CrossEntry)
  2. 雖然FM可以應用於任意數值類型的數據上,但是需要注意對輸入特徵數值進行預處理。 優先進行特徵歸一化,其次再進行樣本歸一化
  3. FM不僅可以用於rank階段,同時可以用於向量召回

 

參考:

  1. https://mp.weixin.qq.com/s/FkqsLjpqH66nLg2OoDGAgg
  2. https://mp.weixin.qq.com/s/hKRGD02LumttFsJt_WyILQ