大家好,我是Jesse,這是我的第一篇專欄文章,以一篇經典的論文FM開始吧:

更好的觀看體驗請點選這裡

原文:《Factorization Machines》

一、問題由來

在計算廣告和推薦系統中,CTR預估(click-through rate)是非常重要的一個環節,判斷一個商品的是否進行推薦需要根據CTR預估的點選率來進行。傳統的邏輯迴歸(LR)模型是一種廣義線性模型,非常容易實現

大規模實時並行

處理,因此在工業界獲得了廣泛應用,但是線性模型的學習能力有限,不能捕獲高階特徵(非線性資訊),而在進行CTR預估時,除了單特徵外,往往要對特徵進行組合。對於特徵組合來說,業界現在通用的做法主要有兩大類:

FM系列與DNN系列

。今天,我們就來分享下FM演算法。

二、為什麼需要FM

1、一方面,特徵組合是許多機器學習建模過程中遇到的問題,如果對特徵直接建模,很有可能會忽略掉特徵與特徵之間的關聯資訊,因此,可以透過構建新的交叉特徵這一特徵組合方式提高模型的效果。

2、另一方面,高維的稀疏矩陣是實際工程中常見的問題,並且直接計算會導致計算量過大,特徵權值更新緩慢。試想一個10000*100的表,每一列都有8種元素,經過one-hot獨熱編碼之後,會產生一個10000*800的表。因此表中每行元素只有100個值為1,700個值為0。特徵空間急劇變大,以淘寶上的item為例,將item進行one-hot編碼以後,樣本空間有一個categorical變為了百萬維的數值特徵,特徵空間一下子暴增一百萬。所以大廠動不動上億維度,就是這麼來的。

而FM的優勢就在於對這兩方面問題的處理。首先是

特徵組合

,透過對兩兩特徵組合,引入交叉項特徵,提高模型得分;其次是應對

高維災難

,透過引入隱向量(且對引數矩陣進行矩陣分解),完成對特徵的引數估計。

三、原理及求解

在看FM演算法前,我們先回顧一下最常見的線性表示式:

計算廣告之CTR預估-FM演算法解析

傳統LR

其中

w_{o}

為初始權值,或者理解為偏置項,

w_{i}

為每個特徵

x_{i}

對應的權值。可以看到,這種線性表示式只描述了每單個特徵與輸出的關係。

而FM的表示式如下,可觀察到,只是在線性表示式後面加入了新的交叉項特徵及對應的權值。

計算廣告之CTR預估-FM演算法解析

FM數學形式

求解過程

從上面的式子可以很容易看出,組合部分的特徵相關引數共有n(n−1)/2個。但是如第二部分所分析,在資料很稀疏的情況下,滿足

x_{i}

x_{j}

都不為0的情況非常少,這樣將導致

w_{ij}

無法透過訓練得出。

為了求出

w_{ij}

,我們對每一個特徵分量

x_{i}

引入輔助向量

v_{i}=(v_{i1},v_{i2}...v_{ik})

。然後,利用

v_{i}v_{j}^{T}

w_{ij}

進行求解(矩陣分解的思路:對於正定矩陣W,存在矩陣V,使得

W=VV^{T}

):

計算廣告之CTR預估-FM演算法解析

輔助向量Vi

那麼

w_{ij}

組成的矩陣可以表示為:

計算廣告之CTR預估-FM演算法解析

這樣,FM的表示式就變為了:

計算廣告之CTR預估-FM演算法解析

可以看到上面這個方程的時間複雜度是

O(kn^{2})

,但是透過下面的變換,會變成線性的時間複雜度O(kn)。在稀疏的情況下,大部分的x中的元素都是0,我們在計算的時候,只需要進行非0值的計算就可以了。

具體推導過程如下:(重要的

化簡

過程)

計算廣告之CTR預估-FM演算法解析

四、引數求解

利用梯度下降法,透過求損失函式對特徵(輸入項)的導數計算出梯度,從而更新權值。設m為樣本個數,θ為權值。

計算廣告之CTR預估-FM演算法解析

其中,

\sum_{j=1}^{n}{V_{j,f}V_{j}}

是和i無關的,可以事先求出來。每個梯度都可以在O(1)時間內求得,整體的引數更新的時間為O(kn)。

五、改進

在FM中,對於特徵

x_{i},x_{j},x_{h}

x_{i}

x_{j}

x_{i}

x_{h}

,都是使用

v_{i}

去和

v_{j}

v_{h}

做內積。但是對於不同的特徵組合,比如天氣與地點,天氣與性別,關聯的程度是不一樣的,都使用同樣的向量去與不同的特徵做內積,會帶來明顯的資訊損失。所以引出了FFM(本系列文章暫時未寫到)。

一個小問題:隱向量

V_{i}

就是embedding vector?

答案:不是,具體計算過程大家可以舉個例推導下。

結論:

我們口中的隱向量

V_{i}

實際上是一個向量組,其形狀為(輸入特徵One-hot後的長度,自定義長度(嵌入向量的長度如k維));

隱向量

V_{i}

代表的並不是embedding vector,而是在對輸入進行embedding vector的向量組,也可理解為是一個權重矩陣;

由輸入xi*

vi得到的向量(維度為1*k

)才是真正的embedding vector。

第一篇博文就到此結束啦,之後會繼續分享計算廣告/推薦系統相關的論文和知識。

實現FM的一個Demo,感興趣的童鞋可以看下我的github。