ALS算法全称为交替最小二乘法(Alternating Least Squares),是一种基于协同过滤思想的矩阵分解算法。其亮点之一就在于优化参数时使用了交替最小二乘法,而非梯度下降算法,使得ALS算法可以进行分布式并行计算,因此其被收录于Spark的Mlib以及ML库中。下面将详细介绍这一算法:

一、核心思想

  通过隐含特征(latent factor)联系用户兴趣和物品(item), 基于用户的行为找出潜在的主题和分类, 然后对item进行自动聚类,划分到不同类别/主题(用户的兴趣)。

  本质是把协同过滤算法进行了一种延伸, 把用户的相似性和物品的相似性通过了一个叫做隐向量的方式进行表达

als推荐算法的实现 spark als算法详解_机器学习


  矩阵分解算法将 als推荐算法的实现 spark als算法详解_损失函数_02 维的共现矩阵 als推荐算法的实现 spark als算法详解_聚类_03 分解成 als推荐算法的实现 spark als算法详解_机器学习_04 维的用户矩阵 als推荐算法的实现 spark als算法详解_机器学习_05als推荐算法的实现 spark als算法详解_机器学习_06 维的物品矩阵 als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_07 相乘的形式。 我们的目标就是填充共现矩阵中的空缺值,从而对用户的行为产生预测。

  其中 als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_08 是用户数量, als推荐算法的实现 spark als算法详解_聚类_09 是物品数量,als推荐算法的实现 spark als算法详解_算法_10 是隐向量维度, 也就是隐含特征个数, 只不过这里的隐含特征变得不可解释了, 即我们不知道具体含义了, 要模型自己去学。als推荐算法的实现 spark als算法详解_算法_10 的大小决定了隐向量表达能力的强弱, als推荐算法的实现 spark als算法详解_算法_10 越大, 表达信息就越强, 理解起来就是把用户的兴趣和物品的分类划分的越具体。

  每个用户和物品都有一个als推荐算法的实现 spark als算法详解_算法_10维的隐向量来表示,因此如果我们想计算某个用户对特定物品的评分或其他隐式行为 als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_14,只需要计算对应向量的内积即可。

         als推荐算法的实现 spark als算法详解_损失函数_15

二、代价函数

显示反馈代价函数
  对于有交互行为的用户和物品来说,其评分偏差就是 als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_16,我们采用平方损失函数,所以对于单个样本来说: als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_17因此,整个样本上的损失函数为:als推荐算法的实现 spark als算法详解_聚类_18其中 als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_19

我们的目的是使得该损失函数最小,因此得到目标函数:als推荐算法的实现 spark als算法详解_聚类_20
  当我们隐向量维度 als推荐算法的实现 spark als算法详解_算法_10 设置的较大时,有可能会造成模型的过拟合,因此我们需要加入正则项对模型的参数进行惩罚(原论文使用的为Tikhonov正则化,我们为了简化计算使用L2正则化),因此损失函数就变成了:als推荐算法的实现 spark als算法详解_算法_22
隐式反馈代价函数
  很多情况下,我们并不能得到用户的显示评分,但可以得到一些隐式评分,比如浏览次数、浏览时长等。我们需要引入一个参数als推荐算法的实现 spark als算法详解_聚类_23来衡量这个隐式得分:als推荐算法的实现 spark als算法详解_机器学习_24
als推荐算法的实现 spark als算法详解_机器学习_25为置信度系数,表明这个隐式评分的可信程度,于是我们的代价函数就变成了:als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_26

三、参数求解

  由于在现实中往往跟用户发生过交互行为的物品往往只是在整个物料库中一小部分,因此传统的矩阵分解方法 als推荐算法的实现 spark als算法详解_算法_27并不适用,我们采用ALS方法来解决,求解过程如下:

  • Step1:初始化矩阵als推荐算法的实现 spark als算法详解_机器学习_28,用电影的平均分作为第一行,其余是小的随机数
  • Step2:固定矩阵als推荐算法的实现 spark als算法详解_机器学习_28,通过最小化损失函数来求解矩阵als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_30
  • Step3:固定矩阵als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_30,通过最小化损失参数来求解矩阵als推荐算法的实现 spark als算法详解_机器学习_28
  • Step4:重复Step2和Step3,直到满足停止条件(原论文中的停止条件是两次迭代计算的RMSE差小于0.0001,实际可根据自身业务需求来决定)

显示反馈求解
  现在来演示一下给定物品矩阵als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_07之后怎样求解矩阵als推荐算法的实现 spark als算法详解_机器学习_05,由于此时矩阵als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_07已经固定,我们可将其看为常量,此时损失函数 als推荐算法的实现 spark als算法详解_损失函数_36可以看作变量为als推荐算法的实现 spark als算法详解_机器学习_05的函数,我们使得als推荐算法的实现 spark als算法详解_损失函数_36取得最小值就是求其极值点,即als推荐算法的实现 spark als算法详解_算法_39,先将L进行变换如下:

als推荐算法的实现 spark als算法详解_聚类_40

als推荐算法的实现 spark als算法详解_聚类_41

als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_42

als推荐算法的实现 spark als算法详解_机器学习_43

als推荐算法的实现 spark als算法详解_损失函数_36als推荐算法的实现 spark als算法详解_机器学习_05求偏导可以分解如下:

als推荐算法的实现 spark als算法详解_算法_46
als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_47
als推荐算法的实现 spark als算法详解_机器学习_48als推荐算法的实现 spark als算法详解_损失函数_49
als推荐算法的实现 spark als算法详解_机器学习_50als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_51als推荐算法的实现 spark als算法详解_损失函数_52als推荐算法的实现 spark als算法详解_损失函数_53
als推荐算法的实现 spark als算法详解_机器学习_54
als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_55
因此可得:
als推荐算法的实现 spark als算法详解_算法_56
als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_57
固定als推荐算法的实现 spark als算法详解_机器学习_05als推荐算法的实现 spark als算法详解_als推荐算法的实现 spark_07求解过程相同,可得:
als推荐算法的实现 spark als算法详解_机器学习_60
隐式反馈求解
过程同上一样,最终可得结果:
als推荐算法的实现 spark als算法详解_机器学习_61
als推荐算法的实现 spark als算法详解_算法_62

四、ALS算法的优缺点

优点

  • 可以分布式计算,处理大数据场景
  • 泛化能力强,原论文提到如果采用Tikhonov正则化不论迭代次数多少或者隐藏向量维度多高都不会出现过拟合现象
  • 解决了协同过滤中头部效应明显的现象

缺点

  • 没有充分利用用户和物品的其他特征以及上下文特征
  • 缺乏用户历史行为时无法进行有效的推荐