因子分解机
MF的局限性以及因子分解机
在之间的博客中具体描述了矩阵分解在推荐系统的应用,介绍了funkSVD,BiasSVD,SVD++等算法,这些算法的思想是将rateing矩阵分解为user矩阵和item矩阵的乘积。
但是在实际的推荐系统中,除了user和item特征,还有很多其他特征也需要加以应用,实际中一个预测问题包含的特征维度可能很多,因此有了后来的FM,FFM以及与DNN结合的deepFM算法。它们除了可以利用user和item特性外还能利用上其他特性对结果进行预测。
下面分别介绍这几种算法:
FM算法
对于特征向量:
X
=
(
x
1
,
x
2
,
…
,
x
n
)
T
X = {\left( {{x_1},{x_2}, \ldots ,{x_n}} \right)^T}
X=(x1,x2,…,xn)T
目标估计函数:
y
∧
(
x
)
=
w
0
+
w
1
x
1
+
w
2
x
2
+
…
w
n
x
n
=
w
0
+
∑
i
=
1
n
w
n
x
n
\mathop y\limits^ \wedge (x) = {w_0} + {w_1}{x_1} + {w_2}{x_2} + \ldots {w_n}{x_n} = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}}
y∧(x)=w0+w1x1+w2x2+…wnxn=w0+i=1∑nwnxn
对于二阶表达式:
y
∧
(
x
)
=
w
0
+
∑
i
=
1
n
w
n
x
n
+
∑
i
=
1
n
∑
j
=
i
+
1
n
w
i
j
x
i
x
j
\mathop y\limits^ \wedge (x) = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} + \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} }
y∧(x)=w0+i=1∑nwnxn+i=1∑nj=i+1∑nwijxixj
使用Wij进行二阶特征组合的参数估计存在问题,即如果观察样本中没有出现过该交互的特征分量,那么直接估计将为0。
二阶特征代表了特征之间的两两组合,考虑了两个特征变量之间的交互影响。
对于Wij的估计,转换成了矩阵分解MF问题
y
∧
(
x
)
=
w
0
+
∑
i
=
1
n
w
n
x
n
+
∑
i
=
1
n
∑
j
=
i
+
1
n
w
i
j
x
i
x
j
=
w
0
+
∑
i
=
1
n
w
n
x
n
+
∑
i
=
1
n
∑
j
=
i
+
1
n
⟨
V
i
,
V
j
⟩
x
i
x
j
\mathop y\limits^ \wedge (x) = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} + \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} }\\ = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} + \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.{x_i}{x_j}} }
y∧(x)=w0+i=1∑nwnxn+i=1∑nj=i+1∑nwijxixj=w0+i=1∑nwnxn+i=1∑nj=i+1∑n⟨Vi,Vj⟩xixj
⟨
V
i
,
V
j
⟩
:
=
∑
f
=
1
k
v
i
,
f
⋅
v
j
,
f
\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.: = \sum\limits_{f = 1}^k {{v_{i,f}} \cdot {v_{j,f}}}
⟨Vi,Vj⟩:=f=1∑kvi,f⋅vj,f
直接计算,复杂度为O(k*n^2)
n是特征个数,k是特征的embedding size
∑
i
=
1
n
∑
j
=
i
+
1
n
⟨
V
i
,
V
j
⟩
x
i
x
j
=
1
2
∑
i
=
1
n
∑
j
=
1
n
⟨
V
i
,
V
j
⟩
x
i
x
j
−
1
2
∑
i
=
1
n
⟨
V
i
,
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
v
j
,
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
)
\begin{array}{l} \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.{x_i}{x_j}} } \\ = \frac{1}{2}\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.{x_i}{x_j}} } - \frac{1}{2}\sum\limits_{i = 1}^n {\left\langle {\left. {{V_i},{V_i}} \right\rangle } \right.{x_i}{x_i}} \\ = \frac{1}{2}\left( {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {\sum\limits_{f = 1}^k {{v_{i,f}}{v_{j,f}}} {x_i}{x_j} - } \sum\limits_{i = 1}^n {\sum\limits_{f = 1}^k {{v_{i,f}}{v_{j,f}}} {x_i}{x_i}} } } \right)\\ = \frac{1}{2}\sum\limits_{f = 1}^k {\left( {\left( {\sum\limits_{i = 1}^n {{v_{i,f}}{x_i}} } \right)\left( {\sum\limits_{j = 1}^n {{v_{j,f}}{x_j}} } \right) - \sum\limits_{i = 1}^n {v_{i,f}^2x_i^2} } \right)} \\ = \frac{1}{2}\sum\limits_{f = 1}^k {\left( {{{\left( {\sum\limits_{i = 1}^n {{v_{i,f}}{x_i}} } \right)}^2} - \sum\limits_{i = 1}^n {v_{i,f}^2x_i^2} } \right)} \end{array}
i=1∑nj=i+1∑n⟨Vi,Vj⟩xixj=21i=1∑nj=1∑n⟨Vi,Vj⟩xixj−21i=1∑n⟨Vi,Vi⟩xixi=21(i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,fvj,fxixi)=21f=1∑k((i=1∑nvi,fxi)(j=1∑nvj,fxj)−i=1∑nvi,f2xi2)=21f=1∑k((i=1∑nvi,fxi)2−i=1∑nvi,f2xi2)
通过公式变换,复杂度由
O
(
k
∗
n
2
)
=
>
O
(
k
∗
n
)
O(k*{n^2}) = > O(k*n)
O(k∗n2)=>O(k∗n)
FM与MF的区别:
- FM矩阵将User和Item都进行了one-hot编码作为特征,使得特征维度非常巨大且稀疏
- 矩阵分解MF是FM的特例,即特征只有User ID 和Item ID的FM模型
- 矩阵分解MF只适用于评分预测,进行简单的特征计算,无法利用其他特征
- FM引入了更多辅助信息(Side information)作为特征
- FM在计算二阶特征组合系数的时候,使用了MF
FM的学习算法:
- ALS,交替最小二乘法
- SGD,随机梯度下降法
- MCMC,马尔科夫链蒙特卡罗法
FFM
FFM引入field的概念:
对于FM对于Wij的估计,观察二阶特征的系数:把相同性质的特征归于同一个field,例如把所有的user作为一个field,把item作为一个field,把其他特征也放到一个field中。
观察FM对于Wij的估计
⟨
V
i
,
V
j
⟩
:
=
∑
f
=
1
k
v
i
,
f
⋅
v
j
,
f
\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.: = \sum\limits_{f = 1}^k {{v_{i,f}} \cdot {v_{j,f}}}
⟨Vi,Vj⟩:=f=1∑kvi,f⋅vj,f
对于不同field的特征采用了同样的隐形影响。
而对于FFM算法:
每个特征会有几个不同的隐向量,fj 是第 j 个特征所属的field。
隐向量的长度为 k,FFM的二次参数有 nfk 个,多于FM模型的 nk 个
由于隐向量与field相关,FFM二次项并不能够化简,计算复杂度是
O
(
k
∗
n
2
)
O(k*{n^2})
O(k∗n2),因此FFM的k值一般远小于FM的k值
FM算法:
- 每个特征只有一个隐向量
- FM是FFM的特例
FFM算法
- 每个特征有多个隐向量
- 使用哪个,取决于和哪个向量进行点乘
DeepFM
FM算法可以做特征组合,但是特征组合需要的时间复杂度较大,所以在一般只使用二阶特征组合。如何既考虑到低阶特征又考虑到高阶特征,于是相应的算法DeepFM出现了。
DeepFM相当于FM+DNN,无需做特征工程进行特征组合,将特征工程的工作交给DNN进行训练。
DeepFM的结构图。1
y
∧
=
s
i
g
m
o
i
d
(
y
F
M
+
y
D
N
N
)
\mathop y\limits^\wedge = sigmoid\left( {{y_{FM}} + {y_{DNN}}} \right)
y∧=sigmoid(yFM+yDNN)
DeepFM = FM + DNN:
提取低阶(low order)特征 => 因子分解机FM
既可以做1阶特征建模,也可以做2阶特征建模
- 提取高阶(high order)特征 => 神经网络DNN
end-to-end,共享特征输入 - 对于特征i,wi是1阶特征的权重,
Vi表示该特征与其他特征的交互影响,输入到FM模型中可以获得特征的2阶特征表示,输入到DNN模型得到高阶特征。
DeepFM中的模块:
- Sparse Features,输入多个稀疏特征
- Dense Embeddings
对每个稀疏特征做embedding,学习到他们的embedding向量(维度相等,均为k),因为需要将这些embedding向量送到FM层做内积。同时embedding进行了降维,更好发挥Deep Layer的高阶特征学习能力
- FM Layer
一阶特征:原始特征相加
二阶特征:原始特征embedding后的embedding向量两两内积 - Deep Layer
将每个embedding向量做级联,然后做多层的全连接,学习更深的特征 - Output Units
将FM层输出与Deep层输出进行级联,接一个dense层,作为最终输出结果
FM,FFM,DeepFM工具
FM工具
libFM(FM软件)
下载地址:https://github.com/srendle/libfm
使用文档:http://www.libfm.org/libfm-1.42.manual.pdf
FM论文作者Steffen Rendle提供的工具(2010年)
在KDD CUP 2012,以及Music Hackathon中都取得不错的成绩
不仅适用于推荐系统,还可以用于机器学习(分类问题)
实现三种优化算法:SGD,ALS,MCMC
支持2种输入数据格式:文本格式(推荐)和二进制格式
FFM工具
libFFM
https://github.com/ycjuan/libffm
xlearn
https://xlearn-doc-cn.readthedocs.io/en/latest/index.html
提供Python接口
支持LR,FM,FFM算法等
运行效率高,比libfm, libffm快
DeepFM工具
DeepCTR工具
https://github.com/shenweichen/DeepCTR
实现了多种CTR深度模型
与Tensorflow 1.4和2.0兼容
summary
FM算法:
- 泛化能力强,能够考虑到多种特征以及特征组合
- 相比于MF使用了更多的side information作为特征,同时在进行二阶特征估计的时候用到了MF
- 计算复杂度,可以在线性时间对样本做出预测,通过公式变换将计算复杂度降到O(k*n)
DeepFM算法:
- 相比于FM考虑到了高阶特征的影响因素,使用DNN对高阶特征进行发现
- 更接近真实场景,真实场景中往往需要考虑到高阶特征的情况,所有在实际中效果更好
- 使用DNN能够发现有些很难理解和解释的高阶特征
DeepFM: A Factorization-Machine based Neural Network for CTR Prediction,2017 ↩︎