DeepCoNN-2017年WSDM
概述
本文提出的 DeepCoNN 模型,有两个平行的神经网络,其中一个对于用户所写的评论分别学习用户的行为数据,另一个则是对物品的所有评论中习得物品的属性信息,最后通过一个“共享层”把这两部分网络特征融合在一起。从而,用户和物品的各自的表示能够以一种类似于分解模型的方式交互。
其实本文也是一种混合模型,结合了文本信息,解决了冷启动问题(其实之后看论文只要加入文本辅助信息那么必然会说解决这个吧),通常由数据过于稀疏导致,记录比较少的或者是新的用户,很难或者根本没有办法学习一个用户的表示。而且对于现有的协同过滤框架很难把这部分信息添加进去,因为协同过滤模型仅仅考虑用户的打分信息,即数值信息。相关工作表明,引入评论信息,能够提高推荐系统的打分预测准确性,尤其是那些冷启动用户和物品。
作者及论文
Joint Deep Modeling of Users and Items Using Reviews for Recommendation
本文模型
DeepCoNN 模型分析评论信息,利用对称的深度网络,联合建模,获得用户和物品的隐藏表示,从而预测用户的打分。
(
l
e
f
t
C
N
N
+
r
i
g
h
t
C
N
N
)
⟶
F
M
(leftCNN+rightCNN)\longrightarrow FM
(leftCNN+rightCNN)⟶FM
模型
如下图所示,左边是用户网络
N
e
t
u
Net_u
Netu,右边是物品网络
N
e
t
i
Net_i
Neti,这两个对称网络的输入分别是和用户、物品相关的评论。
注意:此处以user为例,item同样的处理方式。
Look-up layer
第一层是 look-up 层,把用户、物品的相关评论通过 word-embedding,转换成一个 embedding 的矩阵,具体做法是利用 word2vec 等相关模型得到每个词的分布式表示,接着就通过拼接(stack)的方式构成长度为 n 的矩阵,用
V
1
:
n
V_{1:n}
V1:n 表示(看论文应该是这样的,但是感觉和代码有点出入,github上有清华大学复现的代码);此处,把所有属于
u
s
e
r
i
user_i
useri的reviews连接在一起,然后人为规定一定的长度n,长度不够的添加占位符。并且把所有单词做成一个字典,按序号编码。这样每个
u
s
e
r
i
user_i
useri为
V
1
:
n
u
=
[
d
1
u
,
d
2
u
,
d
3
u
,
d
4
u
,
.
.
.
.
.
.
d
n
−
1
u
,
d
n
u
]
V_{1:n}^u=[d_1^u,d_2^u,d_3^u,d_4^u,......d_{n-1}^u,d_n^u]
V1:nu=[d1u,d2u,d3u,d4u,......dn−1u,dnu],最后经过look-up函数
ϕ
(
d
k
u
)
\phi(d_k^u)
ϕ(dku)进行处理,最后每个
V
1
:
n
u
V_{1:n}^u
V1:nu变为
R
n
∗
c
R^{n*c}
Rn∗c的一个n行c列的矩阵(
i
t
e
m
i
item_i
itemi同样处理),这样考虑了单词的序列相比词袋模型(注意:这块其实需要论证下论文中的
⨁
\bigoplus
⨁符号是如何concateation拼接的,可能是一行有n*c个?不过问题不大先按上面的理解)。
convolution layer
第二层是 CNN 网络层,使用经典的卷积神经网络结构和 ReLU 激活函数,获得多个卷积核的特征输出:卷积核为 K j K_j Kj, K j ∈ R c ∗ t K_j \in R^{c*t} Kj∈Rc∗t, w i n d o s s i z e windos size windossize 为 t t t,偏置为 b j b_j bj,则对于卷积核 K j K_j Kj 的输出即为 z j = R e L U ( V 1 : n ∗ K j + b j ) z_j = ReLU(V_{1:n} *K_j + b_j) zj=ReLU(V1:n∗Kj+bj)
max-pooling layer
第三层为 max-pooling 操作, o j = m a x { z 1 , z 2 , z 3 , z 4 , . . . . . . , z n − t + 1 } o_j=max\{z_1,z_2,z_3,z_4,......,z_{n-t+1}\} oj=max{z1,z2,z3,z4,......,zn−t+1}得到一个固定的长度的向量表示 O = o 1 , o 2 , ⋯ , o n 1 O={o_1,o_2,⋯,o_{n_1}} O=o1,o2,⋯,on1,这里的 n 1 n_1 n1 表示卷积核的总数;
Fully-connected layer
最后一层是全连接层,以用户表示为例, x u = f ( W × O + g ) x_u=f(W×O+g) xu=f(W×O+g),从 n 1 n_1 n1 维的输入映射到 n 2 n_2 n2 维空间,便于和商品表示 y i y_i yi 交互。
Shared layer(这个比较重要)
虽然最终得到的$ x_u$ 和
y
i
y_i
yi 可以直接作为两者的特征表示,但是他们通常是属于不同向量空间的特征表示,因此引入一个共享层来完成映射。把
x
u
x_u
xu 和
y
i
y_i
yi 拼接起来,得到
z
^
=
(
x
u
,
y
i
)
\hat z=(x_u,y_i)
z^=(xu,yi),利用一个**分解机模型(介绍的非常棒)**来预测最终的得分:
J
=
w
^
0
+
∑
i
=
1
∣
z
^
∣
w
^
i
z
^
i
+
∑
i
=
1
∣
z
^
∣
∑
j
=
i
+
1
∣
z
^
∣
⟨
v
^
i
,
v
^
j
⟩
z
^
i
z
j
^
J = \hat{w}_0 + \sum_{i=1}^{|\hat{z}|}\hat{w}_i\hat{z}_i + \sum_{i=1}^{|\hat{z}|} \sum_{j = i+1}^{|\hat{z}|}\langle\hat{v}_i, \hat{v}_j\rangle \hat{z}_i\hat{z_j}
J=w^0+i=1∑∣z^∣w^iz^i+i=1∑∣z^∣j=i+1∑∣z^∣⟨v^i,v^j⟩z^izj^
这里的
w
0
w_0
w0是一个全局bias, J 一部分由
W
^
T
z
^
\hat W^T{\hat z}
W^Tz^ 给出,这是一阶交互,强度由
w
^
\hat{w}
w^控制(前两项是线性回归的形式),二阶交互则是由
v
^
\hat{v}
v^控制
z
^
\hat{z}
z^的每个特征维度(后面的这一项其实考虑了特征分量
z
^
i
\hat z_i
z^i和
z
^
j
\hat z_j
z^j这两相互独立分量之间的关系)。这里的
v
^
\hat{v}
v^ 是什么含义,文中没有给出解释,但是相当于权重是模型需要学习的。
模型训练
根据每一个 batch 的梯度方向优化参数,具体采用了 RMSprop 方式替代了传统梯度下降方法。此外,为了防止过拟合,加入了 dropout。
模型分析
第一,相较于 BoW 方式处理评论,保持了原评论中的语序信息,先表示成一个矩阵,后通过 CNN 得到特征表示,是保留了语序信息的。(问题:why not RNN?其实后面再DeepConn的基础上有用RNN,以及lstm做的)。
第二,推荐系统注重“在线学习”,应尽可能支持。神经网络的状态可以被保存和恢复,所以可以在新的数据产生以后,对模型各种参数进行微调。
评价指标
Mean SquareError (MSE)
M
S
E
=
1
N
∑
n
=
1
N
(
r
n
−
r
^
n
)
2
MSE =\frac1N\sum_{n=1}^N (r_n-\hat r_n)^2
MSE=N1n=1∑N(rn−r^n)2
实验分析
为了回答:
- 两个平行深度网络是否真的从评论文本中联合学习了?
- 对于评论文本从 word-embedding 到 CNN 提取特征是否保留了更好的语义信息?
- 最后的共享层起到了什么样的作用?
这三个问题,作者设计了一系列对比实验,分别是:
- DeepCoNN-User、DeepCoNN-Item 使用一个矩阵随机初始化的矩阵分别替代 Netu 和 Neti,以验证 CNN 处理的有效性
- DeepCoNN-TFIDF,使用 TF-IDF 作为 word-embedding 的替代;DeepCoNN-Random,不使用 word2vec,而是随机初始化每个词的特征向量,以验证 word-embedding 的有效性
- DeepCoNN-DP,不使用共享层,直接采用向量内积,以验证共享层的有效性
创新点及贡献
贡献有三点:
- 首次提出了利用神经网络的方式构建出 DeepCoNN 模型,在推荐系统中融合评论信息,联合学习用户和物品的表示。从评论中学到的用户表示,最终的优化目标是最小化推荐系统的打分误差,与传统的直接融合评论信息的做法,有一个更为明确的任务导向;
- 评论文本使用预训练的模型,以 word-embedding 方式作文本表示,可以保留文本的语义信息,比 BOW、LDA、SDAE 等都更有竞争力;
- DeepCoNN 不仅缓解了冷启动的问题,对于一些热启动的用户也有性能的提升。
代码
待更新!!!