搜索是大众点评App上用户进行信息查找的最大入口,是链接用户和信息的重要纽带。而用户搜索的方式和场景很是多样,而且因为对接业务种类多,流量差别大,为大众点评搜索(下文简称点评搜索)带来了巨大的挑战,具体体如今以下几个方面:html
上述的各项特性,叠加上时间、空间、场景等维度,使得点评搜索面临比通用搜索引擎更加独特的挑战。而解决这些挑战的方法,就须要升级NLP(Natural Language Processing,天然语言处理)技术,进行深度查询理解以及深度评价分析,并依赖知识图谱技术和深度学习技术对搜索架构进行总体升级。在美团NLP中心以及大众点评搜索智能中心两个团队的紧密合做之下,通过短短半年时间,点评搜索核心KPI在高位基础上仍然大幅提高,是过去一年半涨幅的六倍之多,提早半年完成整年目标。算法
美团NLP中心正在构建全世界最大的餐饮娱乐知识图谱——美团大脑(相关信息请参见《美团大脑:知识图谱的建模方法及其应用》)。它充分挖掘关联各个场景数据,用NLP技术让机器“阅读”用户公开评论,理解用户在菜品、价格、服务、环境等方面的喜爱,构建人、店、商品、场景之间的知识关联,从而造成一个“知识大脑”[1]。经过将知识图谱信息加入到搜索各个流程中,咱们对点评搜索的总体架构进行了升级重塑,图1为点评搜索基于知识图谱搭建的5层搜索架构。本篇文章是“美团大脑”系列文章第二篇(系列首篇文章请参见《美团餐饮娱乐知识图谱——美团大脑揭秘》),主要介绍点评搜索5层架构中核心排序层的演变过程,文章主要分为以下3个部分:服务器
搜索排序问题在机器学习领域有一个单独的分支,Learning to Rank(L2R)。主要分类以下:网络
在排序模型方面,点评搜索也经历了业界比较广泛的迭代过程:从早期的线性模型LR,到引入自动二阶交叉特征的FM和FFM,到非线性树模型GBDT和GBDT+LR,到最近全面迁移至大规模深度学习排序模型。下面先简单介绍下传统机器学习模型(LR、FM、GBDT)的应用和优缺点,而后详细介绍深度模型的探索实践过程。架构
随着业务的发展,在传统模型上取得指标收益变得愈发困难。同时业务的复杂性要求咱们引入海量用户历史数据,超大规模知识图谱特征等多维度信息源,以实现精准个性化的排序。所以咱们从2018年下半年开始,全力推动L2核心排序层的主模型迁移至深度学习排序模型。深度模型优点体如今以下几个方面:框架
下图是咱们基于Google提出的Wide&Deep模型搭建的网络结构[2]。其中Wide部分输入的是LR、GBDT阶段经常使用的一些细粒度统计特征。经过较长周期统计的高频行为特征,可以提供很好的记忆能力。Deep部分经过深层的神经网络学习Low-Order、高纬度稀疏的Categorical型特征,拟合样本中的长尾部分,发现新的特征组合,提升模型的泛化能力。同时对于文本、头图等传统机器学习模型难以刻画的特征,咱们能够经过End-to-End的方式,利用相应的子网络模型进行预处理表示,而后进行融合学习。机器学习
深度学习的横空出世,将算法工程师从不少人工挖掘和组合特征的事情中解放出来。甚至有一种论调,专作特征工程的算法工程师可能面临着失业的风险。可是深度学习的自动特征学习目前主要集中体如今CV领域,CV领域的特征数据是图片的像素点——稠密的低阶特征,深度学习经过卷积层这个强力工具,能够自动对低阶特征进行组合和变换,相比以前人工定义的图像特征从效果上来讲确实更加显著。在NLP领域由于Transformer的出现,在自动特征挖掘上也有了长足的进步,BERT利用Transformer在多个NLP Task中取得了State-of-The-Art的效果。分布式
可是对于CTR预估和排序学习的领域,目前深度学习还没有在自动特征挖掘上对人工特征工程造成碾压之势,所以人工特征工程依然很重要。固然,深度学习在特征工程上与传统模型的特征工程也存在着一些区别,咱们的工做主要集中在以下几个方面。ide
深度学习最大的魅力在于其强大的特征表征能力,在点评搜索场景下,咱们有海量的用户行为数据,有丰富的商户UGC信息以及美团大脑提供的多维度细粒度标签数据。咱们利用深度学习将这些信息Embedding到多个向量空间中,经过Embedding去表征用户的个性化偏好和商户的精准画像。同时向量化的Embedding也便于深度模型进一步的泛化、组合以及进行类似度的计算。函数
用户行为序列(搜索词序列、点击商户序列、筛选行为序列)包含了用户丰富的偏好信息。例如用户筛选了“距离优先”时,咱们可以知道当前用户颇有多是一个即时消费的场景,而且对距离较为敏感。行为序列特征通常有以下图所示的三种接入方式:
同时,为了突显用户长期偏好和短时间偏好对于排序的不一样影响,咱们按照时间维度对行为序列进行了划分:Session、半小时、一天、一周等粒度,也在线上取得了收益。
一种更常见的刻画用户偏好的方式,是直接将用户ID通过Embedding后做为特征接入到模型中,可是最后上线的效果却不尽如人意。经过分析用户的行为数据,咱们发现至关一部分用户ID的行为数据较为稀疏,致使用户ID的Embedding没有充分收敛,未能充分刻画用户的偏好信息。
Airbnb发表在KDD 2018上的文章为这种问题提供了一种解决思路[9]——利用用户基础画像和行为数据对用户ID进行聚类。Airbnb的主要场景是为旅游用户提供民宿短租服务,通常用户一年旅游的次数在1-2次之间,所以Airbnb的用户行为数据相比点评搜索会更为稀疏一些。
如上图所示,将用户画像特征和行为特征进行离散分桶,拼接特征名和所属桶号,获得的聚类ID为:US_lt1_pn3_pg3_r3_5s4_c2_b1_bd2_bt2_nu3。
咱们也采起了相似Airbnb的方案,稀疏性的问题获得了很好的解决,而且这样作还得到了一些额外的收益。点评搜索做为一个本地化的生活信息服务平台,大部分用户的行为都集中本身的常驻地,致使用户到达一个新地方时,排序个性化明显不足。经过这种聚类的方式,将异地有相同行为的用户汇集在一块儿,也能解决一部分跨站的个性化问题。
商户Embedding除了能够直接将商户ID加入模型中以外,美团大脑也利用深度学习技术对UGC进行大量挖掘,对商家的口味、特点等细粒度情感进行充分刻画,例以下图所示的“好停车”、“菜品精致”、“愿意再次光顾”等标签。
这些信息与单纯的商户星级、点评数相比,刻画的角度更多,粒度也更细。咱们将这些标签也进行Embedding并输入到模型中:
在咱们的深度学习排序模型中,除了Embedding特征,也存在大量Query、Shop和用户维度的强记忆特征,可以很快收敛。而Embedding特征是更为稀疏的弱特征,收敛速度较慢,为了加速Embedding特征的收敛,咱们尝试了以下几种方案:
图片在搜索结果页中占据了很大的展现面积,图片质量的好坏会直接影响用户的体验和点击,而点评商户首图来自于商户和用户上传的图片,质量良莠不齐。所以,图片特征也是排序模型中较为重要的一类。目前点评搜索主要用了如下几类图片特征:
一般模型的预测目标与业务指标总会存在一些Gap。若是模型的预测目标越贴近业务目标,越能保证模型优化的同时业务指标也可以有相应的提高;反之则会出现模型离线指标提高,但线上关键业务指标提高不明显,甚至出现负向的问题。工业届大部分深度学习排序采用Pointwise的Log Loss做为损失函数,与搜索业务指标有较大的Gap。体如今以下两个方面:
基于上述理由,咱们对于深度学习模型的损失函数进行了优化。
为了让排序模型的优化目标尽可能贴近搜索业务指标,须要按照Query计算损失,且不一样位置的样本具备不一样的权重。搜索系统经常使用的指标NDCG(Normalized Discounted Cumulative Gain)相较于Log Loss显然更贴近搜索业务的要求,NDCG计算公式以下:
累加部分为DCG(Discounted Cumulative Gain)表示按照位置折损的收益,对于Query下的结果列表l,函数G表示对应Doc的相关度分值,一般取指数函数,即G(l<sub>j</sub>)=2<sup>l<sub>j</sub></sup>-1(l<sub>j</sub>表示的是相关度水平,如{0,1,2});函数 η 即位置折损,通常采用 η(j)=1/log(j+1),Doc与Query的相关度越高且位置越靠前则DCG值会越大。另外,一般咱们仅关注排序列表页前k位的效果,Z<sub>k</sub> 表示 DCG@k 的可能最大值,以此进行归一化处理后获得的就是NDCG@k。
问题在于NDCG是一个到处非平滑的函数,直接以它为目标函数进行优化是不可行的。LambdaRank提供了一种思路:绕过目标函数自己,直接构造一个特殊的梯度,按照梯度的方向修正模型参数,最终能达到拟合NDCG的方法[6]。所以,若是咱们能将该梯度经过深度网络进行反向传播,则能训练一个优化NDCG的深度网络,该梯度咱们称之为Lambda梯度,经过该梯度构造出的深度学习网络称之为LambdaDNN。
要了解Lambda梯度须要引入LambdaRank。LambdaRank模型是经过Pairwise来构造的,一般将同Query下有点击样本和无点击样本构形成一个样本Pair。模型的基本假设以下式所示,令P<sub>ij</sub>为同一个Query下Doc<sub>i</sub>相比Doc<sub>j</sub>更相关的几率,其中s<sub>i</sub>和s<sub>j</sub>分别为Doc<sub>i</sub>和Doc<sub>j</sub>的模型得分:
使用交叉熵为损失函数,令S<sub>ij</sub>表示样本Pair的真实标记,当Doc<sub>i</sub>比Doc<sub>j</sub>更相关时(即Doc<sub>i</sub>有被用户点击,而Doc<sub>j</sub>没有被点击),有S<sub>ij</sub>=1,不然为-1;则损失函数能够表示为:
在构造样本Pair时,咱们能够始终令i为更相关的文档,此时始终有S<sub>ij</sub>≡1,代入上式并进行求导,则损失函数的梯度为:
到目前为止,损失函数的计算过程当中并未考虑样本所在的位置信息。所以进一步对梯度进行改造,考虑Doc<sub>i</sub>和Doc<sub>j</sub>交换位置时的NDCG值变化,下式即为前述的Lambda梯度。能够证实,经过此种方式构造出来的梯度通过迭代更新,最终能够达到优化NDCG的目的。
Lambda梯度的物理意义以下图所示。其中蓝色表示更相关(用户点击过)的文档,则Lambda梯度更倾向于位置靠上的Doc获得的提高更大(如红色箭头所示)。有了Lambda梯度的计算方法,训练中咱们利用深度网络预测同Query下的Doc得分,根据用户实际点击Doc的状况计算Lambda梯度并反向传播回深度网络,则能够获得一个直接预测NDCG的深度网络。
咱们利用TensorFlow分布式框架训练LambdaDNN模型。如前文所述,Lambda梯度须要对同Query下的样本进行计算,可是正常状况下全部的样本是随机Shuffle到各个Worker的。所以咱们须要对样本进行预处理:
为了提高训练效率,咱们与基础研发平台数据平台中心紧密协同,一块儿探索并验证了多项优化操做:
总体下来,对于30亿左右的样本量、上亿级别的特征维度,一轮迭代大概在半小时内完成。适当的增长并行计算的资源,能够达到分钟级的训练任务。
NDCG的计算公式中,折损的权重是随着位置呈指数变化的。然而实际曝光点击率随位置变化的曲线与NDCG的理论折损值存在着较大的差别。
对于移动端的场景来讲,用户在下拉滑动列表进行浏览时,视觉的焦点会随着滑屏、翻页而发生变更。例如用户翻到第二页时,每每会从新聚焦,所以,会发现第二页头部的曝光点击率其实是高于第一页尾部位置的。咱们尝试了两种方案去微调NDCG中的指数位置折损:
通过上述对NDCG计算改造训练出的LambdaDNN模型,相较Base树模型和Pointwise DNN模型,在业务指标上有了很是显著的提高。
Lambda梯度除了与DNN网络相结合外,事实上能够与绝大部分常见的网络结构相结合。为了进一步学习到更多交叉特征,咱们在LambdaDNN的基础上分别尝试了LambdaDeepFM和LambdaDCN网络;其中DCN网络是一种加入Cross的并行网络结构,交叉的网络每一层的输出特征与第一层的原始输入特征进行显性的两两交叉,至关于每一层学习特征交叉的映射去拟合层之间的残差。
离线的对比实验代表,Lambda梯度与DCN网络结合以后充分发挥了DCN网络的特色,简洁的多项式交叉设计有效地提高模型的训练效果。NDCG指标对比效果以下图所示:
深度学习排序模型虽然给业务指标带来了大幅度的提高,但因为深度学习模型的“黑盒属性”致使了巨大的解释性成本,也给搜索业务带来了一些问题:
这些问题都会潜在带来一些用户没法理解的排序结果。咱们须要对深度排序模型清晰地诊断并解释。
关于机器学习模型的可解释性研究,业界已经有了一些探索。Lime(Local Interpretable Model-Agnostic Explanations)是其中的一种,以下图所示:经过对单个样本的特征生成扰动产生近邻样本,观察模型的预测行为。根据这些扰动的数据点距离原始数据的距离分配权重,基于它们学习获得一个可解释的模型和预测结果[5]。举个例子,若是须要解释一个情感分类模型是如何预测“我讨厌这部电影”为负面情感的,咱们经过丢掉部分词或者乱序构造一些样本预测情感,最终会发现,决定“我讨厌这部电影”为负面情感的是由于“讨厌”这个词。
基于Lime解释器的思想,咱们开发了一套深度模型解释器工具——雅典娜系统。目前雅典娜系统支持两种工做模式,Pairwise和Listwise模式:
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的,即只会考虑当前商户相关的特征,而不会考虑列表上下文的结果,将来咱们也会在这个方向上进行一些探索。