返回介绍

数学基础

统计学习

深度学习

工具

Scala

十四、Improving Deep Learning For Airbnb Search [2020]

发布于 2023-07-17 23:38:24 字数 34822 浏览 0 评论 0 收藏 0

  1. Airbnb 是一个双边市场,汇集了拥有出租房屋的房东hosts 、以及来自世界各地的潜在租客guestsAirbnbsearch ranking 问题是对住宿地点(称为 listing )进行排名,从而响应用户的 query。这些 query 通常包括位置location、客人数量、入住/退房日期checkin/checkout dates

    过度到深度学习是 Airbnb search ranking 发展过程中的一个重要里程碑。我们在 《Applying Deep Learning to Airbnb Search》 对旅程(指的是超越之旅journey beyond)的描述让我们和许多行业从业人员进行了交谈,使得我们能够交换见解insights 和批评critiques。此类对话中经常出现的一个问题是:下一步是什么?我们试图在论文 《Improving Deep Learning For Airbnb Search》中回答这个问题。

    用于ranking 的深度学习的推出引起了很多庆祝,不仅因为它带来的预订量增益,还因为它给我们未来的路线图roadmap 带来了变化。最初的看法是,在深度学习上的 Airbnb ranking 使我们能够接触到这个巨大的机器学习思想宝库,这个宝库似乎每天都在增长。我们可以简单地从文献综述中挑选出最好的想法,一个接一个地推出,从此过上幸福的生活。

    但是事实证明,这是乐观情绪的山峰the peak of optimism 。熟悉的、陷入绝望之谷valley of despair 的模式很快就出现了:在其他地方取得了令人印象深刻的、成功的技术在我们自己的application 中证明是非常中性neutral 的。这导致了我们在第一次launch 之后对如何迭代深度学习的策略进行了全面修订。

    在论文 《Improving Deep Learning For Airbnb Search》中,我们描述了在 《Applying Deep Learning to Airbnb Search》 推出之后的主要改进。除了深入研究核心机器学习技术本身,我们还关注导致突破的过程process 和缘由reasoning 。现在从更大的角度来看,我们更重视在如何迭代 DNN 方面的经验教训,而不是任何单独的技术。

    我们希望那些专注于在工业环境中应用深度学习的人会发现我们的经验很有价值。我们通过回顾我们为改进 DNN 架构所作的努力来展开讨论。

    • 对于架构,我们描述了一个新的 ranking 神经网络,重点关注于将我们现有的 DNN 发展到两层全连接网络之外的过程。
    • 在处理 ranking 中的位置偏差positional bias 时,我们描述了一种新颖的方法,该方法在处理库存inventory 方面取得了显著的提升。
    • 为了解决冷启动问题,我们描述了我们对问题的看法,以及我们为改善平台上新 listing 的处理所做的改变。

14.1 架构优化

  1. 什么是深度学习?嗯,添加更多的 layer。至少,在回顾了引领当前深度学习时代的一系列进展之后,这是我们朴素的解读。但是,当我们试图复制 《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era》中总结的 scaling 数据和添加更多layer 的好处时,我们遇到的只是中性的测试结果。

    为了解释为什么增加layer 没有显示任何收益,我们从文献中借用了更多的想法,例如应用残差学习residual learningbatch normalization 等等。尽管如此,NDCG 在离线测试中仍然没有提升。

    我们从这些练习 exercise 中得出的结论是:增加layerconvolutional neural networks: CNN 卷积神经网络中的有效技术,但是不一定适用于所有 DNN 。对于像我们这样的全连接网络fully connected networks: FCN ,两个隐层就足够了,模型容量不是我们的问题。

    如果更深的网络不适合我们的架构,那么我么假设:更专业的网络可能适合我们的架构。因此,我们尝试了可以显式处理 querylisting 之间交互的架构,例如 Deep and Wide ,其中 query-listing 的特征交叉添加到 wide 部分。接下来是 《Attention is All you Need》 中基于 attention 的网络变体。这样做的目的是使得从query 特征派生的隐层将注意力集中在从listing 特征派生的隐层的某些部分上。这些努力的简短总结是,它们也未能改变现状。

    在尝试将成功的深度学习架构引入product application 时,在翻译任务translation 中经常忽略的是:一个体系架构的成功和它的应用上下文application context 有着错综复杂的联系。人们报告的架构性能提升来自于解决与它进行比较的baseline 的某些缺点。由于深度学习普遍缺乏可解释性explainability ,因此很难准确推断出新架构正在解决什么缺点、以及如何解决这些缺点。因此,确定这些缺点是否也同样困扰着自家产品,就变成了一种猜测。

    为了提高我们成功的几率,我们放弃了 “下载论文 --> 实现 --> A/B test ” 的循环。相反,我们决定基于一个非常简单的原则来推动这个过程:用户主导、模型跟随 users lead, model follows

    问题驱动,而不是模型驱动。

  2. 用户主导、模型跟随 Users Lead, Model Follows :这里的想法是:首先量化一个用户问题user problem ,随后调整模型以响应用户问题。

    沿着这些思路,我们观察到 《Applying Deep Learning to Airbnb Search》 中描述的一系列成功的 ranking 模型不仅与预订量的增加有关,而且还与搜索结果的平均 listing 价格降低有关。这表明模型迭代越来越接近租客的价格偏好price preference ,其中每轮迭代时平均价格低于前面模型的平均价格。

    我们怀疑,即使在连续降价之后,模型的价格选择和租客的价格偏好之间也可能存在 gap 。为了量化这种gap,我们观察了每个租客看到的搜索结果的价格中位数、以及该租客预订 listing 的价格之间的 gap 的分布。由于价格服从对数正态分布log-normal distribution ,因此在对价格取对数之后计算差异。下图给出了差异的分布情况。X 轴显示了预订价格和搜索结果中间价median price 的对数偏移,Y 轴是这个对数偏移对应的用户数。

    我们预期的是:预订价格将围绕着搜索结果的中间价对称分布,并且类似于以零点为中心的正态分布。实际上相反,这个分布在负向侧negative side 更大,表明租客更偏好较低的价格。这给了我们一个具体的用户问题来调查:是否需要将更接近租客价格偏好的低价listing 排名更高。

    假设有两个普通的listing,它们除了价格在其它方面都相同,我们的直觉理解是租客更喜欢更便宜的 listing 。我们的ranking 模型是否真正理解了 cheaper is better 的原则?我们并不完全确定。

    cheaper is better 是一个先验知识,因此希望模型能够学到这一先验知识。

  3. Enforcing Cheaper Is Better 强迫cheaper is better :我们不清楚模型如何解释 listing 价格的原因是:模型是一个 DNN。一些熟悉的工具,如检查逻辑回归模型中相应权重、或者 GBDT 模型中的部分依赖图partial dependence graphs,在 DNN 环境中都不再有效。

    为了使得价格更可解释 interpretable ,我们对模型架构进行了以下更改:

    • DNN 的输入特征中移除价格。我们将这个修改的 DNN 模型记作 $ \text{DNN}_{\theta}(u,q,l_{\text{no_price}}) $ ,其中 $ \theta $ 为 DNN 模型参数, $ u $ 为用户特征, $ q $ 为 query 特征, $ l_{\text{no_price}} $ 为移除了价格的 listing 特征。

    • 模型的最终输出修改为:

      $ \text{DNN}_{\theta}(u,q,l_{\text{no_price}}) - \tanh(w\times \mathcal P + b) $

      其中 $ w,b $ 为待学习的参数, $ \mathcal P $ 定义为:

      $ \mathcal P = \log \left(\frac{1+\text{price}}{1+\text{price}_{\text{median}}}\right) $

      其中 price 为原始的价格特征,而 $ \text{price}_{\text{median}} $ 为根据日志的listing 价格的中位数计算得出的常数。

    -tanh(.) 项允许我们通过相对于价格单调递减的output score 来强制执行 cheaper is better 。易于解释的 $ w $ 和 $ b $ 参数使得我们能够准确描绘出价格的精确影响。

    通过训练数据我们学习到参数取值为: $ w=0.33, b=-0.9 $ 。我们在下图中绘制了在 ranking 过程中, $ \mathcal P $ 遇到的典型取值所对应 tanh(.) 项的结果。X 轴表示归一化的价格( $ \mathcal P $ 值),Y 轴表示 tanh(.) 项的结果。

    当对 《Applying Deep Learning to Airbnb Search》 中的带两个隐层的 DNN 进行在线 A/B test 时,搜索结果的平均价格下降了 -5.7%,这与离线分析相一致。但是价格的可解释性付出了沉重的代价,因为预订量下降了 -1.5%

    我们猜想背后的原因是:价格和其它特征密切相关,将价格从模型中分离出来导致欠拟合。NDCG 在训练集和测试集上都下降了,该事实支持这一假设。

  4. 广义单调性Generalized Monotonicity:为了在模型中保留 cheaper is better 的直觉,但是允许价格和其它特征相互作用,我们开始研究在某些输入特征方面是单调monotonicDNN 架构。

    lattice networks 为这个问题提供了一个优雅的解决方案。但是,将我们的整个系统切换到 lattice networks 是一个巨大的挑战,我们寻求一种破坏性较小的机制。因此,我们构建了下图中所示的架构,除Tensorflow 中原生节点之外,该架构不依赖于任何专门的计算节点。

    我们讨论架构的逐步构建,确保从输入价格节点到最终输出的所有路径在价格方面都是单调的:

    • 我们将 $ -\mathcal P $ 作为 DNN 的输入,该输入相对于价格单调递减。

    • input layer,我们没有将 $ -\mathcal P $ 乘以权重参数,而是将它乘以权重参数的平方。因为在任何 $ w,b $ 参数(都是实数)的情况下, $ -w^2\times \mathcal P +b $ 都是相对于价格单调递减的。因此第一层隐层的输入对于价格也是单调递减的。

    • 对于隐层,我们使用 $ \tanh(\cdot) $ 作为激活函数,该激活函数保持了单调性。

    • 给定相对于 $ x $ 单调递减的两个函数 $ f_0(x),f_1(x) $ ,那么 $ w_0^2\times f_0(x) +w_1^2\times f_1(x) + b $ 也是相对于 $ x $ 单调递减的。其中 $ w_0,w_1,b $ 可以为任意实数。

      我们在第二个隐层和输出层使用这个属性,所有权重都是平方的。在下图中,这在第二个隐层和输出层用粗实线表示。即:粗实线表示平方权重,虚线表示常规的权重。

    • 添加一个既没有价格作为输入、也没有任何单调性约束的子网subnet,从而允许其它特征之间的不受约束的交互。

    尽管比 Enforcing Cheaper Is Better 中描述的架构更加灵活,但是在线测试的结果非常相似:预订量下降了 -1.6%

    Enforcing Cheaper Is Better 中描述的架构一样,该架构强制模型在任何情况下的输出都是相对于价格单调递减的。这种架构的失败表明:价格的单调性是一个过于严格的约束。

  5. 软单调性Soft Monotonicity:虽然前面描述的架构揭示了 DNN 在支持模型约束方面的能力,但是它也教会了我们 DNN 的另一个特点:它们的行为就像团队中的一位明星工程师star engineer。给定一个问题,让他自己解决,他通常会想出一个合理的解决方案。但是强迫他往某个方向走,灾难很快就会随之而来。

    所以在我们的下一次迭代中,我们决定通过配置上下文setting context 来管理 DNN ,而不是通过控制control 来管理 DNN 。我们没有强制要求模型的输出是价格的单调函数,而是添加了一个软提示soft hintcheaper was better

    通常,每个训练样本包含一对listing,一个是预订的 listing、另一个是未预订的 listing 。将 DNN 应用于这两个listing 的特征并产生对应的logits,并且定义损失函数为:

    
    
    xxxxxxxxxx
    91 # tensorflow 代码定义的 pairwise booking loss2 def get_loss_op(positive_logits, negative_logits):3 logit_diffs = positive_logits - negative_logits4 xentropy = tf.nn.sigmoid_cross_entropy_with_logits(5 labels = tf.ones_like(logit_diffs),6 logits = logit_diffs7 )8 loss = tf.reduce_mean(xentropy)9 return loss

    为了添加价格提示price hint,我们为每个训练样本引入了第二个label,指示两个listing 中哪个价格更低、哪个价格更高。然后我们修改损失函数如下:

    
    
    xxxxxxxxxx
    151 # tensorflow 代码定义的 pairwise booking loss2 def get_loss_op(positive_logits, negative_logits):3 logit_diffs = positive_logits - negative_logits4 xentropy = tf.nn.sigmoid_cross_entropy_with_logits(5 labels = tf.ones_like(logit_diffs),6 logits = logit_diffs7 )8 loss = tf.reduce_mean(xentropy)9 return loss10 # booked listing 为正样本、not booked listing 为负样本11 booking_loss = get_loss_op(booked_logits, not_booked_logits)12 # 低价 listing 为正样本、高价 listing 为负样本13 price_loss = get_loss_op(lower_price_logits, higher_price_logits)14 # alpha 为超参数15 loss = alpha * booking_loss + (1 - alpha) * price_loss

    alpha 超参数提供了一种方法来控制:结果是按照相关性relevance 排序还是按照价格price 排序。

    将价格约束作为一种正则化,使得模型倾向于选择低价的 listing

    为了测试这个想法,我们将 alpha 超参数调整到最小值,这样在离线测试中,我们得到了和 baseline 模型相同的 NDCG。这使得我们能够在不损害相关性的情况下尽可能地推动 cheaper is better 的直觉,至少在离线指标上是这样的。

    在在线 A/B test 中,我们观察到搜索结果的平均价格下降了 -3.3% ,但是预订量也下降了 -0.67%

    离线分析的局限性在于:它仅对日志中可用的、reranking 中的 top 结果(因为这些日志是reranking 模块胜出的流量)进行评估。在在线测试期间,将新训练的模型应用于整个库存inventory 空间揭示了将价格损失作为训练目标的一部分的真实代价。

    离线评估样本分布和在线样本分布不同,因此即使离线 auc 相同的情况下,在线 a/b test 表现也不相同。

  6. 执行个体条件期望 Putting Some ICE :降价实验带来的灾难让我们处于一种矛盾的状态:搜索结果中的listing 价格似乎高于房客偏好价格,但是压低价格却让房客不高兴。

    为了了解新模型的不足之处,有必要比较 baseline 模型是如何利用价格特征的,但是这被全连接 DNN 缺乏可解释性所掩盖。如前所述,像部分依赖图partial dependence plots 这样的概念没有用,因为这种方式依赖于给定的特征对模型的影响独立于其它特征的假设。试图给出价格的部分依赖图会产生平缓倾斜sloping straight 的直线,这表明 DNN 对价格有一些轻微的线性依赖,这与我们所知道的相矛盾。

    为了取得进展,我们缩小scaled downDNN 可解释性的问题。我们没有试图对价格如何影响DNN 做一般性的陈述statement,而是聚焦于一次解释单个搜索结果。借用《Peeking Inside the Black Box: Visualizing Statistical Learning With Plots of Individual Conditional Expectation》 中的个体条件期望individual conditional expectation:ICEplots 的想法,我们从单个搜索结果中获取listing,在保持所有其它特征不变的情况下对价格选取一定的范围,并构建模型得分的plot

    下面给出了一个示例。图中x 轴为价格、y 轴为模型预估的 listing score。每条曲线代表了单次搜索结果中的一个 lising (在多个价格上的score)。因为单次搜索返回多个 listing 结果,所以下图中有多条曲线。

    该图表明,《Applying Deep Learning to Airbnb Search》 中的两层全连接层 DNN 已经理解了 cheaper was better。对日志中随机选择的搜索集合重复 ICE 分析进一步加强了这个结论。

    失败的架构通过试图进一步压低价格从而影响了模型质量。

  7. 双塔架构Two Tower Architecture :回到下图,租客显然是在通过这个plot 传递一个信息。但是,那些致力于用相关性relevance 换取价格price 的架构错误地解释了这个信息。需要对下图进行重新解释,这个解释必须和价格保持一致,也必须和相关性保持一致。

    即不能用相关性的降低来换取价格的降低,应该在保持相关性的同时降低价格。

    当我们计算租客搜索结果的中间价与其预订价格之间的差异,并计算按城市分组的均值时,就出现了上图的替代解释alternate explanation 。正如预期的那样,各城市之间存在差异。但是和头部城市相比,尾部城市的差异要大得多。尾部城市也通常位于发展中市场developing markets。下图展示了某些选定城市的搜索结果中间价和预订价格之间的差异的平均值。

    这就产生了一个假设,即:搜索结果中间价与其预订价格之间差异plot 背后的 DNN 正遭受多数暴政tyranny of the majority,它聚焦于针对统治了预订量的热门区域调优的 price-quality tradeoff 。将这个 trade-off 推广到长尾的query 效果不佳,并且该模型也不适应本地条件(即长尾城市)。

    该假设与馈入 DNN 特征的另一个观察相吻合。鉴于DNN 是使用 pairwise 损失训练的,pair 对的两个listing 中有差异的特征似乎具有最大影响力。query 特征,这对于pair 对的两个listing 都是公共的,似乎没有什么影响,并且删除query 特征对于 NDCG 的影响非常微小。

    新的想法是,该模型充分理解了 cheaper is better,但它缺少的是合适价格right price 的概念。理解这一概念需要密切关注query 特征,如位置location,而不是纯粹基于listing 特征进行区分。这启发了该架构的下一次修订,新架构由双塔two towers 组成。

    • 第一个塔由query 特征和用户特征馈入,生成了一个 100 维的向量,该向量从概念上代表了 query-user 组合的ideal 理想listing
    • 第二个塔根据listing 特征构建了一个 100 维的向量。两个塔输出向量之间的欧氏距离用于衡量给定listingquery-user 的理想listing 之间的距离。

    训练样本由listing pair 对组成:一个已预订listing、一个未预订listing

    损失函数的定义是:和已预订listing 相比,未预订listing 与理想情况的接近程度。因此,对这个双塔模型进行训练可以使得pair 对中的预订listing 更接近理想listing 、同时将未预订listing 远离理想listing 。这类似于《A Unified Embedding for Face Recognition and Clustering》 中引入的 triplet loss 。这里的主要区别在于:我们没有在三元组triples 上训练,而是只有listing pair ,并且三元组中缺失的anchor listing 是由 query-user 塔来自动学习。

    querylistingpairwise training 如下图所示。

    Tensorflow 代码如下所示,实际实现可能略有不同从而优化训练速度:

    
    
    xxxxxxxxxx
    291 import tensorflow as tf2 def get_tower(features, w0, b0, w1, b1):3 # 两层全连接层,用于产生一个 100 维向量4 h1 = tf.nn.tanh(tf.matmul(features, w0) + b0)5 h2 = tf.nn.tanh(tf.matmul(h1, w1) + b1)6 return h27 def get_distance_to_ideal(query_vec, listing_vec):8 # 计算 listing hidden layer 和 query hidden layer 之间的欧式距离9 sqdiff = tf.math.squared_difference(query_vec, listing_vec)10 logits = tf.math.reduce_sum(sqdiff, axis=1)11 return logits12 def pairwise_loss(query_features, booked_listing_features, 13 not_booked_listing_features ) :14 qvec = get_tower(query_features, query_w0, 15 query_b0, query_w1, query_b1)16 booked_vec = get_tower(booked_listing_features, listing_w0,17 listing_b0, listing_w1, listing_b1)18 not_booked_vec = get_tower(listing_features, listing_w0,19 listing_b0, listing_w1, listing_b1)20 booked_distance = get_distance_to_ideal(qvec, booked_vec)21 not_booked_distance = get_distance_to_ideal(qvec, not_booked_vec)22 distance_diff = not_booked_distance - booked_distance23 # 通过增加二者之间的相对距离,将未预定 listing 推离理想 listing,24 # 将预定 listing 推近理想 listing25 xentropy = tf.nn.sigmoid_cross_entropy_with_logits(26 labels = tf.ones_like(logit_diffs),27 logits = logit_diffs)28 loss = tf.reduce_mean(xentropy)29 return loss
  8. 测试结果:当进行线上 A/B test 时,其中 baseline《Applying Deep Learning to Airbnb Search》 中的两层全连接层的 DNN ,双塔架构的预订量增加了 +0.6% 。这一增长是由搜索便利性ease of search 的提高所推动的,因为在线 NDCG 提高了 0.7% 。尽管这个双塔架构的目标不是直接降低价格,但是我们观察到搜索结果的平均价格降低了 -2.3%,这是相关性增加的副作用 side effect。预订量的增加抵消了价格下降对于收入的影响,整体收入增加了 +0.75%

    搜索便利性:搜索结果中,目标listing 排名更靠前因此有利于用户预订。

    除了提高搜索结果的质量之外,双塔架构还允许我们优化在线 DNNscoring 延迟。

    • 对于全连接架构,评估第一个隐层贡献了 scoring 延迟的最大部分。评估第一个隐层的计算复杂度可以表示为 $ O(H\times (Q+L)) $ ,其中 $ Q $ 是和 listing 无关的 queryuser 特征的数量, $ L $ 为 listing 特征的数量, $ H $ 为第一层的隐单元数量。

      为了评估包含 $ N $ 个listing 的结果集(该结果集对应于单个 query 的搜索结果),总的算法复杂为 $ O(N\times H\times (Q+L)) $ 。

    • 在新架构的双塔中,query 塔独立于 listing。这允许在整个搜索结果集针对该塔仅评分一次,并且仅评估每个listinglisting dependent tower 。第一个隐层的计算复杂度降低到 $ O(N\times H_l\times L + H_q\times Q) $ ,其中 $ H_l $ 和 $ H_q $ 为listing 塔和 query 塔的隐层神经元数量。

      当在线测试时,这导致 99th 百分位数的 scoring 延迟降低了 -33%

  9. 架构回顾:就在我们庆祝成功的时候,随着 DNN 迭代的启动,疑虑也悄然而至。架构是否按预期工作?或者 DNN 是否偶然发现了其它意外情况?

    过去,DNN 的不可解释的性质使得回答此类疑问变得极其困难。但是考虑到双塔架构的直觉是针对用户问题user problem 而开发的,我们现在可以使用这些直觉来更好地了解 DNN 的运作方式。

    重温价格的 ICE 图,我们看到了一个显著的变化。如下图所示,我们看到分数在某些价格附近达到峰值,而不是总是向下倾斜(对应于 cheaper is better )。这更接近 right price for the trip(旅行的正确价格) 的解释。

    在这种情况下,一个经常被提出的问题是,低质量的listing 是否可以通过简单地降低价格从而在新模型中提升排名。仔细检查 ICE 曲线发现,某些价格附近的分数峰值仅发生在高质量listing 中,这些listing 通常一开始就排名靠前。对于大多数listing ,该图仍然保持着与价格相关的单调递减曲线。

    正确价格right price 、理想listing 这些概念的核心是query 塔生成的向量,因此自然而然的后续工作是准确地研究这些向量到底是什么样子的。为了进行分析,我们随机采样了一批搜索来运行了双塔 DNN,并收集了 query塔的输出向量。由于 100 维向量对于人类是不可解释的,因此我们应用 t-SNE 将这些向量降维到 2 维空间,如下图所示。图中标出了部分城市对应的 query ,每个点代表一个 query。某些 query 标记有 city/guest-count/trip-length 信息。点的颜色代表query 的预订订单价格,越便宜颜色越绿、越贵颜色越蓝。令人欣慰的是,租客数量guest count 和行程长度trip length 等参数相似的值形成了大的簇clusters 。在大的簇内部,直觉上感觉相似的城市(比如都是发达市场或者发展中市场)被放置在彼此相对接近的地方。

    值得强调的是,簇不仅仅是价格簇price clusters。和query 对应的预订listing 的价格由点的颜色来表示,我们看到簇具有所有范围all range 的颜色。虽然莫斯科通常比巴黎更便宜,但是莫斯科的预订价格很容易超过巴黎的预订价格,这取决于租客数量、停留时间duration of stay 、离旅游景点的距离、周末 vs 工作日、以及许多其他因素。

    价格与所有其它维度有着千丝万缕的联系,掌握旅行的正确价格意味着同时掌握所有其它因素。我们所作的分析都不能作为双塔架构确实发展出这种掌握grasp 的有力证据。但是,针对价格的 ICE 图、query 塔输出的t-SNE 可视化、以及对跨城市price movements的额外分析给了我们足够的信息,让我们相信这一机制正在按预期发挥作用。

    放下一系列的架构操作,接下来我们继续解决ranking 的挑战,该挑战不仅影响房客,也影响 Airbnb 社区的另一半,即房东。

14.2 冷启动改善

  1. 在旅游领域的机器学习application 中,任何时候都有很大一部分用户是新用户,或者在很长一段时间后才使用该产品。此时用户处于连续冷启动状态 continuous cold start

    处理 user level 冷启动是核心排序公式 core ranking formulation 本身的一部分。所以在提到冷启动问题时,我们把注意力集中在 item level 冷启动上(即如何处理新item 的排名)。和前面改进 DNN 架构的情况一样,我们探索的起点不是文献综述,而是对用户问题user problem 的观察。

  2. 使用 NDCG 来量化预订listing 在搜索结果中的位置,这对我们来说是衡量模型性能最可靠的方法。因此,调查用户问题的一个自然的地方是:寻找 NDCG 低于 NDCG 整体水平的细分市场。

    考虑平台上新listing 、老listing 中,预定listing 的在线 NDCG 之间的差异,我们观察到了 -6% 的差距。而模型预估的 NDCG 和在线预定的 NDCG 之间的差异只有 0.7% 。这表明该模型让房客更难发现值得预订的新listing

    为了更好地理解这一点,我们从 DNN 中移除了所有的、listing 上基于房客历史互动生成的输入特征,例如一个listing 的历史预订量。删除这些互动特征engagement features导致离线 NDCG 下降了 -4.5%。显然,DNN 非常依赖于互动特征。由于新listing 没有这些互动特征,因此 DNN 被迫根据剩余特征做出宽泛broad 的判断,从而接近新listing 的平均表现。

  3. 冷启动方法视为 Explore-Exploit:冷启动问题的一个可能的框架是将它视为探索和利用explore-exploit 之间的tradeoff

    排序策略可以通过利用exploiting 当前库存inventory 的知识来短期地专门优化预订量,并且只押注那些有良好记录的listing 。但是为了市场的长期成功,它需要支付一些成本来探索explore 新的库存。

    这种tradeoff 可以作为新listing 的显式排名提升boost 来实现,它为新listing 分配更高的排名(相比较于 DNN 所确定的排名)。这允许新listing 以较低的预订代价cost 收集租客的反馈。这种通用的方式在电商排序application 中很流行,例如在 《Re-ranking results in a search》 中。这种 boost 可以通过曝光次数限制、或者引入时间衰减来进一步细化refined

    即,给新 listing 预估的得分提供一个大于 1 的权重,该权重可以随着时间衰减到 1.0、或者随着新 listing 曝光次数增加而衰减到 1.0

    我们的第一次迭代是为了测试这种 boost 。通过在线 A/B test,与没有 boost 相比,boost 并没有带来新listing 的预订量的提升或下降(效果中性),并且为新listing 带来了 +8.5% 的首页曝光次数。

    但是, explore-exploit 范式带来了严峻的挑战:

    • listingranking boost 被两种相反的力量拉向不同的方向:

      • 由于搜索结果相关性relevance 降低,短期内用户体验user experience 下降。我们可以准确地衡量这一影响(通过点击率或预订量)。
      • 由于库存增加,长期来看用户体验有所改善。我们发现这种影响很难量化。

      缺乏对最佳boost 值的明确和客观的定义导致了激烈的内部辩论,没有一个解决方案让每个团队都满意。

    • 即使能够确定探索exploration 成本的总体预算,很明显,预算的正确使用取决于特定地域location 的供需supply and demand 情况。

      • 当需求量demand 很大时,探索的容忍度就很高。当需求量很少时,探索的容忍度就没那么高。

      即流量充裕的时候,适当的探索可以接受;但是流量稀缺的时候,探索代价较大。

      • 在商品供给受到限制的区域,探索和扩大库存的需求很高。当大量优质listing 空置时,几乎没有动力承担探索成本。

        即供给稀缺的时候,很有必要进行探索;但是供给充裕的时候,没动力进行探索。

      供需反过来又受到位置location 、季节性seasonality 、租客容量capacity 等参数的影响。因此,为了最优地使用全局探索预算,需要数千个局部参数localizing parameters ,这是一项无法手动完成的任务。

  4. 预估将来的用户互动User Engagement:为了让系统更易于管理,我们退了一步,开始问:是什么让一个新的 listing 与众不同?

    答案当然是缺乏用户产生的互动特征engagement features ,例如预订量、点击量、评论量等等。价格、位置location、遍历设施amenities 等其它属性,新listing 和其它listing 一样。理论上,如果我们有一个预言机可以 100% 准确预测新listing 的互动特征,那么它可以最佳地解决冷启动问题。

    因此,我们没有将冷启动视为 explore-exploit tradeoff ,而是将其重新定义为一个评估新listing 互动值 engagement values的问题。问题的重新定义揭示了一些重要的东西:它允许我们为问题定义一个客观的理想 objective ideal ,并不断地朝着它努力。

    为了解决冷启动问题,我们引入了一个新的组件component 来为 DNN 提供数据,该组件在训练和评估时预测新listing 的用户互动特征。为了衡量估计器estimator 的准确性accuracy,我们采用了以下步骤:

    • 从日志中采样 $ O(100M) $ 个搜索结果。对于每个搜索结果,从 top 100 个位置随机抽取一个 listing。这些代表了受到租客充分关注的 listing 样本,因此它们的互动特征已经充分融合converged

    • 令 $ R_{\text{real}} $ 表示从日志中获取的抽样listing 的排名。我们将排名表示为 real,从而表示listing 的互动特征是真实租客互动的结果。从排名中,我们计算 real discounted rank 为:

      $ DR_{\text{real}} = \frac{\log (2.0)}{\log(2.0 + R_{\text{real}})} $

      为什么采用这种形式的 DR 指标?论文未给出解释。该指标的性质:真实排名越靠前,指标越大;指标最大值为 1.0 (当真实排第一名时)、最小值趋近于零。

    • 接下来,对于每个抽样的listing,我们删除所有互动特征,并用被estimator 预测的互动特征来代替它们。我们使用预估的互动特征对listing 进行评分,在相应的日志搜索结果中找到它的新排名,然后从中计算 discounted rank 。我们用 $ DR_{\text{predicted}} $ 来表示。

    • 对于每个抽样的listing,我们计算互动估计中的误差为 $ (DR_{\text{real}} - DR_{\text{predicted}})^2 $ 。

    • 为了获取整体误差,我们对所有抽样的listing 的互动估计误差engagement estimation error 进行平均。

    理想的互动估计器会产生零误差。要在两个估计器之间取舍,可以选择误差较小的估计器。

    为了验证,我们对比了两种估计方法:

    • baseline 是生产中使用的系统,它为缺失的特征分配默认值,包括新listing 的互动特征默认值。默认值是通过手动分析相应特征而创建的常量。

    • 我们对比了一个 estimator,这个 estimator 通过新listing 地理位置附近的其它listing 的互动特征均值来估计了新listing 的互动特征。

      为了提高准确性accuracy,它只考虑和新listing 的房客容量capacity 相匹配的相邻listing ,并计算滑动时间窗口的均值从而考虑季节性seasonality

      这本质上是一种缺失值填充策略:使用相似样本在该特征上取值的均值来进行填充。但是这种方式只能填充单值型的缺失值,难以处理序列型的缺失值。

      例如,为了估计一个容纳两人的新listing 的预订量,我们选取了新listing 的很小半径内的、容量为两人的所有listing 的平均预订量。

      这在概念上类似于朴素贝叶斯推荐器Naive Bayes recommender (它使用生成式方法generative method 来估计缺失信息)。

  5. 测试结果:

    • 在离线分析中,与使用默认值相比,上述互动估计器将互动估计误差降低了 -42%
    • 在在线 A/B test 中,我们观察到新listing 的预订量提高了 +14%,同时新listing 的首页曝光量增加了 +14% 。除了对新listing 的影响之外,整体预订量增加了 +0.38%,表明用户体验的整体改善。

14.3 Positional Bias

  1. 我们研究位置偏差positional bias 的出发点是完全不相关unrelated 的。与新listingNDCG 较低的观察结果类似,另一个表现低于预期的细分市场是精品酒店boutique hotels 和传统住宿加早餐酒店traditional bed and breakfasts。这个细分市场作为库存的一部分正在迅速增长。

    从观察中得出的一个假设是:由于位置偏差,在训练数据中未充分表达under-represented的库存没有得到最佳排名。但是和新listing 表现与冷启动之间的联系不同,没有充分理由相信位置偏差是这个case 的唯一罪魁祸首。还有多个其它假设。

    虽然我们发现关注用户问题user problem 要比简单地从文献综述中引入想法要好得多,但是用户问题并不是万灵药。在用户问题和模型缺陷之间建立因果关系远远不是简单直接的。在目前的场景中,我们是在黑暗中射击shooting in the dark

    但是与此同时,我们决定寻找模型中的最大gap 来解释观察结果。文献综述对于确定我们模型中潜在的主要gap 至关重要。

  2. 相关工作:给定用户 $ u $ 发出的 query $ q $ ,用户从搜索结果中预订 listing $ l $ 的概率可以分解为两个因素:

    • listing 和用户相关relevant 的概率。这个概率可以表示为 $ P(\text{relevant} = 1\mid l,u,q) $ ,从而明确它和 listing、用户、query 的依赖关系。

    • 给定listing 在搜索结果中的位置 $ k $ 的条件下,用户检查examinedlisting 的概率。这可能取决于用户(例如,移动设备上的用户可能对 top 结果有更高的bias )或query (例如,提前期lead days 较短的用户可能不太关注底部结果)。

      我们将这个概率表示为 $ P(\text{examined}=1\mid k,u,q) $ ,它独立于 listing $ l $ 。

      即,用户看到这个 listing 的概率,它和设备相关(如,PC 端还是手机端,以及手机型号)、和用户紧迫程度有关(如,是今天就想入住,还是三个月之后入住)。

    使用 《Click Models for Web Search》 中描述的position based 模型的简化建设,我们将用户预订listing 的概率简单地表示为两个分解概率的乘积:

    $ P_{\text{booking}} = P(\text{relevant} = 1\mid l,u,q)\times P(\text{examined}=1\mid k,u,q) $

    通过直接训练一个模型来预测预订,该模型学会预测了依赖于 $ P(\text{examined}=1\mid k,u,q) $ 的 $ P_{\text{booking}} $ 。这反过来又取决于位置 $ k $ ,这是先前previousranking 模型做出的决定。因此,当前的模型变得依赖于先前的模型(指的是模型的前一个版本)。

    理想情况下,我们希望模型专注于 $ P(\text{relevant} = 1\mid l,u,q) $ ,并仅按照相关性relevancelisting 进行排序。为了实现这一点, 《Unbiased Learning-to-Rank with Biased Feedback》描述了一种具有两个关键概念的方法:

    • 一个预测 $ P(\text{examined}=1\mid k,u,q) $ 的倾向性模型propensity model
    • 用预测的倾向的倒数来加权每个训练样本。

    虽然构建倾向性模型通常涉及扰乱perturbing 搜索结果从而收集反事实counterfactuals 的样本,但是 《Estimating Position Bias Without Intrusive Interventions》 描述了在没有额外干扰的情况下构建倾向模型的方法。

  3. 位置作为控制变量Position As Control Variable:我们的解决方案有两个关键亮点。

    • 首先,它是非侵入式non-intrusive 的,不需要对搜索结果进行任何随机化。

      我们依赖 Airbnb 搜索结果的一些独特属性,这些属性使得listing 即使在排序分不变的情况下也可能出现在不同的位置:

      • listing 代表给定日期范围内只能预订一次的物理实体physical entities 。随着listing 被预订并从搜索结果中消失,这会改变剩余listingposition

        Airbnb 中,每个 item 的库存只有一个,这和电商(每个item 库存很多个)、新闻(每个 item 库存无限)不同。

      • 每个listing 都有自己独特的日历可用性unique calendar availability,因此对于跨日期范围的相似query ,不同的listing 会出现在不同的position

    • 其次,我们没有明确建立一个倾向模型。相反,我们在 DNN 中引入位置position 作为特征,并通过dropout 进行正则化。在评分过程中,我们将position 特征设置为零。

    接下来我们描述为什么这种方法有效的直觉intuition 。我们以前面描述的 DNN 为基础,将query特征、用户特征、listing 特征作为输入。利用符号 $ q $ (query 特征)、 $ u $ (用户特征)、 $ l $ (listing 特征)、 $ \theta $ (DNN 参数),我们将 DNN 的输出表示为:

    $ \text{dnn}_\theta(q,u,l) = \text{rel}_{\theta}(q,u,l)\times \text{pbias}_\theta(q,u,l) $

    这反映了《Click Models for Web Search》position based 模型所作的假设,其中:

    • $ \text{rel}_{\theta}(q,u,l) $ 估计了 $ P(\text{relevance}=1\mid l,u,q) $ ,我们称之为相关性预测relevance prediction
    • $ \text{pbias}_\theta(q,u,l) $ 预估 $ P(\text{examined}=1\mid k,u,q) $ ,我们称之为位置偏差预测positional bias prediction

    很明显 $ \text{pbias}_\theta(q,u,l) $ 缺少listing 的位置 $ k $ 作为输入,而它试图估计的量依赖于 $ k $ 。因此,我们的第一步是将 $ k $ 作为输入特征添加到 DNN。因为相关性预测和位置偏差预测都是由 DNN 的输入馈送fed的,因此向输入中添加 $ k $ 会将我们的 DNN 变为:

    $ \text{dnn}_\theta(q,u,l,k) = \text{rel}_{\theta}(q,u,l,k)\times \text{pbias}_\theta(q,u,l,k) $

    假设 $ P(\text{examined}=1\mid k,u,q) $ 独立于 listing $ l $ ,位置偏差预测对 $ l $ 的任何依赖性dependence 都可以被视为误差error 。我们假设有足够数量的训练数据,待学习的参数 $ \theta $ 能够最小化该误差。我们将这个假设理解为:

    $ \text{dnn}_\theta(q,u,l,k) = \text{rel}_{\theta}(q,u,l,k)\times \text{pbias}_\theta(q,u,k) $

    其中从 $ \text{pbias}_\theta(q,u,l,k) $ 中移除 $ l $ 。

    评分时,我们将位置特征 $ k $ 设置为零。在给定的query 中, $ q $ 和 $ u $ 在 DNN 评分的 listing 中是不变的。我们使用 $ Q $ 和 $ U $ 来表示给定搜索的 query 特征和用户特征。因此,位置偏差预测变为 $ \text{pbias}_\theta(Q,U,0) $ ,它是对给定搜索结果中所有listing 不变invariant 的,我们将其记作 $ \beta $ 。那么DNN 的评分变为:

    $ \text{dnn}_\theta(Q,U,l,0) = \text{rel}_{\theta}(Q,U,l,0)\times \beta $

    这使得两个listing 得分的比较独立于位置偏差positional bias ,并且仅依赖于listing 相关性relevance 。本质上,我们在排序模型中添加了position 作为控制变量control variable

    对于给定的 $ q $ 和 $ u $ (因此 $ \beta $ 是固定的),我们需要对所有的 listing 进行位置无关的排序。则 $ \text{dnn}_\theta(Q,U,l,0) $ 的排序等价于 $ \text{rel}_{\theta}(Q,U,l,0) $ 的排序。

  4. Position Dropout:在 position based 模型的假设下,增加position 作为控制变量有效地消除了listing 排序中的位置偏差预测,但是它引入了一个新的问题:相关性预测现在依赖于位置特征position feature 。这使得 DNN 在训练期间依赖位置特征来预测相关性,但是在评分期间无法利用学到的、位置相关的知识(因为评分期间位置特征总是为零)。

    将具有位置特征的 DNN 和没有位置特征的baseline 进行比较,我们可以看到离线 NDCG 下降了大约 -1.3% 。因此,直接将位置作为控制变量引入模型似乎会损害相关性预测。为了减少相关性预测对于位置特征的依赖项,我们使用 dropout 对其进行正则化。在训练期间,我们随机性地将listingposition 设为0,这个概率由 dropout rate 来控制。

    dropout rate 在无噪声noise-free 地访问位置特征从而准确地推断位置偏差 vs 有噪声noisy地访问位置特征从而远离相关性预测之间进行tradeoff。我们尝试通过以下步骤找到平衡的 tradeoff

    • 扫描一个范围内的 dropout rate ,并在测试集上计算两种 NDCG

      • 第一个是在测试期间将position 为零,这衡量了相关性预测并表示为 $ \text{NDCG}_{\text{rel}} $ 。
      • 第二个通过保留位置特征来衡量相关性和位置偏差组合在一起的预测,记作 $ \text{NDCG}_{\text{rel+pbias}} $ 。
    • $ \text{NDCG}_{\text{rel+pbias}} - \text{NDCG}_{\text{rel }} $ 从而获得位置偏差预测。这里的直觉是:通过比较有位置输入和没有位置输入的排序质量,我们可以估计位置对于排序的贡献。

      我们得到了 $ \text{NDCG}_{\text{rel}} $ 针对位置偏差预测的曲线,如下图所示。Y 轴为 $ \text{NDCG}_{\text{rel}} $ ,X 轴为位置偏差预测。

    • 为了在相关性预测和位置偏差预测之间取得平衡,我们在曲线上选择一个点,该点在 X 轴上的位置偏差预测足够先进advanced,而且不会导致Y 轴上的相关性预测下降太多。

    通过这个练习exercise,我们最终选择了 0.15dropout rate

  5. 测试结果:我们通过在线 A/B test 测试了这个想法,其中:对照组是没有位置偏差的 DNN;实验组是相同的 DNN,但是使用位置作为特征进行训练,并以 0.15dropout rate 进行正则化。在在线测试中,我们观察到预订量增加了 0.7%

    除了预订量增加之外,收入增长 1.8% 也是一个惊喜。收入增长这个副作用说明了位置偏差是如何在模型的多次迭代中累计起来的。

    对于排序模型来说,了解价格的影响相对容易,因为价格是一个非常清晰的特征,并且数据强烈表明人们更喜欢较低的价格。质量quality、地域location 等平衡力量balancing forces 更难学习。因此,最初的简单模型严重依赖较低的价格。

    经过多次模型迭代,我们提高了对质量和地域的理解,但那时对更便宜的价格的bias 已经在训练数据中根深蒂固。这种黏性使得接下来的模型高估了对较低价格的偏好。消除positional bias使得模型更接近客人的真实偏好,并在价格、质量、地域之间取得更好的平衡。观察到的收入增长是其直接后果。

    最后,我们观察到精品酒店的预订量增加了 1.1%

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文