推荐系统学习(七)

概述

  本文提出的 DeepCoNN 模型,有两个平行的神经网络,其中一个对于用户所写的评论分别学习用户的行为数据,另一个则是对物品的所有评论中习得物品的属性信息,最后通过一个“共享层”把这两部分网络特征融合在一起。从而,用户和物品的各自的表示能够以一种类似于分解模型的方式交互。
  其实本文也是一种混合模型,结合了文本信息,解决了冷启动问题(其实之后看论文只要加入文本辅助信息那么必然会说解决这个吧),通常由数据过于稀疏导致,记录比较少的或者是新的用户,很难或者根本没有办法学习一个用户的表示。而且对于现有的协同过滤框架很难把这部分信息添加进去,因为协同过滤模型仅仅考虑用户的打分信息,即数值信息。相关工作表明,引入评论信息,能够提高推荐系统的打分预测准确性,尤其是那些冷启动用户和物品。

作者及论文

Joint Deep Modeling of Users and Items Using Reviews for Recommendation

本文模型

  DeepCoNN 模型分析评论信息,利用对称的深度网络,联合建模,获得用户和物品的隐藏表示,从而预测用户的打分。
(leftCNN+rightCNN)FM(leftCNN+rightCNN)\longrightarrow FM

模型

  如下图所示,左边是用户网络 NetuNet_u,右边是物品网络 NetiNet_i,这两个对称网络的输入分别是和用户、物品相关的评论。
注意:此处以user为例,item同样的处理方式。

推荐系统学习(七)

Look-up layer

  第一层是 look-up 层,把用户、物品的相关评论通过 word-embedding,转换成一个 embedding 的矩阵,具体做法是利用 word2vec 等相关模型得到每个词的分布式表示,接着就通过拼接(stack)的方式构成长度为 n 的矩阵,用 V1:nV_{1:n} 表示(看论文应该是这样的,但是感觉和代码有点出入,github上有清华大学复现的代码);此处,把所有属于useriuser_ireviews连接在一起,然后人为规定一定的长度n,长度不够的添加占位符。并且把所有单词做成一个字典,按序号编码。这样每个useriuser_iV1:nu=[d1u,d2u,d3u,d4u,......dn1u,dnu]V_{1:n}^u=[d_1^u,d_2^u,d_3^u,d_4^u,......d_{n-1}^u,d_n^u],最后经过look-up函数ϕdku\phi(d_k^u)进行处理,最后每个V1:nuV_{1:n}^u变为RncR^{n*c}的一个n行c列的矩阵(itemiitem_i同样处理),这样考虑了单词的序列相比词袋模型(注意:这块其实需要论证下论文中的\bigoplus符号是如何concateation拼接的,可能是一行有n*c个?不过问题不大先按上面的理解)。

convolution layer

  第二层是 CNN 网络层,使用经典的卷积神经网络结构和 ReLU **函数,获得多个卷积核的特征输出:卷积核为 KjK_j,KjRctK_j \in R^{c*t},windossizewindos sizett,偏置为 bjb_j,则对于卷积核 KjK_j 的输出即为zj=ReLU(V1:nKj+bj)z_j = ReLU(V_{1:n} *K_j + b_j)

max-pooling layer

  第三层为 max-pooling 操作,oj=max{z1,z2z3z4......,znt+1}o_j=max\{z_1,z_2,z_3,z_4,......,z_{n-t+1}\}得到一个固定的长度的向量表示 O=o1,o2,,on1O={o_1,o_2,⋯,o_{n_1}},这里的 n1n_1 表示卷积核的总数;

Fully-connected layer

  最后一层是全连接层,以用户表示为例,xu=f(W×O+g)x_u=f(W×O+g),从 n1n_1 维的输入映射到 n2n_2 维空间,便于和商品表示 yiy_i 交互。

Shared layer(这个比较重要)

  虽然最终得到的$ x_u$ 和 yiy_i 可以直接作为两者的特征表示,但是他们通常是属于不同向量空间的特征表示,因此引入一个共享层来完成映射。把 xux_uyiy_i 拼接起来,得到 z^=(xu,yi)\hat z=(x_u,y_i),利用一个**分解机模型(介绍的非常棒)**来预测最终的得分:
J=w^0+i=1z^w^iz^i+i=1z^j=i+1z^v^i,v^jz^izj^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}
  这里的w0w_0是一个全局bias, J 一部分由W^Tz^\hat W^T{\hat z} 给出,这是一阶交互,强度由 w^\hat{w}控制(前两项是线性回归的形式),二阶交互则是由v^\hat{v}控制z^\hat{z}的每个特征维度(后面的这一项其实考虑了特征分量z^i\hat z_iz^j\hat z_j这两相互独立分量之间的关系)。这里的v^\hat{v} 是什么含义,文中没有给出解释,但是相当于权重是模型需要学习的。

模型训练

  根据每一个 batch 的梯度方向优化参数,具体采用了 RMSprop 方式替代了传统梯度下降方法。此外,为了防止过拟合,加入了 dropout。

模型分析

第一,相较于 BoW 方式处理评论,保持了原评论中的语序信息,先表示成一个矩阵,后通过 CNN 得到特征表示,是保留了语序信息的。(问题:why not RNN?其实后面再DeepConn的基础上有用RNN,以及lstm做的)。

第二,推荐系统注重“在线学习”,应尽可能支持。神经网络的状态可以被保存和恢复,所以可以在新的数据产生以后,对模型各种参数进行微调。

评价指标

Mean SquareError (MSE)
MSE=1Nn=1N(rnr^n)2MSE =\frac1N\sum_{n=1}^N (r_n-\hat r_n)^2

实验分析

为了回答:

  1. 两个平行深度网络是否真的从评论文本中联合学习了?
  2. 对于评论文本从 word-embedding 到 CNN 提取特征是否保留了更好的语义信息?
  3. 最后的共享层起到了什么样的作用?

这三个问题,作者设计了一系列对比实验,分别是:

  1. DeepCoNN-User、DeepCoNN-Item 使用一个矩阵随机初始化的矩阵分别替代 Netu 和 Neti,以验证 CNN 处理的有效性
  2. DeepCoNN-TFIDF,使用 TF-IDF 作为 word-embedding 的替代;DeepCoNN-Random,不使用 word2vec,而是随机初始化每个词的特征向量,以验证 word-embedding 的有效性
  3. DeepCoNN-DP,不使用共享层,直接采用向量内积,以验证共享层的有效性

创新点及贡献

  贡献有三点:

  1. 首次提出了利用神经网络的方式构建出 DeepCoNN 模型,在推荐系统中融合评论信息,联合学习用户和物品的表示。从评论中学到的用户表示,最终的优化目标是最小化推荐系统的打分误差,与传统的直接融合评论信息的做法,有一个更为明确的任务导向;
  2. 评论文本使用预训练的模型,以 word-embedding 方式作文本表示,可以保留文本的语义信息,比 BOW、LDA、SDAE 等都更有竞争力;
  3. DeepCoNN 不仅缓解了冷启动的问题,对于一些热启动的用户也有性能的提升。

代码

待更新!!!

参考资料

落尽红樱君不见,轻绘梨花泪沾衣
因式分解机
分解机理论