详解SLIM与GLSLIM推荐模型

来源:互联网 发布:java工程师面试题大全 编辑:程序博客网 时间:2024/06/07 20:35

一、介绍

     SLIM模型是明尼苏达大学2011年的论文,点击打开链接这是文章链接。GLSLIM是今年推荐系统顶会RecSys的 best paper,新鲜出炉Local Item-Item Models for Top-N Recommendation 。网上还没有解释过SLIM的博文,所以写在这里(全网首发哦,转载请注明出处),希望和大家分享,如果有错误的地方,也希望大家批评建议。

      Top-N 推荐系统一直是热门问题,它的解决算法一般分为两大类:neighborhood-based 和 model-based。 neighborhood-based 大家都很熟悉,用各种距离度量方式计算出用户之间(user-based)或者物品之间(item-based)的近似度,然后类似于KNN算法,根据该用户(物品)的最相似的 k 个用户(物品)来进行推荐,这种算法只用了用户行为数据,可解释性强,容易实现,得益于用户行为矩阵的稀疏性,运算非常快。Youtube之前的视频推荐算法,是content-based和item-based结合,根据用户行为,只计算同一topic下的视频的相似度,这样避免了用户行为数据里的噪音,并且相对普通的item-based算法,更好地利用了长尾数据,增强了推荐系统的覆盖率,并且在改进算法中结合model-based,效果进一步提升。Model-based一般是指根据用户行为数据矩阵进行矩阵分解或者用模型来学习用户、物品隐变量,用学习到的低rank的用户矩阵、物品矩阵相乘来预测结果,典型算法有SVD, SVD++, ALS算法等等。 Neighborhood-based的优势是计算速度快(毕竟不需要有训练、学习的过程),但是速度是牺牲在推荐效果上的。Model-based算法推荐效果会优于neighborhood-based算法,但是推荐效果的提升是在算法训练时间大幅上涨的前提下。那么,有没有一种算法可以既提升neighborhood-based算法的效果,又提升model-based算法的运行时间呢?答案就是SLIM算法。

       


二、SLIM 

1. SLIM 介绍

了解SVD系列推荐系统的都知道,SVD系列算法的精髓在于找出两个rank远低于原矩阵的小矩阵,矩阵B代表用户的特征,矩阵C代表物品的特征,B的第 i 行即为用户 i 的特征,C 的第 j 列即为物品 j 的特征,两个向量相乘,得到的即为用户 i 对于 物品 j  的得分预测。由于预测过程只需要矩阵相乘,训练出两个 low rank 矩阵后,得到速度非常快。SLIM和SVD系列相似,区别在于 SVD是把矩阵 A 分解为了两个 low rank 的小矩阵,而SLIM是直接用矩阵 A 当做要学习得到的用来相乘的两个矩阵中的一个。
在下 SLIM 这一节中,u代表用户,t代表物品,集合U代表所有用户,集合T代表所有物品。用户行为矩阵为A(m*n,m个用户,n个物品)如果用户 i 对 物品 j 有过点击、购买等行为,Aij 就是1(或者一个正数),否则为0 。代表矩阵A的一行,即用户 i 对所有物品的行为记录。 代表矩阵A的一列,即所有用户对物品 j 的记录。字母上面带下划线的是预测的结果,例如
       SLIM的预测公式是,写成矩阵的形式就是。W 是一个n*n的矩阵,也就是我们需要训练学习得到的权重矩阵。本质上,权重矩阵 W 是物品之间的相似度矩阵。大家可能会有疑惑,SLIM 的权重矩阵比 SVD 的两个小矩阵大好多啊,看起来并没有什么训练时间上的优化。而且 A 和 W 的 rank 都高,相乘得到预测结果的时候计算量也更大。不要着急,下面会对 SLIM 算法速度提升在哪进行解释。

       权重矩阵 W 的学习过程如下,损失函数是大家都很熟悉的最小二乘法 + L2正则化+L1正则化。值得注意的是那两个约束条件,一个是 W 非负,这样我们只学习 item 之间的正相关关系。那么为什么 W 的对角线都要为 0 呢? 留给大家思考一下。
       

2. SLIM 的优势

好了不卖关子啦,答案是如果没有这个对角线限制,与 A 相乘之后,为了减小误差函数,会倾向于只推荐它自己,所以我们要保证一个已知的行为得分不会用于预测他自己的计算。


        那么速度性能的提升在哪里呢? 

首先, W 的各列之间是独立的,也就是说,我们可以将 W 的学习过程分解为下图所示的一个个小过程,对 W 中的每一列独立求解。很方便并行化。

        其次,由上面各列的损失函数,可以发现拟合的时候其实是用剩下的 n-1 列来拟合的,这就引来了一个优化方向,如果我们只选择那些和相似度较高的列来拟合,就像特征选择一样,那么训练过程会大大缩短。思考一下矩阵 A 中每一列的意义,是所有用户对一个物品 j 的行为,取那些和相似度高的列,也就是取那些用户行为和物品 j 相似的物品们的向量。这里其实很像 item-based。

综上所述,SLIM 既考虑到了利用用户物品行为之间的相似度来缩短训练时间(neighborhood-based),又利用学习训练过程提升了结果的精度(model-based),结合了两种主流算法的优势,而且由于矩阵 A 很稀疏(一个用户只会对很小一部分物品有过行为,注意在这个算法里,矩阵缺失值填0),学习到的 W 也很稀疏(一是L1正则化会产生稀疏解,二是特征选择的过程本身就将用户行为相似度低的物品们的权重置零了)。据论文作者的实验,SLIM 算法在 top-N 推荐任务里的准确度要高于其余算法。

三、 从SLIM到GLSLIM

1.  思路

SLIM 已经不错了,但还有没有可以改进的方向呢? 
SLIM 是对全局信息进行统一的学习过程,但是用户之间是可以根据用户行为聚类的,各类里独有的行为,用一个 global 的模型恐怕不能完整地描述出来。比如下图中,如果用户行为如左图所示,那么物品 c 和 i、j 之间在用户群 B 里的相似度和在用户群 A 里的相似度是截然不同的;若用户行为如右图所示,则物品 i 和 j 的相似度不受用户群体影响。考虑到其实绝大多数现实数据都像左图一样,我们可以针对各类进行训练,学习每个类里的特殊信息。


2. GLSLIM

公式(3)是 GLSLIM 的拟合公式,GLSLIM 会像 SLIM 一样拟合一个权重矩阵 S (SLIM算法中的W),然后再训练 k 个 local 模型,学习 k 个不同的类中的信息(论文中聚类方法采用的是CLUTO)。代表第 pu 个类的权重矩阵,pu ∈{1,2 … k}。代表物品 l 和 物品 i 的全局相似度,代表物品 l 和物品 i 的在第pu个用户群里的局部相似度。是每个用户独有的权重系数,代表该用户更倾向于全局模型还是局部模型,该系数位于【0,1】区间内,也是模型需要学习的参数。下图意为预测 用户 u 对 物品 i 的得分,其中用户 u 属于 pu 类。

GLSLIM 的损失函数如下,看起来比 SLIM 复杂很多,其实只是加入了对各局部模型的拟合、正则化,约束项中对的约束也类似于全局模型,保证只
学习物品间的正相似度,以及不用已知的行为去拟合它自己。



用户偏好系数由最小化公式(3)的误差而得,公式如下图所示:


看到这里,大家应该一目了然了,与 SLIM 非常相似,只不过加入了更多的局部模型。大家应该能发现,GLSLIM 的一个关键点是如何对用户进行聚类,众所周知,聚类的
效果不容易保证,难道要完全依赖于聚类算法们的效果吗?
答案是 No,第一步聚类的结果只是初始化用,GLSLIM 算法本身还会对聚类结果进行调整。下图是 GLSLIM 的完整算法,可以看到在while循环里,对每个用户,会把他分到训练误差最小的那一类去。当聚类的结果改变超过 1% 时,会一直迭代下去。GLSLIM 的结果要优于 SLIM,但是这个准确度的提升,是建立在更多次的迭代和更多的基模型的基础上的。


3.  LSLIM 和 GLSLIMr0

这是两种 GLSLIM 的变型,LSLIM 与 GLSLIM 相比,没有去训练全局模型,只训练了各用户群的局部模型。效果会比GLSLIM稍差一些,毕竟训练过程缩短,没有训练全局模型,捕捉不到全局信息。拟合公式如公式(9)所示,损失函数如公式(8)所示:




GLSLIMr0 与GLSLIM 相比,相信聚类算法的结果,没有在每次迭代中对用户所在的用户群进行更改,固定住每个类里的用户,当某次迭代和上一次的训练误差相比变化不大时,停止训练。以下是这两种算法的详细过程:

个人感觉 GLSLIM 的计算量确实大了些,训练时间比起 SLIM 几何倍增加,短时间内应该很难进行工业实现。谢谢能看到这里的朋友~ 转载请注明出处~

原创粉丝点击