推荐系统遇上深度学习 (二十九)-- 协同记忆网络
协同过滤 (collaborative filtering) 是推荐系统中经典的一类方法。协同过滤中比较经典的解法有基于邻域方法、矩阵分解等,这些方法都有各自的优点和缺点,本文介绍的方法 -** 协同记忆网络(Collaborative Memory Network,简称 CMN)** 融合了不同协同过滤方法的优点。我们来一探究竟!
协同记忆网络 CMN 论文:https://arxiv.org/pdf/1804.10862.pdf
代码地址:https://github.com/tebesu/CollaborativeMemoryNetwork
1、协同过滤介绍
在信息过载的时代,推荐系统显得十分重要。而在推荐系统中,协同过滤是一种非常受欢迎且有效的方法。协同过滤基于用户和物品的过去交互行为,同时认为相似的用户会消费相似的物品,从而进行推荐。
协同过滤是一类推荐方法,大体上可以分为三个分支:
-
基于邻域的方法。这也是我们常说的基于物品的协同过滤和基于用户的协同过滤方法。我们首先需要计算用户之间、物品之间的相似度,随后基于计算的相似度进行推荐。这种方法的一个主要缺陷就是只使用了局部的结构,而忽略了很多全局的信息,因为我们只使用 K 个相似用户或者相似物品进行相关的推荐。
-
基于隐向量的方法。这一分支中最具代表性的是矩阵分解及后面的各种改进方法。通常的做法是将每一个用户和物品表示称一个 n 维的向量,通过用户矩阵和物品矩阵的相乘,希望能够尽可能还原评分矩阵。这种做法虽然考虑了全局的信息,但是忽略了一些比较强的局部联系。
-
基于混合模型的方法。由于上述两种方法都有各自的缺陷,因此混合方法开始出现。最具代表性的是因子分解机和 SVD++ 方法。
也就是说,在使用协同过滤这些方法时,我们通常需要关注两点:
1、需要考虑全局的信息,充分利用整个评分矩阵。
2、需要考虑局部的信息,考虑用户或者物品之间的相似性。相似性高的用户或者物品给予更高的权重。
本文将要介绍的协同记忆网络,便是充分利用了上述两方面的信息。协同过滤我们已经介绍了,那么什么是记忆网络呢?我们接下来进行介绍。
2、记忆网络 Memory Network 简介
Memory Network 是深度学习的一个小分支,从 2014 年被提出到现在也逐渐发展出了几个成熟的模型。我们这里只介绍其中两个比较基础的模型。一个是 Basic Memory Network,另一个是 End to End Memory Network。
我们首先要搞清楚的是,为什么要有记忆网络?在翻译、问答等领域的任务中,我们通常使用的是 Seq2Seq 结构,由两个循环神经网络组成。循环神经网络 (RNN,LSTM,GRU 等) 使用 hidden states 或者 Attention 机制作为他们的记忆功能,但是这种方法产生的记忆太小了,无法精确记录一段话中所表达的全部内容,也就是在将输入编码成 dense vectors 的时候丢失了很多信息。因此,在模型中加入一系列的记忆单元,增强模型的记忆能力,便有了 Memory Network。
2.1 Basic Memory Network
基本的 Memory Network 由 Facebook 在 2014 年的“Memory Networks”一文中提出。该模型主要由一个记忆数组 m 和 I,G,O,R 四个模块。结构图如下所示:
简单来说,就是输入的文本经过 Input 模块编码成向量,然后将其作为 Generalization 模块的输入,该模块根据输入的向量对 memory 进行读写操作,即对记忆进行更新。然后 Output 模块会根据 Question(也会进过 Input 模块进行编码)对 memory 的内容进行权重处理,将记忆按照与 Question 的相关程度进行组合得到输出向量,最终 Response 模块根据输出向量编码生成一个自然语言的答案出来。各模块作用如下:
有关记忆网络的详细原理,参考文章:https://zhuanlan.zhihu.com/p/29590286或者原论文:https://arxiv.org/pdf/1410.3916.pdf。
2.2 End to End Memory Network
End to End Memory Network 是 Memory Network 的一个改进版本,可以进行端对端的学习。原文中介绍的网络模型应用于 QA 任务。单层网络的结构如下图所示:
模型主要的参数包括 A,B,C,W 四个矩阵,其中 A,B,C 三个矩阵就是 embedding 矩阵,主要是将输入文本和 Question 编码成词向量,W 是最终的输出矩阵。从上图可以看出,对于输入的句子 s 分别会使用 A 和 C 进行编码得到 Input 和 Output 的记忆模块,Input 用来跟 Question 编码得到的向量相乘得到每句话跟 q 的相关性,Output 则与该相关性进行加权求和得到输出向量。然后再加上 q 并传入最终的输出层。
进一步,我们可以使用多层的结构:
有关 End2End Memory Network 的详细原理,可以参考文章:https://zhuanlan.zhihu.com/p/29679742和原论文:http://10.3.200.202/cache/11/03/papers.nips.cc/82b8c2ad3e5cde7cad659be2d37c251e/5846-end-to-end-memory-networks.pdf。
当然,也可以动手实现一个网络结构,参考代码:https://github.com/princewen/tensorflow_practice/tree/master/nlp/Basic-EEMN-Demo
3、协同记忆网络原理
我们的协同记忆网络 CMN 其实借鉴了 End2End Memory Network 的思路,我们先来看一下完整的网络结构,随后一步步进行介绍:
这里明确一点,我们的任务是预测用户 u 对于物品 i 的评分。
3.1 User Embedding
首先,我们会有两组用户的 Memory(其实就是 Embedding),分别是 M 和 C,M 用于计算用户之间关于某件物品 i 的相关性,C 用于最终的输出向量。我们还有一组物品的 Memory(其实就是 Embedding),我们称作 E。
对于预测用户 u 对于物品 i 的评分。我们首先会得到历史上所有跟物品 i 有反馈的用户集合,我们称作 N(i)。接下来,我们要计算目标用户 u 和 N(i) 中每个用户的相关性,基于下面的公式:
其中,mu,mv 分别是用户 u 和用户 v 在 M 中的相关记忆。ei 代表物品 i 在 E 中的相关记忆。
3.2 Neighborhood Attention
对于上一步计算出的相关性,我们需要通过一个 softmax 操作转换为和为 1 的权重向量:
同时,根据得到的权重向量,我们根据下面的式子得到输出向量:
其中,cv 代表用户 v 在 C 中的相关记忆。
3.3 Output Module
最终的预测输出为:
可以看到,在上面的式子中,括号中的第一项是用户的记忆 mu 和物品的记忆 ei 进行的 element-wise 相乘操作,这相当于矩阵分解的思想,即考虑了全局的信息。第二项相当于是按照基于邻域的思路得到的一个输出向量,即考虑了局部的相关用户的信息。最终经过激活函数φ和输出层得到最终的预测评分。因此,CMN 不仅考虑了全局的结构信息,还考虑了局部的相关用户的信息。
3.4 Multiple Hops
CMN 模型可以扩展为多层。在每一层,我们的记忆是不变的,变化的主要是权重向量。每一层的权重向量计算公式如下:
那么这就跟我们单层的 CMN 网络中的计算方式是一样的,因为内积的计算是符合乘法分配律的。
接下来每一层的 z,计算公式如下:
3.5 Parameter Estimation
论文中 CMN 网络采取的是一个pair-wise 的方式,训练时每次输入一个正样本得到一个评分,输入一个负样本得到一个评分,我们希望正样本的得分远大于负样本的得分。这种形式我们称为Bayesian Personalized Ranking (BPR) optimization criterion:
好了,模型的原理我们就介绍到这里了,接下来我们看一下代码实现吧。
4、CMN 模型的 tensorflow 实现
本文的代码参考地址为:https://github.com/tebesu/CollaborativeMemoryNetwork
代码文件结构为:
该 Demo 中的部分神经网络结构由 dm-sonnet 进行了封装,可以通过 pip install dm-sonnet 进行安装,默认进行安装的话,tensorflow 的版本应该至少在 1.8 以上。
有关代码的实现细节,本文就不再介绍了,感兴趣的话,大家可以看一下这个 Demo。
参考文献
1、《End-To-End Memory Networks》:http://10.3.200.202/cache/11/03/papers.nips.cc/82b8c2ad3e5cde7cad659be2d37c251e/5846-end-to-end-memory-networks.pdf )
2、《MEMORY NETWORKS》:https://arxiv.org/pdf/1410.3916.pdf
3、https://zhuanlan.zhihu.com/c_129532277
作者:石晓文的学习日记
链接:https://www.jianshu.com/p/3e80d8426f7f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

时间:2019-01-20 01:32 来源: 转发量:次
声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。
相关文章:
相关推荐:
网友评论: