导语:本系列文章一共有三篇,分别是
《原理篇 | 推荐系统之矩阵分解模型》
《实践篇 | 推荐系统之矩阵分解模型》
第一篇用一个具体的例子介绍了MF是如何做推荐的。第二篇讲的是MF的数学原理,包括MF模型的目标函数和求解公式的推导等。第三篇回归现实,讲述MF算法在图文推荐中的应用实践(将于后续发布)。下文是第二篇——《原理篇 | 推荐系统之矩阵分解模型》,敬请阅读。
上一篇我们用一个简单的例子讲述了矩阵分解(Matrix Factorization, MF)是如何做推荐的,但没有深入到算法的细节。如果想编写自己的代码实现MF,那么就需要了解其中的细节了。本文是MF系列的第二篇文章,主要介绍了显式矩阵分解和隐式矩阵分解的数学原理,包括模型思想、目标函数、优化求解的公式推导等,旨在为需要了解算法细节的同学提供参考。
MF用到的用户行为数据分为显式数据和隐式数据两种。显式数据是指用户对item的显式打分,比如用户对电影、商品的评分,通常有5分制和10分制。隐式数据是指用户对item的浏览、点击、购买、收藏、点赞、评论、分享等数据,其特点是用户没有显式地给item打分,用户对item的感兴趣程度都体现在他对item的浏览、点击、购买、收藏、点赞、评论、分享等行为的强度上。
显式数据的优点是行为的置信度高,因为是用户明确给出的打分,所以真实反映了用户对item的喜欢程度。缺点是这种数据的量太小,因为绝大部分用户都不会去给item评分,这就导致数据非常稀疏,同时这部分评分也仅代表了小部分用户的兴趣,可能会导致数据有偏。隐式数据的优点是容易获取,数据量很大。因为几乎所有用户都会有浏览、点击等行为,所以数据量大,几乎覆盖所有用户,不会导致数据有偏。其缺点是置信度不如显式数据的高,比如浏览不一定代表感兴趣,还要看强度,经常浏览同一类东西才能以较高置信度认为用户感兴趣。
根据所使用的数据是显式数据还是隐式数据,矩阵分解算法又分为两种[4,6]。使用显式数据的矩阵分解算法称为显式矩阵分解算法,使用隐式数据的矩阵分解算法称为隐式矩阵分解算法。由于矩阵分解算法有众多的改进版本和各种变体[4,5,6,7,8,9,10,11],本文不打算一一列举,因此下文将以实践中用得最多的矩阵分解算法为例,介绍其具体的数据原理,这也是spark机器学习库mllib中实现的矩阵分解算法[4,6]。从实际应用的效果来看,隐式矩阵分解的效果一般会更好。
在本系列第一篇文章中,我们提到,矩阵分解算法的输入是user对item的评分矩阵(图1等号左边的矩阵),输出是User矩阵和Item矩阵(图1等号右边的矩阵),其中User矩阵的每一行代表一个用户向量,Item矩阵的每一列代表一个item的向量。User对item的预测评分用它们的向量内积来表示,通过最小化预测评分和实际评分的差异来学习User矩阵和Item矩阵。
图1
2.1 目标函数
为了用数学的语言定量表示上述思想,我们先引入一些符号。设rui 表示用户u 对item i 的显式评分,当rui >0时,表示用户u 对item i 有评分,当rui =0时,表示用户u 对item i 没有评分,xu 表示用户u 的向量,yi 表示item i 的向量,则显式矩阵分解的目标函数为:
其中xu 和yi 都是k 维的列向量,k 为隐变量的个数,
是所有xu 构成的矩阵,
为所有yi 构成的矩阵,N 为用户数,M 为item数,λ为正则化参数。
在上述公式中,
为用户向量与物品向量的内积,表示用户u 对物品i 的预测评分,目标函数通过最小化预测评分和实际评分rui 之间的残差平方和,来学习所有用户向量和物品向量。这里的残差项只包含了有评分的数据,不包括没有评分的数据。目标函数中第二项是L2正则项,用于保证数值计算稳定性和防止过拟合。
2.2 求解方法:
求解X 和Y 采用的是交替最小二乘法(alternative least square, ALS),也就是先固定X 优化Y ,然后固定Y 优化X ,这个过程不断重复,直到X 和Y 收敛为止。每次固定其中一个优化另一个都需要解一个最小二乘问题,所以这个算法叫做交替最小二乘方法。
(1)Y 固定为上一步迭代值或初始化值,优化X :
此时,Y 被当做常数处理,目标函数被分解为多个独立的子目标函数,每个子目标函数对应一个用户。对于用户u ,目标函数为:
这里面残差项求和的个数等于用于u 评过分的物品的个数,记为m 个。把这个目标函数化为矩阵形式,得
其中,