《深度学习推荐系统》阅读 WIP

Table of content:

About

这是一篇对王喆的 深度学习推荐系统 的阅读笔记,其中会结合着工作相关的思考展开一些话题。

** 相关链接:**
王喆的机器学习笔记 - 知乎
《深度学习推荐系统》总结系列一 - 知乎
《深度学习推荐系统》总结系列二 - 知乎

《深度学习推荐系统》

推荐系统的技术架构

在获知用户信息、物品信息、场景信息的基础上,推荐系统要处理的问题可以形式化地定义为:对于用户 U(User)在特定场景 C(Context)下,针对海量物品信息 I(Item),构建一个函数 f(U,I,C), 预测用户对特定候选物品 I (Item)的喜好程度,再根据喜好程度对所有候选物品进行排序,生成推荐列表的问题。

而实际场景中,还需要着着重解决的问题有:

  • 数据和信息相关的问题:用户、物品、场景信息分别是什么,如何存储、更新和处理。
  • 推荐系统算法和模型相关的问题:如何训练(training)、评估(evaluation)、部署(deployment)、线上推断(online inference)、从而达到更好的效果

在拿到推荐系统的原始数据之后,推荐系统会进一步加工,数据出口有三个

  1. 生成推荐模型锁需要的样本数据,用于算法模型的训练和评估
  2. 生成推荐模型服务(model serving)所需的「特征」,用于推荐系统的线上推断
  3. 生成系统监控、商业智能(Business Intelligence,BI)所需的统计数据

推荐系统「模型部分」是推荐系统的主题,一般由「召回层」「排序」「补充策略与算法层」组成。

  • 召回层:利用高效的召回规则、算法或简单模型,快速从海量的候选集召回用户可能感兴趣的物品
  • 排序层:利用排序模型对初筛的候选集进行精排序
  • 补充策略与算法:也被称为再排序层,在推荐列表返回用户之前,兼顾结果的多样性、流行度、新鲜度等指标,结合一些补充的策略和算法对推荐列表进行一定的调整,最终形成用户可见的推荐里列表。

推荐系统的进化

传统推荐模型的发展主要经历了四个阶段:

  • ** 协同过滤 CF 算法阶段 **:只需用户物品共现矩阵就可以构建推荐系统,根据相似度取值对象可分为 itemCF 和 userCF 两类,优势是简单易实现。CF 的问题是泛化能力弱,无法应对稀疏矩阵,而矩阵分解作为协同过滤的进化版,克服了 CF 的缺点。
  • ** 逻辑回归 LR 阶段 **:综合利用用户、物品、上下文等多种不同的特征,假设用户是否点击广告服从伯努利分布,将推荐问题转化为点击率预估 (CTR) 问题,预测正样本概率对物品进行排序。其数学形式是各个特征的加权和经过 sigmoid 函数,得到用户点击物品的概率。LR 的优势是可解释性强、易于并行化、模型简单、训练开销小。其局限性在于表达能力不强,需要大量具有业务背景知识的人工特征筛选与交叉。
  • ** 因子分解机 FM 阶段 *:为每个特征学习一个隐向量,在特征交叉时,使用两个特征隐向量的内积作为交叉特征的权重。虽然 FM 相比 POLY2 的完全交叉 + 单一权重记忆能力略弱,但解决了特征交叉过程中交叉特征对应的数据过于稀疏无法充分学习权重的问题。FFM 引入特征域进一步增强了模型的表达能力,做特征交叉时,每个特征选择与对方域对应的隐向量的内积作为交叉特征的权重,但 FFM 的计算复杂度也由 kn 上升到 knn。
  • ** 组合模型阶段 **:这一阶段主要是为了进一步提高特征交叉的维度,同时融合多个模型的优点。GBDT+LR 是组合模型的代表方案,GBDT 自动进行特征筛选和组合得到新的离散特征向量输入 LR 模型。GBDT+LR 的组合方式开启了特征工程模型化的趋势,真正实现端到端训练。

深度学习在推荐系统中的应用

推荐系统模型经过了机器学习阶段充分的发展后,终于进入了深度学习时代。与传统机器学习模型相比,深度学习模型具有表达能力更强,模型结构更灵活更贴合业务场景的优点。

深度学习阶段的推荐模型从多层感知机 MLP 出发,通过改变神经网络的结构,演变为各种各样的深度学习推荐模型。总结起来,有七个演变方向:

  • 改变神经网络的复杂程度:增加深度神经网络的层数和结构复杂度。
  • 丰富特征交叉方式:改变特征向量的交叉方式,如 NeuralCF,PNN(Product-based Neural Network)。
  • 组合模型:组合两种不同特点、优势互补的网络,主要是指 Wide&Deep 及其后续各种改进模型如 Deep&Cross、DeepFM 等。
  • FM 模型的深度学习演化:对 FM 模型的各种改进,包括 NFM(Neural Factorization Machine) 使用神经网络提升 FM 二阶交叉部分的特征交叉能力、FNN(Factorization-machine supported Neural Network) 利用 FM 的结果进行网络初始化、AFM(Attention neural Factorization Machine) 在 FM 中引入注意力机制。
  • 引入注意力机制:主要包括上述的 AFM 和 DIN(Deep Interest Network, 深度兴趣网络) 模型
  • 融合序列模型:使用序列模型模拟用户行为或用户兴趣的演化趋势,如 DIEN(Deep Interest Evolution Network,深度兴趣进化网络)
  • 结合强化学习:主要是为了模型的在线学习和实时更新,包括 DRN(Deep Reinforcement Learning Network, 深度强化学习网络)
    首先直接在 DNN 上演变的模型有:

AutoRec:将自编码器 (AutoEncoder) 与协同过滤结合的单隐层神经网络模型,利用协同过滤中的共现矩阵,完成物品 / 用户向量的自编码,基于自编码的结果得到用户对物品的预估评分,进而排序。AutoRec 模型结构和 word2vec 结构一致,相对简单,但优化目标和训练方法有所不同,AutoRec 表达能力有限。
Deep Crossing:由微软于 2016 年发布,用于其搜索引擎 Bing 中的搜索广告推荐场景。Deep Crossing 完善了深度学习在推荐领域的实际应用流程,提出了一套完整的从特征工程、稀疏向量稠密化、多层神经网络进行优化目标拟合的解决方案,开启了无需任何人工特征工程的时代

Embedding 技术在推荐系统中的应用

Embedding 是用一个低维稠密的向量来「表示」一个对象(object),向量能表达相应对象的某些特征,同时向量之间的距离也表示了物品之间的相似性。

为什么 Embedding 技术对深度学习如此重要 ?

  1. 推荐系统中大量使用 one-hot 编码对类别、id 型特征进行编码,导致样本特征向量极度稀疏,而深度学习的结构特点使其不利于稀疏特征向量的处理,因此几乎所有的深度学习推荐模型都会由 Embedding 层负责将高维稀疏特征向量转成稠密低维特征向量。
  2. Embedding 本身就是极其重要的特征向量,其表达能力更强。
  3. Embedding 对物品、用户相似度的计算是常用的推荐系统召回层技术。在局部敏感哈希(Locality-Sensitive Hashing)等快速最近邻搜索技术应用于推荐系统之后,Embedding 更适用于对海量备选物品进行快速初步筛选,过滤出几百到几千的物品交由深度学习网络进行精排。

所以,Embedding 非常重要,熟悉并掌握各类流行的 Embedding 方法是构建一个成功的深度学习推荐系统的有力武器。

Word2vec,经典的 Embedding 方法

word2vec(word to vevtor)是一个生成树词的向量表达模型。

Item2vec

Graph Embedding

Graph Embedding 是一种对图结构中的节点进行 Embedding 编码的方法。

links:

多角度审视推荐系统

特征工程

推荐系统中,特征的本质其实是对某个行为过程相关信息的抽象表达。从具体的行为转化为抽象的特征,这一过程必然涉及信息的损失。所以构建推荐系统特征工程的原则是:尽可能让特征工程抽取出的一组特征能够保留推荐环境以及用户行为过程中的有用信息,尽量摒弃冗余信息。

推荐系统的常用特征包括:

  1. ** 用户行为数据 **,
  2. ** 用户关系数据 **,
  3. ** 属性、标签类数据 **
  4. ** 内容类数据 **,一般来说,内容类数据无法直接换换成推荐系统可以 “消化” 的特征,需要通过自然语言处理、计算机视觉等技术手段提取关键内容特征,再输入推荐系统。
  5. ** 上下文信息 **,描述推荐行为产生的场景信息,比如时间地点、季节、月份、是否是节假日、天气、空气质量、社会事件等。典型的例子是,用户可能会倾向于在特定时段看不同题材的电影。
  6. ** 统计类特征 **,即通过统计方法计算出的特征,例如历史 CTR、历史 CVR、物品热门程度、物品流程程度等。
  7. ** 组合特征 **,将不同的特征进行组合后生成的细腻特征,最常见的是年龄 + 性别组成的人口属性分段特征。

这里有一篇有趣的文章,讲了特征的组合和特征值的重要性,毕加索的「公牛」和机器学习的「特征工程」 - 知乎

对推荐系统来说,模型的输入往往是由数字组成的特征向量。在众多特征类别中,有年龄、播放时长、历史 CTR 这些可以由数字表达的特征,它们可以非常自然地成为特征向量中的一个维度。而对于更多的特征,如用户性别、观看历史,它们是如果转变成数值型特征向量的呢。

  1. ** 连续性特征 **,如用户年龄、统计类特征、物品的发布时间、影片播放时长等数值型的特征,最常用的数据手段是归一化
    、离散化、加非线性函数等方法。
  2. ** 类别型特征 **,如用户历史行为数据、属性标签类数据。它的原始表现性似乎还往往是一个类别或者一个 id,这类特征最常用的处理方法是使用 one-hot 编码将其转换成一个数值向量,面对同一个特征域非唯一的类别选项,还可以采用 multi-hot 编码。

召回层和排序

召回阶段负责将海量的候选集快速缩小为几百到几千的规模;而排序阶段负责对缩小后的候选集进行精准排序。利用少量的特征和简单的模型或者规则进行候选集的快速筛选,减少精排阶段的时间开销。总结起来,召回和排序的特点为:

  • 召回层:计算量候选集大、速度快、模型简单、特征较少,尽量让用户感兴趣的物品在这个阶段能被快速召回,保证相关物品的召回率
  • 排序层:目标是得到精准的排序,需处理的物品数量少,可利用特征多,使用比较复杂的模型。

在权衡计算速度和召回率后,目前工业界主流的召回方法是采用多个简单策略叠加的「多路召回策略」。所谓多路召回,就是采用不同的策略、特征或简单模型,分别召回一部分候选集,然后把候选集混合在一起供后续排序模型使用的策略。在此过程中,候选集大小和策略选择都需要人工参与,策略之间的信息也是割裂的,无法综合考虑不同策略对一个物品的影响。

基于 Embedding 的召回是一个综合性更强且计算速度也能满足需求的召回方法。(TODO,后续可以展开)

Parameter Server

Reference: 一文读懂「Parameter Server」的分布式机器学习训练原理

PS 分为两大部分:server group 和多个 worker group,另外 resource manager 负责总体的资源分配调度。

  • server 节点的主要功能是保存模型参数、接受 worker 节点计算出的局部梯度、汇总计算全局梯度,并更新模型参数。server group 内部包含多个 server node,每个 server node 负责维护一部分参数,server manager 负责维护和分配 server 资源;
  • worker 节点的主要功能是各保存部分训练数据,从 server 节点拉取最新的模型参数,根据训练数据计算局部梯度,上传给 server 节点。每个 worker group 对应一个 application(即一个模型训练任务),worker group 之间,以及 worker group 内部的 worker node 互相之间并不通信,worker node 只与 server 通信。

push:worker 节点利用本节点上的训练数据,计算好局部梯度,上传给 server 节点;
pull:为了进行下一轮的梯度计算,worker 节点从 server 节点拉取最新的模型参数到本地。
结合图 3 这里概括一下整个 PS 的分布式训练流程:

  • 每个 worker 载入一部分训练数据
  • worker 节点从 server 节点 pull 最新的全部模型参数
  • worker 节点利用本节点数据计算梯度
  • worker 节点将梯度 push 到 server 节点
  • server 节点汇总梯度更新模型
  • goto step2 直到迭代次数上限或模型收敛

总结一下 Parameter Server 实现分布式机器学习模型训练的要点:

  • 用异步非阻断式的分布式梯度下降策略替代同步阻断式的梯度下降策略;
  • 实现多 server 节点的架构,避免了单 master 节点带来的带宽瓶颈和内存瓶颈;
  • 使用一致性哈希,range pull 和 range push 等工程手段实现信息的最小传递,避免广播操作带来的全局性网络阻塞和带宽浪费。

但是,Parameter Server 仅仅是一个管理并行训练梯度的权重的平台,并不涉及到具体的模型实现,因此 PS 往往是作为 MXNet,TensorFlow 的一个组件,要想具体实现一个机器学习模型,还需要依赖于通用的,综合性的机器学习平台。

如何增加实时性

Reference:如何增强推荐系统模型更新的「实时性」? - 知乎

与 “特征” 的实时性相比,推荐系统模型的实时性往往是从更全局的角度考虑问题。特征的实时性力图用更准确的特征描述一个人,从而让推荐系统给出更符合这个人的推荐结果。要发现这类全局性的数据变化,就需要更快地更新模型。而影响模型的实时性最重要的因素就是模型的训练方式。

** 全量更新 **: 模型训练最常用的方式就是全量更新。模型会利用某时间段内的所有训练样本进行重新训练,再用训练好的新模型替代 “过时” 的模型。但全量更新需要训练的样本量大,因此所需训练时间较长;而且全量更新往往在离线的大数据平台上进行,如 spark+tensorflow,因此数据的延迟也较长,这都导致了全量更新是 “实时性” 最差的模型更新方式。

** 增量更新(Incremental Learning)**:增量更新仅将新加入的样本喂入模型进行增量学习。在实际的推荐系统中,往往采用增量更新与全局更新相结合的方式,在进行几轮增量更新后,在业务量较小的时间窗口进行全局更新,纠正模型在增量更新过程后中积累的误差。在 “实时性” 和 “全局最优” 中间进行取舍和权衡。

** 在线学习(online learning)**“增量更新” 是在获得一批新样本时进行增量更新,而在线学习是在每次获得一个新样本的时候就实时更新模型。

** 模型局部更新 **: 提高模型实时性的另外一个改进方向是进行模型的局部更新,大致的思路是降低训练效率低的部分的更新频率,提高训练效率高的部分的更新频率。这种方式比较有代表性的是 facebook 的 GBDT+LR 模型。

** 客户端模型实时更新:** 既然客户端是最接近用户的部分,实时性最强,那么能否在客户端就根据当前用户的行为历史更新模型呢?对于物品 embedding 的更新来说,往往需要全局的数据,因此只能在服务器端进行整体的更新;而对用户 embedding 来说,则更多依赖于用户自身的数据。那么把用户 embedding 的更新过程移植到客户端来做,就能够实时地把用户最近的行为数据反应到用户的 embedding 中来,从而通过实时改变用户 embedding 的方式完成实时推荐。

推荐系统的评估

线上 AB Test 必然要占用宝贵的线上流量资源,还有可能会对用户体验造成损害,但线上流量资源显然是有限的,而且只有小部分能够用于 AB Test;而算法研发这侧,算法驱动的使用场景不断增加,大量候选算法需要逐一进行 AB Test。这二者之间的矛盾必然愈演愈烈。这就迫切需要设计一个快速的线上评估方法。

Netflix 设计了一个两阶段的线上测试过程(如图 2)。

  • 第一阶段利用被称为 Interleaving 的测试方法进行候选算法的快速筛选,从大量初始想法中筛选出少量 “优秀的”Ranking 算法。
  • 第二阶段是对缩小的算法集合进行传统的 AB Test,以测量它们对用户行为的长期影响。

传统 ab 测试的问题:
设计一个 AB Test 来验证用户群体是否对 “可口可乐” 和 “百事可乐” 存在口味倾向。那么按照传统的做法,我们会将测试人群随机分成两组然后进行 “盲测”,即在不告知可乐品牌的情况下进行测试。第一组只提供可口可乐,第二组只提供百事可乐,然后根据大家一定时间内的可乐消耗量来观察人们是更喜欢 “可口可乐” 还是 “百事可乐”。

这个实验一般意义上确实是有效的,很多时候我们也是这么做的。但也确实存在一些潜在的问题:

总的测试人群中,对于可乐的消费习惯肯定各不相同,从几乎不喝可乐到每天喝大量可乐的人都有。
可乐的重消费人群肯定只占总测试人群的一小部分,但他们可能占整体汽水消费的较大比例。
这两个问题导致了,即使 AB 两组之间重度可乐消费者的微小不平衡也可能对结论产生不成比例的影响。

在互联网场景下,这样的问题同样存在。比如 Netflix 场景下,非常活跃用户的数量是少数,但其贡献的观看时长却占较大的比例,因此 Netflix AB Test 中活跃用户被分在 A 组的多还是被分在 B 组的多,将对结果产生较大影响,从而掩盖模型的真实效果。

那么如何解决这个问题呢?一个方法是不对测试人群进行分组,而是让所有测试者都可以自由选择百事可乐和可口可乐(测试过程中仍没有品牌标签,但能区分是两种不同的可乐)。在实验结束时,统计每个人可口可乐和百事可乐的消费比例,然后进行平均后得到整体的消费比例。

这个测试方案的优点在于:

  • 消除了 AB 组测试者自身属性分布不均的问题;
  • 通过给予每个人相同的权重,降低了重度消费者对结果的过多影响。

这个测试思路应用于 Netflix 的场景,就是 Interleaving。Interleaving 是一种强大快捷的算法验证方法,它加速了 Netflix 各类 Ranking 算法的迭代创新。

但我们也要清楚的是 Interleaving 方法也存在一定的局限性,主要是下面两点:

  • 工程实现的框架较传统 AB Test 复杂。由于 Interleaving 实验的逻辑和业务逻辑纠缠在一起,因此业务逻辑可能会被干扰。而且为了实现 Interleaving,需要将大量辅助性的数据标示添加到整个数据 pipeline 中,这都是工程实现的难点;
  • Interleaving 毕竟只是对用户对算法推荐结果偏好程度的相对测量,不能得出一个算法完整的表现。比如我们想知道算法 A 能够将用户整体的观看时长提高多少,使用 Interleaving 是无法得出这样的结论的。为此 Netflix 才设计了 Interleaving+AB Test 两级实验结构,完善整个线上测试的框架。

深度学习推荐系统的前沿实践

Further

后续思考和疑问

  • one-hot, multi-hot
  • Explainable Recommend system
2020 年 6 月摘要
2020 年 7 月摘要