去哪儿酒店搜索排序模型的演进

Original 杨旭 Qunar技术沙龙 2025年02月17日 17:02 北京

作者介绍:

杨旭,2019年加入去哪儿旅行,目前在算法团队担任搜索推荐算法工程师,主要负责国内酒店搜索排序相关工作。通过分析理解数据,基于不同的场景和任务进行模型迭代升级,提升国内酒店的转化率和收益。

一、背景

在用户在线浏览酒店时,旅行平台需要解决一个重要问题:如何更好地为用户挑选适合的酒店,并降低用户选择的费力度。而为用户挑选符合需求的酒店,需要千人千面的模型排序。在去哪儿(Qunar)APP中,触发个性化排序的场景主要是欢迎度排序(见图1)。

Image

图1 Qunar酒店搜索产品形态

**二、**Qunar酒店搜索排序架构

Qunar酒店搜索推荐系统的总体流程可以分成四块,主要是召回、粗排、精排、重排。其中精排主要会根据用户的搜索关键词和其他相关信息,筛选出与用户需求最相符合的酒店,确保在搜索结果中,用户能够看到那些与其需求最相关的酒店。而Qunar酒店长期优化的业务目标是s2o,即下单用户数/搜索用户数。

Image

图2 Qunar搜索架构

**三、**Qunar酒店搜索精排排序的发展历程

第一阶段升级机器学习模型,酒店搜索业务准备使用机器学习模型替换人工规则排序。为了能快速上线验证模型效果,并考虑到酒店业务天生自带大量连续特征,如酒店价格、酒店距离等,我们选择了对连续特征比较友好的树模型LambdaMart模型。

第二阶段升级深度模型,LambdaMart排序模型常用的迭代优化手段,如添加特征、样本调整等几乎已经无法带来增量收益,因此我们准备升级成比树模型天花板更高的深度模型架构LambdaDNN。

第三阶段升级多目标模型,LambdaDNN排序模型主要还是聚焦单目标建模(CTCVR),而多目标建模更好的考虑了排序全空间的曝光样本,综合考虑了下单前的用户点击行为,降低样本偏差问题,我们借鉴了Google的MMOE模型,同时学习CTR目标任务和CTCVR目标任务。

第四阶段升级多场景多目标模型,酒店业务搜索场景分为同城空搜、异地空搜等,每个场景单独一个模型,使得维护成本很高,并且用户出行时,会在多个场景(同城搜索、异地搜索)下搜索找到符合自己期望的酒店。若将多个场景分别单独训练模型,会使得用户连贯的搜索行为割裂,学习不到用户在不同场景下的差异和共性。因此,我们提出将信息表征拆分,融合多场景样本的多场景多目标模型。

下面具体阐述我们在Qunar酒店搜索排序模型的演进。

**四、**Qunar酒店搜索精排排序算法的迭代

排序学习(Learning to Rank)是一个监督学习过程,给定一个query,搜索引擎会召回一系列相关的item,然后对这些召回的item进行排序,最后将Top N的item输出。而排序问题就是使用一个模型 f(q,d)来对该query下的item进行排序,分为PointWise,PairWise,ListWise三种排序学习方式。

PointWise:输入空间中样本是单个 item(和对应 query)构成的特征向量,输出空间中样本是单个 item(和对应 query)的相关度,是将所有用户的样本空间的样本同等对待。

PairWise:输入空间中样本是(同一 query 对应的)两个item构成的两个特征向量,输出空间中样本对的偏序关系,此方法学习了同一个query下的两个样本对比偏好。

ListWise:输入空间中样本是(同一 query 对应的)所有item构成的多个特征向量列表,输出空间是同一个query下的最优排序列表,是pairwise和lambda梯度的结合,如LambdaMart算法,对整个列表建模,学习一个最优排序列表。

Image

模型的预测目标与业务指标之间存在一定的差距,Pointwise注重单个物品的点击率,对所有请求下的物品同等对待,与搜索业务指标存在较大的Gap,而搜索业务更关注在页面头部的搜索结果的优劣。

因此,初期阶段我们选择了更适合搜索排序的Listwise方式学习模型,即LambdaMart树模型作为base模型,同时树模型不需要做大量的特征处理,可以快速上线验证效果、拿到收益。

1. 由LambdaMart模型升级到LambdaDNN模型

将排序模型从LambdaMart升级到LambdaDNN模型主要考虑到以下几点:

树模型和深度模型的主要区别见表1。

表1

特征工程 在线学习 稀疏特征
树模型 优化后期,增大数据量、特征工程收益变小 不适合在线学习,酒店用户在节假日行为有较大不同,这时需要快速更新模型 对高维的稀疏向量不友好,如ID类特征
深度模型 网络结构和参数可以调整的空间更大,表达能力也更强,可以优化提升的空间更大 可以进行在线学习,多目标学习 容量更大,可以处理高维稀疏特征,如ID类

2. LambdaDNN模型实践

为了验证深度模型的有效性,我们控制了loss的学习方式,统一为listwise方式,唯一变量只是模型的结构。而LambdaDNN模型是将神经网络DNN与LamdaRank [2] 定义的NDCG排序指标梯度相结合,演进出了LambdaDNN,是一种listwise的学习方式。因此我们尝试将LambdaDNN模型应用在了Qunar搜索推荐下的精排阶段,

模型学习目标定义为曝光转化率(ctcvr)。LambdaDNN的搭建主要包括了框架选型、样本构造、特征工程、模型离线训练及线上化,其中样本与特征决定了模型效果的上限。接下来分别介绍下这几个部分:

2.1 框架选型

TensorFlow Ranking (TFR) 是 TensorFlow 官方开发的 LTR 框架,旨在基于 TensorFlow 开发和整合 LTR 相关的技术,使开发人员可以更加方便的进行 LTR 算法的开发。TFR 使用了 Estimator API,提供了排序任务常见的损失函数和指标计算实现,比如 listwise Loss 和 NDCG指标。

根据训练流程,模块结构可以分成特征输入、特征转换、模型打分和损失计算等模块。这样的模块划分可以提高后续快速迭代的便利性和灵活性,而不用关注于各种实施上的细节。

Image

图3 TFRanking框架

如上图3所示,model_fn 参数内需要自己设计和开发的算法模型模块。在这个 model_fn 中,需要自行设计模型结构 (Scoring Function),然后用模型计算的 logit 和 label 来计算 Loss 和 Metrics,最后利用 Optimizer 来进行模型的优化。图3中的下方部分为使用 TFR 服务的整个流程。

为了配合 TFR 框架中的 LTR 相关的 Loss 和 Metrics 来实现 LTR 的训练,训练数据需要以 listwise 的形式组织。即LTR 模型与一次只对一个item进行分类的标准分类模型不同,它会将整个items列表接收输入,并学习排序,充分提升整个list列表的效用,如图4所示。

Image

图4 listwise的学习方式

2.2 模型结构

我们使用的模型结构,借鉴了Airbnb的深度学习[3]模型演进的经验,模型探索的原则是从简单到复杂,逐步积累经验,针对特征数量不多的情况下,使用非常深的网络,会导致过拟合。因此,如图5所示,采用了简单2层隐藏层的金字塔网络结构。

对一个query下的样本计算Lambda Loss,优化网络参数。其中,模型调优参数,batch size为1024,加入dropout和Batch Normalization(BN),梯度优化器是Adam,学习率为0.01。输入特征仅为77维,隐藏层神经元数为[128,86]。

Image

图5 模型结构

2.3 样本构造

为了训练listwise模型,需要构造样本来表示用户的查询query和item之间的关系。图6(左图)显示了一个典型的用户搜索旅程的简化示例,其中客户在多天内进行多次query搜索,并点击多个搜索结果以查看其详细页面,最终在第M日query#3下的结果列表中用户点击了酒店(hotel-b)和下单了酒店(hotel-d),整个会话以用户下单酒店成功结束。

Image

图6 用户搜索行为示例

在我们的业务场景下,线上业务优化目标为下单转化率,对应离线建模目标为曝光转化率(ctcvr),即从search到order的转化,训练的目标是从曝光到下单的转化。

工程实践:Listwise学习方式的Lambda梯度需要对同Query下的样本进行计算。因此我们需要对样本进行预处理:将同一个查询(Query)的样本聚合在一起,采用ExampleListWithContext编码方式,将这些样本打包进一个TFRecord中。由于每次请求Query召回的item数不一样,对于可变Size的Query样本在拉取数据进行训练时需要注意,TF会自动补齐Mini-Batch内每个样本大小一致。

2.4****特征工程

特征工程主要包括特征构建、特征分析、特征处理,以及特征选择等:

特征构建:

构建原则:

特征选择:

Image

图7 选择不同top数量的特征训练后的模型效果

特征分析:

深度模型对特征大小较为敏感,因此特征处理的好坏直接影响后续模型的表现。

Image

Image

我们通过上述变换方式,让所有特征范围在0-1之间或者0附近,在输入模型后经过一层bn操作进行正态分布处理。当然还有其他处理方式,具体还要根据自己业务选择合适的处理方式。

2.5 实验评估

baseline模型即LambdaMart,离线ndcg@10效果如下表,LambdaDnn线上转化率提升0.5%。

NDCG@10
LambdaMart 0.7310
LambdaDnn 0.7463

3. 多目标模型优化

在类似电商搜索推荐系统中,用户的行为通常按照一种序列化的模式进行,即首先是曝光,然后是点击,最后是转化。因此,CTCVR模型的作用是预估在曝光发生后的转化概率。

3.1 为什么选择多目标建模?

单目标方式缺陷:

1)样本选择偏差问题

2)模型分可解释性差

3)数据稀疏,模型泛化能力不足

多目标优势:

1)缓解样本偏差,及稀疏性

2)可解释性好

3)促进作用

4)约束作用

3.2 多目标建模选型

MMOE是谷歌18年提出的模型结构,其思想是所有目标共享多个experts,但是考虑到不同任务之间的差异性,为每一个目标设置一个gate门控网络,用来控制不同目标选择每个expert的信号占比,类似于weighted sum pooling操作。

MMOE(如图8所示)通过共享experts学习到不同任务的联系和差异,提高了每个任务的学习效率和质量,同时通过gates来平衡多个任务对experts信号的选择,不要求目标之间必须是高相关性的,MMOE是业界通用的多目标实现算法。

多目标建模更好的考虑了排序全空间的曝光样本,综合考虑了下单前的用户点击行为,降低样本偏差问题,引入了多个专家、2个目标任务、一个CTR目标任务和一个CTCVR目标任务。

Image

图8 MMOE网络结构

3.3 MMOE样本选择

1)只选取有行为的搜索列表,即该列表是有被点击或被下单的酒店的列表;

2)选取每个列表的曝光样本,以及每个列表的最底部未曝光的n家酒店作为easy negative sample,防止排序出一些较差的酒店。

3)同一个请求列表中的酒店被点击多次的,只记录一次点击行为,即一次点击正样本。

3.4 MMOE训练过程中遇到的问题

1)实际的业务数据中,曝光到转化过于稀疏,具体训练过程中ctcvr的loss明显比ctr的loss小。为了使得2个目标任务的loss的量级一致,并没有采用loss加权处理,而是在样本构造过程中对下单样本进行上采样复制,保持正负样本1:1,基本上可以使得目标loss大小量级一样。

这样在训练shuffle时,不会使得一个正样本在batch内重复出现N次,使得ctcvr任务泛化性更好,同时对ctr任务中的上采样过的点击样本进行降权处理,恢复原先样本分布。

2) gate network输出进入饱和区,反向传播梯度消失:

expert gate输出,是由输入特征经过门网络后softmax得到,在训练的过程中,经过一段迭代次数,门控网络的输入值方差变大,经过softmax后gate network大部分输出是0,在这种情况下,multi expert的优势就没办法发挥出来,

一种解决方式是dropout,依然解决不了部分值偏大的问题;另一种方式对进入softmax之前的得分,进行得分除以一个lambda平滑处理(即,温度系数的调节),缓解部分专家退化现象;这里取lambda为输入特征的维度,也可以参考self-attention。

Image

如下表指数e函数曲线中所示,x的域范围在[-10,10]区间时,softmax的值很容易在x小于-2.5时为0,x大于10时为1。如果将x缩放尺度为1/100,就会缓解退化问题。

Image

3.5 实验结果

线上预测时,我们会加权融合两个目标预测值作为排序分,而融合权重可以通过离线数据拟合得到。

从下表中,我们的MMOE最终的离线指标NDCG@10没有提升,主要的原因是测试集是只能在有下单的请求上预测,而lambda直接学习的ndcg目标,所以ndcg更高。而多目标线上的ctr有明显提升,线上点击率提升2%,转化率持平。

LambdaDnn MMOE
未采样 下单上采样 gate缩放
NDCG@10 0.7477 0.74048 0.74407 0.74738

4. 多场景多目标优化

4.1 业务背景

在用户出行想要预定酒店时,搜索酒店列表是一个常见的行为。根据用户所处空间不同、搜索行为不同,分为:异地空搜,同城空搜等场景,并且一个用户会跨不同场景进行搜索。而之前模型建模,每个场景单独训练一个模型,一是树模型容量小等历史原因延续单独建模,二是每个场景下所使用的特征不一样,特征的索引也没有对齐。

单独建模不会受到其他场景下的特征影响,其次也可学到单个场景独有的一些特点。但是带来的问题是不同场景下的共有信息无法相互共享、无法迁移学习,造成了信息孤岛。因为同一个用户会在不同场景下都有搜索行为,将同一个用户行为样本分开建模显然是不合理的,同时对多个模型的维护成本也很高。

因此,升级到了MMOE模型后,我们考虑将几个场景下的样本融合学习一个模型,宗旨是既可以学习到场景间独有信息,也能迁移学习不同场景下的共有信息。

4.2 多场景样本如何进行融合?

不同场景下用户和item存在重叠,具有一定共性,不同场景下的用户行为,具有一定差异性;不同任务之间具有不同的稀疏性,同时也存在相互影响;如果在建模过程中忽略了多场景和多任务之间的共性和差异性,会影响建模效果,如果多个场景和任务不能很好地进行平衡,会存在场景跷跷板和 任务跷跷板现象。

一开始我们也是调研了目前不同场景下建模的方式,如阿里STAR、HMOE等多场景建模方式,但是效果不佳。原因是STAR、HMOE模型都是对不同场景下的分布差异较大的样本进行建模,会有比较好的效果。例如、淘宝的商品的主搜列表推荐、和主页的猜你喜欢等不同的多个频道的建模,而在去哪儿的酒店场景,其实还都是一个频道,用户的行为分布都是一致的,在目的地确定的前提下,无论是poi搜索、同城搜索,都是想预定目的地下的符合需求的酒店。

因此,我们尝试了直接将多个场景的样本放在一起学习,同时特征一起输入到MMOE中,简单的hard-share效果比STAR、HMOE效果会好。我们将训练完的模型,输出每个场景的专家权重,来分析不同场景下的权重是否分布一样。

Image

图9 不同场景下样本在专家下的权重占比

从图9来看,不同场景下的专家权重,分布几乎一致,最高的权重是专家2。侧面验证了,在我们的业务下场景间的分布差异没有很大。线上的下单转化相对提升0.56%。

4.3 多场景下特征如何对齐?

对于酒店业务下的特征,特征主要分为4类:

如上所述,输入部分,将场景的domain信息作为特征和场景共有特征一起拼接输入到感知网络中,抽取场景间共性信息;将场景的domain信息作为特征和场景特有特征一起拼接输入到感知网络中,抽取场景间差异信息;

如果统一作为MMOE的输入直接输入,模型无法很好的学习到不同场景的差异,若人为先验的分为上述几类特征,拉平场景特征之间的差异。可以使得模型在一个稳定的样本分布下学习,增强模型对用户跨域行为的底层感知能力。

Image

图10 多场景多目标网络结构

4.4 实验评估

模型 特征处理方式 专家个数 NDCG@10
v1.样本未融合 |4 0.78416
v2.多场景样本合并 |4 0.78449
v3.多场景样本合并 |8 0.78566
v4.全场景融合 特征分类建模输入 8 0.78745

5. 特征选择

5.1 为什么需要做特征选择?

随着Qunar酒店排序模型业务需求的迭代,越来越多的特征被引入模型中,导致出现如下问题:

5.2 传统特征选择方法

上述传统方法更适合数量小,训练时间短,模型简单的场景。而我们深度模型采用了基于dropout 的特征选择,借鉴了论文Dropout Feature Ranking for Deep Learning Models 的工作。

5.3 使用变分dropout来做特征的排序

Image

图11 dropout的训练前后的丢弃概率示意图

基于两阶段,第一阶段需要先训练一个pretrained Model 这样先学习模型的参数,第二阶段固定模型参数不做梯度更新,对输入的特征增加一个dropout丢弃变量(可导)与输入特征元素相乘,这个阶段的主要目的是优化该dropout丢弃概率。

如图11所示,论文提出了Dropout Feature Ranking方法,在训练完后,可以获取到每个特征的重要度。

本质的思想是将不可导的离散变量dropout,采用Concrete relaxation操作,对符合伯努利分布的离散变量近似估计为一个连续可导变量。松弛为连续性的噪声扰动过程,使其可以进行梯度更新。并对1-dropout_rate添加正则,使其在训练中尽可能最小化。图12 中的p就是特征的丢弃概率。

Image

这种方案的优点:

实验效果:

1、为了验证无效特征会影响模型的效果,我们在模型的原特征基础上增加了10个随机生成的噪声生成噪声特征(在某些特征上添加均匀分布噪声、高斯分布噪声等)

2、加上DFR层后,删减了14维特征后,模型效果不但没有下降,反而有微弱的提升。删除特征重新训练模型,线上转化率提升0.2%。

ndcg@10 相对降低
v1:基线模型(特征数310) 0.74956
v2:基线模型+增加10个噪声(特征数320) 0.74270 -0.915%
v3:基线模型+DFR(特征数296) 0.75038 0.109%

3、使用DFR算法后,特征重要性如下:

特征名 特征重要度分(1-p) 含义
f_10 0.9977435 实时类特征
f_16 0.9972702
f_1 0.9955838
f_20 0.9914903 用户和酒店交叉类特征
f_31 0.8450232
f_40 0.7709408
....... .......
f_noise 0.2733287 随机生成高斯分布的对照特征
f_150 0.1862088 酒店统计类特征(前面已提取过相关特征,基本上是一些冗余特征)
....... .......
f_130 0.1356599
f_0 0.0001341 值全为0的对照特征

五、阶段总结和未来规划

本文主要介绍Qunar在酒店搜索精排模型上的演进实践,从实验效果来看,证明了深度模型在酒店搜索排序的有效性,以及合理引入多场景特征间的差异建模可以让模型更好的理解数据。

对于接下来的深度模型优化:借鉴listwise的建模方式,将pointwise loss和listwise loss融合,既可以学习排序,又可以学习判别分类。

[1]Chris J.C. Burges. 2010. From RankNet to LambdaRank to LambdaMART: An Overview. Technical Report. https://www.microsoft.com/en-us/research/publication/from-ranknet-to-lambdarank-to-lambdamart-an-overview/

[2] Rama Kumar Pasumarthi, Sebastian Bruch, Xuanhui Wang, Cheng Li, Michael Bendersky, Marc Najork, Jan Pfeifer, Nadav Golbandi, Rohan Anil, Stephan Wolf. TF-Ranking: Scalable TensorFlow Library for Learning-to-Rank. KDD 2019.

[3] Haldar M, Abdool M, Ramanathan P, et al. Applying deep learning to airbnb search[C]//Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2019: 1927-1935.