天天看点

推荐系统系列——矩阵分解与FM算法矩阵分解算法逻辑回归算法优缺点FM模型算法FFM算法

目录

矩阵分解算法

隐语义模型

矩阵分解算法原理

矩阵分解算法的求解

矩阵分解算法优缺点

逻辑回归算法优缺点

FM模型算法

FM公式的理解

FM模型的应用

FM算法的优缺点

FFM算法

FFM算法的思想

矩阵分解算法

隐语义模型

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

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

如果我们知道了用户A和用户B两个用户在豆瓣的读书列表, 从他们的阅读列表可以看出,用户A的兴趣涉及侦探小说、科普图书以及一些计算机技术书, 而用户B的兴趣比较集中在数学和机器学习方面。 那么如何给A和B推荐图书呢?
先说说协同过滤算法, 这样好对比不同:
1. 对于UserCF,首先需要找到和他们看了同样书的其他用户(兴趣相似的用户),然后给他们推荐那些用户喜欢的其
他书。
2. 对于ItemCF,需要给他们推荐和他们已经看的书相似的书,比如作者B看了很多关于数据挖掘的书,可以给他推荐机器学习或者模式识别方面的书。
​
而如果是隐语义模型的话, 它会先通过一些角度把用户兴趣和这些书归一下类, 当来了用户之后, 首先得到他的兴趣分类, 然后从这个分类中挑选他可能喜欢的书籍。
​
这里就看到了隐语义模型和协同过滤的不同, 这里说的角度其实就是这个隐含特征, 比如书籍的话它的内容, 作者, 年份,主题等都可以算隐含特征,如果这个例子还不是很清晰的话,那么下面再举个更为具体的例子, 看看是如何通过隐含特征来划分开用户兴趣和物品的。      
推荐系统系列——矩阵分解与FM算法矩阵分解算法逻辑回归算法优缺点FM模型算法FFM算法

矩阵分解算法原理

通过分解协同过滤的共现矩阵(评分矩阵)来得到用户和物品的隐向量, 就是上面的用户矩阵Q和物品矩阵P, 这也是“矩阵分解”名字的由来。

推荐系统系列——矩阵分解与FM算法矩阵分解算法逻辑回归算法优缺点FM模型算法FFM算法

那么如果有了用户矩阵和物品矩阵的话, 我们就知道了如果想计算用户u

对物品i的评分, 只需要

矩阵分解算法的求解

  • 随机初始化用户矩阵U和物品居中P
  • 构建损失函数
  • 利用梯度下降法求解损失函数的最小值,对应的U和P矩阵即为所要分解的矩阵

矩阵分解算法优缺点

a. 优点:

  • 泛化能力强: 一定程度上解决了稀疏问题
  • 空间复杂度低: 由于用户和物品都用隐向量的形式存放, 少了用户和物品相似度矩阵, 空间复杂度由降到了(n+m)*f
  • 更好的扩展性和灵活性:矩阵分解的最终产物是用户和物品隐向量, 这个深度学习的embedding思想不谋而合, 因此矩阵分解的结果非常便于与其他特征进行组合和拼接, 并可以与深度学习无缝结合。

b.缺点:

但是, 矩阵分解算法依然是只用到了评分矩阵, 没有考虑到用户特征, 物品特征和上下文特征, 这使得矩阵分解丧失了利用很多有效信息的机会, 同时在缺乏用户历史行为的时候, 无法进行有效的推荐。 所以为了解决这个问题,逻辑回归模型及后续的因子分解机模型, 凭借其天然的融合不同特征的能力, 逐渐在推荐系统领域得到了更广泛的应用。

逻辑回归算法优缺点

优点:

  1. LR模型形式简单,可解释性好,从特征的权重可以看到不同的特征对最后结果的影响。
  2. 训练时便于并行化,在预测时只需要对特征进行线性加权,所以性能比较好,往往适合处理海量id类特征,用id类特

征有一个很重要的好处,就是防止信息损失(相对于范化的 CTR 特征),对于头部资源会有更细致的描述

  1. 资源占用小,尤其是内存。在实际的工程应用中只需要存储权重比较大的特征及特征对应的权重。
  2. 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)

缺点:

1.无法自动做特征交叉,需要人工手动参与,并且比较依赖人工的工程经验,也可能造成信息的损失。

2.不能处理非线性数据,产生更具深层意义的高维特征,所以其产生的推荐结果是直白的,暴力的。

FM模型算法

针对逻辑回归的第一个缺点,即无法做特征交叉,FM模型对逻辑回归模型增加了一个二阶交叉项并对其做出了修改,能够自动对每个特征做特征交叉。下面是基于逻辑回归模型提出的PLOY2模型

但这个式子有一个问题,只有当 xi与 xj均不为0时这个二阶交叉项才会生效,后面这个特征交叉项本质是和多项式核SVM等价的,为了解决这个问题,我们的FM登场了!

FM模型使用了如下的优化函数:

事实上做的唯一改动就是把wij 替换成了<vi,vj> ,大家应该就看出来了,这实际上就有深度学习的意味在里面了,实质上就是给每个xi计算一个embedding,然后将两个向量之间的embedding做内积得到之前所谓的 好处就是这个模型泛化能力强 ,即使两个特征之前从未在训练集中同时出现,我们也不至于像之前一样训练不出wij,事实上只需要xi和其他的 xk同时出现过就可以计算出的embedding!

FM公式的理解

  • 首先,单从模型表达能力上来看,FM是要强于LR的,至少它不会比LR弱,当交叉项参数 全为0的时候,整个模型就退化为普通的LR模型。对于有n个特征的模型,特征组合的参数数量共有个,并且任意两个参数之间是独立的。

    而FM模型中二次项的参数数量减少为kn 个,远少于多项式模型的参数数量。另外,参数因子化使得xhxi的参数和xixj的参数不再是相互独立的,因此我们可以在样本稀疏的情况下相对合理地估计FM的二次项参数。具体来说,xhxi和xixj的系数分别为<vh,vi>和<vi,vj>,它们之间有共同项 vi。也就是说,所有包含“ xi的非零组合特征”(存在某个 ,使得 ​)的样本都可以用来学习隐向量,这很大程度上避免了数据稀疏性造成的影响。具体的例子如下,主要是FM之中的隐向量之间具有相关性,隐向量可以从其他的隐向量对中学习而得。而POLY2只能由数据给定。所以当数据比较稀疏是,PLOY2中的交叉项非常稀疏,容易退化成LR。而FM则可以通过其他非0组合特征中学习到隐向量。具体例子如下:

推荐系统系列——矩阵分解与FM算法矩阵分解算法逻辑回归算法优缺点FM模型算法FFM算法
推荐系统系列——矩阵分解与FM算法矩阵分解算法逻辑回归算法优缺点FM模型算法FFM算法
  • FM的公式是一个通用的拟合方程,可以采用不同的损失函数用于解决regression、classification等问题,比如可以采用MSE(Mean Square Error)loss function来求解回归问题,也可以采Hinge/Cross-Entropy loss来求解分类问题。当然,在进行二元分类时,FM的输出需要使用sigmoid函数进行变换,该原理与LR是一样的。直观上看,FM的复杂度是。但是FM的二次项可以化简,其复杂度可以优化到 。由此可见,FM可以在线性时间对新样本作出预测。

FM模型的应用

最直接的想法就是直接把FM得到的结果放进sigmoid中输出一个概率值,由此做CTR预估,事实上我们也可以做召回。

由于FM模型是利用两个特征的Embedding做内积得到二阶特征交叉的权重,那么我们可以将训练好的FM特征取出离线存好,之后用来做KNN向量检索。

工业应用的具体操作步骤:

  1. 离线训练好FM模型(学习目标可以是CTR)
  2. 将训练好的FM模型Embedding取出
  3. 将每个uid对应的Embedding做avg pooling(平均)形成该用户最终的Embedding,item也做同样的操作
  4. 将所有的Embedding向量放入Faiss等
  5. 线上uid发出请求,取出对应的user embedding,进行检索召回

FM算法的优缺点

优点:

  • 引入了二阶项,能够自动进行特征组合
  • 二阶项的参数为两个特征之间的隐向量(由矩阵分解算法我们可以知道,隐向量具备了特征之间更深层的信息,从而能为我们挖掘出从没出现过的特征组合)
  • 隐向量之间具有相关性,能够解决样本稀疏时的参数轨迹问题。

缺点:

  • 当<vh,vi>和<vi,vj>,它们之间有共同项 vi时,vi是综合了vh和vj等多个和vi有交互的特征学习到的。虽然具有普遍意义,但是当vh和vj的差别很大时,使用同样的vi是不太合理的。因此我们引入了FFM。
推荐系统系列——矩阵分解与FM算法矩阵分解算法逻辑回归算法优缺点FM模型算法FFM算法

FFM算法

FFM算法的思想

  • 在学习隐向量前,先把特征进行分类
  • 对于每个特征,按照不同的分类域学习不同的隐向量,也就是一个特征对应着多个隐向量。(也就是一个特征对应多个隐向量。 这样在与不同域(类)里面特征交叉的时候, 用相应的隐向量去交叉计算权重, emmm, 这倒是一种思路, 并且这样做的好处是学习隐向量的时候只需要考虑相应的域的数据, 且与不同类的特征进行关联采用不同的隐向量, 这和不同类特征的内在差异也比较相符。 这其实就是FFM在FM的基础上做的改进, 引入了域的概念, 对于每个特征, 针对不同的交叉域要学习不同的隐向量特征。)
  • 域理解起来的话其实就是先对特征根据性质的不同进行了一个分类,不同的分类就是不同的域,域内特征一般都是同一个categorical特征经过One-Hot编码生成的数值特征,比如用户性别, 职业, 日期啊等等。

继续阅读