ALS算法全称为交替最小二乘法(Alternating Least Squares),是一种基于协同过滤思想的矩阵分解算法。其亮点之一就在于优化参数时使用了交替最小二乘法,而非梯度下降算法,使得ALS算法可以进行分布式并行计算,因此其被收录于Spark的Mlib以及ML库中。下面将详细介绍这一算法:
一、核心思想
通过隐含特征(latent factor)联系用户兴趣和物品(item), 基于用户的行为找出潜在的主题和分类, 然后对item进行自动聚类,划分到不同类别/主题(用户的兴趣)。
本质是把协同过滤算法进行了一种延伸, 把用户的相似性和物品的相似性通过了一个叫做隐向量的方式进行表达
矩阵分解算法将 维的共现矩阵 分解成 维的用户矩阵 和 维的物品矩阵 相乘的形式。 我们的目标就是填充共现矩阵中的空缺值,从而对用户的行为产生预测。
其中 是用户数量, 是物品数量, 是隐向量维度, 也就是隐含特征个数, 只不过这里的隐含特征变得不可解释了, 即我们不知道具体含义了, 要模型自己去学。 的大小决定了隐向量表达能力的强弱, 越大, 表达信息就越强, 理解起来就是把用户的兴趣和物品的分类划分的越具体。
每个用户和物品都有一个维的隐向量来表示,因此如果我们想计算某个用户对特定物品的评分或其他隐式行为 ,只需要计算对应向量的内积即可。
二、代价函数
显示反馈代价函数
对于有交互行为的用户和物品来说,其评分偏差就是 ,我们采用平方损失函数,所以对于单个样本来说: 因此,整个样本上的损失函数为:其中
我们的目的是使得该损失函数最小,因此得到目标函数:
当我们隐向量维度 设置的较大时,有可能会造成模型的过拟合,因此我们需要加入正则项对模型的参数进行惩罚(原论文使用的为Tikhonov正则化,我们为了简化计算使用L2正则化),因此损失函数就变成了:
隐式反馈代价函数
很多情况下,我们并不能得到用户的显示评分,但可以得到一些隐式评分,比如浏览次数、浏览时长等。我们需要引入一个参数来衡量这个隐式得分:
为置信度系数,表明这个隐式评分的可信程度,于是我们的代价函数就变成了:
三、参数求解
由于在现实中往往跟用户发生过交互行为的物品往往只是在整个物料库中一小部分,因此传统的矩阵分解方法 并不适用,我们采用ALS方法来解决,求解过程如下:
- Step1:初始化矩阵,用电影的平均分作为第一行,其余是小的随机数
- Step2:固定矩阵,通过最小化损失函数来求解矩阵
- Step3:固定矩阵,通过最小化损失参数来求解矩阵
- Step4:重复Step2和Step3,直到满足停止条件(原论文中的停止条件是两次迭代计算的RMSE差小于0.0001,实际可根据自身业务需求来决定)
显示反馈求解
现在来演示一下给定物品矩阵之后怎样求解矩阵,由于此时矩阵已经固定,我们可将其看为常量,此时损失函数 可以看作变量为的函数,我们使得取得最小值就是求其极值点,即,先将L进行变换如下:
对求偏导可以分解如下:
因此可得:
固定对求解过程相同,可得:
隐式反馈求解
过程同上一样,最终可得结果:
四、ALS算法的优缺点
优点
- 可以分布式计算,处理大数据场景
- 泛化能力强,原论文提到如果采用Tikhonov正则化不论迭代次数多少或者隐藏向量维度多高都不会出现过拟合现象
- 解决了协同过滤中头部效应明显的现象
缺点
- 没有充分利用用户和物品的其他特征以及上下文特征
- 缺乏用户历史行为时无法进行有效的推荐