继协同过滤后的一大推荐算法,成名为2006年的Netflix Prize推荐比赛。主要解决的是协同过滤难以处理稀疏矩阵的问题,提高了泛化能力。

问题定义

已有用户-物品交互矩阵,交互值为0、1或评分值,根据交互矩阵为指定用户进行物品兴趣度预测(CTR)和物品推荐(TopN)。

技术方案

构造隐向量空间,将用户-物品交互矩阵分解为两个矩阵:用户-隐向量矩阵、隐向量-物品矩阵

相当于将用户和物品都投影到一个低维的向量隐空间,设向量空间为矩阵分解和因子分解机 - 图1维,则两矩阵中每个矩阵分解和因子分解机 - 图2维向量表示用户向量和物品向量,两者的内积认定为两者的相似度。

分解算法

  1. SVD。对于矩阵分解,常用算法就是EVD(特征值分解)和SVD(奇异值分解),因为用户-物品交互矩阵不是方阵,无法使用EVD,所有使用SVD。但是对于矩阵分解和因子分解机 - 图3的矩阵,复杂度高达矩阵分解和因子分解机 - 图4#card=math&code=O%28mn%5E2%29),对于规模较大的矩阵,SVD计算成本比较大,基本无法满足工业需求。
  2. LFM。称为Latent Factor Model,将求解两个矩阵的参数问题转换成一个最优化问题,通过训练集数据来不断更新用户矩阵和物品矩阵中的参数,通常使用梯度下降法。

理论分析

相似度预测:

矩阵分解和因子分解机 - 图5

其中矩阵分解和因子分解机 - 图6都为偏置参数,为了消除用户和物品打分的差异,矩阵分解和因子分解机 - 图7是所有用户-商品记录评分的全局平均数;矩阵分解和因子分解机 - 图8为用户偏置,可以使用用户矩阵分解和因子分解机 - 图9的平均均值也可以作为训练参数;矩阵分解和因子分解机 - 图10为物品偏置,可以使用物品矩阵分解和因子分解机 - 图11的平均均值。加入偏置后,隐向量更能反映不同用户对不同物品的态度差异

可以使用带正则项的MSE作为损失函数。

目标函数:

矩阵分解和因子分解机 - 图12%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum%7Bu%2Ci%7D%5B%20(r%7Bui%7D-%5Chat%20r%7Bui%7D)%5E2%20%2B%20%5Clambda(%5CVert%20p_u%5CVert%5E2%20%2B%20%5CVert%20q_i%5CVert%5E2%2Bb_u%5E2%20%2B%20b_i%5E2)%5D%0A#card=math&code=L%28p_u%2C%20q_i%2C%20b_u%2C%20b_i%29%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum%7Bu%2Ci%7D%5B%20%28r%7Bui%7D-%5Chat%20r%7Bui%7D%29%5E2%20%2B%20%5Clambda%28%5CVert%20p_u%5CVert%5E2%20%2B%20%5CVert%20q_i%5CVert%5E2%2Bb_u%5E2%20%2B%20b_i%5E2%29%5D%0A)

求导有(向量、矩阵求导参考The Matrix Cookbook):

矩阵分解和因子分解机 - 图13%20%2B%20%5Clambda%20pu%5D%5C%5C%5C%5C%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20q_i%7D%20%26%3D%20%5Csum%7Bui%7D%5B-q%7Bu%7D%5ET(r%7Bui%7D-%5Chat%20r%7Bui%7D)%20%2B%20%5Clambda%20q_i%5D%5C%5C%5C%5C%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20b_u%7D%20%26%3D%20%5Csum%7Bui%7D%5B-(r%7Bui%7D-%5Chat%20r%7Bui%7D)%2B%5Clambda%20bu%5D%5C%5C%5C%5C%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20b_i%7D%20%26%3D%20%5Csum%7Bui%7D%5B-(r%7Bui%7D-%5Chat%20r%7Bui%7D)%20%2B%20%5Clambda%20bi%5D%0A%5Cend%7Balign%7D%0A#card=math&code=%5Cbegin%7Balign%7D%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20p_u%7D%20%26%3D%20%5Csum%7Bui%7D%5B-qi%5ET%28r%7Bui%7D-%5Chat%20r%7Bui%7D%29%20%2B%20%5Clambda%20p_u%5D%5C%5C%5C%5C%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20q_i%7D%20%26%3D%20%5Csum%7Bui%7D%5B-q%7Bu%7D%5ET%28r%7Bui%7D-%5Chat%20r%7Bui%7D%29%20%2B%20%5Clambda%20q_i%5D%5C%5C%5C%5C%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20b_u%7D%20%26%3D%20%5Csum%7Bui%7D%5B-%28r%7Bui%7D-%5Chat%20r%7Bui%7D%29%2B%5Clambda%20bu%5D%5C%5C%5C%5C%0A%5Cfrac%7B%5Cpart%20L%7D%7B%5Cpart%20b_i%7D%20%26%3D%20%5Csum%7Bui%7D%5B-%28r%7Bui%7D-%5Chat%20r%7Bui%7D%29%20%2B%20%5Clambda%20b_i%5D%0A%5Cend%7Balign%7D%0A)

设置好epoch, learning_rate, lambda等参数,进行梯度更新即可。

实现

见Github页面矩阵分解

因子分解机(FM)

思想同矩阵分解,在推荐系统中的场景不多,主要在于降低特征交叉的复杂度,主要贡献在于处理特征交叉的思想

对于CTR问题,以前常用的技术是LR,输入用户的特征,输出对用户是否会点击(某产品、某服务等)的概率,为了增强特征的表示能力,对用户特征加以组合:

矩阵分解和因子分解机 - 图14

解释

  • 上式中除去最后一项就是标准的LR,矩阵分解和因子分解机 - 图15为输入,矩阵分解和因子分解机 - 图16为输出
  • 输入矩阵分解和因子分解机 - 图17具有矩阵分解和因子分解机 - 图18个类别(通常都是一维),表示矩阵分解和因子分解机 - 图19种不同的特征
  • 最后一项矩阵分解和因子分解机 - 图20是特征矩阵分解和因子分解机 - 图21和特征矩阵分解和因子分解机 - 图22的组合特征,为了提高特征表达能力
  • 可知,需要的参数矩阵分解和因子分解机 - 图23个数为矩阵分解和因子分解机 - 图24,规模是矩阵分解和因子分解机 - 图25

正如上述中,直接对特征进行(二项)交叉,需要重新学习的参数规模为矩阵分解和因子分解机 - 图26,为了降低这个复杂度,应用到FM的思想,将矩阵分解和因子分解机 - 图27所有元素构成的整体视为一个矩阵(且是方阵,称为矩阵分解和因子分解机 - 图28),对该方阵进行降维得到矩阵分解和因子分解机 - 图29的两个矩阵,实际上两个矩阵互为转置(根据矩阵分解和因子分解机 - 图30元素特征可知为半正定矩阵,可以分解为矩阵分解和因子分解机 - 图31)。进一步理解:就是Embedding的思想,将每个特征用一个隐向量表示,矩阵分解和因子分解机 - 图32个特征就是矩阵分解和因子分解机 - 图33个隐向量,不同特征的二项交叉通过两者隐向量的内积表示

由于隐向量是具有维数的,设为矩阵分解和因子分解机 - 图34,那么应用FM思想之后,分解的矩阵总特征交叉参数规模为矩阵分解和因子分解机 - 图35,而原规模是矩阵分解和因子分解机 - 图36