FM 模型推导
论文地址:https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf
在使用 LR 的时候,要进行大量的特征工程,如对离散值进行独热编码,在进行大量的独热编码之后,特征矩阵会变得非常稀疏。在特征创建的时候,两两特征进行组合,由于特征向量过于稀疏,无法学习到很多组合特征的权重,FM 模型在 LR 模型的基础上,多了特征两两组合的部分,需要比 LR 多学习对应参数的权重。
只讨论二阶特征组合的情况
- LR 多了两两特征组合的形式如下 , n n n 是特征向量的维度:
y ^ = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n ∑ j = i + 1 n ω i j x i x j \hat{y} = \omega_0 + \sum^n_{i=1}\omega_ix_i +\sum^n_{i=1}\sum^n_{j=i+1} \omega_{ij}x_ix_j y^=ω0+i=1∑nωixi+i=1∑nj=i+1∑nωijxixj
- 假设每个特征有它对应的隐因子向量,那么 ω i j \omega_{ij} ωij 就可以用两个特征对应的 k k k 纬隐因子向量 v i v_i vi, v j v_j vj 的内积表示
y ^ = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j \hat{y} = \omega_0 + \sum^n_{i=1}\omega_ix_i +\sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j y^=ω0+i=1∑nωixi+i=1∑nj=i+1∑n<vi,vj>xixj
- 这里 ∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j \sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j ∑i=1n∑j=i+1n<vi,vj>xixj 的部分可以进行优化,先贴上论文里面的推导,step by step
Step 1
特征要两两进行组合,肯定是不考虑重复的情况,所以开始的时候
∑
i
=
1
n
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
\sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j
∑i=1n∑j=i+1n<vi,vj>xixj 的
j
j
j 从
i
+
1
i+1
i+1 开始。现在
j
j
j 的下标变为从
1
1
1 开始,那么
<
v
i
,
v
j
>
<v_i, v_j>
<vi,vj> 和
<
v
j
,
v
i
>
<v_j, v_i>
<vj,vi> 都要算一遍,这俩计算结果是一样的,只算一遍即可,整体除以
2
2
2 ,因为原来
<
v
i
,
v
i
>
<v_i, v_i>
<vi,vi> 是不算的,现在算上了,所以要减去
<
v
i
,
v
i
>
<v_i, v_i>
<vi,vi>
Step 2
这里就是把
k
k
k 纬的隐因子向量展开
Step 3
- 提 ∑ f = 1 k \sum^k_{f=1} ∑f=1k
= 1 2 ∑ f = 1 k ( ∑ i = 1 n ∑ j = 1 n v i , f v j , f x i x j − ∑ i = 1 n v i , f v i , f x i x i ) =\frac{1}{2} \sum^k_{f=1} \Big( \sum^n_{i=1}\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j - \sum^n_{i=1}v_{i,f} v_{i,f}x_ix_i \Big) =21f=1∑k(i=1∑nj=1∑nvi,fvj,fxixj−i=1∑nvi,fvi,fxixi)
- 只看里面的
∑
i
=
1
n
∑
j
=
1
n
v
i
,
f
v
j
,
f
x
i
x
j
\sum^n_{i=1}\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j
∑i=1n∑j=1nvi,fvj,fxixj
∑ j = 1 n v i , f v j , f x i x j \sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j ∑j=1nvi,fvj,fxixj 因为里面的 v i , f x i v_{i,f} x_i vi,fxi 对于此处来说相当于常量,提到外面,变为 v i , f x i ∑ j = 1 n v j , f x j v_{i,f}x_i \sum^n_{j=1} v_{j,f} x_j vi,fxi∑j=1nvj,fxj ,所以变为:
∑ i = 1 n ∑ j = 1 n v i , f v j , f x i x j = ∑ i = 1 n v i , f x i ∑ j = 1 n v j , f x j \sum^n_{i=1}\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j = \sum^n_{i=1}v_{i,f}x_i\sum^n_{j=1} v_{j,f} x_j i=1∑nj=1∑nvi,fvj,fxixj=i=1∑nvi,fxij=1∑nvj,fxj
Step 4
这里
∑
i
=
1
n
v
i
,
f
x
i
\sum^n_{i=1}v_{i,f}x_i
∑i=1nvi,fxi 和
∑
j
=
1
n
v
j
,
f
x
j
\sum^n_{j=1} v_{j,f} x_j
∑j=1nvj,fxj 其实只是下标的名字不一样而已,对应的隐因子向量的每个元素是一样的,so
∑
i
=
1
n
v
i
,
f
x
i
\sum^n_{i=1}v_{i,f}x_i
∑i=1nvi,fxi 和
∑
j
=
1
n
v
j
,
f
x
j
\sum^n_{j=1} v_{j,f} x_j
∑j=1nvj,fxj 是同一个东西,这样的话,只需要计算一次的
∑
i
=
1
n
v
i
,
f
x
i
\sum^n_{i=1}v_{i,f}x_i
∑i=1nvi,fxi 就可以了
到这样,计算 ∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j \sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j ∑i=1n∑j=i+1n<vi,vj>xixj 的复杂度,就从 O ( k n 2 ) O(kn^2) O(kn2) 变为了 O ( k n ) O(kn) O(kn)
后面把这个 y ^ \hat{y} y^ 代入 Sigmoid 函数,使用 logistic 损失函数,然后梯度下降求解 ω i \omega_i ωi 和 v i , f v_{i,f} vi,f 即可。