总结篇-推荐算法总结

相关文章

算法分类

  • 分类方法1

    • 传统
      • 协同过滤
      • 矩阵分解(MF)
      • 因式分解机(FM)
    • 基于embedding(深度学习兴起后)
      • word-embedding:skip-gram等
      • graph-embedding:DeepWalk,TransE等
    • 基于深度神经网络
      • Deep & Wide
  • 分类方法2

    • 线性
      • LR
      • 在排序模型方面很多基于LR模型,现在很多都是基于深度学习来做,不同模型都有不同的应用场景,并不是单一使用一种场景。LR模型利用人工特征工程,相对于深度学习的优点是可以感知的,是可以debug的
    • 非线性
      • FM,FFM,GBDT+LR,XGboost+LR
      • LR模型对于特征处理是线性的,利用Xgboost+LR或者GBDT+LR由线性向非线性转化,能够做到多特征组合,对推荐效果也有不同程度的提升
    • 神经网络
      • DeepFM,Wide&Deep
      • 目前还有利用Wide&Deep,可以从特征工程中解放出来,在特征选取方面不需要做很多工作,但是在调参方面工作量比较大

GBDT+LR

  • LR特征工程很难,那能否自动完成呢?模型级联提供了一种思路,典型的例子就是Facebook 2014年的论文中介绍的通过GBDT(Gradient Boost Decision Tree)模型解决LR模型的特征组合问题。思路很简单,特征工程分为两部分
    • 一部分特征用于训练一个GBDT模型,把GBDT模型每颗树的叶子节点编号作为新的特征,加入到原始特征集中
    • 再用LR模型训练最终的模型
  • GBDT模型能够学习高阶非线性特征组合,对应树的一条路径(用叶子节点来表示)
    • 通常把一些连续值特征、值空间不大的categorical特征都丢给GBDT模型
    • 空间很大的ID特征(比如商品ID)留在LR模型中训练,既能做高阶特征组合又能利用线性模型易于处理大规模稀疏数据的优势
  • 树模型缺点
    • 基于树的模型适合连续中低度稀疏数据,容易学到高阶组合
    • 但是树模型却不适合学习高度稀疏数据的特征组合
      • 一方面高度稀疏数据的特征维度一般很高,这时基于树的模型学习效率很低,甚至不可行;
      • 另一方面树模型也不能学习到训练数据中很少或没有出现的特征组合(比如训练数据完全没有特征x和特征y的训练数据出现)

协同过滤

探索推荐引擎内部的秘密

  • 基于协同过滤的推荐可以分为三个子类:基于用户的推荐(User-based Recommendation),基于项目的推荐(Item-based Recommendation)和基于模型的推荐(Model-based Recommendation)
  • 基于用户的协同过滤推荐
    • 基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K- 邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐
  • 基于项目的协同过滤推荐
    • 基于项目的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户
  • 基于协同过滤的推荐机制是现今应用最为广泛的推荐机制,它有以下几个显著的优点:
    • 它不需要对物品或者用户进行严格的建模,而且不要求物品的描述是机器可理解的,所以这种方法也是领域无关的。
    • 这种方法计算出来的推荐是开放的,可以共用他人的经验,很好的支持用户发现潜在的兴趣偏好
  • 存在以下几个问题:
    • 方法的核心是基于历史数据,所以对新物品和新用户都有“冷启动”的问题。
    • 推荐的效果依赖于用户历史偏好数据的多少和准确性。
    • 在大部分的实现中,用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。
    • 对于一些特殊品味的用户不能给予很好的推荐。
    • 由于以历史数据为基础,抓取和建模用户的偏好后,很难修改或者根据用户的使用演变,从而导致这个方法不够灵活。

MF

  • MF(Matrix Factorization,矩阵分解)模型是个在推荐系统领域里资格很深的老前辈协同过滤模型了。核心思想是通过两个低维小矩阵(一个代表用户embedding矩阵,一个代表物品embedding矩阵)的乘积计算,来模拟真实用户点击或评分产生的大的协同信息稀疏矩阵,本质上是编码了用户和物品协同信息的降维模型
  • 当训练完成,每个用户和物品得到对应的低维embedding表达后,如果要预测某个 $User_i 对 Item_j 的评分的时候,只要它们做个内积计算 〈User_i,Item_j 〉$ ,这个得分就是预测得分

SVD,MF,FISM,SVD++

  • CF本质就是解决矩阵填充问题
  • 矩阵填充一般是用SVD分解来解决
    • SVD就是在解决以下问题(Loss)
    • svd有以下缺点:
      • missing data(就是没打分的,占比99%)和observed data(观测到的、已打分的)有一样的权重
      • 没有加正则,容易过拟合
    • 注意和MF的区别,这边没没有使用embedding,user,item词嵌入的概念。而是用数学的方法求解的
  • MF
    • user和item分别用一个embedding表示,然后用户对item的偏好程度用这两个embedding的内积表示
    • 使用L2-loss(其它loss也可以)和正则:
  • FISM(Factored Item Similarity Model)
    • 用user作用过的item的embedding的和来表示user,item用另一套embedding下的一个embedding来表示,最后两者的内积表示user对该item的偏好
      • 这个模型也叫item-based的CF,因为把括号里的东西展开后,其实就是找用户作用过的item和item[j]的相似度
  • SVD++
    • 很简单,另外用一个user的embedding,和上述的FISM的方法,融合来表示user。这曾经是netflix比赛中连续三年效果最好的单模型

FM

张俊林-推荐系统召回模型

  • 从LR到SVM再到FM模型
    LR模型简单易懂,但不能捕获更高维的特征,比如特征组合这类特征,所以不能很好拟合较复杂的场景(欠拟合)

  • 加入特征组合(提升模型复杂度)

    • 虽然这个模型看上去貌似解决了二阶特征组合问题了,但是它有个潜在的问题:它对组合特征建模,泛化能力比较弱
    • 尤其是在大规模稀疏特征存在的场景下,这个毛病尤其突出,比如CTR预估和推荐排序
    • 这些场景的最大特点就是特征的大规模稀疏。所以上述模型并未在工业界广泛采用
    • 主要原因:由于数据稀疏,$x_i x_j$的权重参数$w_{i,j}$很多为0,导致不能学习
      • 在训练数据里两个特征并未同时在训练实例里见到过,意味着 $x_i and x_j$ 一起出现的次数为0,如果换做SVM的模式,是无法学会这个特征组合的权重的
  • FM模型
    对于因子分解机FM来说,利用特征的嵌入方式,最大的特点是对于稀疏的数据具有很好的学习能力。现实中稀疏的数据很多

    • 觉得可以看做是LR和MF的组合
    • 核心:这本质上是在对特征进行embedding化表征
    • 和SVM模型最大的不同,在于特征组合权重的计算方法。FM对于每个特征,学习一个大小为k的一维向量,于是,两个特征 $x_i 和 x_j 的特征组合的权重值,通过特征对应的向量 v_i 和 v_j 的内积 <v_i,v_j>$来表示。

    • 为什么模型泛华能力强,能够解决稀疏数据的问题

      • 在训练数据里两个特征并未同时在训练实例里见到过,意味着 $x_i and x_j$ 一起出现的次数为0,如果换做SVM的模式,是无法学会这个特征组合的权重的。
      • 但是因为FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,所以只要特征 x_i 和其它任意特征组合出现过,那么就可以学习自己对应的embedding向量
        • 于是,尽管 $x_i and x_j$ 这个特征组合没有看到过,但是在预测的时候,如果看到这个新的特征组合,因为 $x_i 和 x_j$ 都能学会自己对应的embedding,所以可以通过内积算出这个新特征组合的权重。
        • 这是为何说FM模型泛化能力强的根本原因
    • 上式只是对数据的拟合函数,还要根据具体问题比如回归还是分类设以不同的Loss方法进行求解。以及数学求解的方法需要另参考其他资料

    • 算法的效率

      • 粗略的看
        从FM的原始数学公式看,因为在进行二阶(2-order)特征组合的时候,假设有n个不同的特征,那么二阶特征组合意味着任意两个特征都要进行交叉组合,所以可以直接推论得出:FM的时间复杂度是n的平方。但是如果故事仅仅讲到这里,FM模型是不太可能如此广泛地被工业界使用的。因为现实生活应用中的n往往是个非常巨大的特征数,如果FM是n平方的时间复杂度,那估计基本就没人带它玩了
      • 数学公式演示改进(细节也可以参考论文资料等)
        FM如今被广泛采用并成功替代LR模型的一个关键所在是:它可以通过数学公式改写,把表面貌似是 $O(kn^2 ) 的复杂度降低到 O(kn)$

MF到FM的转换理解

  • 本质上,MF模型是FM模型的特例,MF可以被认为是只有User ID 和Item ID这两个特征Fields的FM模型,MF将这两类特征通过矩阵分解,来达到将这两类特征embedding化表达的目的
  • 而FM则可以看作是MF模型的进一步拓展,除了User ID和Item ID这两类特征外,很多其它类型的特征,都可以进一步融入FM模型里,它将所有这些特征转化为embedding低维向量表达,并计算任意两个特征embedding的内积,就是特征组合的权重

FFM(Field-aware FM)

  • 核心思想

    • FM模型的某个特征,在和任意其它特征域的特征进行组合求权重的时候,共享了同一个embedding特征向量
    • FFM模型是做得更细腻一些,在做特征组合的时候使用的embedding不同的特征向量。
    • 这意味着,如果有F个特征域,那么每个特征由FM模型的一个k维特征embedding,拓展成了(F-1)个k维特征embedding
    • 这个就是Field-aware的深层含义吧
  • 算法效率问题

    • FM模型可以通过公式改写,把本来看着是n的平方的计算复杂度,降低到 $O(k*n)$
    • 而FFM无法做类似的改写,所以它的计算复杂度是 $O(k*n^2$ ) ,这明显在计算速度上也比FM模型慢得多
    • 所以,无论是急剧膨胀的参数量,还是变慢的计算速度,无论从哪个角度看,相对FM模型,FFM模型是略显笨重的。
    • 正因为FFM模型参数量太大,所以在训练FFM模型的时候,很容易过拟合,需要采取早停等防止过拟合的手段
  • 数学公式

    • 其中$f_i和f_j$分别代表第i个特征和第j个特征所属的field

WDL

  • Wide and Deep Learning
    简单来说,人脑就是一个不断记忆(memorization)并且归纳(generalization)的过程,而这篇论文的思想,就是将宽线性模型(Wide Model,用于记忆,下图左侧)和深度神经网络模型(Deep Model,用于归纳,下图右侧)结合,汲取各自优势形成了 Wide & Deep 模型用于推荐排序

  • Wide Model
    要理解的概念是 Memorization,主要是学习特征的共性或者说相关性,产生的推荐是和已经有用户行为的物品直接相关的物品

    • 通过线性模型 + 特征交叉。所带来的Memorization以及记忆能力非常有效和可解释。但是Generalization(泛化能力)需要更多的人工特征工程
    • 用的模型是 逻辑回归(logistic regression, LR),LR 的优点就是简单(simple)、容易规模化(scalable)、可解释性强(interpretable)。LR 的特征往往是二值且稀疏的(binary and sparse)
    • 总结一下,宽度模型的输入是用户安装应用(installation)和为用户展示(impression)的应用间的向量积(叉乘),模型通常训练 one-hot 编码后的二值特征
      • 缺点:这种操作不会归纳出训练集中未出现的特征对
  • Deep Model
    要理解的概念是 Generalization,可以理解为相关性的传递(transitivity),会学习新的特征组合,来提高推荐物品的多样性,或者说提供泛化能力(Generalization)

    我的理解就是要用DL能够学习各种未出现的特征组合能力,特征模型的泛化能力
    - DNN几乎不需要特征工程。通过对低纬度的dense embedding进行组合可以学习到更深层次的隐藏特征
    - 泛化往往是通过学习 low-dimensional dense embeddings 来探索过去从未或很少出现的新的特征组合来实现的
    - 缺点是有点over-generalize(过度泛化)
    - 当query-item矩阵是稀疏并且是high-rank的时候(比如user有特殊的爱好,或item比较小众),很难非常效率的学习出低维度的表示。这种情况下,大部分的query-item都没有什么关系。但是dense embedding会导致几乎所有的query-item预测值都是非0的,这就导致了推荐过度泛化,会推荐一些不那么相关的物品
    - 相反,linear model却可以通过cross-product transformation来记住这些exception rules,而且仅仅使用了非常少的参数
    - 所以WDL结合LR,这点和 LR 正好互补,因为 LR 只能记住很少的特征组合,能够帮助识别Deep Model中《所有 query-item pair 非零的预测》情况
  • 两者区别与互补

    • Memorization趋向于更加保守,推荐用户之前有过行为的items(只认识出现过的)
    • generalization更加趋向于提高推荐系统的多样性(diversity)
    • 所以WDL结合LR,这点和 LR 正好互补,因为 LR 只能记住很少的特征组合,能够帮助识别Deep Model中《所有 query-item pair 非零的预测》情况
  • GP推荐系统的整体架构

    • 由两个部分组成,检索系统(或者说候选生成系统)和排序系统(排序网络)。
    • 首先,用 检索(retrieval) 的方法对大数据集进行初步筛选,返回最匹配 query 的一部分物品列表,这里的检索通常会结合采用 机器学习模型(machine-learned models) 和 人工定义规则(human-defined rules) 两种方法。从大规模样本中召回最佳候选集之后
    • 再使用 排序系统 对每个物品进行算分、排序,分数 P(y|x)。WDL 就是用在排序系统中

DeepFM

  • FM模型可以用神经网络进行表示

    • 这里需要理解Sparse Feature层和Embeddings层的表示,如何和原始的FM模型等价
      • Sparse Feature层中维数数据可能不一样,有可能是多维的one-hot向量,比如分类的数据,如果是连续的数值型,那么就是本身
        • 即使各个field的维度是不一样的,但是它们embedding后长度均为k
        • 也就是说one-hot只有一位为非0,其实就是通过矩阵相乘后就表示和原始的FM模型是等价了
      • 最终表现就是这个模型
  • DeepFM的模型如下图
    共享整个embedding层,进行多层网络训练,提取高阶特征

    • 左边就是刚才将的FM模型的神经网络表示
    • 右边的则为deep部分,为全连接的网络,用于挖掘高阶的交叉特征。整个模型共享embedding层,最后的结果就是把FM部分和DNN的部分做sigmoid
      $Y=sigmoid(Y_{FM}+Y_{DNN})$
  • DeepFM的结构中包含了因子分解机部分以及深度神经网络部分,分别负责低阶特征的提取和高阶特征的提取

  • 与图像或者语音这类输入不同,图像语音的输入一般是连续而且密集的,然而用于CTR的输入一般是及其稀疏的。Embedding嵌入层就是这个作用

  • 类比DeepFFM
    类似于FFM对于FM模型来说,划分了field,对于不同的field内积时采用对应的隐向量。同样可以把DeepFM进行进化为DeepFFM,即将每一个field embedding为m个维度为k的隐向量(m为field的个数)

  • 类比WDL

    • 简单比较就是将WDL的LR部分替换为FM,FM比LR在特征组合上优势比较大,但也比LR复杂很多

DCN

  • 背景:
    FM、DeepFM和Inner-PNN都是通过原始特征隐向量的内积来构建vector-wise的二阶交叉特征,这种方式有两个主要的缺点:

    • 必须要穷举出所有的特征对,即任意两个field之间都会形成特征组合关系,而过多的组合关系可能会引入无效的交叉特征,给模型引入过多的噪音,从而导致性能下降。
    • 二阶交叉特征有时候是不够的,好的特征可能需要更高阶的组合。虽然DNN部分可以部分弥补这个不足,但bit-wise的交叉关系是晦涩难懂、不确定并且不容易学习的
    • 有没有可能引入更高阶的vector-wise的交叉特征,同时又能控制模型的复杂度,避免产生过多的无效交叉特征呢
  • 概念

    • bit-wise VS vector-wise
      假设隐向量的维度为3维,如果两个特征(对应的向量分别为(a1,b1,c1)和(a2,b2,c2)的话)在进行交互时,交互的形式类似于f(w1 a1 a2,w2 b1 b2 ,w3 c1 c2)的话,此时我们认为特征交互是发生在元素级(bit-wise)上。如果特征交互形式类似于 f(w (a1 a2 ,b1 b2,c1 c2))的话,那么我们认为特征交互是发生在特征向量级(vector-wise)
    • 特征的显示隐式交叉(explicitly VS implicitly)
      显式的特征交互和隐式的特征交互。以两个特征为例xi和xj,在经过一系列变换后,我们可以表示成 wij (xi xj)的形式,就可以认为是显式特征交互,否则的话,是隐式的特征交互
  • 网络架构
    DCN模型以一个嵌入和堆叠层(embedding and stacking layer)开始,接着并列连一个cross network和一个deep network,接着通过一个combination layer将两个network的输出进行组合
    完整的网络模型如图:

  • 嵌入和堆叠层
    将sparse feature转换为Embedding vec,然后combin Dense feature,形成$x_0$

  • 交叉网络
    交叉网络(cross network)的核心思想是以有效的方式应用显式特征交叉。交叉网络由交叉层组成,每个层具有以下公式:
    • 模型本质意义

xDeepFM模型

xDeepFM模型