推荐系统之矩阵分解模型-原理篇
作者:zhongzhao,腾讯 PCG 应用研究员
上一篇我们用一个简单的例子讲述了矩阵分解(Matrix Factorization, MF)是如何做推荐的,但没有深入到算法的细节。如果想编写自己的代码实现MF,那么就需要了解其中的细节了。本文是MF系列的第二篇文章,主要介绍了显式矩阵分解和隐式矩阵分解的数学原理,包括模型思想、目标函数、优化求解的公式推导等,旨在为需要了解算法细节的同学提供参考。
本系列文章一共有三篇,分别是
第二篇(本文)讲的是MF的数学原理,包括MF模型的目标函数和求解公式的推导等。第三篇将会回归现实,讲述MF算法在图文推荐中的应用实践。
1.显式数据和隐式数据
MF用到的用户行为数据分为显式数据和隐式数据两种。显式数据是指用户对item的显式打分,比如用户对电影、商品的评分,通常有5分制和10分制。隐式数据是指用户对item的浏览、点击、购买、收藏、点赞、评论、分享等数据,其特点是用户没有显式地给item打分,用户对item的感兴趣程度都体现在他对item的浏览、点击、购买、收藏、点赞、评论、分享等行为的强度上。
显式数据的优点是行为的置信度高,因为是用户明确给出的打分,所以真实反映了用户对item的喜欢程度。缺点是这种数据的量太小,因为绝大部分用户都不会去给item评分,这就导致数据非常稀疏,同时这部分评分也仅代表了小部分用户的兴趣,可能会导致数据有偏。隐式数据的优点是容易获取,数据量很大。因为几乎所有用户都会有浏览、点击等行为,所以数据量大,几乎覆盖所有用户,不会导致数据有偏。其缺点是置信度不如显式数据的高,比如浏览不一定代表感兴趣,还要看强度,经常浏览同一类东西才能以较高置信度认为用户感兴趣。
根据所使用的数据是显式数据还是隐式数据,矩阵分解算法又分为两种[4,6]。使用显式数据的矩阵分解算法称为显式矩阵分解算法,使用隐式数据的矩阵分解算法称为隐式矩阵分解算法。由于矩阵分解算法有众多的改进版本和各种变体[4,5,6,7,8,9,10,11],本文不打算一一列举,因此下文将以实践中用得最多的矩阵分解算法为例,介绍其具体的数据原理,这也是spark机器学习库mllib中实现的矩阵分解算法[4,6]。从实际应用的效果来看,隐式矩阵分解的效果一般会更好。
2.显式矩阵分解
在本系列第一篇文章中,我们提到,矩阵分解算法的输入是user对item的评分矩阵(图1等号左边的矩阵),输出是User矩阵和Item矩阵(图1等号右边的矩阵),其中User矩阵的每一行代表一个用户向量,Item矩阵的每一列代表一个item的向量。User对item的预测评分用它们的向量内积来表示,通过最小化预测评分和实际评分的差异来学习User矩阵和Item矩阵。
2.1 目标函数
为了用数学的语言定量表示上述思想,我们先引入一些符号。设r_{ui}表示用户u对物品i的显式评分,当r_{ui}>0时,表示用户u对物品i有评分,当r_{ui}=0时,表示用户u对物品i没有评分,x_u表示用户u的向量,y_i表示物品i的向量,则显式矩阵分解的目标函数为:
\underset{X,Y}{min}\sum_{r_{ui}\neq0}\left(r_{ui}-x_u^Ty_i\right)^2+\lambda\left(\sum_u||x_u||_2^2+\sum_i||y_i||_2^2\right) \\
其中x_u和y_i都是k维的列向量,k为隐变量的个数,X=\left[x_1, x_2, \cdots, x_N\right]是所有x_u构成的矩阵,Y=\left[y_1, y_2, \cdots, y_M\right]为所有y_i构成的矩阵,N为用户总数,M为物品总数,\lambda为正则化参数。
在上述公式中,x_u^Ty_i为用户向量与物品向量的内积,表示用