论文笔记:Restricted Boltzmann Machines for Collaborative Filtering

摘要

目前存在的大多数协同过滤算法都不能解决大量数据集对应的矩阵运算,本文中展示了两层的无向图模型,即RBM,可以用来建模表格数据,比如用户评级。我们给出了高效的算法,证明了它在很大的数据集上可以运行。同时,还证明了它比SVD的性能略好。当RBM和SVD组合时,可以获得6%的性能提升。

绪论

协同过滤的一个常用方法是矩阵分解。假如用NM的矩阵来表示N名用户评价M个电影,那么NM矩阵可以写为NC的矩阵和CM的矩阵的乘积,其中前者是用户矩阵,后者是电影矩阵,C是主题的个数。

通常来说,这一过程通过奇异值分解(SVD)来完成。但大规模的数据集通常面临着矩阵过于稀疏的问题,这使得奇异值分解变得很难进行。本文中提出了RBM的解法。而且通过CD-k采样,可以使RBM算法精确又高效。

受限玻尔兹曼机(RBM)

我们要训练的是一个RBM。假如所有N个用户都评价了M个电影,那么就可以把每个用户看作一个单独的训练样本,玻尔兹曼机有M个可视节点和若干隐藏节点。现在的问题是矩阵是稀疏的,那么我们选择不去填充这个缺失项,我们纯粹是忽略它们。

image

依然是用每个用户的评分记录作为一个训练样本,但是注意,对于每一个用户,我们只关注他有评分的那些项。无论是前向还是反向传播或者训练,我们都只关注建立了连接的这些节点。

2.1 模型建立

根据前面的表述,V是一个K*m的矩阵,它以二元的形式表征了用户对电影的评分情况。首先把V的每一列建模为条件多项式分布(其实也就是对每一个电影的评分建模)

image

image

然后把隐藏节点建模为条件伯努利分布(根据文中的表述,j个隐藏节点应该代表了j个主题)

image

image是逻辑斯蒂函数image是电影i的特征j和等级k之间的对称交互参数,image表示电影i在分数k上的偏倚,而image是特征j的偏倚。image可以被初始化为评分的i平均值。

下面,根据RBM的相关知识,可以写出概率函数

image

以及能量函数

image

Z这一项,论文里说这个是归一化因子。

这里我觉得需要注意的一点是,标准的RBM中,每一个可视节点对应的是一个数,而这里对应的是一个K维的向量。所以对应的,W是一个ijk的矩阵,是一个mk的矩阵,是一个1j的向量,这是因为隐藏节点是一维的;和虽然都叫b,但是并不是同一个东西。

2.2 训练

根据RBM的公式,很容易可以得到

image

其中,data和model分别代表了数据和模型驱动下的两个值的内积。那么我们要做的当然就是让内积最小化,这也有点类似于极大似然估计。这边使用了==对比散度方法==


本文的方法,是在得到RBM模型之后,用用户的电影评分向量作为输入向量,然后用RBM reconstruct用户的输入向量,包括那些missing input(表示用户没看过的电影)。此时,这些missing input的值就是表示了用户对这个电影的喜好程度。电影有k个评分,RBM reconstruct 对这k个值(所对应的节点)都有输出。选择用户对这个电影的预测评分就有两种方法:

  1. 选择k个节点中RBM输出权值最大的那个节点作为用户对当前电影的评分;
  2. 对这k个节点的权重加权平均,平均值离k个数字哪个最近,就是评分是多少。在实践中,这两种方法都可以尝试一下。

我们输入用户目前已经有的评分,可以算出隐藏节点,然后再由隐藏节点反向可以算出全部的可视节点,也就是填补了那些缺失的评分。

3.条件RBM

这里提到了一个问题,就是在上面训练的时候,是直接忽略了没看过的那些电影,而我们没有输入的节点会确确实实地影响到输入值。在数据中,有些用户可能看过电影,但是没有评分数据,因为没有评分或者评分被弄丢了,这种情况是值得注意的。

文章中给出了一个解决的思路Conditional RBM,它可以加入一些外部数据的影响,然而这一章里并没有用这个思路。这一章里,对于那些看过但是没有评分的条例,用电影的base rate作为输入值进行了训练,并获得了不错的结果。

4. 条件分解RBM

上面的矩阵还有一个问题,就是W矩阵维度过大。过大的矩阵一方面会导致计算困难,另一方面会很容易产生严重的过拟合。为了解决这个问题,矩阵分解可以上场

image

image

分解后的矩阵参数量大大减小,速度也快的多。

5. 实验结果

参数设置

隐特征数:100

5的降维矩阵中隐特征数500,降维之后C=30

Batch-size:1000

迭代次数:40-50

学习率:0.01

image

没有给出baseline,但应该是很好的。

6.奇异值分解

奇异值分解的原理,不再赘述。

image

可以看出,RBM的效果更好,不过没有好太多。

在实验中,SVD经过了精心的调参,但是RBM还有很多参数可以优化,比如学习率,batch-size等。所以RBM有着更多的潜力。另外,SVD和RBM的错误很不一样,所以对它们进行模型融合也会获得不错的结果。

感觉怎么说呢

1.学习自动编码器:感觉就是把RBM变成了自编码器,从而把随机隐藏向量变成了实数向量。

2.学习更深的生成模型

7.我的思考

只看懂了一个大概的意思。RBM在这里我觉得是类似于自编码器的存在,提取隐藏特征,给出其他的矩阵评分。这巧妙地利用了电影与电影之间的关系,使得预测变得简洁高效。其实感觉挺微妙的,当时看其他论文的时候脑子里突然就有这个想法,历史数据稀疏性、长短时记忆、冷启动(粗粒度个性化推荐、隐式信息反馈)时间性预测、多态相互融合、标签化之间关系连接做出推荐信息通路,最后如何汇总组合…… 感觉不止这些,最近看的越多论文 潜意识感觉好多东西中间有个东西在连接着它们 隐隐在往上推在寻找一个最优的平衡点……

顺便,讲得比较好的几个RBM的原理在这里

https://blog.csdn.net/Yt7589/article/details/52487505

https://blog.csdn.net/peghoty/article/details/19168937

大体有了感性的认识。希望以后看了新的论文会有一些更深入的思考。

技术总结:

1.对矩阵的降维。第五部分中讲解了如何通过降维来大大提升运行速度,降维是一个非常万能的方法,可以留意一下。

2.加入“看过但是未评分的记录”,充分利用信息优化结果。

3.利用diversity的特性来做模型融合。