FFM原理及公式推導


上一篇講了FM(Factorization Machines),今天說一說FFM(Field-aware Factorization Machines )。

回顧一下FM:

\begin{equation}\hat{y}=w_0+\sum_{i=1}^n{w_ix_i}+\sum_{i=1}^n{\sum_{j=i+1}^n{v_i\cdot v_jx_ix_j}}\label{fm}\end{equation}

$\cdot$表示向量的內積。樣本$x$是$n$維向量,$x_i$是第$i$個維度上的值。$v_i$是$x_i$對應的長度為$K$的隱向量,$V$是模型參數,所以所有樣本都使用同一個$V$,即$x_{1,1}$與$x_{2,1}$都使用$v_1$。

在FFM(Field-aware Factorization Machines )中每一維特征(feature)都歸屬於一個特定的field,field和feature是一對多的關系。比如

 field field1年齡 field2城市 field3性別
 feature x1年齡 x2北京 x3上海 x4深圳 x5男 x6女
用戶1 23 1 0 0 1 0
用戶2 31 0 0 1 0 1

1. 對於連續特征,一個特征就對應一個Field。或者對連續特征離散化,一個分箱成為一個特征。比如

field  field1年齡
 feature 小於20 20-30 30-40 大於40
用戶1 0 23 0 0
用戶2 0 0 31 0

 

2. 對於離散特征,采用one-hot編碼,同一種屬性的歸到一個Field

不論是連續特征還是離散特征,它們都有一個共同點:同一個field下只有一個feature的值不是0,其他feature的值都是0。

FFM模型認為$v_i$不僅跟$x_i$有關系,還跟與$x_i$相乘的$x_j$所屬的Field有關系,即$v_i$成了一個二維向量$v_{F\times K}$,$F$是Field的總個數。FFM只保留了(\ref{fm})中的二次項.

\begin{equation}\hat{y}=\sum_{i=1}^n{\sum_{j=i+1}^n{v_{i,fj}\cdot v_{j,fi}x_ix_j}}\label{ffm}\end{equation}

以上文的表格數據為例,計算用戶1的$\hat{y}$

$$\hat{y}=v_{1,f2}\cdot v_{2,f1}x_1x_2+v_{1,f3}\cdot v_{3,f1}x_1x_3+v_{1,f4}\cdot v_{4,f1}x_1x_4+\cdots$$ 

由於$x_2,x_3,x_4$屬於同一個Field,所以$f2,f3,f4$可以用同一個變量來代替,比如就用$f2$。

$$\hat{y}=v_{1,f2}\cdot v_{2,f1}x_1x_2+v_{1,f2}\cdot v_{3,f1}x_1x_3+v_{1,f2}\cdot v_{4,f1}x_1x_4+\cdots$$ 

我們來算一下$\hat{y}$對$v_{1,f2}$的偏導。

$$\frac{\partial{\hat{y}}}{\partial{v_{1,f2}}}=v_{2,f1}x_1x_2+v_{3,f1}x_1x_3+v_{4,f1}x_1x_4$$

等式兩邊都是長度為$K$的向量。

 注意$x_2,x_3,x_4$是同一個屬性的one-hot表示,即$x_2,x_3,x_4$中只有一個為1,其他都為0。在本例中$x_3=x_4=0, x_2=1$,所以

$$\frac{\partial{\hat{y}}}{\partial{v_{1,f2}}}=v_{2,f1}x_1x_2$$

推廣到一般情況:

\begin{equation}\frac{\partial{\hat{y}}}{\partial{v_{i,fj}}}=v_{j,fi}x_ix_j\label{par}\end{equation}

$x_j$屬於Field $fj$,且同一個Field里面的其他$x_m$都等於0。實際項目中$x$是非常高維的稀疏向量,求導時只關注那些非0項即可。

你一定有個疑問:$v$是模型參數,為了求$v$我們采用梯度下降法時需要計算損失函數對$v$的導數,為什么這里要計算$\hat{y}$對$v$的導數?看看分割線下方的內容你就明白了。


 在實際預測點擊率的項目中我們是不會直接使用公式(\ref{ffm})的,通常會再套一層sigmoid函數。公式(\ref{ffm})中的$\hat{y}$我們用$z$來取代。

$$z=\phi(v,x)=\sum_{i=1}^n{\sum_{j=i+1}^n{v_{i,fj}\cdot v_{j,fi}x_ix_j}}$$

由公式(\ref{par})得

$$\frac{\partial{z}}{\partial{v_{i,fj}}}=v_{j,fi}x_ix_j$$

用$a$表示對點擊率的預測值

$$a=\sigma(z)=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-\phi(v,x)}}$$

令$y=0$表示負樣本,$y=1$表示正樣本,$C$表示交叉熵損失函數。根據《神經網絡調優》中的公式(1)(2)可得

$$\frac{\partial C}{\partial z}=a-y=\left\{\begin{matrix}-\frac{1}{1+e^z} & if\ y是正樣本 \\ \frac{1}{1+e^{-z}} & if\ y是負樣本\end{matrix}\right . $$

$$\frac{\partial C}{\partial{v_{i,fj}}}=\frac{\partial C}{\partial z}\frac{\partial{z}}{\partial{v_{i,fj}}}$$

 看完了本博客再去看論文《Field-aware Factorization Machines for CTR Prediction》中的公式推導應該就比較容易了吧,在該論文中他是以$y=1$代表正樣本,$y=-1$代表負樣本,所以才有了3.1節中的

$$\kappa=\frac{\partial C}{\partial z}=\frac{-y}{1+e^{yz}}$$


 

加速計算

關注(\ref{ffm})式,當$x$都是one-hot時可以寫成

$$\sum_{i=1}^n{\sum_{j=i+1}^n{V_{i,fj}V_{j,fi}}}$$

公式通過變形可以減少計算量,這里要分兩種情況:$i$和$j$是否屬於同一個Field。

$i$和$j$不屬於同一個Field

$$\sum_{i\in Filed1}\sum_{j\in Filed2}V_{i,f2}V_{j,f1}=\sum_{i\in Filed1}V_{i,f2}\sum_{j\in Filed2}V_{j,f1}$$ 

舉個例子,比如$a$、$b$、$c$屬於Field1,$d$、$e$屬於Field2,則$ad+ae+bd+de+cd+ce=(a+b+c)(d+e)$。只需要一次乘法。

$i$和$j$屬於同一個Field

\begin{eqnarray*}
\begin{aligned}
\sum_{i=1}\sum_{j=i+1}V_{i,f}V_{j,f}&=\frac{1}{2}\left[\sum_{i=1}\sum_{j=1}V_{i,f}V_{j,f}-\sum_{i=1}V_{i,f}^2\right]\\
&=\frac{1}{2}\left[\sum_{i=1}V_{i,f}\sum_{j=1}V_{j,f}-\sum_{i=1}V_{i,f}^2\right]\\
&=\frac{1}{2}\left[\left(\sum_{i=1}V_{i,f}\right)^2-\sum_{i=1}V_{i,f}^2\right]
\end{aligned}
\end{eqnarray*}

舉個例子,比如$a$、$b$、$c$屬於同一個Fied,則$ab+ac+bc=\frac{1}{2}[(a+b+c)^2-(a^2+b^2+c^2)]$。乘法計算量由$O(n^2)$ 降為$O(n)$,$n$表示該Field內有幾個特征。


免責聲明!

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



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