论文笔记:Restricted Boltzmann Machines for Collaborative Filtering

阅读时参考以下博文:

https://blog.csdn.net/xceman1997/article/details/9901395#commentsedit

摘要

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

绪论

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

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

受限玻尔兹曼机(RBM)

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

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

下面讲解求解过程。以某一个特定用户为例,下面是参数设置。

2.1 模型建立

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

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

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

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

以及能量函数

我记得我之前学的RBM里是没有Z这一项的,论文里说这个是归一化因子。

这里我觉得需要注意的一点是,标准的RBM中,每一个可视节点对应的是一个数,而这里对应的是一个K维的向量。所以对应的,W是一个i*j*k的矩阵,是一个m*k的矩阵,是一个1*j的向量,这是因为隐藏节点是一维的;虽然都叫b,但是并不是同一个东西(其实这里我觉得分开起名一个叫c一个叫b会更好一点)。

2.2 训练

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

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

其中,的计算复杂度非常大,是指数级别(我没算,论文里这么说的)。为了得到这个值,可以用蒙特卡洛马尔可夫抽样方法,但是很慢。

这边使用了对比散度方法。我没有特别懂这个原理,大概就是一个抽象很快的方法吧。。

2.3 预测

一旦我们得到了训练完成的RBM,就可以用它来做预测了。这里讲的预测,我理解就是对于某一列,或者说某一个用户,填补评分矩阵中的缺失值。因为为了用所有用户的数据训练这个RBM,从而发现了电影之间的联系,类似itemCF的思想求解来填充缺失值其实也就是预测用户偏好。也就是参考的那篇博客里面说的

本文的方法,是在得到RBM模型之后,用用户的电影评分向量作为输入向量,然后用RBM reconstruct用户的输入向量,包括那些missing input(表示用户没看过的电影)。此时,这些missing input的值就是表示了用户对这个电影的喜好程度。电影有k个评分,RBM reconstruct 对这k个值(所对应的节点)都有输出。选择用户对这个电影的预测评分就有两种方法:1. 选择k个节点中RBM输出权值最大的那个节点作为用户对当前电影的评分;2. 对这k个节点的权重加权平均,平均值离k个数字哪个最近,就是评分是多少。在实践中,这两种方法都可以尝试一下。

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

3. 高斯隐藏节点条件下的RBM

在上面的算法中,我们将隐藏节点建模为条件伯努利分布,但是其实我们也可以把它建模为高斯分布。

这样的话,能量函数就可以被改写为

再往下怎么做没有写了。

4.条件RBM

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

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

5. 条件分解RBM

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

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

6. 实验结果

数据规模

参数设置

隐特征数:100

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

Batch-size:1000

迭代次数:40-50

学习率:0.01

实验结果

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

7.奇异值分解

奇异值分解的原理项亮的书和各种博客里都有讲,不再赘述。

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

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

8.未来展望

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

2.学习更深的生成模型

9.总结

(下面的内容来自谷歌翻译)

我们引入了一类双层无向图形模型(RBM),适用于表格或计数数据的建模,并为这类模型提供了有效的学习和推理程序。 我们还证明了RBM可以成功应用于包含超过1亿用户/电影评级的大型数据集。

最近提出了各种模型来最小化对应于特定概率模型的损失。 所有这些概率模型都可以被视为图形模型,其中隐藏因子变量指向与表示用户评级的变量的连接。他们的主要缺点是难以给出精确的推理,因此必须利用缓慢或不准确的近似来计算后验分布。

不同于分解矩阵因子,(Srebro等,2004)提出约束U和V的范数。 这个被称为“最大保证金矩阵因子分解”的问题公式可以被视为限制因素的总体“强度”而不是它们的数量。 然而,学习MMMF需要解决稀疏半定规划(SDP)。 通用SDP求解器遇到超过大约10,000个观测(用户/电影对)的困难,因此已经提出了基于梯度的直接优化方法以试图使MMMF扩展到更大的问题。 然而,Netflix数据集包含超过1亿个观测值,并且上述方法都不能轻易处理如此大的数据集。

 

 

10.我的思考

这篇笔记里很多地方都写的很简略,主要是因为我没有完全看懂= =

只看懂了一个大概的意思。RBM在这里我觉得是类似于自编码器的存在,提取隐藏特征,给出其他的矩阵评分。这巧妙地利用了电影与电影之间的关系,使得预测变得简洁高效。

特意提前看了RBM的原理还是看的似懂非懂的,自己的数学还是需要恶补……

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

http://blog.csdn.net/mytestmy/article/details/9150213

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

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

因为时间问题,只看懂了大概,有了感性的认识。希望以后看了新的论文会有一些更深入的思考。

技术总结:

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值