本文介绍了使用 玻尔兹曼机 用于 推荐系统.
有一群用户可能订购(阅读,观看,购买)大量商品。用户给商品评分(或评价)。我们的任务是,根据用户和他人的先前评分,尽可能精确地预测用户对新商品的评分,以便推荐用户可能喜欢的商品。
大多数推荐系统具有以下特征
- 用户数量远远超过商品数量
- 所有或几乎所有用户只对一小部分商品进行了评分
- 评分的可能性很小(通常为1,2,3,4,5)。
- 已评分商品数量差异很大。
正如 Netflix 奖比赛所显示的,没有哪种方法优于其他方法。为了获得最佳结果,应将几种方法结合在一起。其中之一,限制玻尔兹曼机(RBM),将在本文中介绍。
- U - 用户集
- I - 商品集
- G - 评分集
- 评分了商品
的用户集。
- 用户
评价过的商品集。
- 用户
对商品
的评分。
- 用户
对商品
的评分预测。
- T - 训练集。T 的每个成员都是一个三元组
.
在描述 RBM 模型之前,我们简要介绍一下 SVD 模型(奇异值分解),它可能是最好的单一方法。
在奇异值分解 (SVD) 下,每个用户
由一个特征向量
表示,其中 N 是模型的维度。类似地,每个项目
由一个特征向量
表示。
预测评分是两个向量的乘积

这里的 x 和 y 是模型需要学习的参数,以便拟合训练集。
该模型直观易懂,因为特征代表了项目的各种属性。例如,在推荐电影时,某些特征可能对爱情片非常积极,对没有爱情元素的电影则为零或负面,而对讽刺爱情片的电影则非常负面。用户特征向量中对应的特征对讨厌爱情片的用户将是负面的,而对于相反情况则为正面的。
学习模型最简单的方法是将总误差
降至最小。我们可以通过梯度下降来实现,循环地从训练集中提取数据,对于每个
,将参数沿着与 E 的梯度相反的方向改变。



这里的 L 是一个学习参数,它设定了梯度下降的整体速度。
但是,对于数据量少的用户和电影,这种方法往往会构建巨大的特征向量,因为这样可以更好地拟合数据。为了禁止这种情况,并利用大特征值不太可能出现的知识,应该添加正则化项


有关 SVD 的更详细解释,请参阅 Simon Funk 的“Netflix 更新:在家尝试” [1]。但是,他的算法一次添加一个特征,后来发现不如同时学习所有特征好。
现在我们来谈谈玻尔兹曼机模型。
第一步,假设我们不是预测分数,而是预测特定分数的 *概率*
的概率。
我们可以使用与上一节中描述的类似方法。

(为什么不
? 因为通常用户比物品多得多,所以
会包含大量的参数。)
但是我们可以做得更好。首先,我们可以利用所有分数的总概率为 1 的事实

其次,由于概率始终介于 0 到 1 之间,因此最好用它本身的逻辑函数而不是向量积来描述
逻辑函数

其中 *逻辑函数* f 定义为

将
重新定义为权重 W,并将
重新定义为隐层单元,并要求所有 x 都为 0 或 1,则可以得到

这就是玻尔兹曼机模型。