Airbnb基于深度学习的搜索算法优化实践

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在Airbnb搜索业务中,根据其业务特殊性,工程师们经过多次迭代尝试,深入挖掘DNN在搜索排序中的潜力,预定量和收入都得到了很大的提升。在论文"},{"type":"link","attrs":{"href":"https:\/\/arxiv.org\/pdf\/2002.05515.pdf","title":null,"type":null},"content":[{"type":"text","text":"《Improving Deep Learning For Airbnb Search》"}]},{"type":"text","text":"中,研究团队从DNN网络结构的搭建到解决冷启动问题、位置偏差问题等方面分享了非常宝贵的算法经验。我们将在本文对这项研究工作进行详细解读。"}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#000000","name":"user"}}],"text":"概览"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Airbnb是一个双边市场,它将拥有出租房子的房东和来自全球各地的潜在客人聚集在一起。Airbnb的搜索排名问题是根据客人的查询对住宿地点进行排名,这些查询通常包括位置、客人数量和入住\/退房日期。演进到深度学习是Airbnb搜索排名发展的一个重要里程碑。我们在[6]中对这段旅程的描述使我们与许多行业实践者进行了交谈,允许我们能够交流见解和评论。在这样的交流之后经常出现的一个问题是:下一步怎么办?我们试图在本文中回答这个问题。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"深度学习排名的推出引起了很多人的庆祝,不仅因为它带来了预订量的增长,还因为它给我们未来的路线图带来了变化。最初的看法是,通过Airbnb对深度学习的排名,我们可以接触到这个庞大的机器学习思想宝库,它似乎每天都在增长。我们可以简单地从论文研究中挑选出最好的点子,一个接一个地推出,从此过上幸福的生活。但事实证明,这是乐观情绪的顶峰。很快,我们熟悉的进入绝望谷的模式就出现了,在其他地方取得显著成功的技术在我们自己的应用中被证明是相当中性的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这将导致我们在第一次发布之后如何迭代深度学习的策略进行全面修订。在本文中,我们捕获了在[6]中描述的DNN发布之后的主要增强。除了深入研究核心机器学习技术本身,我们还关注导致突破的过程和推理。从现在的大局来看,我们更看重在dnn上迭代的经验教训,而不是任何单独的技术。我们希望那些专注于在行业环境中应用深度学习的人会发现我们的经验很有价值。我们先来看看我们改进DNN体系结构的努力。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"优化架构"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"什么是深度学习?好吧,添加更多的层。至少这是我们在回顾了开创当前深度学习时代的一系列进步之后的天真的解释。但当我们试图复制[14]中总结的缩放数据和添加层的好处时,我们只得到了中性的测试结果。试图解释为什么增加的层没有显示出任何好处,我们从文献中借用了更多的思想,比如应用残差学习[7]和批处理规范化[8]。不过,NDCG拒绝在离线测试中让步。我们从实验中得到的结论是,增加层数是卷积神经网络的一种有效技术,但不一定适用于所有的DNN。对于像我们这样完全连接的网络,两个隐藏层就足够了,模型容量不是我们的问题。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们假设,如果更深层次的网络不是适合我们的架构,那么更专业化的架构可能会更适合我们。因此,我们尝试了能够更明确地处理查询和列表之间交互的架构,比如deep&wide,其中查询房屋特征交叉被添加到宽部分。随后是[16]中基于注意力的网络变体。其目的是使从查询特征派生的隐藏层将注意力集中在从listing特征派生的隐藏层的某些部分上。对这些努力的简短总结是,他们也未能采取行动。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在尝试将成功的深度学习体系结构导入到产品应用程序中时,在翻译过程中经常会迷失的是,一个体系结构的成功与它的应用程序上下文密切相关。所报告的架构性能增益来自于解决与之比较的基线的某些缺点。由于深度学习普遍缺乏可解释性,因此很难准确推断新体系结构正在解决什么缺陷以及如何解决。因此,判断这些确切的缺点是否也困扰着这款产品,就成了一个猜测。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了提高成功的机会,我们放弃了{download paper→implement→A\/B test}这样的循环流程。相反,我们决定基于一个非常简单的原则来驱动这个过程:用户主导,模型跟随。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.1 用户主导,模式跟随"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这里的想法是首先量化用户问题。模型调整是在随后进行的,并且是针对用户的问题。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"沿着这些思路,我们首先观察到[6]中描述的一系列成功的排名模型发布不仅与预订量的增加有关,而且还与搜索结果的平均挂牌价格下降有关。这表明模型迭代越来越接近客人的价格偏好,这低于之前模型的估计。我们怀疑,即使在连续降价之后,这款车型的价格选择和客人的喜好之间也可能存在差距。为了量化这个差距,我们研究了顾客看到的搜索结果的中间价与顾客预订的物品价格之间的差异分布。由于价格服从对数正态分布,所以在计算价格对数后计算差额。图1描绘了差异是如何分布的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/48\/4815deeeab34a380e725597a266959ed.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们的预期是,预订价格将对称分布在搜索结果的中间价附近,并且类似于以零为中心的正态分布。相反,它的负面影响很大,表明客人倾向于降低价格。这给了我们一个需要调查的具体用户问题:价格较低、更接近客人偏好价格的房源是否需要排名靠前。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"考虑到两个其他东西都相同的普通房源,我们的直观理解是,客人更喜欢更经济的房源。我们的排名模型真的理解这个“便宜就是好”的原则吗?我们不能完全确定。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.2 强制使越便宜越好"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"模型是DNN,我们不清楚它是如何学习房屋价格的。熟悉的工具,如检查logistic回归模型中的相应权重或绘制GBDT模型的部分依赖图,在DNN模型上不再有效。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了使价格更具可解释性,我们采用了以下更改:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"1)删除了价格作为DNN的输入特征。我们将这个修正的DNN表示为DNN θ(u,q,l (no- price))。这里θ是DNN参数、u是用户特征、q是查询特征和l(no_price)房屋特征列表(价格除外)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"2)将模型的最终输出表示为:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/e9\/e9e7d1ef53b8137b336c7c9bbb331f1a.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"其中,使用反向传播来学习附加参数w和b,以及"}]},{"type":"image","attrs":{"src":"https:\/\/uploader.shimo.im\/f\/E9yy97wxhiLvH3VZ.png!original","alt":null,"title":null,"style":[{"key":"width","value":"50%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这里price是原始价格特征,price(median)是根据记录的房屋价格的中值计算出来的常数。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"术语−tanh()允许我们通过单调地降低相对于价格上涨的产出分数来实施“越便宜越好”。易于解释的w和b参数使我们能够描绘出价格的精确影响。对于参数的学习值,w=0.33和b=−0.9,图2显示了排名过程中遇到的典型P范围。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/5a\/5a749a317278ae42d8ffde24a89968c2.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"当在线测试时,作为针对[6]中两个隐藏层DNN的A\/B实验,搜索结果的平均价格下降了−5.7%,与离线分析相一致。但由于预订量下降了1.5%,价格的可解释性付出了沉重的代价。我们的假设是,价格与其他特征之间有很大的相互作用。将价格与模型隔离导致拟合不足。这一假设得到了训练和测试NDCG都下降的事实的支持。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.3 广义单调性"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了在模型中保留“便宜即是好”的直觉,但允许价格特征与其他特性交互,我们开始研究DNN体系结构,这些体系结构在某些输入方面是单调的。在[19]中描述的晶格网络(Lattice network)为这个问题提供了一个优雅的解决方案。但将整个系统转向晶格网络是一个巨大的挑战,我们寻求一种破坏性更小的机制。因此,我们构建了如图3所示的体系结构,除了Tensorflow中固有的那些节点之外,它不依赖任何专门的计算节点。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/f3\/f36c4ba43a7fe186bcc926dfe5f44cf4.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们讨论逐步构建体系结构的流程,确保从输入价格节点到最终输出的所有路径相对于价格都是单调的:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)我们将 −P 作为输入,DNN是对价格是单调递减的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)在输入层,我们不是用−P乘以权重,而是乘以权重的平方。由于−w2*P+b对于w和b的任何实值都是单调递减的,所以到第一隐层的输入对于价格总是单调地降低。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(3)对于隐藏层,我们使用tanh激活来保持单调性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(4)给定f0(x)和f1(x),x的两个单调递减函数w0^2*f0(x)+w1^2*f1(x)+b也是 x的单调递减函数,其中w0和w1可以是任意实数权重。我们在第二个隐藏层和输出层使用这个属性,其中所有的权重都是平方的。图3中的第二个隐藏层和输出层用粗体实线表示。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(5)添加一个子网,该子网既没有价格作为输入,也没有任何单调性约束,以允许其余特征之间的无约束交互。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"尽管比第2.2节中描述的架构更灵活,但在线测试的结果非常相似,导致预订量下降-1.6%。与它的前身一样,该体系结构强制要求模型输出在所有情况下对于价格都是单调地降低。这种架构的失败表明,价格方面的单调性是一个过于严格的约束。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.4 软单调性"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"虽然第2.3节描述的体系结构揭示了DNN在支持模型约束方面的多功能性,但它也教会了我们DNN的另一个特点:它们的行为就像团队中的另一位明星工程师。对于一个问题,任由他们自己解决,他们通常会想出一个合理的解决方案。但如果强迫他们往某个方向发展,灾难就会很快接踵而至。所以在下一次迭代中,我们决定通过设置上下文而不是控制来管理DNN。我们没有强制要求模型的输出与价格单调相关,而是添加了一个柔和的暗示,即越便宜越好。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"通常,每个训练示例都包含一对房屋,一个已预订,另一个未预订。将DNN应用于这两个房屋的特征将生成相应的logit,损失的定义如表1所示。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/6e\/6e30bb37c204c2f31c06e4c2aa0690f8.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了增加价格提示,我们为每个训练样本引入了第二个标签,指出两个示例中哪个房屋的价格更低,哪个价格较高。如表2,我们对loss进行了修改。alpha参数提供了一种方式来控制我们的结果是以相关性排序还是价格排序。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/89\/89a0ef8ef4cdd7c661af64541e493fc3.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了验证这一想法,我们将alpha超参数调整到最小值,以便在离线测试中得到与基线模型相同的NDCG。这使我们能够在不损害相关性的前提下,尽可能地推动“便宜即是更好”的直觉,至少在离线测量时是这样。在在线A\/B测试中,我们观察到搜索结果的平均价格下降了-3.3%。但预订量也下降了0.67%。离线分析的局限性在于,它只评估对日志中可用的最高结果进行重新排序。在在线测试中,将新训练的模型应用于整个库存,揭示了将价格损失作为训练目标的一部分的真实成本。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.5 添加一些ICE"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"降价实验带来的灾难让我们陷入了一种自相矛盾的状态:搜索结果中的房屋价格似乎高于客人的喜好,但压低价格却让客人不高兴。为了了解新模型的不足之处,有必要比较基准模型是如何利用价格特征的,但这被完全连接的DNN缺乏可解释性所掩盖。如前所述,部分依赖图这样的概念是没有用的,因为它们依赖于一个给定特征对模型的影响独立于其他特征的假设。在DNNs的情况下,这根本不是真的。试图画出价格的部分依赖关系会产生平缓倾斜的直线,这表明DNN对价格有一些轻微的线性依赖,这与我们所知道的一切都是矛盾的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了取得进展,我们缩小了DNN可解释性的问题。我们没有试图对价格如何影响DNN做一般性的陈述,而是专注于一次解释一个搜索结果。借鉴文献[5]中单个条件期望(ICE)图的思想,我们从单个搜索结果中提取房屋列表,在保持所有其他特征不变的情况下,扫描价格范围,并构建模型分数图。图4显示了一个示例图。这些图表明[6]中的完全连接的两层DNN学习了便宜是好的这一结果。对从日志中随机选择的一组搜索结果重复ICE分析进一步强化了这一结论。通过试图进一步压低价格,失败的架构在房屋质量上作出了妥协。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/fc\/fc558004446df2835f4877923865f420.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.6 双塔结构"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"回到图1,通过这个图,我们了解到了客人给我们传递的信息。但是,那些试图用相关性换取价格的体系结构错误地解释了这一信息。重新解释图1是合理的。重新解释必须符合价格,以及相关性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"图1的另一种解释出现在我们计算客人搜索结果的中间价和他们预订的价格之间的差额,并计算出按城市分组的平均值。正如预期的那样,各城市之间存在差异。但与主要城市相比,尾城的差异要大得多。尾城通常也位于发展中市场。图5显示了一些选定城市搜索结果的中间价与预订价之间的平均差。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这就产生了这样一种假设,即图1背后的DNN正遭受着大多数人的暴政,关注的是价格-质量的权衡,这些权衡是针对最受欢迎的预订地点而调整的。将这些折衷推广到尾部查询并没有起到很好的效果,而且模型无法适应当地的条件。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这一假说与另一项有关DNN的特征的观察结果吻合得很好。考虑到DNN是使用成对损失进行训练的,两个房屋列表中不同的特征似乎是影响最大的因素。查询特征,这个交叉对很常见,似乎没有什么影响,删除它们对NDCG的影响很小。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"新的想法是,该模型对“便宜即是好”有充分的理解,它所缺少的是旅行的正确价格的概念。理解这一概念需要更密切地关注诸如位置之类的查询特征,而不是纯粹基于房屋特征来区分。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这启发了下一次的架构修改,它由双塔组成,类似于[10]。第一个塔由查询和用户特征提供信息,生成一个100维向量,从概念上表示查询用户组合的理想列表。第二座塔根据所列特征构建了一个100维向量。两个向量之间的欧几里德距离被用来衡量给定房屋与查询用户的理想房屋之间的距离。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"训练样本包括成对的房屋列表:一个已预订,另一个未预订。损失函数的定义是,与已预定的房屋相比,未预定的房屋与理想情况的差距有多大。因此,对这两塔的训练使这两塔的预订房源更接近理想,同时也将未预订的房源推到了另一边。这与[12]中引入的triplet loss类似。这里的主要区别在于,我们没有训练三元组,而是只有成对的房源列表,三元组中丢失的锚定房源由查询用户塔自动学习。查询和房源塔的成对训练如图6所示。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/ec\/ecd06f12456c2ae0478e6ea9cf3c8f92.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"表3显示了该体系结构的抽象Tensorflow代码。实际实现略有不同,以优化训练速度。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/ee\/ee42e2af44add872cdddd5f97704c2d0.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.7 测试结果"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"当在A\/B实验中针对[6]中的完全连接的两层DNN进行在线测试时,双塔结构记录了+0.6%的预订收益。由于在线计算的NDCG提高了+0.7%,搜索的容易程度提高了。虽然双塔架构并不是为了降低价格,但我们发现搜索结果的平均价格下降了2.3%,这是相关性增强的副作用。预订量的增加抵消了价格下降对收入的影响,导致整体增长+0.75%。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"除了提高结果的质量,双塔结构还允许我们优化在线评分DNN的延迟时间。对于完全连接的体系结构,评估第一个隐藏层对评分延迟的贡献最大。计算第一隐藏层的计算复杂度可以表示为O(H∗(Q+L)),其中Q是独立于房源的查询和用户特征的数量,L是与房源相关的特征的数量,H是第一层的隐藏单元的数量。对于评估有N个房源的搜索结果集,总复杂度可以表示为O(N*H*(Q+L))。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在新架构中的两个塔中,查询塔独立于房源列表。这样就可以对整个搜索结果集精确地对该塔进行一次评分,并且只为每个房源评估与房源相关的塔。第一个隐藏层的计算复杂度降低到O(N*Hl*L+Hq*Q),其中Hl和Hq是房源和查询塔中隐藏单元的数量。当在线测试这一结果时,这导致第99百分位评分延迟降低了-33%。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.8 架构回顾"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"就在我们庆祝成功的同时,随着DNN迭代的启动,质疑也悄然出现。体系结构是否按预期工作,或者DNN无意中发现了其他东西?DNNs的不可穿透性使得在过去很难回答这样的疑问。但是考虑到双塔结构的直觉是针对用户问题开发的,我们现在可以利用这些直觉更好地了解DNN是如何工作的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"重新审视价格的ICE的绘图,我们看到了明显的变化。我们看到的不是那些总是随着价格向下倾斜的绘图,而是强调价格越便宜越好的解释,而是看到分数在某些价格附近达到峰值,如图7所示。这更接近旅行解释的正确价格。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/9c\/9c7825bd25beb53c9742ce9dd836b7ec.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在这种情况下,人们经常提出的一个问题是,低质量的房源是否可以通过设定一个价格来获得新模式的排名。对ICE曲线的仔细研究发现,某些价格附近的分数峰值只出现在高质量的房源身上,它们通常一开始就排名靠前。对于大多数普通房源,对价格的绘图仍保持单调下降曲线。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"合适的价格和理想房源的概念围绕着查询塔生成的向量,所以自然的后续工作就是研究这些向量到底是什么样子。为了进行分析,我们在随机抽样的搜索中运行了双塔DNN,并收集了查询塔的输出向量。由于100维向量无法被人类理解,我们应用t-SNE将其缩减为二维向量,如图8所示。与图5中的一些城市相对应的查询会标记在图上。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/d8\/d87dae706327babe37e7cff991f47845.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"令人欣慰的是,在类似的参数值(如客流量和行程)周围形成大型簇类。在大型簇中,直觉上感觉相似的城市彼此之间的距离相对较近。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"值得强调的是,聚类并不是简单的价格聚类。与查询相对应的预订房源的价格由点的颜色表示,我们可以看到聚类具有所有范围的颜色。虽然莫斯科通常比巴黎便宜,但莫斯科的预订价格很容易超过巴黎的预订价格,这取决于游客数量、停留时间、距离旅游景点的距离、周末与工作日以及其他一系列因素。价格与所有其他维度都有着千丝万缕的联系,掌握一次旅行的合适价格意味着要同时掌握所有其他因素。我们所做的分析都不能作为确凿的证据,证明双塔模型确实学习到了。但是,对价格的ICE图、查询塔输出的t-SNE可视化以及对各城市价格变动的额外分析的结合,给了我们足够的信心,使我们相信该机制正在按预期工作。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"暂且不谈一系列的架构操作,接下来我们将着手解决一个排名挑战,这个挑战不仅影响到客人,也影响了Airbnb社区的另一半,即主人。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"改善冷启动"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在旅行的机器学习应用程序中,任何时候都有很大一部分用户是新用户或在长时间间隔后使用产品。对于所有实际用途,用户都处于[2]所述的连续冷启动状态。处理用户级冷启动是核心排名公式本身的一部分。因此,当提到冷启动问题时,我们将注意力集中在项目级别的冷启动(即如何处理排名中的新房源)。正如在第2.1节中对DNN体系结构的改进一样,我们探索的起点不是文献调查,而是对用户问题的观察。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"使用NDCG来量化已预订房源在搜索结果中的位置一直是我们最可靠的模型性能指标。因此,调查用户问题的一个自然的地方就是寻找NDCG与整体NDCG相比较低的部分。将新平台中新登记的登记房源的NDCG划分出来,并将其与现有房源进行比较,我们发现差距为-6%。就上下文而言,我们观察到,与NDCG模型相比,在线预订的差异仅为0.7%,在统计学上存在显著差异。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这表明,这种模式使客人更加努力地去发现值得预订的新房源。为了更好地理解这一点,我们从DNN中删除了所有基于与客人的历史交互生成的输入特征,例如一个房源的过去预订数量。取消这些预定特征导致NDCG下降了−4.5%。显然,DNN在很大程度上依赖于预定特征。由于新房源与客人之间缺乏这些细粒度的特征,DNN被迫根据剩余的特征作出大致判断,以接近新房源的平均表现。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1 冷启动和Explore-Exploit方法"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"冷启动问题的一个可能框架是将其视为探索和利用之间的折衷。排名策略可以通过利用对当前库存的了解来优化短期内的预订,并且只对那些有着可靠业绩记录的房源下注。但为了市场的长期成功,它需要付出一些成本来探索新的库存。这种折衷可以作为一个显式的排名提升来实现,它为新房源分配比DNN所确定的更高的排名。这使得新的房源可以收集客人的反馈,而预订费用很低。通用方法在电子商务排名应用中已经很流行,例如在[15]中。这种提升可以进一步细化,通过展现计数来封顶,或者引入时间衰减。我们的第一次迭代是为了测试这种提升。通过在线A\/B测试,我们将新的房源排名提升调整为预订中性,而不是没有提升,同时为新房源分配+8.5%的额外首页展现机会。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"但是,在explore-exploit范式下运行带来了严峻的挑战:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)新的房源排名提升在不同的方向上受到两种对立力量的影响:1)由于搜索结果相关性降低,用户体验在短期内下降(我们可以准确衡量这种影响);2)长期来看,由于库存增加,用户体验有所改善(我们发现这种影响更为明显,难以量化)。由于缺乏对最佳提升量的明确和客观定义,导致了激烈的内部辩论,没有一个解决方案能让每一个感兴趣的团队都满意。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)甚至在对勘探成本进行任意组合后,预算的合理使用取决于特定地点的供求关系。当需求量大时,对勘探的容忍度很高,但当一个地方的需求量很少时,就没有那么大了。而且,在良好供应受到限制的地区,勘探和扩大库存的需求很高。当大量高质量的房源处于空置状态时,很少有动机去承担勘探成本。供应和需求反过来又取决于地理位置、季节性和客流量等参数。因此,为了最佳地利用全局勘探预算,需要数千个定位参数,这是一项人工无法完成的任务。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.2 估计未来用户参与度"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了让这个系统变得更容易管理,我们又采取了什么措施?当然,答案是缺乏用户生成的参与特征,如预订数量、点击量、评论等。其他属性,如价格、位置、便利设施等,与其他房源一样是众所周知的。从理论上讲,如果我们有一个神谕来预测一个新的房源的参与特征,它可以以最佳的方式解决冷启动问题。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"因此,我们没有将冷启动视为一种探索-利用权衡,而是将其重新定义为一个估计新房源的参与度值的问题。重新定义问题发现了一些重要的东西:它允许我们为问题定义一个客观的理想,并积极地朝着它努力。为了解决冷启动问题,我们引入了一个新的组件,它可以在训练和评分时预测新房源的用户参与特征。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了测量估计器的准确性,我们采用了以下步骤:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)从日志中获取O(100M)的搜索结果样本。对于每个搜索结果,从前100个位置随机抽取一个房源。这些房源样本充分受到客户的关注,因此他们的参与度特征可以充分覆盖。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)让R real表示从日志中获得的抽样房源的排名。我们将排名表示为实数,以表示房源的参与特征是真实客户交互的结果。根据排名,我们计算实际折扣排名为DR real=log(2.0)\/log(2.0+R real)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(3)接下来,对于每个抽样房源,我们移除所有的参与特征,并用测试集预估器预测的参与特征来替换它们。我们用预测的参与度特征对房源进行评分,在相应的日志搜索结果中找到它的新排名,然后从中计算折扣排名。我们用DR predicted表示。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(4)对于每个抽样房源,我们计算参与估计误差为(DR real−DR predicted)^2。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(5)为了得到总体误差,我们对所有抽样房源中的参与度估计误差取平均值。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"理想的参与度估计器将产生0误差。为了在两个估计量之间作出决定,可以选择误差较小的估计量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了验证,我们比较了两种估计方法。基线是生产中使用的系统,它为缺少的特征分配默认值,包括新房源的参与度特性。默认值是通过手动分析相应特征而构建的常量。这项比较是针对一个预估器,该预估器通过平均新房源地点附近房源的参与特征来预测参与特征。为了提高准确性,它只考虑与新房源的客流量相匹配的相邻房源,并计算滑动时间窗口内的平均值,以考虑季节性。例如,为了估计一个有两个客人容量的新房源的预订数量,它取的是能容纳两人新房源半径范围内所有房源的平均预订量。这在概念上类似于[11]中的朴素贝叶斯推荐,它使用生成方法来估计缺失的信息。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.3 测试结果"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在离线分析中,与使用默认值相比,上述参与度估算器减少了−42%的参与度估计误差。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在在线A\/B实验中,我们观察到新创建的的预订量提高了+14%,同时首页结果的浏览量增加了+14%。除了对新房源的影响外,整体预订量增加了0.38%,这表明用户体验总体上有所改善。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"从研究向DNN提供数据的挑战,我们过渡到围绕DNN如何解释呈现数据的问题,以及位置偏差的问题。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"消除位置偏差"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们调查位置偏差的出发点是完全不相关的。与新房源的NDCG较低的观察结果类似,另一个表现低于预期的细分市场是精品酒店和传统的床和早餐,作为库存的一部分,这一部分增长迅速。从观察中得出的一个假设是,由于位置偏差,在训练数据中历史上被低估的库存没有得到最佳排序。但与新房源业绩与冷启动之间的联系不同,没有强有力的理由相信位置偏差是这起案件的唯一罪魁祸首;还有其他多种假设。虽然我们发现关注用户问题比简单地从文献调查中导入想法要好得多,但这本身并不是万能药。在用户问题和模型中的缺陷之间建立因果关系远非易事。在当前的场景中,我们是在黑暗中拍摄。但在这一过程中,我们决定寻找能够解释观测结果的模型中最大的差距。文献调查对于确定我们模型中潜在的主要差距是至关重要的。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"4.1 相关工作"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"给定发出查询q的用户u,用户从搜索结果预订房源l的概率可以分解为两个因素:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)房源与用户。这个概率可以表示为P(relative=1 | l,u,q),表示房源、用户和查询的显式依赖关系。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)用户在搜索结果的k位置检查房源的概率。这可能取决于用户(例如,移动用户可能对最高结果有更高的偏好)或查询(例如,短期的用户可能更不关注底部结果)。我们将此概率表示为P(examined=1 | k,u,q),独立于房源l。房源对预订事件的影响完全由P(relevant=1 | l,u,q)来解释。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"利用文献[4]中描述的基于位置的模型的简化假设,我们将用户预订房源的概率表示为两个分解概率的乘积。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/60\/609fe4a6645bccd0af2c42a010c68f5f.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"通过直接训练一个预测预订量的模型,该模型学习预测依赖于P(examined=1 | k,u,q)的P(booking),而这又取决于前一个排名模型所决定的位置k。因此,当前模型将依赖于以前的模型。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"理想情况下,我们希望模型只关注P(relevant=1 | l,u,q)并仅根据相关性对列表进行排名。为此,介绍了一种包含两个关键概念的方法:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)预测P(examined=1 | k,u,q)的倾向模型。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)用预测倾向的倒数来衡量每个训练样本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"当构造倾向模型时,通常需要扰动搜索结果以收集反事实的例子,描述了在不需要额外干预的情况下构造倾向模型的方法。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"4.2 位置和控制变量"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们的解决方案有两个关键亮点。首先,它是非侵入性的,不需要对搜索结果进行任何随机化。我们依赖Airbnb搜索结果的一些独特属性,这些属性使得房源出现在不同的位置,即使它们在排名时的相应分数或多或少是不变的:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)房源表示在给定日期范围内只能预订一次的实体。当房源被预订并从搜索中消失时,它会改变其余房源的位置。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)每个房源都有自己独特的日历可用性,因此不同的房源会出现在不同的位置,以便跨日期范围进行类似的查询。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们解决方案的第二个亮点是我们没有建立一个明确的倾向模型。相反,我们在DNN中引入位置作为一个特征,通过dropout正则化。在评分过程中,我们将位置特征设置为0。本节的其余部分描述了为什么这是有效的直觉。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们以第2.6节中描述的DNN为基础,以查询、用户和房源特征作为输入。使用符号q(查询特性)、u(用户特性)、l(房源特性)、θ(DNN参数),我们将DNN的输出表示为:"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/6e\/6ecdc0bde45130616453093951d6b1eb.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"反映了[4]中基于位置模型的假设。在这里,relθ(q,u,l)估计P(relevance=1 | l,u,q),我们称之为相关性预测。pbiasθ(q,u,l)估计P(examination=1 | k,u,q),我们称之为位置偏差预测。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"很明显,pbiasθ(q,u,l)缺少房源k作为输入的位置,因为它试图估计的数量依赖于k。因此,我们的第一步是将k作为输入特征添加到DNN中。由于关联预测和位置偏差预测都是由DNN输入提供的,所以在输入中添加k将把DNN的表示转换为:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/c1\/c17f374e5bacc20002110cb88b558c97.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" 假设P(examined=1 | k,u,q)与l无关,位置偏差预测对l的任何依赖都可以被视为误差。我们假设在训练数据量足够大的情况下,学习的参数θ能够使误差最小化,并且位置偏差预测在所有实际应用中都与l无关。我们把这个假设理解为:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/91\/9197af744ca0d0e51906f7d47d10ab31.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"从pbias θ(q,u,l,k)中删除l。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在打分时,我们将位置特征k设置为0。在给定的搜索中,q和u在DNN评分的房源中是不变的。我们使用Q和U来表示特定搜索的查询和用户特征。因此,位置偏差预测变成pbiasθ(Q,U,0),这是特定搜索结果中所有房源的不变量。将不变量β命名为,评分时方程(5)可改写为:"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/af\/af5fcb1acc16d3d97f56338aa5b4ba45.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"这使得两个房源的分数比较不受位置偏差的影响,并且只依赖于房源的相关性。本质上,我们在排名模型中添加了位置作为控制变量[18]。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"4.3 位置Dropout"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在基于位置的模型假设下,加入位置作为控制变量可以有效地消除房源排名中的位置偏差预测,但这又带来了一个新的问题。关联预测现在依赖于位置作为特征。这就存在着DNN在训练过程中依赖位置特征来预测相关性的风险,但是在位置特征总是设置为0的情况下,无法利用这种学习来进行评分。将具有位置作为特征的DNN的NDCG与没有位置特征的基线相比,我们看到大约-1.3%的下降。因此,直接引入位置作为控制变量似乎会损害相关性预测。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"为了减少相关性预测对位置特征的依赖性,我们使用dropout将其正则化[13]。在训练期间,我们将房源的位置设置为0,由dropout率控制。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Dropout 率在无噪声访问位置特征以准确推断位置偏差与使位置特征具有噪声以使其远离相关性预测之间进行权衡。我们试图通过以下步骤找到平衡点:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(1)扫描dropout率的范围,并在一个测试集上计算NDCG的两个偏好。首先在测试期间将位置设置为0。它来测量相关性预测并且表示为NDCG rel。第二种方法通过保持位置特征来度量相关性和位置偏差预测,即NDCG(rel+pbias)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(2)减去NDCG(rel+pbias)−NDCG(rel)得到位置偏差预测的度量。这里的直觉是,通过比较有无位置输入的排名质量,我们可以估计出位置对排名的贡献。根据NDCG rel绘制它,以获得图9中的曲线。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/f0\/f04e641f4136cce6514d76c166cb8709.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"(3)为了在相关性预测和位置偏差预测之间取得平衡,在曲线上选择位置偏差预测在x轴上足够提前的点,而不会在y轴上引起太多的相关性预测下降。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"通过这个实验,我们最终选择了0.15的辍学率。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"4.4 测试结果"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我们通过一个在线A\/B测试来测试这个想法,其中控制是来自第2.6节的DNN,没有位置偏差的概念。讨论的是相同的DNN,但训练的特征是位置作为特征,dropout率为0.15。在在线测试中,我们发现预订量增加了0.7%。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在预订量增加的同时,收入增长了1.8%,这是一个令人惊喜的惊喜。收入的副作用说明了位置偏差是如何在模型的多次迭代中建立起来的。对于排名模型来说,相对容易了解价格的影响,因为它是一个非常干净的特征,而且数据强烈表明人们倾向于更低的价格。质量、位置等的平衡力更难学。因此,最初的简化模型严重依赖于较低的价格。经过多次模型迭代,我们提高了对质量和位置的理解,但到那时,对更便宜价格的偏见已经在训练中根深蒂固数据。这个粘性使得连续几个模型高估了低价的偏好。消除位置偏差可以使模型更接近客人的真实偏好,并在价格、质量和位置之间取得更优的平衡。由此带来的直接后果就是收入增长。最后,为了结束我们的起点,我们观察到精品酒店的预订量增加了+1.1%。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"结论"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"深度学习在Airbnb的搜索排名中继续蓬勃发展。我们由衷地感谢社区为我们提供了深入学习的生态系统、开放的思想交流以及通过分享我们自己的经验加入对话的机会。但我们旅程的亮点在于,我们意识到,要突破DNN的界限,灵感不会来自于某些外部来源。为此,我们必须听从用户的领导。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"论文原文链接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/arxiv.org\/pdf\/2002.05515.pdf","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/arxiv.org\/pdf\/2002.05515.pdf"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章