SLIM模型是明尼苏达大学2011年的文章。
引入
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方法介绍
了解SVD系列推荐系统的都知道,SVD系列算法的精髓在于找出两个rank远低于原矩阵的小矩阵。
矩阵B代表用户的特征,矩阵C代表物品的特征,B的第i
行即为用户 i
的特征,C 的第 j
列即为物品 j
的特征,两个向量相乘,得到的即为用户 i
对于 物品 j
的得分预测。由于预测过程只需要矩阵相乘,训练出两个 low rank 矩阵后,得到速度非常快。SLIM和SVD系列相似,区别在于 SVD是把矩阵 A 分解为了两个 low rank 的小矩阵,而SLIM是直接用矩阵 A 当做要学习得到的用来相乘的两个矩阵中的一个。
符号定义
u
代表用户t
代表物品U
表示所有用户集合T
表示所有物品集合A
表示用户行为矩阵,其维度为,
m
表示用户数量,n
表示物品数量,如果用户i
对物品j
有过点击、购买或者浏览等行为,则为1,或者某正数,否则为0.
表示矩阵A的一行,即用户
i
对所有物品的行为记录,表示矩阵A的一列,即所有用户对物品
j
的记录。
计算公式
SLIM的评分预测公式为:
写作矩阵形式即为:
其中,W
是一个的的矩阵,也就是我们要训练学习的权重矩阵。
本质上,权重矩阵是物品之间相似度的矩阵,或者说是影响度的矩阵,是两个物品之间的影响度。两物品a
和b
之间的影响度不是对称的,a
对b
的影响度与
b
对a
的影响度是不一样的。
但是,显然可见SLIM的权重矩阵比SVD方法分解之后的两个小矩阵要大得多,看起来在训练时间上并没有提高,矩阵和
都是高维矩阵,计算内积的计算量也非常大。那SLIM算法的速度又提升在哪里呢?
先看权重矩阵的损失函数:
其中, L1正则保证矩阵
的稀疏性,矩阵对角线值为0,是为了确保不会用已有的打分去影响预测。
因为各列是互相独立的,也就是说,可以将
的学习过程,分解成一个个较小的学习过程,对
的每一行进行独立求解优化,可得:
,
其中,.
分析
根据上面定义的损失函数,可以发现拟合的时候其实是用剩下的 n-1
列来拟合的,这就引来了一个优化方向,如果我们只选择那些和相似度较高的列来拟合,就像特征选择一样,那么训练过程会大大缩短。思考一下矩阵 中每一列的意义,是所有用户对一个物品
j
的行为,取那些和相似度高的列,也就是取那些用户行为和物品 j
相似的物品们的向量。这里其实很像 item-based。
综上所述,SLIM 既考虑到了利用用户物品行为之间的相似度来缩短训练时间(neighborhood-based),又利用学习训练过程提升了结果的精度(model-based),结合了两种主流算法的优势,而且由于矩阵 很稀疏(一个用户只会对很小一部分物品有过行为,注意在这个算法里,矩阵缺失值填0),学习到的
也很稀疏(一是L1正则化会产生稀疏解,二是特征选择的过程本身就将用户行为相似度低的物品的权重置零了)。
通过一种线性的方式,学习物品之前的影响度,能够通过迭代的方式做类似于协同过滤的事情,而且计算过程能够并行,方便扩展。