《DeepFM: A Factorization-Machine based Neural Networ》精读笔记
- 哈工大与华为诺亚方舟联合实验室2017年发表的论文。
- 借鉴了Wide&Deep模型,Wide部分替换为FM模型。
0. FM模型(Factorization Machine)
DeepFM之前应该了解的是FM,在预测系统中,特征进行编码之后会使数据变得很稀疏,FM主要是解决数据稀疏的情况下特征组合问题。
考虑特征互相关联的情况下,二阶多项式模型表达式如下:
y
=
ω
0
+
∑
i
=
1
n
ω
i
x
i
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
ω
i
j
x
i
x
j
y=\omega_{0}+\sum_{i=1}^{n} \omega_{i} x_{i}+\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} \omega_{i j} x_{i} x_{j}
y=ω0+i=1∑nωixi+i=1∑n−1j=i+1∑nωijxixj(特征
x
i
x_{i}
xi与
x
j
x_{j}
xj的组合用
x
i
x
j
x_{i} x_{j}
xixj表示)
(
n
n
n表示样本的特征数量,
x
i
x_{i}
xi表示第
i
i
i个特征)
在数据很稀疏的情况下,满足
x
i
x_{i}
xi与
x
j
x_{j}
xj都不为0的情况非常少,这样就很难训练出想要的
w
w
w,所以对每一个特征分量
x
i
x_i
xi引入辅助向量
V
i
=
(
v
i
1
,
v
i
2
,
⋯
,
v
i
k
)
Vi=(v_i1,v_i2,⋯,v_ik)
Vi=(vi1,vi2,⋯,vik),利用
v
i
v
j
T
v_iv_j^T
vivjT对
ω
i
j
ω_{ij}
ωij进行求解。
W
^
=
V
V
T
=
(
v
1
v
2
⋮
v
n
)
(
v
1
T
v
2
T
⋯
v
n
T
)
\hat{\mathbf{W}}=\mathbf{V V}^{T}=\left(\begin{array}{c} \mathbf{v}_{1} \\ \mathbf{v}_{2} \\ \vdots \\ \mathbf{v}_{n} \end{array}\right)\left(\begin{array}{llll} \mathbf{v}_{1}^{T} \mathbf{v}_{2}^{T} \cdots \mathbf{v}_{n}^{T} \end{array}\right)
W^=VVT=⎝⎜⎜⎜⎛v1v2⋮vn⎠⎟⎟⎟⎞(v1Tv2T⋯vnT)
可得出对应参数的偏导如下,通过随机梯度下降SGD得到最优解。
∂
∂
θ
y
(
x
)
=
{
1
,
if
θ
is
w
0
x
i
,
if
θ
is
w
i
x
i
∑
j
=
1
n
v
j
,
f
x
j
−
v
i
,
f
x
i
2
,
if
θ
is
v
i
,
f
\frac{\partial}{\partial \theta} y(\mathbf{x})=\left\{\begin{array}{ll} 1, & \text { if } \theta \text { is } w_{0} \\ x_{i}, & \text { if } \theta \text { is } w_{i} \\ x_{i} \sum_{j=1}^{n} v_{j, f} x_{j}-v_{i, f} x_{i}^{2}, & \text { if } \theta \text { is } v_{i, f} \end{array}\right.
∂θ∂y(x)=⎩⎨⎧1,xi,xi∑j=1nvj,fxj−vi,fxi2, if θ is w0 if θ is wi if θ is vi,f
之后还有发展出来的FFM(Field-aware Factorization Machine),在每项特征之间还添加了一个隐向量,因为每项特征的影响是不一样的。
1. 介绍
作者首先提出:
- 特征交叉在CTR预估中至关重要;
- 线性模型不适合学习特征交叉,需要通过人工特征工程之后进行部分学习;
- FM因为计算复杂度的原因,通常只用于学习二阶特征交叉;
- 神经网络模型适于学习高阶特征交叉
- 基于CNN的模型适于学习相邻特征之间的交叉;
- 基于RNN的模型适于学习带有时序依赖数据的交叉;
- FNN:在DNN之前预训练FM模型,但受限于FM的性能;
- PNN: 在embedding层与全连接层之间增加一个点积层;
- Wide & Deep: 线性模型 + deep模型,两个部分需要构建不同的输入。
2. DeepFM模型
DeepFM包含两部分:神经网络部分与因子分解机部分,分别负责低阶特征的提取和高阶特征的提取(FM用于学习低阶特征交叉,Deep部分用于学习高阶特征)。
相比于Wide & Deep,DeepFM可以不经过特征工程直接进行端到端的训练,同时DeepFM共享输入和嵌入向。
DeepFM的预测结果可以写为:
y
^
=
sigmoid
(
y
F
M
+
y
D
N
N
)
\hat{y}=\operatorname{sigmoid}\left(y_{F M}+y_{D N N}\right)
y^=sigmoid(yFM+yDNN)
神经网络的输入应该是连续和稠密的,而CTR预估中原始的数据通常是高度稀疏和高维的,所以应该在原始数据与第一个隐藏层之间增加一个embedding层,将稀疏特征数据转换为稠密数据。
Embedding Layer的两个特性:
- 尽管不同field的输入长度不同,但是embedding之后向量的长度均为K
- 用FM中的隐向量作为embedding向量
FM部分和Deep部分共享特征embedding的两个优点:
- 能够从原始数据中学到低阶和高阶交叉
- 不需要人工特征工程
3. 实验
作者在论文中给出了和其他模型的比较,指出了其他模型的问题和验证了DeepFM的性能,后面也讨论了一些超参数的影响。但我并没有对其一一实验,可以选择性相信作者的实验结果。
4. 代码
python + tensorflow实现,GitHub有少量代码,大部分是tensorflow1.版本的,之后整理好我会把我修改的tensorflow2.上传。
5. 总结
- 作为一个初学者,可以发现传统的一些机器学习算法和深度学习接合起来确实有意象不到的效果
- tensorflow太好用了
- 主要参考:DeepFM论文剖析