前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个 RNN 调研引发的点评推荐血案

一个 RNN 调研引发的点评推荐血案

原创
作者头像
serena
修改2021-08-03 14:56:06
2.4K0
修改2021-08-03 14:56:06
举报
文章被收录于专栏:社区的朋友们社区的朋友们

作者:阿龙

导语

推荐系统在电子商务领域有着很重要的作用。电子商务公司通过向用户推荐符合他们口味的商品而获取巨大利润。最为通常的推荐方法是基于内容的协同过滤对每个用户产生一个推荐列表,但是这些方法并没有很好的考虑用户的评论内容,同时这些评论内容直接体现用户的偏好。在这篇文章里,作者基于用户的评论内容,评估了十多种不同的 RNN 框架。这些 RNN 框架包括多层双向 GRU 和 LSTM,同时有 attention-based RNN 框架。这种基于注意力的 RNN 框架不仅在众多模型中表现尚佳,同时它会对每一个评论单词赋予一个权重。因为获得了每一个单词的权重,我们能够在后续预测过程中增加一些额外的视角。作者在做相关的调研时采用的是Yelp(类似国内的大众点评)的数据集。

简介

随着像Yelp和Trip-Advisor 这样的点评网站的数据量级迅速增长,它们拥有关于用户个性化和偏好的充足数据。大量的评论信息对于推荐的准确率提升是一种新的助力,因为用户的偏好深根于用户的评论之中,这些评论对于神经网络来说能够产生很多有用的特征。在这篇文章里,作者调研并对比了十多种不同RNN推荐系统模型。

在调研过程中,我们首先面临一个很重要的问题:基于用户的个人数据对单个用户进行预测会有特征稀疏性的问题,也就是说单个个体的自解释特征覆盖的样本太少,容易造成过拟合。因此需要更加泛化的特征覆盖更多的人和样本。当前已经有许多成熟的方案来解决数据稀疏性问题13。由于我们的目标是为模型以获取用户偏好的充足数据,因此我们基于用户的偏好寻找其最邻近的用户,并且使用最邻近用户形成的簇所包含的评论来训练模型。

RNN模型的输入:将评论中每一个单词转换为单词向量(word vector),每一个word vector 作为RNN模型的隐层输入4。

RNN模型的输出:用户对特定饭店的喜好的概率。每一个簇的用户都有其自己的模型。

[1499656069645_6259_1499656069823.png]
[1499656069645_6259_1499656069823.png]

我们采用自底向上的方式来生成不同的RNN结构。首先是实验两个典型的RNN模型效果:LSTM和GRU,这两个模型能够解决梯度消失的问题7。为了能够使模型结合评论的上下文信息,增强模型预测能力,引入了双向的RNN结构(bi-directionality)。另外,从网络深度的维度,我们在LSTM和GRU的基础上,引入了多个隐含层的RNN模型。最后,attention-based 的RNN 模型也被引入进来,因为注意力模型能够对训练评论每一个单词给出一个权重,用来表明评论中哪些单词对表达中心主题更重要。

相关工作

我们知道,RNN是一个极具表达能力的模型,能够学习出序列数据中高度复杂的关系。它维护着序列数据中每一个时间步长的一系列激活单元,这使得RNN结构深度天然就会很长。而这样的结构会导致两个问题:梯度爆炸,梯度消失。

[1499656141970_3472_1499656142276.png]
[1499656141970_3472_1499656142276.png]
[1499656155079_4895_1499656155253.png]
[1499656155079_4895_1499656155253.png]

梯度爆炸的问题可以通过增加一个梯度上限来解决9;梯度消失的问题可以通过LSTM和GRU的结构很好地解决1012。LSTM 和 GRU 都是通过重新参数化RNN的模型来解决梯度消失的问题;LSTM单元的输入是由输入门的激活来控制,更早之前的数据是由遗忘门来控制,网络结构只会通过LSTM cell 结构中门的控制来相互影响。GRU 是在LSTM的基础上,把遗忘门和输入门结合成一个更新门,并将隐含状态结合了cell的状态,并且它的效果在某些任务被证明是超过LSTM8。

另一个关键问题是:单向的RNN结构每一层的输出是完全依赖上文环境。对于一个自然语句的理解应该依赖于上下文环境。如果不仅仅依赖上文或者下文,会导致预测的准确性降低。对于这个问题,一个看上去优雅的解决方案是通过双向的RNN模型来解决这个问题。每一个训练序列会被表达成前向和后向两种单独的循环网络,它们都被连接到同一个输出层1416。

[1499656182173_6023_1499656182367.png]
[1499656182173_6023_1499656182367.png]

多层的RNN模型已经被证明在NLP领域有很显著的效果18。单层RNN被排列在一起,每一个隐含状态的输出信号作为上层隐含状态的输入。多层的结构能够在不同时间维度发挥作用,低层RNN能够获取短时的相互影响,然而聚合的影响能够被深层的RNN模型所捕获17。

[1499656194032_3085_1499656194134.png]
[1499656194032_3085_1499656194134.png]

最后一个关键的技术点是,引入注意力模型到RNN中,能够使RNN模型更加关注一条评论某局部关键信息,并且模型会认为这个局部的信息是对整个评论的理解起到了关键作用。

举个例子,“我的段位达到了最强王者,哈哈哈哈哈”。显然,我们会觉得“我,段位,最强王者”是非常关键的信息,然而“哈哈哈哈哈”是无关痛痒的东西。引入注意力模型,就是希望RNN模型知道对于输入的评论,每一个单词对语义理解的贡献都是有一定权重的1921。

[1499656212146_6811_1499656212251.png]
[1499656212146_6811_1499656212251.png]

数据集

数据集采用的是Yelp DataSet Challenge website。它提供的是5种Json结构的对象,包含饭店、用户、评论、登记、建议信息,我们只使用了饭店,用户和评论信息。

饭店信息包含饭店类型、位置、类别、评分、名字等。

评论信息包含评星和评论内容。

yelp 数据集包含2225134 条评论,77445 个饭店,552339个用户。我们把数据集减少到 关于27882个饭店的1231275个评论。

为了克服单个用户数据的稀疏性,我们把具有相似偏好的k-nerest的用户聚集在一个簇里面2,并用这个簇所包含的用户评论来作为训练集。我们将评论数据集分为训练集(4000评论),有效集(400条评论),测试集(400条评论)。评论中每一个单词被转化为300维的向量,使用的方法是GloVe5,这个GloVe类似于Word2Vector,但是比Word2Vector好用。

为了简化RNN模型的输入,我们统一每条评论的单词个数为200个。主要的操作方法是:评论单词数大于200个,会砍掉200之后的单词;评论单词数小于200个,会重复评论最后的句子追加到评论里面直至200个。为啥是200个呢,当然不是拍脑袋想的,是统计出来的。

这样的话,RNN的输入实际上是固定两个单词,每一单词300维的向量表示。

实验方法和模型

通常方法

我们需要实验10种不同的RNN模型,每一个模型都会将指定饭店的评论作为输入,输出是用户对饭店喜欢还是不喜欢。

我们将饭店的评论分为两个类别:

  • 喜欢:评论星级是4或者5
  • 不喜欢:评论星级是1或者2

每个单词的词向量都会喂给RNN的隐层,最后的输出会通过softmax的激活函数返回每一个类别的概率。我们使用交叉熵作为代价函数来训练模型,样本的label被表示成one-hot形式。

[1499656292453_9250_1499656292649.png]
[1499656292453_9250_1499656292649.png]

在这个实验中,我们只关注选择的数据来测试不同的RNN模型效果。结果显示,GRU模型效果好于LSTM。然后,我们以GRU作为Cell单元,

模型选择

我们首先测试比较GRU和LSTM的效果。然后以GRU的cell作为单元基础,构造单层、双层、三层、四层的双向模型,来进行实验效果测试。以同样的方式,基于GRU的cell,构造多层的基于注意的RNN模型。

[1499656320449_5016_1499656320590.png]
[1499656320449_5016_1499656320590.png]

LSTM模型和GRU模型描述

[1499656448171_6760_1499656448483.png]
[1499656448171_6760_1499656448483.png]
[1499656462649_6430_1499656462882.png]
[1499656462649_6430_1499656462882.png]

LSTM 和 GRU 都是在基本的RNN结构上改造隐含单元的结构。这些结构看起来很复杂,但其实这些不关键。只要记住这些结构能起到很好地保存短期和长期的记忆,并有效地解决梯度消失的问题就ok了,具体推导在这里不展开。

双向RNN模型描述

BiRNN 包含前向和后向的RNN结构(GRU cell)。在前向RNN中,输入的顺序是从第一个单词导最后一个单词,模型会计算前向序列的隐含状态。后向RNN是把输入序列倒过来,产生一个倒序的隐含状态。我们取双向RNN输出的平均值,并进行线性转换,输入到softmax的激活函数,然后获得输出。

多层 BiRNN是由多个单词BiRNN构成的模型。每上一层的隐含状态是作为下一层隐含状态的输入。直观来看,每一层都会用上一层的记忆序列作为输入序列,并计算出自己的记忆表达。我们也是通过计算最后一层双向RNN的输出的平均值,输入到softmax激活函数来计算最后预测值。

[1499656526409_5777_1499656526734.png]
[1499656526409_5777_1499656526734.png]

基于注意力的模型描述

一个标准的RNN模型会通过长距离的方式来传播依赖关系来获得最后的预测结果。RNN网络必须获取之前状态的所有信息来作预测。对于神经网络来说,处理长文本的内容将是很困难的。例如有1000个单词,通过一千次传递到最后的输出。最后输出必须包含一开始的输入,这个信息折损是相当大的,不能很好表达第一个单词的意思。在本文实验中,我们的输入长度是200个单词,训练过程中是很容易造成信息损失的1921。

我们引入了基于注意力的模型思想来助力RNN模型。简单理解就是我们希望对输出的影响,不仅是传递到最后一个单词的输出来影响预测,而是每一个序列的输出都会影响预测。这样对于预测的结果来说,就知道哪些词是关键的,哪些是不关键的。

[1499656556942_3909_1499656557197.png]
[1499656556942_3909_1499656557197.png]

实验结果

GRU和LSTM有相似效果,它们的效果都要好于基线SVM的效果。

[1499656574449_4432_1499656574734.png]
[1499656574449_4432_1499656574734.png]

同时,BiRNN要好于uni-directional RNN效果,多层的BiRNN的效果要好于单层BiRNN的效果。同时我们也发现准确率不是是层数越多越好,而是在达到第三层的时候,效果是最好的。同时,我们也看到当引入了注意力模型时,其效果并没有预计的那么好,这个可能跟训练的数据有大关系。

[1499656752557_8739_1499656752759.png]
[1499656752557_8739_1499656752759.png]

引入注意力模型的效果,我们也可以看到这样的例子。

[1499656727194_9558_1499656727845.png]
[1499656727194_9558_1499656727845.png]

上面是两个测试样本。标粗的单词是在Bi-directional RNN with Attention 模型中,输出权重top的单词。从这两个样本,我们可以再深刻体会下注意力模型的作用。前者是一个good case,标粗的单词能够概括整个评论的主题思想,后面的例子就呵呵了....

总结和未来工作

1. 证明了RNN在预测用户偏好时,评论内容是用得上的。

2. 多层双向,基于注意力的RNN模型比起单层单向的RNN模型预测得还是要准一些。

3. 并不是神经网络的层数越多越好使,还是要试试,看命。

4. 理论上基于注意力的RNN模型效果更好,但是实际效果差了些,这个跟数据集不够充足有关。

存在的问题:

1. 评论的长度限制太死了,后面其实可以让模型处理自定义长度。

2. 数据集可以用得更多。

3. 目前RNN的输出只有2个类别,其实可以设置更多的类别,并且做到并不针对某一个饭店预测(输入引入除评论的外的,饭店特征维度)。

参考文献

1 Aggarwal, C.C., Wolf, J.L., Wu, K., Yu, P.S.: Horting hates an egg: A new graph-theoretic approach to collaborative filtering. In: Proc. of the 5th ACM SIGKDD Int. Conf. on Knowledge Discovery and Data Mining, KDD 1999, pp. 201-212. ACM, New York (1999)

2 Sarwar, B., Karypis, G., Konstan, J., Riedl, J.: Item based collaborative filtering recommendation algorithms. In: Proc. of the WWW Conf. (2001)

3 Wang, F., Ma, S., Yang, L., Li, T.: Recommendation on item graphs. IN. Proc. of the Sixth Int. Conf. on Data Mining, ser. ICDM 2006, pp. 1119-1123. IEEE Computer Society, Washington, DC (2006)

4 T. Mikolov, I. Sutskever, K. Chen, G. Corrado, and J. Dean. Distributed Representations of Words and Phrases and their Compositionality. NIPS 2013.

5 Pennington, Jeffrey, Richard Socher, and Christopher D Manning. 2014. Glove: Global vectors for word representation. Proceedings of the Empiricial Methods in Natural Language Processing (EMNLP 2014) 12.

6 Richard Socher, Alex Perelygin, Jean Wu, Jason Chuang, Christopher D. Manning, Andrew Y. Ng, and Christopher Potts. 2013b. Recursive deep models for semantic compositionality over a sentiment treebank. In Proceedings of the 2013 Conference on Empirical Methods in Natural Language Processing, pages 1631–1642, Stroudsburg, PA, October. Association for Computational Linguistics.

7 Bengio, Yoshua, Simard, Patrice, Frasconi, Paolo, 1994. Learning long-term dependencies with gradient descent is difficult. Neural Networks, IEEE Transactions on, 5, pp.157–166.

8 Jozefowicz, Rafal, Zaremba, Wojciech, and Sutskever, Ilya. An empirical exploration of recurrent network architectures. In Proceedings of the 32nd International Conference on Machine Learning (ICML-15), pp. 2342– 2350, 2015.

9 Pascanu, Razvan, Mikolov, Tomas, and Bengio, Yoshua. On the difficulty of training recurrent neural networks. arXiv preprint arXiv:1211.5063, 2012.

10 Hochreiter, S., & Schmidhuber, J. (1997). Long short-term memory. Neural Computation, 9(8),1735–1780.

11 Gers, F., Schraudolph, N., & Schmidhuber, J. (2002). Learning precise timing with LSTM recurrent networks. Journal of Machine Learning Research, 3, 115–143.

12 Cho, Kyunghyun, van Merrienboer, Bart, Gulcehre, Caglar, Bougares, Fethi, Schwenk, Holger,and Bengio, Yoshua. Learning phrase representations using rnn encoder- decoder for statistical machine translation. arXiv preprint arXiv:1406.1078, 2014.

13 Chung, Junyoung, Gulcehre, Caglar, Cho, KyungHyun, and Bengio, Yoshua. Empirical evaluation of gated re- current neural networks on sequence modeling. arXiv preprint arXiv:1412.3555, 2014.

14 Schuster, M., & Paliwal, K. K. (1997). Bidirectional recurrent neural networks. IEEE Transactions on Signal Processing, 45, 2673–2681.

15 Baldi, P., Brunak, S., Frasconi, P., Soda, G., & Pollastri, G. (1999). Exploiting the past and the future in protein secondary structure prediction. BIOINF: Bioinformatics , 15.

16 A. Graves and J. Schmidhuber, “Framewise Phoneme Classification with Bidirectional LSTM and Other Neural Network Architectures,” Neural Networks, vol. 18, nos. 5-6, pp. 602-610, 2005.

17 Michiel Hermans and Benjamin Schrauwen. 2013. Training and analysing deep recurrent neural networks. In Advances in Neural Information Processing Systems, pages 190–198

18 Irsoy, Ozan, and Claire Cardie. "Opinion Mining with Deep Recurrent Neural Networks." EMNLP. 2014.

19 Bahdanau, Dzmitry, Kyunghyun Cho, and Yoshua Bengio. "Neural machine translation by jointly learning to align and translate." arXiv preprint arXiv:1409.0473 (2014).

20 Mnih, Volodymyr, Nicolas Heess, and Alex Graves. "Recurrent models of visual attention." Advances in Neural Information Processing Systems. 2014.

21 Karol Gregor, Ivo Danihelka, Alex Graves, and Daan Wierstra. DRAW: A recurrent neural network for image generation. CoRR, abs/1502.04623, 2015.

22 Hermann, Karl Moritz, et al. "Teaching machines to read and comprehend."Advances in Neural Information Processing Systems. 2015

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • 简介
  • 相关工作
  • 数据集
  • 实验方法和模型
    • 通常方法
      • 模型选择
        • LSTM模型和GRU模型描述
          • 双向RNN模型描述
            • 基于注意力的模型描述
            • 实验结果
            • 总结和未来工作
            • 参考文献
            相关产品与服务
            云顾问
            云顾问(Tencent Cloud Smart Advisor)是一款提供可视化云架构IDE和多个ITOM领域垂直应用的云上治理平台,以“一个平台,多个应用”为产品理念,依托腾讯云海量运维专家经验,助您打造卓越架构,实现便捷、灵活的一站式云上治理。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档