Collaborative Filtering for Implicit Feedback Datasets(2008)

概述

广泛的讲,推荐系统基于两种不同的策略:

  1. 基于内容,找出固有的属性,但是信息冗余且难以收集;
  2. 基于评分行为的,也是本文的策略。

协同过滤(Collaborative Filtering)是推荐领域非常重要的算法策略,由于它的领域无关性,应用非常广泛。本文解决的一个问题是:在训练数据集合中,只有用户的隐式反馈,例如用户的浏览行为、收藏行为等,没有用户直接打分行为(如1-5stars);即只有用户偏好行为(简单的来讲就是用户和物品是否有评分,有即为1,没有即为0),对于用户不喜欢的商品没有数据支持;基于以上数据本文提出一种隐式因子模型(Factor Model)解决该问题,并给出优化求解,此文求解用的最小二程(ALS)。

隐式反馈的特点

  1. 没有负反馈,也就是说即使用户没有行为也并不意味着用户不喜欢

  2. 隐式反馈本质上是含有很多噪音的,并不能真正反映出用户的偏好。用户购买了某物品,并不代表他喜欢,也许是送礼,也许买了之后发现不喜欢。

  3. 显示反馈的数值反映了用户的偏好;而隐式反馈不能明确反应用户喜好,其数值反映了置信度(也就是用户有多大可能性对该物品感兴趣)。比如一个用户经常看某部连续剧,可能该用户对该连续剧的喜好值一般,只是因为每周都播,所以动作频次很大,假如该用户对某部电影超级喜欢,但可能就看过一次,因此动作频次大并不反应偏好值大。从这个用户经常看这部连续剧这个行为,只能推断出该用户喜欢这连续剧有很大的置信度,但这个用户对这个连续剧的偏好值是多少我们无法评估。

  4. 隐式反馈的推荐需要合适的方法来进行评估

准备工作

准备了用户数据矩阵RR,这里的RuiR_{ui}不是偏好值,而是对用户行为的观察。论文中ruir_{ui}是用户uu全程观看电影ii的次数。如果用户uu观看了电影ii的70%,那么ruir_{ui}就被设置为0.7,用户在网站上对物品点击了2次,那么ruir_{ui}就被设置为2。

之前的研究

Neighborhood-based (item-item)

Item-based Collaborative Filtering Recommendation Algorithms
根据item ii相似的kk个items,估计出对item ii的评分。采用加权平均的方法,如下,sijs_{ij}为item ii与itemjj的相似度,相似度的计算有多种方式,例如余弦相似度,皮尔森相关系数等。
ruir_{ui}为user uu 对 item ii 的评分。
推荐系统学习(三)

latent factor models(MF,SVD)

Matrix Factorization Techniques for Recommender Systems
基于相似度的方法只能找出相似的items,意味着向一个看了动作片的人推荐更多动作片。但现实情况是,喜欢看动作片的人可能不仅仅喜欢动作片,也喜欢爱情片,或者爱情动作片。这就需要挖掘出潜在因素来进行推荐(latent factors)
将 user-item 评分矩阵分解为 userfeaturesitemfeaturesuserfeatures*itemfeatures
推荐系统学习(三)
由于R矩阵是非常稀疏的,有大量缺失值,如果使用传统SVD分解需要填补缺失值。这样做有两个缺点:1. 填补什么值?会造成不准确;2. 填补后变成稠密矩阵,计算量大增。于是采用忽略缺失值的方法,最小化 least square。但要注意防止 overfitting,加入正则化项(与模型复杂度成正比)
推荐系统学习(三)
可使用SGD(随机梯度下降)求解。每次只用一个样本下降梯度,所以求导时去掉求和符。
推荐系统学习(三)
推荐系统学习(三)

本文的模型- 针对隐式反馈的矩阵分解方法

主要是针对显示反馈(explicit feedback)的数据。如果你只有用户观看记录(隐式反馈),那么就需要修改一下方法。主要思想是将隐式反馈转化为置信度(confidence)。例如,如果只有用户观看时长,我们可以将观看比例作为评分 ruir_{ui},然后转为置信度:
cui=1+αruic_{ui}=1 + \alpha r_{ui}
置信度表示,如果用户观看得越久,我们就越相信他是喜欢这部片的(本文中α=40\alpha = 40,如果看了代码你就会发现该值其实就是矩阵中的零元素的个数与非零元素个数的比例)。
则修改后的Lost function:
minx,y(u,i)cui(puixuTyi)2+λ(uxu2+iyi2)\min\limits_{x*, y*} \sum\limits_{(u,i)} c_{ui}(p_{ui} - x_u^Ty_i)^2 + \lambda \left ( \sum\limits_{u}||x_u||^2 + \sum\limits_{i}||y_i||^2 \right)
其中 pui 取值为0,1。(看了则为1,没看则为0)
求解:

同样可以使用SGD求解,但需要注意的是,这里使用的是隐式反馈,user-item 矩阵就变得不那么稀疏了,因为用户事件可能会非常多(例如点击)。SGD 每次迭代都需要使用所有 user-item pair 进行梯度下降,由于数据变稠密了,计算量就会增加。针对此问题,可以使用 ALS (Alternating Least Square) 求解。与SGD不同,每次更新 XX 先固定YY,即对用户维度和物品维度分别进行求解,每一步求解都是一个最优化问题,也就转化为 least square 问题,然后交替更新XXYY
推荐系统学习(三)
每轮迭代更新:
xu=(YTY+YT(CuI)Y+λI)1YTCup(u)x_{u} = (Y^{T}Y + Y^{T}(C^{u}-I)Y + \lambda I)^{-1}Y^{T}C^{u}p(u)
yi=(XTX+XT(CiI)X+λI)1XTCip(i)y_{i} = (X^{T}X + X^{T}(C^{i}-I)X + \lambda I)^{-1}X^{T}C^{i}p(i)

评价指标

显示反馈

MAE
MAE=1Nrir^iMAE= \frac {1}{N} \sum |r_i - \hat{r}_i|
MAE
RMSE=1N(rir^i)2RMSE = \sqrt {\frac{1}{N} \sum(r_i - \hat{r}_i)^2 }
然而评分误差指标并不适用于隐式反馈数据,因为用户没有实际评分。可用percentile-rank 和 hit radio评估。

隐反馈

Percentile-rank
推荐系统学习(三)
Hit Radio at N (or [email protected])
测试集中,能够落在推荐列表中的 top N 之中的记录数,占总测试记录数的比例。换言之,就是推荐的前 N 个 items 中,有多少是能够命中用户实际偏好的。

创新点

  1. 隐式用户观察值分解为偏好值和置信度(对于显示用户行为无效)
  2. 使用了潜在因子(特征向量)算法,将所有User-Item矩阵中的数值作为输入(即使没有观察值)
  3. 优化算法,使迭代的时间开销只随输入数量线性增长
  4. 使用代数演算转换为基于物品的邻域公式,从而进行推荐解释

代码

开源工具

Implicit
今后更新!!!!

参考资料

ALS(alternating least squares)交替最小二乘
深入理解Spark ML:基于ALS矩阵分解的协同过滤算法与源码分析
协同过滤的ALS算法
A Gentle Introduction to Recommender Systems with Implicit Feedback
Explicit Matrix Factorization: ALS, SGD, and All That Jazz

相关文章: