《Restricted Boltzmann Machines for Collaborative Filtering》理解与资料整理
1 原文如下
2 理解
这篇文章尝试把RBM应用到协同过滤中,在netflix上的数据集做实验,RBM方法与SVD方法线性插值相结合,能提高系统性能6%左右。
2.1问题描述:
对电影的推荐,用户对电影集合中的某个电影进行打分,分值区间为(0, k]。
基于user-based的协同过滤算法,用用户对电影的打分形成一个整数向量,用来表征用户特征,进一步计算用户之间的相似度。这篇文章引入RBM,输入向量为用户对电影的打分的整数向量,从而学习隐含层,并用隐含层的数值来表示用户特征。进一步地,类似协同过滤,也可以用用户向量来计算用户之间的相似关系。不过作者没有按照这个思路做,而是直接用RBM的输入向量,从隐含层向显示层reconstruction的结果,来预测当前用户与未知电影之间的关系。针对每一个用户,训练一个RBM。
标准RBM的输入时0-1向量,上面的RBM的输入节点是个(0, k]的向量,表示用户对当前电影的打分。其时,将(0, k]向量向水平方向展开,就是标准RBM了。
Softmax神经元为一个长度为K的向量,并且这个向量每次只有一个分量为1,其余分量则为0。而评分缺失的Softmax神经元可以同样视为一个长度为K的向量,只不过其所有的分量始终为0。
用户的输入向量是个稀疏向量,包含了所有电影,但是很多电影用户并没有评分,就是上面的missing的部分。这部分的输入如何取值?作者的解决方法是不考虑这部分节点,在模型训练的时候,只考虑用户已经有评分的电影、以及相关联的权重。用CD-k的算法,来更新当前用户的RBM的权重。更新之后,输入向量转为下一个用户的输入向量,这时候missing的节点电影,就有可能被那个用户评分。这个用户,模型的训练过程同上,也是只针对这个用户所评分的电影,进行RBM权重更新——文章中说对每个用户单独建立RBM是不准确的,其实就是一个RBM,只不过更新权重的时候,1. 不是所有的权重都要更新,2. 每个用户的输入作为单独一个样本,一个样本一个样本的训练。最终,所有样本都训练完之后,形成RBM最终的权重,此时,将用户的输入向量输入进去,在隐含层得到的就是用户在这些电影上的兴趣表示了。
RBM的训练过程仍然用的CD-k,与普通RBM没什么不同;不同之处在于某些权重(用户没有看过电影的节点对应的权重)没有参与当时的训练。
2.2 模型预测
得到了RBM,且得到了用户在RBM隐含层表示的用户兴趣向量,如何给用户推荐电影呢?两种思路:
- 采用协同过滤的框架,用用户表示向量来计算用户之间的相似度,然后用“相似用户看过的电影给当前用户进行推荐”。不过这篇文站采用的是另外一种方法——更加直接的方法。
- 本文的方法,是在得到RBM模型之后,用用户的电影评分向量作为输入向量,然后用RBM reconstruct用户的输入向量,包括那些missing input(表示用户没看过的电影)。此时,这些missing input的值就是表示了用户对这个电影的喜好程度。电影有k个评分,RBM reconstruct 对这k个值(所对应的节点)都有输出。选择用户对这个电影的预测评分就有两种方法:1. 选择k个节点中RBM输出权值最大的那个节点作为用户对当前电影的评分;2. 对这k个节点的权重加权平均,平均值离k个数字哪个最近,就是评分是多少。在实践中,这两种方法都可以尝试一下。
2.3 模型改进
2.3.1 conditional RBM
上面的模型有一个缺点,忽略了一个信息:用户可能看过这个电影,只不过没有评分而已。这个信息上面的模型没有利用。用户看过电影,也是表示对这个电影的一个喜好。conditional RBM 就是解决这个问题。它引入了一个辅助输入0-1向量,表示用户是否看过这个电影。如果看过,但是没有评分,那么对应的电影的用户输入(missing状态,是随机值)以及对应的权重,也参与训练。作者认为这样会有助于提升模型性能。此时RBM的结构如下:
2.3.2 Conditional Factored RBM
完全训练conditional RBM会因为参数过多而变慢。Factored RBM 将 RBM 中的权重矩阵W分解为两个小矩阵A和B的乘积,CD-k算法分别对这两个小矩阵进行权重更新(非常类似对W的更新),从而用减少参数的方式来加快训练速度。文章中称同conditional RBM相比,Conditional Factored RBM的效果略差,但是速度很快。不过文章中的实验效果是Conditional Factored RBM的效果也更好。
参考文献
1、deep learning学习笔记】Restricted Boltzmann Machines for Collaborative Filtering
2、实例与代码
3、一定要阅读
4、对应文献3的代码