FM(因子分解机)
优点:
- 能在稀疏特征情况下有很好的表现
- 时间复杂度O(n)
在推荐场景使用one-hot编码会导致稀疏特征
FM
背景
线性回归:
Y
=
W
T
X
Y=W^{T}X
Y=WTX 只有一次项,但是一次项有时候效果不好,尤其是在特别稀疏的场景当中,刻画能力不够。
如果加入二次项:
y
^
=
w
0
+
∑
w
i
x
i
+
∑
∑
w
i
j
x
i
x
j
\hat{y}=w_0+\sum{w_i}x_i+\sum\sum{w_{ij}x_ix_j}
y^=w0+∑wixi+∑∑wijxixj
这里两两特征组合的特征量级大约是n的平方,因此带来的参数数量就是一个天文数字。
FM 既引入了特征交叉,又解决了复杂度以及模型参数的问题。
原理
FM解决这个问题的方法非常简单,FM模型引入了新的矩阵V,矩阵V是一个
n
X
k
n X k
nXk的二维矩阵。这里的
k
k
k是我们设置的参数,一般不会很大,比如16、32之类。对于特征每一个维度i,我们都可以找到一个
v
i
v_i
vi,它表示一个长度为k的向量。
于是可以用
v
i
v_i
vi和
v
j
v_j
vj来计算得出上式当中的
w
i
j
w_{ij}
wij,相比于原先
n
2
n^2
n2量级的参数而言,虽然现在看来参数量是
n
2
k
n^2k
n2k,但是通过推导我们可以将参数的量级降低到了n x k。由于k是一个常数值,所以可以看成我们的参数数量是
O
(
n
)
O(n)
O(n)
有了矩阵v之后, 公式可以写成:
y
^
=
w
0
+
∑
w
i
x
i
+
∑
∑
v
i
T
v
j
x
i
x
j
\hat{y}=w_0+\sum{w_i}x_i+\sum\sum{v_i^{T}v_jx_ix_j}
y^=w0+∑wixi+∑∑viTvjxixj
FM引入的参数矩阵V可以看成是对W矩阵做了一个因子分解,这也是FM得名的由来。
复杂度优化
观察一下刚才上面的式子,不难发现,目前对于预测一条样本的计算复杂度为
O
(
k
n
2
)
O(kn^2)
O(kn2)
交叉项可以通过变形进行时间复杂度的优化:
∑
i
=
1
n
∑
j
=
i
+
1
n
v
i
T
v
j
x
i
x
j
=
1
2
∑
i
=
1
n
∑
j
=
1
n
v
i
T
v
j
x
i
x
j
−
∑
i
=
1
n
v
i
T
v
i
x
i
x
i
=
1
2
(
∑
i
=
1
n
∑
j
=
1
n
∑
f
=
1
k
v
i
f
v
j
f
x
i
x
j
−
∑
i
=
1
n
∑
f
=
1
k
v
i
f
T
v
i
f
x
i
x
i
)
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
f
x
i
)
(
∑
j
=
1
n
v
j
f
x
j
)
−
∑
i
=
1
n
v
i
f
2
x
i
2
)
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
f
x
i
)
2
−
∑
i
=
1
n
v
i
f
2
x
i
2
)
\sum_{i=1}^{n}\sum_{j=i+1}^{n}{v_i^{T}v_jx_ix_j}\\ =\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}{v_i^{T}v_jx_ix_j}-\sum_{i=1}^{n}v_i^Tv_ix_ix_i\\ =\frac{1}{2}(\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{f=1}^{k}v_{if}v_{jf}x_ix_j-\sum_{i=1}^{n}\sum_{f=1}^{k}v_{if}^Tv_{if}x_ix_i)\\ =\frac{1}{2}\sum_{f=1}^{k}((\sum_{i=1}^{n}v_{if}x_i)(\sum_{j=1}^{n}v_{jf}x_j)-\sum_{i=1}^{n}v_{if}^2x_i^2)\\ =\frac{1}{2}\sum_{f=1}^{k}((\sum_{i=1}^{n}v_{if}x_i)^2-\sum_{i=1}^{n}v_{if}^2x_i^2)
i=1∑nj=i+1∑nviTvjxixj=21i=1∑nj=1∑nviTvjxixj−i=1∑nviTvixixi=21(i=1∑nj=1∑nf=1∑kvifvjfxixj−i=1∑nf=1∑kvifTvifxixi)=21f=1∑k((i=1∑nvifxi)(j=1∑nvjfxj)−i=1∑nvif2xi2)=21f=1∑k((i=1∑nvifxi)2−i=1∑nvif2xi2)
可以看出优化后的时间复杂度为
O
(
k
n
)
O(kn)
O(kn)
参数训练
∂ y ( x ) ^ ∂ θ { 1 , θ = w 0 x i , θ = w i x i ∑ j = 1 n v j , f x j − v i , f x i 2 \frac{\partial \hat{y(x)}}{\partial \theta} \begin{cases} 1, \theta=w_0\\ x_i, \theta=w_i\\ x_i\sum_{j=1}^nv_{j,f}x_j-v_{i,f}x_{i}^2 \end{cases} ∂θ∂y(x)^⎩⎪⎨⎪⎧1,θ=w0xi,θ=wixi∑j=1nvj,fxj−vi,fxi2
∑
j
=
1
n
v
j
,
f
x
j
\sum_{j=1}^nv_{j,f}x_j
∑j=1nvj,fxj与
i
i
i独立,可以提前计算出来,则梯度更新的训练复杂度也是
O
(
k
n
)
O(kn)
O(kn)。
综上所述,FM可以在线性时间训练和预测,是一种非常高效的模型。
DeepFM
顾名思义,DeepFM就是把Deep embedding特征和FM相加,然后用sigmoid激活:
其中Deep Embedding的特征就是先将每个特征的 k维embedding向量进行拼接,然后用神经网络进行进一步的embedding。
FFM(Field-aware FM)
在FM中,每个特征有一个对应的向量,而FFM相对于FM的改进就是:
假设有F个特征,则每个特征有F-1个向量,在二次交叉项的权重部分,每个特征与其他F-1个特征结合使用的向量都不同,这样FFM的时间复杂度就达到
O
(
k
∗
n
2
)
O(k*n^2)
O(k∗n2)