基于评论文本的深度推荐系统总结

文章目录
  1. 问题简介
    1. 数据集
    2. 评价指标
    3. 基本框架
  2. 基于document建模的方法
    1. DeepCoNN (WSDM’17)
    2. D-Attn (RecSys’17)
    3. ANR
    4. CARL
    5. DAML
    6. CARP
  3. 基于review建模的方法
    1. NARRE (WWW’18)
    2. MPCN
    3. TARMF
  4. 其他
    1. TransNet
    2. PARL
  5. 总结

本文主要总结下近几年结合评论文本的推荐系统 (review-based recommendation),主要侧重基于深度学习的模型,并且开源了相关的代码库: Neu-Review-Rec (未完待续…)。

问题简介

电商网站都允许用户为商品填写评论,这些文本评论能够体现出用户的偏好以及商品特征信息,是一种语义信息丰富的隐式特征。 相比于单纯的利用显式评分特征,文本信息一方面可以弥补评分稀疏性的问题,另一方面在推荐系统的可解释方面也能够做的更好。 从用户对某部电影的评论中,能够看出电影的一些情节特征,还有用户自己的理解与喜好兴趣等。

很多推荐系统工作开始考虑利用评论信息为用户和商品进行建模,在介绍具体的工作前,先简单介绍下常用的数据集,评价指标等。

数据集

一般情况,最常用的两大类带评论信息的数据集为:

  • Amazon Review: 亚马逊数据集一般分不同的类别,比如电影,音乐,衣服,工具,游戏等,由McAuley整理发布出来的。现在有两个版本,一个是旧版数据(链接,时间为11996-2014年的Amazon数据。另外Mc课题组又更新到了新版数据(链接),新加了2014-2018年间的Amazon Review数据,具体的字段可以到上述链接中查看。 目前大部分已有工作基于旧版数据中的small部分,一般是选择几个分类目录去做实验,当然也有文章把所有的分类都跑了的,比如MPCN。
  • Yelp Review dataset: Yelp网站上的评论数据 (链接) , 常用的几个Yelp数据有 yelp2013, yelp2014, 和 yelp2016。Yelp提供的是完整数据集,需要根据需要自己去筛选不同年份的数据。

此外,还有一些用的比较少的数据,比如Beer Dataset, 之前在SNAP上有相关数据集,后来被要求删除了。 不过一般情况做实验使用Amazon的几个目录以及Yelp的数据集就足够了。 数据格式都可以简化为用户评论商品的四元组: user, item, review text, rating,rating一般都是从1-5分。 一般将按照user-item pair将数据集划分为训练接/验证集/测试集三部分,不过这里有一个坑需要注意:

使用评论文本建模用户和商品,因此需要将在验证集和测试集中的user-item对应的review从训练集中去掉,这一条review在实际中是不存在的,因此不能用来建模用户或者对应的物品,如果这一条review没有移除的话,模型效果可能会不合理的提高。

评价指标

基于评论的推荐系统的基本目标就是评分预测 (Rating Prediction),因此本质上是一个回归问题,因此一般情况下,j常用的三种评价指标如下:

  • Mean Squared Error: \(MSE = \frac{1}{|D|}\sum_{(u,i) \in D}(r_{u,i} - \hat{r}_{u,i})^2\)
  • Root Mean Squared Error: \(RMSE = \sqrt{\frac{1}{|D|}\sum_{(u,i) \in D}(r_{u,i} - \hat{r}_{u,i})}\)
  • Mean Absolute Error: \(MAE = \frac{1}{|D|}\sum_{(u,i) \in D}|r_{u,i} - \hat{r}_{u,i}|\)

其中\(r_{u,i}\) 表示用户u对商品i的真实评分,$ _{u,i}$则是模型预测评分。本质上这三个评价指标差别不大,一般常用的是MSE/RMSE, MAE很少单独使用。 不过有一点小trick,就是模型在训练选择loss的时候,可以尝试这三个,有时候performance可能会有些许的不同。

基本框架

推荐系统的一个核心任务就是如何得到更精确的用户和商品表示。基于评论文本的推荐模型也不例外,核心就是利用评论文本信息表示用户和商品。 一般而言, 模型都包含编码层,融合层,评分预测层等几个模块,如下简图所示: framework

其中:

  • 编码层:将用户和商品的文档通过模型编码,得到各自的特征,例如利用CNN/RNN,还有各种Attention的变种等。
  • 融合层:如何将用户表示(user embedding)和物品表示(item embedding) 进行融合,得到统一的向量,常见的element-wise的add,dot以及concatenate等,还有一些其他更复杂的操作。
  • 评分预测层:将融合得到的向量进行最终的rating prediction, 本质就是一个回归问题。常用的有使用MLP,FM, LFM等方式做最后的预测。多提一句,我们的实践发现这一层可能对部分模型效果影响较大,可能换一个输出层,指标就上去了….

大部分的工作都会在上述三个模块中动手脚,这里面的核心就是编码层,如何利用用户与商品的评论进行建模, 尽可能的反映出用户偏好和商品特征,这是本质的目的。目前已有很多基于深度学习的工作,下面会对一些比较经典常用的工作分了两类,并做简单介绍。
关于分类标准,本文并没有从方法论的角度分类(如是否用注意力机制),而是从问题建模的角度出发。 >考虑到一个用户或者一个商品会有多条评论,关于如何处理多条评论,个人将已有工作分为两种。

  • 将用户或商品的多条reviews进行concatenate得到一个较长的document, 然后对该document进行提取特征作为用户和商品特征。 这种方法将所有review聚合,能够得到用户或者商品一个全局的兴趣或者特征。
  • 单独建模每一条review,之后再将review的特征聚合为用户特征。这种方法能够捕获用户对某一特定商品的偏好信息。

下面将会按照上述的分类对已有工作进行介绍,此外最后附上两篇角度比较新奇的工作。

此外,这里先给出两种特征:

  • review-based feaure:使用user与item的评论文本信息得到对应的语义特征。
  • rating-based feature: 可以理解为单纯的user/item 的ID embedding,能够视为每个用户或者商品的独有的特征。

基于document建模的方法

下面介绍的几篇文章都是将用户或者商品的所有评论进行合并成一个长文档然后进行建模的。 ### ConvMF (RecSys’16) >Kim D, Park C, Oh J, et al. Convolutional matrix factorization for document context-aware recommendation[C]//Proceedings of the 10th ACM Conference on Recommender Systems. ACM, 2016: 233-240.

基本介绍

这大概是较早的探索卷积神经网络在review-based rec上的工作,将CNN与概率矩阵分解(PMF)结合起来进行评分预测,值得注意的是,本文仅仅利用了商品的评论数据,用户的话,还是只有评分数据。这与后面的大部分用户-商品的平行结构是不同的。

方法 在介绍ConvMF前,先简单介绍下基于评分矩阵的PMF。一般情况下,评分预测任务首先需要学习用户和商品的feature, 即两个latent feature matrix: \(U \in R^{N \times k}, V \in R^{M \times k}\), 其中U,V分别为N个用户和M个商品的特征矩阵。一般情况下,利用已有的观测矩阵向量,可以给出条件概率: \[p(R|U, V, \sigma^2) = \prod \prod \mathcal{N}(R_{ij}| U_i, V_j, \sigma^2) \]

其中U,V也都利用均值为 (向量)的高斯分布来刻画: \[p(U|\sigma_{U}^2) = \prod_{i=1}^{N} \mathcal{N}(U_i|0,\sigma_{U}^2\mathbf{I}), p(V|\sigma_{V}^2) = \prod_{j=1}^{M} \mathcal{N}(V_j|0,\sigma_{V}^2\mathbf{I})\] 最后使用最大化后验概率来优化函数,然后推导化简最终可以得到 \[\mathcal{L}(U,V) = \sum_{i=1}^N\sum_{j=1}^M(R_{ij} - U_i^TV_j)^2 + \frac{\lambda_U}{2}\sum_{i=1}^N||U_i||^2_2 + \frac{\lambda_V}{2}\sum_{j=1}^{M}||V_j||^2_2 \] 从最后的损失函数中可以看出来,其实也就是一个MSE损失,后面两项可以看出正则项,所以虽然PMF是概率模型,通过后验概率去优化,不过与直接MSE殊途同归。这样根据训练数据去更新U和V到收敛, 得到用户和商品的潜在特征,最后的评分预测,就直接使用用户和商品特征的dot得到:\(r = U_i^TV_j\)

理解了PMF, ConvMF这篇文章基本就很容易了。 ConvMF在商品的特征向量V的高斯分布上做文章,将经过CNN抽取出的评论信息特征,作为V的高斯分布的均值,而不再使用均值为\(\mathbf{0}\)。如下: \[p(V|W, X, \sigma_{V}^2) = \prod_{j=1}^{M} \mathcal{N}(V_j|cnn(W,X ),\sigma_{V}^2\mathbf{I})\] 这其中\(\mathbf{X}\)就是商品的评论文档,而\(\mathbf{W}\)则是卷积的参数,包括卷积核和偏置。至于CNN的用法,这里就不再赘述了,毕竟现在看来还是比较简单,利用word embedding将词映射为向量,之后卷积,最大池化得到feature vector。完整的框架图如下: ConvMF 有了CNN,相当于在PMF的基础上多了一个W参数,这样在最后的损失函数上,就会变成下面的: \[\mathcal{L}(U,V,W) = \sum_{i=1}^N\sum_{j=1}^M(R_{ij} - U_i^TV_j)^2 + \frac{\lambda_U}{2}\sum_{i=1}^N||U_i||^2_2 + \frac{\lambda_V}{2}\sum_{j=1}^{M}||V_j-cnn(W,X_j)||^2_2 + \frac{\lambda_W}{2}||W||^2_2 \] 其中商品对应的高斯分布的均值将PMF与CNN的桥梁。 在最终优化的时候,很显然CNN的参数W不能得到解析解,因此这两部分参数还是需要分开优化。在固定U,V的前提下,使用BP更新W。固定W的条件下, 使用坐标梯度下降即可更新U后者V,直到收敛。

总结

现在看来这篇文章的思路其实很简单,利用CNN提取商品的feature,之后将其融入到PMF中。 其实这种方法也是深度学习与概率图模型的结合的一种很直接的方式,用深度模型学到的特征替换某一分布的参数,可以理解为先验。 后来也有不少工作在这个思路上发展,比如偶然看见的WWW2018的一篇Poster: >Network Embedding Based Recommendation Method in Social Networks

基本思路也是利用预训练的Embedding替换分布参数。 此外,反过来思考这篇文章只用了商品的评论建模,没有利用用户的历史评论信息,可能是当时推荐系统优先考虑如何学习item embedding, 而对user embedding的研究并不是很多。 ConvMF的源代码地址:ConvMF

DeepCoNN (WSDM’17)

Zheng L, Noroozi V, Yu P S. Joint deep modeling of users and items using reviews for recommendation[C]//Proceedings of the Tenth ACM International Conference on Web Search and Data Mining. ACM, 2017: 425-434.

基本介绍

上面说到ConvMFC只用了商品的评论文本,DeepCoNN这篇文章可以说是ConvMF的进阶版,全部使用深度学习模型去建模用户和商品,完全的end-to-end训练。 利用两个平行的卷积结构分别对用户和商品的评论文档建模,最后使用了FM (Factorization Machine) 做评分预测。 需要说明的是: >DeepCoNN原文在处理数据的时候,并没有去掉在validation 和 test dataset中 的评论。

方法

模型其实现在看来很简单,首先将用户和商品的所有评论串联起来组成两个长的文档,然后用两个卷积结构(卷积层,池化层)学习文档的表示向量作为用户和商品的表示,最后串联二者输入到FM中预测评分,结构图如下:

DeepCoNN

DeepCoNN

对应到三个模板的就是:

  • 编码层:卷积神经网络, CNN
  • 融合层: concatenation 串联
  • 评分预测层:Factorization Machine 因子分解机

具体的细节也就无需再介绍了。

总结 这篇文章应该算是第一篇完全基于深度学习的review-based rec模型,并且设计的用户和商品平行结构 (类似文本语义匹配的双塔结构)也是后面很多工作的基石。 有第三方复现的代码:DeepCoNN .

D-Attn (RecSys’17)

Sungyong Seo, Jing Huang, Hao Yang, and Yan Liu. 2017. Interpretable Convolutional Neural Networks with Dual Local and Global Attention for Review Rating Prediction. In Proceedings ofthe Eleventh ACMConference on Recommender Systems.

基本介绍 这篇文章在DeepCoNN的基础上引入了词级别的attention,不同的词对于建模用户和商品的重要性是不同的, 因此这篇文章引入了两种词级别的注意力机制:local and global attention 都是为了寻找更informative的词,为不同的词赋予不同的权重。

方法 跟DeepCoNN一样,双塔结构。首先review document经过word embedding层,得到词矩阵表示\(\mathbf{d_u=[x_1, x_2, ..., x_ T]}\)。之后分别是两种attention + CNN:

  • CNN based on local attention : 这一层利用词的上下文信息,来获得当前词的重要性。
    • 具体首先设定一个local window,假设宽度为\(w\), 当前词为第\(i\)-th 词, 那么如何结算第\(i\)-th词的注意力权重呢? 首先取出第i个词上下各\(w/2\)的词,即: \(\mathbf{X_{l-att,i}}[\mathbf{x_{i+\frac{-w+1}{2}}, \cdots, x_i, \cdots, x_{i+\frac{w-1}{2}}}] \in R^{w \times d}\), 这样组成一个\(w*d\)的矩阵,作为\(x_i\)的上下文局部信息,之后直接经过一层的MLP得到一个权重标量,作为词的权重: \(s_i = MLP(\mathbf{X_{l-att, i}})\), 之后得到一个带权的document 矩阵\([s_1\mathbf{x_1},\cdots,s_i\mathbf{x_i}...]\)
    • 由于前面的加权词矩阵已经捕获了上下文信息,因此接下来的CNN的filter的窗口直接设置为1,最后使用max pooling得到基于local attention的用户、商品的评论文档特征向量。
  • CNN based on global attention:这一部分global attention本质上就是一个普通的窗口大于1 的CNN, 然后池化得到一个特征向量,至于能否称之为global还有待商榷。
  • 将这两部分的特征进行拼接得到用户和商品的表示向量,之后直接进行dot product 预测最终的评分。

完整的框架图如下所示:

D-Attn

D-Attn

总结

这篇文章算是第一篇在review-based rec上使用了attention机制,用来indicate那些更加重要的词。不过现在看来global attention的动机稍微不那么convincing,根据文中的描述,本质就是朴素的CNN,当然这篇文章的核心贡献就是引入了注意力机制,但是仅仅是词级别,所以才会有后面的review-level的注意力机制模型。

ANR

CARL

DAML

CARP

基于review建模的方法

接下来这一系列的方法都是单独对用户或商品的每一条评论进行建模,得到每一条review的feature,之后将所有的feature进行聚合,作为用户或者商品的特征。

NARRE (WWW’18)

Chen C, Zhang M, Liu Y, et al. Neural attentional rating regression with review-level explanations[C]//Proceedings of the 2018 World Wide Web Conference. 2018: 1583-1592.

基本介绍

这篇文章的出发点很简单,就是不同review的重要性是不同的,有的review包含信息量大,可能对建模用户或者商品更加有用 (usefulness), 而有的review可能没有作用。 因此这篇文章提出了review-level的注意力机制来刻画每一条review的权重。

方法

有了上述的动机,具体的方法就比较清晰了,同样的双塔框架图如下所示:

  • Review Encoder: 对每一条评论建模使用CNN+Max Pooling 得到review 的 feature, 也就是图中的\(O_{u1}, O_{u2}..\)
  • User/Item Encoder: 使用Attention 聚合所有的 \(O_{u1}...O_{uj}\)得到用户u的表示,聚合所有的\(O_{i1}...O_{ik}\)得到商品i的表示。
    • Attention Score计算:在计算某一个review的score的时候,NARRE并没有随机初始化一个query vector直接做点乘,再, 而是借助于这条review对应的user 或者 item 的ID Embedding计算,不过是一种交叉计算。 比如聚合用户的review list的时候,使用的是当前review对应的item的 ID embedding, 聚合商品的review list的时候,用的是当前review对应的用户的ID Embedding。其实这里的动机解释的话,大概是这样。 有些用户总喜欢写一些无用的评论,有些用户则倾向于写信息量高的评论,所以融入user的ID embedding 能够包含用户本身usefulness的信息,具体的计算公式,以item为例: \[a^*_{il}=h^TReLU(WO_{il} + W_uu_{il} + b_1) + b_2\] 得到的\(a^*_{il}\) 则是商品i的第l条review的权重.
    • 按照softmax将\(a^*\)归一化权重,进而使用加权平均,得到商品从评论文本中得到的feature: 记为\(Y_i\), 同样方法得到user的feature, 记为\(X_i\).
  • Rating Prediction: 本文考虑到传统的rating feature (即ID Embedding) 用到最后的评分预测中,即:\[h= (q_u + X_u) \cdot (p_i + Y_i)\], 其中\(q_u,p_i\)分别为用户u和商品i的ID Embedding。 之后使用Latent Factor Model 计算最终的评分: \(r_{u,i} = MLP(h) + b_u + b_i\),其中 \(b_u\)为用户偏置,\(b_i\)为商品偏置。

总结

这篇文章比较经典,我个人认为他的核心贡献有两点:

  • 引入review-level的注意力机制,研究不同评论的usefulness.
  • ID Embedding的使用:(1)用于Attention的计算。 (2) 最后Rating Prediction中。 实际上在我们的实验中发现, 最后单纯使用id embedding做rating prediction, 在几个小的数据集上表现甚至优于很多复杂的深度学习模型。

MPCN

TARMF

其他

TransNet

PARL

总结

基于评论文本的推荐系统其实一定程度上跟NLP技术的结合更多,不过场景和动机都是出自推荐领域,本身在实际应用中远少于一些CTR系列的推荐工作,属于一个小领域。从近几年的趋势来看, 大家基本都已经明了这块的工作基本上从框架中的三个部分着手进行改进:编码层,融合层和评分预测层。相对于review来说,显然核心是编码层,毕竟融合层和评分预测层毕竟在其他推荐领域也都是共同问题。 此外小声说一句,感觉这个坑已经快填满了。

最后则是,上述所有内容均是个人总结,如有纰漏,欢迎指出。