本文是一篇偏实践的文章,不讲太多虚的,什么有效什么无效,您请细品!
将深度学习应用于搜索排名是Airbnb最具影响力的产品改进之一。但在推出深度学习模式之后,接下来会发生什么呢?在本文中,我们描述了超越的历程,讨论了我们所说的改进搜索的ABC:
对于体系结构,我们描述了一个新的ranking神经网络,重点放在我们现有的DNN超越完全连接的两层网络的过程。在处理ranking中的位置偏差时,我们描述了一种新的方法,这种方法导致了DNN在处理库存方面最显著的改进,而DNN在历史上发现这种改进具有挑战性。为了解决冷启动,我们描述了我们对这个问题的看法,以及我们为改善平台上new listing所做的改变。
我们希望向深度学习过渡的rangking团队将发现这是一个如何迭代DNNs的实际案例研究。
在实践过程中,我们发现:
这里的想法是首先量化一个用户问题。模型调整是在用户问题之后进行的。
沿着这些思路,我们观察到,之前描述的一系列成功的排名模型发布不仅与预订量的增加有关,而且与搜索结果的平均价格的降低有关。这表明模型迭代更接近客人的价格偏好,这低于之前模型的估计。我们怀疑,即使在连续降价之后,这款模型的价格选择与客人的喜好之间也可能存在差距。为了量化这一差距,我们研究了客人看到的搜索结果的中间价和客人预订的物品价格之间的差异分布。差价是在取了价格的后计算出来的,因为价格服从对数正态分布。图1描绘了差异是如何分布的。
我们的预期是预订价格将对称分布在搜索结果的中间价周围,并且类似于以零为中心的正态分布。相反,它的负面影响很大,表明客人倾向于低价。这给了我们一个具体的用户问题来调查:
考虑到两个普通房源与其他房源相同,我们的直觉理解是,客人更喜欢经济实惠的房源。我们的排名模型真的明白这个“便宜就是更好”的原则吗?我们不完全确定。
我们对模型如何解释上市价格缺乏清晰的解释,是因为它是一个DNN。常见的工具,如在logistic回归模型中检查相应的权重或绘制GBDT模型的部分依赖图,在DNN环境中不再有效。为了使得价格更加具有解释性,我们使用下面的方案:
这个−tanh()项允许我们通过提高价格来单调地降低产出分数,从而实现更便宜更好。易于解释的w和参数b使我们能够描绘出价格的确切影响。对于参数的学习值,w=0.33和b=−0.9。
线上的A/B实验,相较于两层隐藏层的DNN,搜索结果的平均价格下降了5.7%,与离线分析结果一致。但由于预订量下降了1.5%,价格的可解释性付出了沉重的代价。我们的假设是,价格与其他特征有很大的相互作用。将价格与模型分离会导致欠拟合。这一假设得到了训练和测试的NDCG都下降的事实的支持。
为了保留模型中更便宜更好的直觉,同时允许价格与其他特性交互,我们开始研究DNN体系结构。
我们构建了如上图所示的体系结构,除了TensorflowTM中本机存在的那些节点之外,它不依赖于任何专门的计算节点。我们讨论了该体系结构的逐步构造,确保从输入价格节点到最终输出的所有路径对价格是单调的:
线上的结果非常相似,导致预订量下降了1.6%。该体系结构要求模型输出在任何情况下都是单调递减的w.r.t价格。这种结构的失败认为价格的单调性是一个过于严格的约束。
虽然第2.3节中描述的体系结构揭示了DNNs在支持模型约束方面的多功能性,但它也教会了我们DNNs的另一个特点:它们的行为就像团队中的另一位明星工程师。
考虑到一个问题,他们通常会想出一个合理的解决方案。但是强迫朝某个方向走,灾难很快就会接踵而至。所以在下一次迭代中,我们决定通过设置上下文而不是控制来管理DNN。我们没有强制要求模型输出相对于价格是单调的,而是添加了一个软提示,即越便宜越好。通常,每个训练示例都包含一对列表,一个已预订,另一个未预订。将DNN应用于这两个列表的特征会生成相应的logit,损失的定义如下图所示。
为了添加price提示,我们为每个训练示例引入了第二个标签,指示成对中哪个列表的价格较低,哪个列表的价格较高。然后按表2所示修改损失。alpha-hyperparameter提供了一种方法来控制结果是按相关性排序还是按价格排序。
为了解决价格的提示,我们引入每个训练样本的第二个label,表示两个列表中哪个列表的价格较低,哪个列表的价格较高。然后按下面的方式修改损失。alpha-hyperparameter提供了一种方法来控制结果是按相关性排序还是按价格排序
为了测试该想法,我们依据最小值调整alpha参数,在线下的测试中,我们可以得到和Baseline一样的NDCG,这允许我们再不伤害相关性的情况下push “越便宜越好”的想法,在线上的A\B测试中,我们发现价格有平均3.3%的下降,在booking上又0.67%的下降。在在线测试中,将新训练的模型应用于整个库存,揭示了将价格损失作为训练目标一部分的真实成本。
降价实验带来的灾难让我们处于一种自相矛盾的状态:搜索结果中的挂牌价格似乎高于客人喜欢的价格,但压低价格却让客人不高兴。为了理解新模型的不足之处,有必要比较基准模型是如何利用价格特征的,但这被完全连接的DNN缺乏可解释性所掩盖。如前所述,像部分依赖plots这样的概念是没有用的,因为它们依赖于给定特征对模型影响的假设与其他特征无关。在DNNs的情况下,这根本不是真的。试图描绘价格的部分依赖产生了平缓倾斜的直线,这表明DNN对价格有一些轻微的线性依赖,这与我们所知道的一切都是矛盾的.
为了取得进展,我们缩小了DNN的可解释性问题。我们没有试图对价格如何影响DNN做一般性的陈述,而是专注于一次解释一个搜索结果。借用单个条件期望(ICE)plots的思想,我们从单个搜索结果中获取列表,在保持所有其他特征不变的情况下横扫价格范围,并构建模型得分图。示例图如图所示。这些图表明,模型已经了解到的完全连接的双层DNN更便宜。
对从日志中随机选择的搜索集合重复ICE分析进一步加强了这一结论。由于试图进一步压低价格,失败的体系结构在质量上正在妥协。
暴政这就产生了一个假设,即图1后面的DNN正遭受着大多数人的暴政,集中在价格和质量的权衡上,这些权衡是针对占主导地位的最受欢迎的地点调整的。将这些折衷推广到尾部查询效果不佳,而且模型无法适应局部条件.于是我们采用双塔结构。
对应的代码如下:
我们再看价格的ICE图,我们发现一个明显的改变,而不是地块总是向下倾斜,价格强调一个更便宜的是更好的解释,我们看到分数峰值在某些价格的周围,如上图所示。这更接近“right price for the trip”的正确解释。
在这种情况下,一个经常被提出的问题是,低质量的上市公司是否可以仅仅通过确定一个价格就获得新模式的排名。仔细观察ICE曲线发现,某些价格附近的得分峰值只出现在高质量的上市公司,而这些上市公司通常一开始就排名靠前。对于大多数普通房源,该地块的价格仍然保持着单调递减的曲线。
正确价格和理想清单的概念是围绕query tower生成的向量展开的,因此接下来自然要研究这些向量到底是什么样子的。为了进行分析,我们在随机的搜索样本上运行了双塔DNN,并收集了查询塔的输出向量。由于100-d矢量不是人类可解释的,我们应用t-SNE将其简化为2-d矢量,如下图所示。
令人欣慰的是,在类似的参数值(如客流量和行程长度)周围形成了大型集群。在大的城市群中,直觉上相似的城市被放置在相对较近的地方。
在旅游领域的机器学习应用中,任何时候都有很大一部分用户是新用户,或者是在很长一段时间后才使用产品的。出于所有实际目的,用户处于持续冷启动状态,处理用户级冷启动是核心排名公式本身的一部分。因此,当提到冷启动问题时,我们将注意力集中在项目级别的冷启动(即,如何处理排名中的新列表)。正如在第2.1节中对DNN架构的改进一样,我们的探索的出发点不是文献调查,而是对用户问题的观察。
排名策略可以通过利用对当前库存的了解,在短期内专门优化预订,并且只押注那些有可靠业绩记录的上市公司。但为了市场的长期成功,它需要付出一些成本来探索新的库存。这种折衷可以实现为一个显式的排名提升为新的上市公司,分配更高的排名比什么是由DNN决定。这样一来,新房源就可以以较低的预订成本收集客人的反馈。提升可以进一步细化,通过印象计数或引入时间衰减来封顶。我们的第一次迭代就是测试这样一个增强。通过在线A/B测试,我们将新上市排名提升调整为预订中性,而不是没有提升,同时将8.5%的额外首页曝光分配给新的listings。
在explore和exoloit的机制下存在许多的挑战:
为了使系统更易于管理,我们退了一步问:**什么使新的listings不同?**答案是,当然,没有用户生成的参与功能,如预订数量,点击,评论等。其他属性,如价格,位置,便利设施是众所周知的一样,其余的上市。从理论上讲,如果我们有一个oracle来预测一个100%准确的新上市公司的接洽特征,它可以最佳地解决冷启动问题。
与其将cold-start作为一个探索利用的tradeoff,我们将其重新构建为一个参与度预估的问题,重新定义这个问题可以解锁一些重要的东西:它允许我们将这个问题定义一个理想的目标,并不断地朝着这个目标努力。为了解决冷启动问题,我们引入了一个新的组件,该组件为DNN提供了一个新的列表,在训练和评分时预测了用户参与特性:
为了评估estimator的准确性,我们按下面的步骤来做:
为了验证,我们比较了两种估计方法。基线是生产中使用的系统,它为缺少的特性(包括新列表的engament特性)指定默认值。默认值是通过手动分析相应功能而构建的常量。这一比较结果与一个评估器的结果相反,该估计器通过平均新listing附近listings的参与特征来预测参与特征。
为了提高准确性,它只考虑与新房源的客流量相匹配的相邻房源,并计算滑动时间窗口内的平均值,以考虑季节性。例如,要估算两人入住的新盘的预订数量,需要计算两人入住的新盘小半径内所有房源的平均预订数量。这在概念上类似于naivebayes推荐器,后者使用生成方法估计丢失的信息.
在离线分析中,与使用默认值相比,上述接合估计器将接合估计误差降低了42%。
在在线A/B实验中,我们观察到新创建的列表的预订量提高了14%,同时第一页结果的impression也增加了14%。除了对新房源的影响外,整体预订量增加了0.38%,表明用户体验整体改善。
我们调查position bias的出发点与此完全无关。与新上市公司净利润率较低的观察结果类似,另一个表现低于预期的细分市场是精品酒店和传统床和早餐,这一细分市场作为库存的一部分正在迅速增长。从观察中得出的一个假设是,由于位置偏差,在训练数据中历史上代表性不足的库存没有得到最佳排序。但与在new lisitings和冷启动之间的联系不同,没有强有力的理由相信位置偏差是本案的唯一罪魁祸首;还有其他多种假设。虽然我们发现关注用户问题比简单地从文献调查中导入想法要好得多,但这本身并不是万能的。在用户问题和模型中的缺陷之间建立因果关系远非易事。在当前场景中,我们是在黑暗中探索的。但在这期间,我们决定去寻找解释观察结果的模型中最大的差距。而文献调查对于确定我们的模型中潜在的主要差距是至关重要的。
给定用户u,该用户进行了问题的查询q,用户搜索的结果会被分为两大块:
我们将用户booking一个listing的概率表示为两个分解的概率的乘积:
虽然构建propensity model通常涉及干扰搜索结果以收集反事实的示例,但描述了在不进行额外干预的情况下构建propensity model的方法。
我们的解决方案有两个关键亮点。首先,它是非侵入性的,不需要对搜索结果进行任何随机化。我们依赖Airbnb搜索结果的一些独特属性,这些属性使得列表出现在不同的位置,即使它们在排名时的相应分数或多或少是不变的.
我们的解决方案的第二个亮点是,我们没有建立一个明确的倾向模型。相反,我们在DNN中引入位置作为一个特征,通过dropout进行正则化。在得分过程中,我们将位置特征设置为0。本节的其余部分描述了为什么这样做的直觉。
在基于基于position的模型假设之下,将位置作为一个控制变量有效的从listing ranking中降低了position bias,但是却引入了新的问题,相关性的预测是依赖于位置作为特征的,在预测的时候将其设置为0,我们发现加不加会有1.3%的影响,所以将position作为控制变量看起来会影响相关性的预测。
为了降低position特征的相关性依赖预测,我们使用dropout,在训练的时候,我们将listing设置为0,由dropout率来控制。dropout率在无噪声访问位置特征以准确推断位置偏差和使位置特征噪声化以使其远离相关预测之间进行折衷。我们试图通过以下步骤找到一个平衡点:
我们通过AB测试来评估我们的想法,我们评估了之前的模型以及加入了position bias的网络并在线进行测试,我们发现存在0.7%的gap;与此同时,我们得到了1.8%的收益的提升,这也表明了position bias的重大影响。
深度学习在Airbnb的搜索排名中继续蓬勃发展。我们由衷地感谢社区提供了深入的学习生态系统、开放的思想交流,以及通过分享我们自己的经验参与对话的机会。但我们旅程的亮点是意识到,要突破我们的DNNs的界限,灵感不会来自外部。为此,我们必须遵循用户的引导。