写点什么

大众点评搜索基于知识图谱的深度学习排序实践

  • 2019-02-06
  • 本文字数:10836 字

    阅读完需:约 36 分钟

大众点评搜索基于知识图谱的深度学习排序实践

1. 引言

挑战与思路


搜索是大众点评 App 上用户进行信息查找的最大入口,是连接用户和信息的重要纽带。而用户搜索的方式和场景非常多样,并且由于对接业务种类多,流量差异大,为大众点评搜索(下文简称点评搜索)带来了巨大的挑战,具体体现在如下几个方面:


  • 意图多样:用户查找的信息类型和方式多样。信息类型包括 POI、榜单、UGC、攻略、达人等。以找店为例,查找方式包括按距离、按热度、按菜品和按地理位置等多种方式。例如用户按照品牌进行搜索时,大概率是需要寻找距离最近或者常去的某家分店;但用户搜索菜品时,会对菜品推荐人数更加敏感,而距离因素会弱化。

  • 业务多样:不同业务之间,用户的使用频率、选择难度以及业务诉求均不一样。例如家装场景用户使用频次很低,行为非常稀疏,距离因素弱,并且选择周期可能会很长;而美食多为即时消费场景,用户行为数据多,距离敏感。

  • 用户类型多样:不同的用户对价格、距离、口味以及偏好的类目之间差异很大;搜索需要能深度挖掘到用户的各种偏好,实现定制化的“千人千面”的搜索。

  • LBS 的搜索:相比电商和通用搜索,LBS 的升维效应极大地增加了搜索场景的复杂性。例如对于旅游用户和常驻地用户来说,前者在搜索美食的时候可能会更加关心当地的知名特色商户,而对于距离相对不敏感。


上述的各项特性,叠加上时间、空间、场景等维度,使得点评搜索面临比通用搜索引擎更加独特的挑战。而解决这些挑战的方法,就需要升级 NLP(Natural Language Processing,自然语言处理)技术,进行深度查询理解以及深度评价分析,并依赖知识图谱技术和深度学习技术对搜索架构进行整体升级。在美团 NLP 中心以及大众点评搜索智能中心两个团队的紧密合作之下,经过短短半年时间,点评搜索核心 KPI 在高位基础上仍然大幅提升,是过去一年半涨幅的六倍之多,提前半年完成全年目标。


基于知识图谱的搜索架构重塑


美团 NLP 中心正在构建全世界最大的餐饮娱乐知识图谱——美团大脑(相关信息请参见《美团大脑:知识图谱的建模方法及其应用》)。它充分挖掘关联各个场景数据,用 NLP 技术让机器“阅读”用户公开评论,理解用户在菜品、价格、服务、环境等方面的喜好,构建人、店、商品、场景之间的知识关联,从而形成一个“知识大脑”[1]。通过将知识图谱信息加入到搜索各个流程中,我们对点评搜索的整体架构进行了升级重塑,图 1 为点评搜索基于知识图谱搭建的 5 层搜索架构。本篇文章是“美团大脑”系列文章第二篇(系列首篇文章请参见《美团餐饮娱乐知识图谱——美团大脑揭秘》),主要介绍点评搜索 5 层架构中核心排序层的演变过程,文章主要分为如下 3 个部分:


  1. 核心排序从传统机器学习模型到大规模深度学习模型的演进。

  2. 搜索场景深度学习排序模型的特征工程实践。

  3. 适用于搜索场景的深度学习 Listwise 排序算法——LambdaDNN。



图 1 基于知识图谱的点评搜索 5 层架构

2. 排序模型探索与实践

搜索排序问题在机器学习领域有一个单独的分支,Learning to Rank(L2R)。主要分类如下:


  1. 根据样本生成方法和 Loss Function 的不同,L2R 可以分为 Pointwise、Pairwise、Listwise。

  2. 按照模型结构划分,可以分为线性排序模型、树模型、深度学习模型,他们之间的组合(GBDT+LR,Deep&Wide 等)。


在排序模型方面,点评搜索也经历了业界比较普遍的迭代过程:从早期的线性模型 LR,到引入自动二阶交叉特征的 FM 和 FFM,到非线性树模型 GBDT 和 GBDT+LR,到最近全面迁移至大规模深度学习排序模型。下面先简单介绍下传统机器学习模型(LR、FM、GBDT)的应用和优缺点,然后详细介绍深度模型的探索实践过程。


传统机器学习模型



图 2 几种传统机器学习模型结构


  1. LR 可以视作单层单节点的线性网络结构。模型优点是可解释性强。通常而言,良好的解释性是工业界应用实践比较注重的一个指标,它意味着更好的可控性,同时也能指导工程师去分析问题优化模型。但是 LR 需要依赖大量的人工特征挖掘投入,有限的特征组合自然无法提供较强的表达能力。

  2. FM 可以看做是在 LR 的基础上增加了一部分二阶交叉项。引入自动的交叉特征有助于减少人工挖掘的投入,同时增加模型的非线性,捕捉更多信息。FM 能够自动学习两两特征间的关系,但更高量级的特征交叉仍然无法满足。

  3. GBDT 是一个 Boosting 的模型,通过组合多个弱模型逐步拟合残差得到一个强模型。树模型具有天然的优势,能够很好的挖掘组合高阶统计特征,兼具较优的可解释性。GBDT 的主要缺陷是依赖连续型的统计特征,对于高维度稀疏特征、时间序列特征不能很好的处理。


深度神经网络模型


随着业务的发展,在传统模型上取得指标收益变得愈发困难。同时业务的复杂性要求我们引入海量用户历史数据,超大规模知识图谱特征等多维度信息源,以实现精准个性化的排序。因此我们从 2018 年下半年开始,全力推进 L2 核心排序层的主模型迁移至深度学习排序模型。深度模型优势体现在如下几个方面:


  1. 强大的模型拟合能力:深度学习网络包含多个隐藏层和隐藏结点,配合上非线性的激活函数,理论上可以拟合任何函数,因此十分适用于点评搜索这种复杂的场景。

  2. 强大的特征表征和泛化能力:深度学习模型可以处理很多传统模型无法处理的特征。例如深度网络可以直接中从海量训练样本中学习到高维稀疏 ID 的隐含信息,并通过 Embedding 的方式去表征;另外对于文本、序列特征以及图像特征,深度网络均有对应的结构或者单元去处理。

  3. 自动组合和发现特征的能力:华为提出的 DeepFM,以及 Google 提出的 DeepCrossNetwork 可以自动进行特征组合,代替大量人工组合特征的工作。


下图是我们基于 Google 提出的 Wide&Deep 模型搭建的网络结构[2]。其中 Wide 部分输入的是 LR、GBDT 阶段常用的一些细粒度统计特征。通过较长周期统计的高频行为特征,能够提供很好的记忆能力。Deep 部分通过深层的神经网络学习 Low-Order、高纬度稀疏的 Categorical 型特征,拟合样本中的长尾部分,发现新的特征组合,提高模型的泛化能力。同时对于文本、头图等传统机器学习模型难以刻画的特征,我们可以通过 End-to-End 的方式,利用相应的子网络模型进行预处理表示,然后进行融合学习。



图 3 Deep&Wide 模型结构图

3. 搜索深度排序模型的特征工程实践

深度学习的横空出世,将算法工程师从很多人工挖掘和组合特征的事情中解放出来。甚至有一种论调,专做特征工程的算法工程师可能面临着失业的风险。但是深度学习的自动特征学习目前主要集中体现在 CV 领域,CV 领域的特征数据是图片的像素点——稠密的低阶特征,深度学习通过卷积层这个强力工具,可以自动对低阶特征进行组合和变换,相比之前人工定义的图像特征从效果上来说确实更加显著。在 NLP 领域因为 Transformer 的出现,在自动特征挖掘上也有了长足的进步,BERT 利用 Transformer 在多个 NLP Task 中取得了 State-of-The-Art 的效果。


但是对于 CTR 预估和排序学习的领域,目前深度学习尚未在自动特征挖掘上对人工特征工程形成碾压之势,因此人工特征工程依然很重要。当然,深度学习在特征工程上与传统模型的特征工程也存在着一些区别,我们的工作主要集中在如下几个方面。

3.1 特征预处理

  • 特征归一化:深度网络的学习几乎都是基于反向传播,而此类梯度优化的方法对于特征的尺度非常敏感。因此,需要对特征进行归一化或者标准化以促使模型更好的收敛。

  • 特征离散化:工业界一般很少直接使用连续值作为特征,而是将特征离散化后再输入到模型中。一方面因为离散化特征对于异常值具有更好的鲁棒性,其次可以为特征引入非线性的能力。并且,离散化可以更好的进行 Embedding,我们主要使用如下两种离散化方法:

  • 等频分桶:按样本频率进行等频切分,缺失值可以选择给一个默认桶值或者单独设置分桶。

  • 树模型分桶:等频离散化的方式在特征分布特别不均匀的时候效果往往不好。此时可以利用单特征结合 Label 训练树模型,以树的分叉点做为切分值,相应的叶子节点作为桶号。

  • 特征组合:基于业务场景对基础特征进行组合,形成更丰富的行为表征,为模型提供先验信息,可加速模型的收敛速度。典型示例如下:

  • 用户性别与类目之间的交叉特征,能够刻画出不同性别的用户在类目上的偏好差异,比如男性用户可能会较少关注“丽人”相关的商户。

  • 时间与类目之间的交叉特征,能够刻画出不同类目商户在时间上的差异,例如,酒吧在夜间会更容易被点击。

3.2 万物皆可 Embedding

深度学习最大的魅力在于其强大的特征表征能力,在点评搜索场景下,我们有海量的用户行为数据,有丰富的商户 UGC 信息以及美团大脑提供的多维度细粒度标签数据。我们利用深度学习将这些信息 Embedding 到多个向量空间中,通过 Embedding 去表征用户的个性化偏好和商户的精准画像。同时向量化的 Embedding 也便于深度模型进一步的泛化、组合以及进行相似度的计算。

3.2.1 用户行为序列的 Embedding

用户行为序列(搜索词序列、点击商户序列、筛选行为序列)包含了用户丰富的偏好信息。例如用户筛选了“距离优先”时,我们能够知道当前用户很有可能是一个即时消费的场景,并且对距离较为敏感。行为序列特征一般有如下图所示的三种接入方式:


  • Pooling:序列 Embedding 后接入 Sum/Average Pooling 层。此方式接入成本低,但忽略了行为的时序关系。

  • RNN:LSTM/GRU 接入,利用循环网络进行聚合。此方式能够考虑行为序列的时序关系;代价是增大了模型复杂度,影响线上预测性能。

  • Attention:序列 Embedding 后引入 Attention 机制,表现为加权的 Sum Pooling;相比 LSTM/GRU 计算开销更低[4]。



图 4 行为序列特征接入的几种方法


同时,为了突显用户长期偏好和短期偏好对于排序的不同影响,我们按照时间维度对行为序列进行了划分:Session、半小时、一天、一周等粒度,也在线上取得了收益。

3.2.2 用户 ID 的 Embedding

一种更常见的刻画用户偏好的方式,是直接将用户 ID 经过 Embedding 后作为特征接入到模型中,但是最后上线的效果却不尽如人意。通过分析用户的行为数据,我们发现相当一部分用户 ID 的行为数据较为稀疏,导致用户 ID 的 Embedding 没有充分收敛,未能充分刻画用户的偏好信息。


Airbnb 发表在 KDD 2018 上的文章为这种问题提供了一种解决思路[9]——利用用户基础画像和行为数据对用户 ID 进行聚类。Airbnb 的主要场景是为旅游用户提供民宿短租服务,一般用户一年旅游的次数在 1-2 次之间,因此 Airbnb 的用户行为数据相比点评搜索会更为稀疏一些。



图 5 按照用户画像和行为信息聚类


如上图所示,将用户画像特征和行为特征进行离散分桶,拼接特征名和所属桶号,得到的聚类 ID 为:US_lt1_pn3_pg3_r3_5s4_c2_b1_bd2_bt2_nu3。


我们也采取了类似 Airbnb 的方案,稀疏性的问题得到了很好的解决,并且这样做还获得了一些额外的收益。大众点评作为一个本地化的生活信息服务平台,大部分用户的行为都集中自己的常驻地,导致用户到达一个新地方时,排序个性化明显不足。通过这种聚类的方式,将异地有相同行为的用户聚集在一起,也能解决一部分跨站的个性化问题。

3.2.3 商户信息 Embedding

商户 Embedding 除了可以直接将商户 ID 加入模型中之外,美团大脑也利用深度学习技术对 UGC 进行大量挖掘,对商家的口味、特色等细粒度情感进行充分刻画,例如下图所示的“好停车”、“菜品精致”、“愿意再次光顾”等标签。



图 6 美团大脑提供的商家细粒度情感标签


这些信息与单纯的商户星级、点评数相比,刻画的角度更多,粒度也更细。我们将这些标签也进行 Embedding 并输入到模型中:


  • 直连:将标签特征做 Pooling 后直接输入模型。这种接入方式适合端到端的学习方式;但受输入层大小限制,只能取 Top 的标签,容易损失抽象实体信息。

  • 分组直连:类似于直连接入的方式,但是先对标签进行分类,如菜品/风格/口味等类别;每个分类取 Top N 的实体后进行 Pooling 生成不同维度的语义向量。与不分组的直连相比,能够保留更多抽象信息。

  • 子模型接入:可以利用 DSSM 模型,以标签作为商户输入学习商户的 Embedding 表达。此种方式能够最大化保留标签的抽象信息,但是线上实现和计算成本较高。

3.2.4 加速 Embedding 特征的收敛

在我们的深度学习排序模型中,除了 Embedding 特征,也存在大量 Query、Shop 和用户维度的强记忆特征,能够很快收敛。而 Embedding 特征是更为稀疏的弱特征,收敛速度较慢,为了加速 Embedding 特征的收敛,我们尝试了如下几种方案:


  • 低频过滤:针对出现频率较低的特征进行过滤,可以很大程度上减少参数量,避免过拟合。

  • 预训练:利用多类模型对稀疏 Embedding 特征进行预训练,然后进入模型进行微调:

  • 通过无监督模型如 Word2vec、Fasttext 对用户-商户点击关系建模,生成共现关系下的商户 Embedding。

  • 利用 DSSM 等监督模型对 Query-商户点击行为建模得到 Query 和商户的 Embedding。

  • Multi-Task:针对稀疏的 Embedding 特征,单独设置一个子损失函数,如下图所示。此时 Embedding 特征的更新依赖两个损失函数的梯度,而子损失函数脱离了对强特征的依赖,可以加快 Embedding 特征的收敛。



图 7 Multi-Task 加速 Embedding 特征收敛

3.3 图片特征

图片在搜索结果页中占据了很大的展示面积,图片质量的好坏会直接影响用户的体验和点击,而点评商户首图来自于商户和用户上传的图片,质量参差不齐。因此,图片特征也是排序模型中较为重要的一类。目前点评搜索主要用了以下几类图片特征:


  • 基础特征:提取图片的亮度、色度饱和度等基础信息,进行特征离散化后得到图片基础特征。

  • 泛化特征:使用 ResNet50 进行图片特征提取[3],通过聚类得到图片的泛化特征。

  • 质量特征:使用自研的图片质量模型,提取中间层输出,作为图片质量的 Embedding 特征。

  • 标签特征:提取图片是否是食物、环境、价目表、Logo 等作为图片分类和标签特征。



图 8 图片特征接入

4. 适用于搜索场景的深度学习 Listwise 排序算法:LambdaDNN

4.1 搜索业务指标与模型优化目标的 Gap

通常模型的预测目标与业务指标总会存在一些 Gap。如果模型的预测目标越贴近业务目标,越能保证模型优化的同时业务指标也能够有相应的提升;反之则会出现模型离线指标提升,但线上关键业务指标提升不明显,甚至出现负向的问题。工业届大部分深度学习排序采用 Pointwise 的 Log Loss 作为损失函数,与搜索业务指标有较大的 Gap。体现在如下两个方面:


  1. 搜索业务常用的指标有 QV_CTR 或者 SSR(Session Success Rate),更关心的是用户搜索的成功率(有没有发生点击行为);而 Pointwise 的 Log Loss 更多是关注单个 Item 的点击率。

  2. 搜索业务更关心排在页面头部结果的好坏,而 Pointwise 的方法则对于所有位置的样本一视同仁。



图 9 Pointwise 和 Listwise 优化目标的区别


基于上述理由,我们对于深度学习模型的损失函数进行了优化。

4.2 优化目标改进:从 Log Loss 到 NDCG

为了让排序模型的优化目标尽量贴近搜索业务指标,需要按照 Query 计算损失,且不同位置的样本具有不同的权重。搜索系统常用的指标 NDCG(Normalized Discounted Cumulative Gain)相较于 Log Loss 显然更贴近搜索业务的要求,NDCG 计算公式如下:



累加部分为 DCG(Discounted Cumulative Gain)表示按照位置折损的收益,对于 Query 下的结果列表 l,函数 G 表示对应 Doc 的相关度分值,通常取指数函数,即 G(lj)=2lj-1(lj 表示的是相关度水平,如{0,1,2});函数 η 即位置折损,一般采用 η(j)=1/log(j+1),Doc 与 Query 的相关度越高且位置越靠前则 DCG 值会越大。另外,通常我们仅关注排序列表页前 k 位的效果,Zk 表示 DCG@k 的可能最大值,以此进行归一化处理后得到的就是 NDCG@k。


问题在于 NDCG 是一个处处非平滑的函数,直接以它为目标函数进行优化是不可行的。LambdaRank 提供了一种思路:绕过目标函数本身,直接构造一个特殊的梯度,按照梯度的方向修正模型参数,最终能达到拟合 NDCG 的方法[6]。因此,如果我们能将该梯度通过深度网络进行反向传播,则能训练一个优化 NDCG 的深度网络,该梯度我们称之为 Lambda 梯度,通过该梯度构造出的深度学习网络称之为 LambdaDNN。


要了解 Lambda 梯度需要引入 LambdaRank。LambdaRank 模型是通过 Pairwise 来构造的,通常将同 Query 下有点击样本和无点击样本构造成一个样本 Pair。模型的基本假设如下式所示,令 Pij 为同一个 Query 下 Doci 相比 Docj 更相关的概率,其中 si 和 sj 分别为 Doci 和 Docj 的模型得分:



使用交叉熵为损失函数,令 Sij 表示样本 Pair 的真实标记,当 Doci 比 Docj 更相关时(即 Doci 有被用户点击,而 Docj 没有被点击),有 Sij=1,否则为-1;则损失函数可以表示为:



在构造样本 Pair 时,我们可以始终令 i 为更相关的文档,此时始终有 Sij≡1,代入上式并进行求导,则损失函数的梯度为:



到目前为止,损失函数的计算过程中并未考虑样本所在的位置信息。因此进一步对梯度进行改造,考虑 Doci 和 Docj 交换位置时的 NDCG 值变化,下式即为前述的 Lambda 梯度。可以证明,通过此种方式构造出来的梯度经过迭代更新,最终可以达到优化 NDCG 的目的。



Lambda 梯度的物理意义如下图所示。其中蓝色表示更相关(用户点击过)的文档,则 Lambda 梯度更倾向于位置靠上的 Doc 得到的提升更大(如红色箭头所示)。有了 Lambda 梯度的计算方法,训练中我们利用深度网络预测同 Query 下的 Doc 得分,根据用户实际点击 Doc 的情况计算 Lambda 梯度并反向传播回深度网络,则可以得到一个直接预测 NDCG 的深度网络。



图 10 Lambda 梯度的物理意义

4.3 LambdaDNN 的工程实施

我们利用 TensorFlow 分布式框架训练 LambdaDNN 模型。如前文所述,Lambda 梯度需要对同 Query 下的样本进行计算,但是正常情况下所有的样本是随机 Shuffle 到各个 Worker 的。因此我们需要对样本进行预处理:


  1. 通过 QueryId 进行 Shuffle,将同一个 Query 的样本聚合在一起,同一个 Query 的样本打包进一个 TFRecord。

  2. 由于每次请求 Query 召回的 Doc 数不一样,对于可变 Size 的 Query 样本在拉取数据进行训练时需要注意,TF 会自动补齐 Mini-Batch 内每个样本大小一致,导致输入数据中存在大量无意义的默认值样本。这里我们提供两点处理方式:

  3. MR 过程中对 Key 进行处理,使得多个 Query 的样本聚合在一起,然后在训练的时候进行动态切分。

  4. 读取到补齐的样本,根据设定的补齐标记获取索引位,去除补齐数据。



图 11 Lambda 梯度的分布式实现


为了提升训练效率,我们与基础研发平台数据平台中心紧密协同,一起探索并验证了多项优化操作:


  1. 将 ID 类特征的映射等操作一并在预处理中完成,减少多轮 Training 过程中的重复计算。

  2. 将样本转 TfRecord,利用 RecordDataSet 方式读取数据并计算处理,Worker 的计算性能大概提升了 10 倍。

  3. Concat 多个 Categorical 特征,组合成 Multi-Hot 的 Tensor 进行一次 Embedding_Lookup 操作,减少 Map 操作的同时有助于参数做分片存储计算。

  4. 稀疏 Tensor 在计算梯度以及正则化处理时保留索引值,仅对有数值的部分进行更新操作。

  5. 多个 PS 服务器间进行分片存储大规模 Tensor 变量,减少 Worker 同步更新的通讯压力,减少更新阻塞,达到更平滑的梯度更新效果。


整体下来,对于 30 亿左右的样本量、上亿级别的特征维度,一轮迭代大概在半小时内完成。适当的增加并行计算的资源,可以达到分钟级的训练任务。

4.4 进一步改进优化目标

NDCG 的计算公式中,折损的权重是随着位置呈指数变化的。然而实际曝光点击率随位置变化的曲线与 NDCG 的理论折损值存在着较大的差异。


对于移动端的场景来说,用户在下拉滑动列表进行浏览时,视觉的焦点会随着滑屏、翻页而发生变动。例如用户翻到第二页时,往往会重新聚焦,因此,会发现第二页头部的曝光点击率实际上是高于第一页尾部位置的。我们尝试了两种方案去微调 NDCG 中的指数位置折损:


  1. 根据实际曝光点击率拟合折损曲线:根据实际统计到的曝光点击率数据,拟合公式替代 NDCG 中的指数折损公式,绘制的曲线如图 12 所示。

  2. 计算 Position Bias 作为位置折损:Position Bias 在业界有较多的讨论,其中[7][8]将用户点击商户的过程分为观察和点击两个步骤:a.用户需要首先看到该商户,而看到商户的概率取决于所在的位置;b.看到商户后点击商户的概率只与商户的相关性有关。步骤 a 计算的概率即为 Position Bias,这块内容可以讨论的东西很多,这里不再详述。



图 12 真实位置折损与理论折损的差别


经过上述对 NDCG 计算改造训练出的 LambdaDNN 模型,相较 Base 树模型和 Pointwise DNN 模型,在业务指标上有了非常显著的提升。



图 13 LambdaDNN 离线 NDCG 指标与线上 PvCtr 效果对比

4.5 Lambda 深度排序框架

Lambda 梯度除了与 DNN 网络相结合外,事实上可以与绝大部分常见的网络结构相结合。为了进一步学习到更多交叉特征,我们在 LambdaDNN 的基础上分别尝试了 LambdaDeepFM 和 LambdaDCN 网络;其中 DCN 网络是一种加入 Cross 的并行网络结构,交叉的网络每一层的输出特征与第一层的原始输入特征进行显性的两两交叉,相当于每一层学习特征交叉的映射去拟合层之间的残差。



图 14 DCN 模型结构


离线的对比实验表明,Lambda 梯度与 DCN 网络结合之后充分发挥了 DCN 网络的特点,简洁的多项式交叉设计有效地提升模型的训练效果。NDCG 指标对比效果如下图所示:



图 15 Lambda Loss 与 DCN 网络结果的效果

5. 深度学习排序诊断系统

深度学习排序模型虽然给业务指标带来了大幅度的提升,但由于深度学习模型的“黑盒属性”导致了巨大的解释性成本,也给搜索业务带来了一些问题:


  1. 日常搜索 Bad Case 无法快速响应:搜索业务日常需要应对大量来自于用户、业务和老板们的“灵魂拷问”,“为何这个排序是这样的”,“为什么这家商户质量跟我差不多,但是会排在我的前面”。刚切换到深度学习排序模型的时候,我们对于这样的问题显得手足无措,需要花费大量的时间去定位问题。

  2. 无法从 Bad Case 中学习总结规律持续优化:如果不明白为什么排序模型会得出一个很坏的排序结果,自然也 2. 无法定位模型到底出了什么问题,也就无法根据 Bad Case 总结规律,从而确定模型和特征将来的优化方向。

  3. 模型和特征是否充分学习无从得知:新挖掘一些特征之后,通常我们会根据离线评测指标是否有提升决定特征是否上线。但是,即使一个有提升的特征,我们也无法知道这个特征是否性能足够好。例如,模型拟合的距离特征,会不会在特定的距离段出现距离越远反而打分越高的情况。


这些问题都会潜在带来一些用户无法理解的排序结果。我们需要对深度排序模型清晰地诊断并解释。


关于机器学习模型的可解释性研究,业界已经有了一些探索。Lime(Local Interpretable Model-Agnostic Explanations)是其中的一种,如下图所示:通过对单个样本的特征生成扰动产生近邻样本,观察模型的预测行为。根据这些扰动的数据点距离原始数据的距离分配权重,基于它们学习得到一个可解释的模型和预测结果[5]。举个例子,如果需要解释一个情感分类模型是如何预测“我讨厌这部电影”为负面情感的,我们通过丢掉部分词或者乱序构造一些样本预测情感,最终会发现,决定“我讨厌这部电影”为负面情感的是因为“讨厌”这个词。



图 16 Lime 解释器的工作原理


基于 Lime 解释器的思想,我们开发了一套深度模型解释器工具——雅典娜系统。目前雅典娜系统支持两种工作模式,Pairwise 和 Listwise 模式:


  1. Pairwise 模式用来解释同一个列表中两个结果之间的相对排序。通过对样本的特征进行重新赋值或者替换等操作,观察样本打分和排序位次的变化趋势,诊断出当前样本排序是否符合预期。如下图所示,通过右侧的特征位次面板可以快速诊断出为什么“南京大牌档”的排序比“金时代顺风港湾”要更靠前。第一行的特征位次信息显示,若将“金时代顺风港湾”的 1.3km 的距离特征用“南京大牌档”的 0.2km 的距离特征进行替换,排序位次将上升 10 位;由此得出,“南京大牌档”排在前面的决定性因素是因为距离近。

  2. Listwise 模式与 Lime 的工作模式基本类似,通过整个列表的样本生成扰动样本,训练线性分类器模型输出特征重要度,从而达到对模型进行解释的目的。



图 17 深度学习排序诊断系统:雅典娜

6. 总结与展望

2018 年下半年,点评搜索完成了从树模型到大规模深度学习排序模型的全面升级。团队在深度学习特征工程、模型结构、优化目标以及工程实践上都进行了一些探索,在核心指标上取得了较为显著的收益。当然,未来依然有不少可以探索的点。


在特征层面,大量知识图谱提供的标签信息尚未充分挖掘。从使用方式上看,简单以文本标签的形式接入,损失了知识图谱的结构信息,因此,Graph Embedding 也是未来需要尝试的方向。同时团队也会利用 BERT 在 Query 和商户文本的深层语义表达上做一些工作。


模型结构层面,目前线上依然以全连接的 DNN 网络结构为主,但 DNN 网络结构在低秩数据的学习上不如 DeepFM 和 DCN。目前 LambdaDeepFM 和 LambdaDCN 在离线上已经取得了收益,未来会在网络结构上做进一步优化。


在模型优化目标上,Lambda Loss 计算损失的时候,只会考虑 Query 内部有点击和无点击的样本对,大量无点击的 Query 被丢弃,同时,同一个用户短时间内在不同 Query 下的行为也包含着一些信息可以利用。因此,目前团队正在探索综合考虑 Log Loss 和 Lambda Loss 的模型,通过 Multi-Task 和按照不同维度 Shuffle 样本让模型充分学习,目前我们已经在线下取得了一些收益。


最后,近期 Google 开源的 TF Ranking 提出的 Groupwise 模型也对我们有一些启发。目前绝大部分的 Listwise 方法只是体现在模型训练阶段,在打分预测阶段依然是 Pointwise 的,即只会考虑当前商户相关的特征,而不会考虑列表上下文的结果,未来我们也会在这个方向上进行一些探索。

参考资料

1.美团大脑:知识图谱的建模方法及其应用


2.Wide & Deep Learning for Recommender Systems


3.Deep Residual Learning for Image Recognition


4.Attention Is All You Need


5.Local Interpretable Model-Agnostic Explanations: LIME


6.From RankNet to LambdaRank to LambdaMART: An Overview


7.A Novel Algorithm for Unbiased Learning to Rank


8.Unbiased Learning-to-Rank with Biased Feedback


9.Real-time Personalization using Embeddings for Search Ranking at Airbnb

作者简介

非易,2016 年加入美团点评,高级算法工程师,目前主要负责点评搜索核心排序层的研发工作。


祝升,2016 年加入美团点评,高级算法工程师,目前负责点评搜索核心排序层的研发工作。


汤彪,2013 年加入美团点评,高级算法专家,点评平台搜索技术负责人,致力于深层次查询理解和大规模深度学习排序的技术落地。


张弓,2012 年加入美团点评,美团点评研究员。目前主要负责点评搜索业务演进,及集团搜索公共服务平台建设。


仲远,博士,美团 AI 平台部 NLP 中心负责人,点评搜索智能中心负责人。在国际顶级学术会议发表论文 30 余篇,获得 ICDE 2015 最佳论文奖,并是 ACL 2016 Tutorial “Understanding Short Texts”主讲人,出版学术专著 3 部,获得美国专利 5 项。此前,博士曾担任微软亚洲研究院主管研究员,以及美国 Facebook 公司 Research Scientist。曾负责微软研究院知识图谱、对话机器人项目和 Facebook 产品级 NLP Service。


2019-02-06 12:006328

评论

发布
暂无评论
发现更多内容

阿里P8大牛亲自讲解!2021年Android网络编程总结篇,醍醐灌顶!

欢喜学安卓

android 程序员 面试 移动开发

OpenKruise v0.8.0 核心能力解读:管理 Sidecar 容器的利器

阿里巴巴云原生

容器 微服务 云原生 k8s 应用服务中间件

朋友,你听说过跨域吗

河磨

spring CORS 跨域

有道技术沙龙 | AI 语音交互技术在语言学习场景的实践

有道技术团队

人工智能

电商千万级交易的金手指:分布式事务管理

华为云开发者联盟

微服务 事务 华为云 分布式事务管理 DTM

沙龙报名 | 云计算进入多元架构,云原生时代的挑战与机遇

京东科技开发者

云计算 云原生

LeetCode题解:647. 回文子串,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

跟公司新招的这个“同事”搭档,工作搬砖太“自动化”了

华为云开发者联盟

华为 AI RPA 自动化 员工

看故事学Redis:再不懂,我怀疑你是假个开发

华为云开发者联盟

MySQL 数据库 redis 缓存 数据

JVM笔记 -- 来,教你类加载子系统

秦怀杂货店

Java JVM 类加载 虚拟机

EGG公链生态项目——EFTalk上的巴莱特定律

币圈那点事

区块链

架构师训练营第十一周作业 - 命题作业

阿德儿

JDK8新特性 Fork/Join 的优化

Java小咖秀

Java java8 jdk8 forkjoin fork

阿里P8大牛亲自教你!一个三非渣本的Android校招秋招之路,满满干货指导

欢喜学安卓

android 程序员 面试 移动开发

智慧公安二维码定位报警系统开发,微警务平台解决方案

源中瑞-龙先生

二维码定位报警系统开发 智慧公安 智慧公安扫码

数据驱动业务:一张大屏掌控城市运行,效率提高95%

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧园区 智慧交通

C语言中“野指针”、“悬空指针”是什么?

不脱发的程序猿

c 指针 编程之路 bug 3月日更

你遇到过哪些质量很高的 Java 面试?

张小方

Java 面试 阿里 薪资

寻找被遗忘的勇气(十七)

Changing Lin

3月日更

【LeetCode】不同的子序列Java题解

Albert

算法 LeetCode 28天写作 3月日更

第8周大作业

八达鸟

一招让Kafka达到最佳吞吐量

万俊峰Kevin

kafka go-zero Go 语言

Oracle Sql性能优化

大数据技术指南

oracle 大数据 28天写作 3月日更

图解堆排序

Silently9527

Java 排序算法 堆排序

拍乐云创始人&CEO赵加雨:深耕18载,打造全景式音视频服务

拍乐云Pano

音视频 WebRTC 在线教育 RTC 实时通信

带你走进与千万数据通信者共成长的“家园”

华为云开发者联盟

华为 开发者 网络 华为数据通信 社区

多端框架开发 | 拼团商城项目开发说明

YonBuilder低代码开发平台

小程序云开发 大前端 移动终端 APP开发 多端开发

“时间”都去哪儿了?性能调优分析方法与案例详解

京东科技开发者

数据库 客户端

电影AI修复,让重温经典有了新的可能

华为云开发者联盟

AI 电影 华为云视频 视频增强 经典

怎么找属于自己最优的2B增长模型?

boshi

销售管理 SaaS 七日更

SDK 是如何存储事件数据的?

神策技术社区

ios 大数据 存储 数据采集 神策数据

大众点评搜索基于知识图谱的深度学习排序实践_大数据_仲远_InfoQ精选文章