数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
十四、Improving Deep Learning For Airbnb Search [2020]
Airbnb
是一个双边市场,汇集了拥有出租房屋的房东hosts
、以及来自世界各地的潜在租客guests
。Airbnb
的search 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 架构优化
什么是深度学习?嗯,添加更多的
layer
。至少,在回顾了引领当前深度学习时代的一系列进展之后,这是我们朴素的解读。但是,当我们试图复制《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era》
中总结的scaling
数据和添加更多layer
的好处时,我们遇到的只是中性的测试结果。为了解释为什么增加
layer
没有显示任何收益,我们从文献中借用了更多的想法,例如应用残差学习residual learning
、batch normalization
等等。尽管如此,NDCG
在离线测试中仍然没有提升。我们从这些练习
exercise
中得出的结论是:增加layer
是convolutional neural networks: CNN
卷积神经网络中的有效技术,但是不一定适用于所有DNN
。对于像我们这样的全连接网络fully connected networks: FCN
,两个隐层就足够了,模型容量不是我们的问题。如果更深的网络不适合我们的架构,那么我么假设:更专业的网络可能适合我们的架构。因此,我们尝试了可以显式处理
query
和listing
之间交互的架构,例如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
。问题驱动,而不是模型驱动。
用户主导、模型跟随
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
是一个先验知识,因此希望模型能够学到这一先验知识。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
在训练集和测试集上都下降了,该事实支持这一假设。广义单调性
Generalized Monotonicity
:为了在模型中保留cheaper is better
的直觉,但是允许价格和其它特征相互作用,我们开始研究在某些输入特征方面是单调monotonic
的DNN
架构。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
中描述的架构一样,该架构强制模型在任何情况下的输出都是相对于价格单调递减的。这种架构的失败表明:价格的单调性是一个过于严格的约束。软单调性
Soft Monotonicity
:虽然前面描述的架构揭示了DNN
在支持模型约束方面的能力,但是它也教会了我们DNN
的另一个特点:它们的行为就像团队中的一位明星工程师star engineer
。给定一个问题,让他自己解决,他通常会想出一个合理的解决方案。但是强迫他往某个方向走,灾难很快就会随之而来。所以在我们的下一次迭代中,我们决定通过配置上下文
setting context
来管理DNN
,而不是通过控制control
来管理DNN
。我们没有强制要求模型的输出是价格的单调函数,而是添加了一个软提示soft hint
:cheaper 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_lossalpha
超参数提供了一种方法来控制:结果是按照相关性relevance
排序还是按照价格price
排序。将价格约束作为一种正则化,使得模型倾向于选择低价的
listing
。为了测试这个想法,我们将
alpha
超参数调整到最小值,这样在离线测试中,我们得到了和baseline
模型相同的NDCG
。这使得我们能够在不损害相关性的情况下尽可能地推动cheaper is better
的直觉,至少在离线指标上是这样的。在在线
A/B test
中,我们观察到搜索结果的平均价格下降了-3.3%
,但是预订量也下降了-0.67%
。离线分析的局限性在于:它仅对日志中可用的、
reranking
中的top
结果(因为这些日志是reranking
模块胜出的流量)进行评估。在在线测试期间,将新训练的模型应用于整个库存inventory
空间揭示了将价格损失作为训练目标的一部分的真实代价。离线评估样本分布和在线样本分布不同,因此即使离线
auc
相同的情况下,在线a/b test
表现也不相同。执行个体条件期望
Putting Some ICE
:降价实验带来的灾难让我们处于一种矛盾的状态:搜索结果中的listing
价格似乎高于房客偏好价格,但是压低价格却让房客不高兴。为了了解新模型的不足之处,有必要比较
baseline
模型是如何利用价格特征的,但是这被全连接DNN
缺乏可解释性所掩盖。如前所述,像部分依赖图partial dependence plots
这样的概念没有用,因为这种方式依赖于给定的特征对模型的影响独立于其它特征的假设。试图给出价格的部分依赖图会产生平缓倾斜sloping straight
的直线,这表明DNN
对价格有一些轻微的线性依赖,这与我们所知道的相矛盾。为了取得进展,我们缩小
scaled down
了DNN
可解释性的问题。我们没有试图对价格如何影响DNN
做一般性的陈述statement
,而是聚焦于一次解释单个搜索结果。借用《Peeking Inside the Black Box: Visualizing Statistical Learning With Plots of Individual Conditional Expectation》
中的个体条件期望individual conditional expectation:ICE
图plots
的想法,我们从单个搜索结果中获取listing
,在保持所有其它特征不变的情况下对价格选取一定的范围,并构建模型得分的plot
。下面给出了一个示例。图中
x
轴为价格、y
轴为模型预估的listing score
。每条曲线代表了单次搜索结果中的一个lising
(在多个价格上的score
)。因为单次搜索返回多个listing
结果,所以下图中有多条曲线。该图表明,
《Applying Deep Learning to Airbnb Search》
中的两层全连接层DNN
已经理解了cheaper was better
。对日志中随机选择的搜索集合重复ICE
分析进一步加强了这个结论。失败的架构通过试图进一步压低价格从而影响了模型质量。
双塔架构
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
维的向量。两个塔输出向量之间的欧氏距离用于衡量给定listing
和query-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
塔来自动学习。query
和listing
的pairwise 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- 第一个塔由
测试结果:当进行线上
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
排名更靠前因此有利于用户预订。除了提高搜索结果的质量之外,双塔架构还允许我们优化在线
DNN
的scoring
延迟。对于全连接架构,评估第一个隐层贡献了
scoring
延迟的最大部分。评估第一个隐层的计算复杂度可以表示为 $ O(H\times (Q+L)) $ ,其中 $ Q $ 是和listing
无关的query
和user
特征的数量, $ L $ 为listing
特征的数量, $ H $ 为第一层的隐单元数量。为了评估包含 $ N $ 个
listing
的结果集(该结果集对应于单个query
的搜索结果),总的算法复杂为 $ O(N\times H\times (Q+L)) $ 。在新架构的双塔中,
query
塔独立于listing
。这允许在整个搜索结果集针对该塔仅评分一次,并且仅评估每个listing
的listing dependent tower
。第一个隐层的计算复杂度降低到 $ O(N\times H_l\times L + H_q\times Q) $ ,其中 $ H_l $ 和 $ H_q $ 为listing
塔和query
塔的隐层神经元数量。当在线测试时,这导致
99th
百分位数的scoring
延迟降低了-33%
。
架构回顾:就在我们庆祝成功的时候,随着
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 冷启动改善
在旅游领域的机器学习
application
中,任何时候都有很大一部分用户是新用户,或者在很长一段时间后才使用该产品。此时用户处于连续冷启动状态continuous cold start
。处理
user level
冷启动是核心排序公式core ranking formulation
本身的一部分。所以在提到冷启动问题时,我们把注意力集中在item level
冷启动上(即如何处理新item
的排名)。和前面改进DNN
架构的情况一样,我们探索的起点不是文献综述,而是对用户问题user problem
的观察。使用
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
的平均表现。冷启动方法视为
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
范式带来了严峻的挑战:新
listing
的ranking boost
被两种相反的力量拉向不同的方向:- 由于搜索结果相关性
relevance
降低,短期内用户体验user experience
下降。我们可以准确地衡量这一影响(通过点击率或预订量)。 - 由于库存增加,长期来看用户体验有所改善。我们发现这种影响很难量化。
缺乏对最佳
boost
值的明确和客观的定义导致了激烈的内部辩论,没有一个解决方案让每个团队都满意。- 由于搜索结果相关性
即使能够确定探索
exploration
成本的总体预算,很明显,预算的正确使用取决于特定地域location
的供需supply and demand
情况。- 当需求量
demand
很大时,探索的容忍度就很高。当需求量很少时,探索的容忍度就没那么高。
即流量充裕的时候,适当的探索可以接受;但是流量稀缺的时候,探索代价较大。
在商品供给受到限制的区域,探索和扩大库存的需求很高。当大量优质
listing
空置时,几乎没有动力承担探索成本。即供给稀缺的时候,很有必要进行探索;但是供给充裕的时候,没动力进行探索。
供需反过来又受到位置
location
、季节性seasonality
、租客容量capacity
等参数的影响。因此,为了最优地使用全局探索预算,需要数千个局部参数localizing parameters
,这是一项无法手动完成的任务。- 当需求量
预估将来的用户互动
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}} $ 表示从日志中获取的抽样
$ DR_{\text{real}} = \frac{\log (2.0)}{\log(2.0 + R_{\text{real}})} $listing
的排名。我们将排名表示为real
,从而表示listing
的互动特征是真实租客互动的结果。从排名中,我们计算real discounted rank
为:为什么采用这种形式的
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
来估计缺失信息)。
测试结果:
- 在离线分析中,与使用默认值相比,上述互动估计器将互动估计误差降低了
-42%
。 - 在在线
A/B test
中,我们观察到新listing
的预订量提高了+14%
,同时新listing
的首页曝光量增加了+14%
。除了对新listing
的影响之外,整体预订量增加了+0.38%
,表明用户体验的整体改善。
- 在离线分析中,与使用默认值相比,上述互动估计器将互动估计误差降低了
14.3 Positional Bias
我们研究位置偏差
positional bias
的出发点是完全不相关unrelated
的。与新listing
的NDCG
较低的观察结果类似,另一个表现低于预期的细分市场是精品酒店boutique hotels
和传统住宿加早餐酒店traditional bed and breakfasts
。这个细分市场作为库存的一部分正在迅速增长。从观察中得出的一个假设是:由于位置偏差,在训练数据中未充分表达
under-represented
的库存没有得到最佳排名。但是和新listing
表现与冷启动之间的联系不同,没有充分理由相信位置偏差是这个case
的唯一罪魁祸首。还有多个其它假设。虽然我们发现关注用户问题
user problem
要比简单地从文献综述中引入想法要好得多,但是用户问题并不是万灵药。在用户问题和模型缺陷之间建立因果关系远远不是简单直接的。在目前的场景中,我们是在黑暗中射击shooting in the dark
。但是与此同时,我们决定寻找模型中的最大
gap
来解释观察结果。文献综述对于确定我们模型中潜在的主要gap
至关重要。相关工作:给定用户 $ u $ 发出的
query
$ q $ ,用户从搜索结果中预订listing
$ l $ 的概率可以分解为两个因素:listing
和用户相关relevant
的概率。这个概率可以表示为 $ P(\text{relevant} = 1\mid l,u,q) $ ,从而明确它和listing
、用户、query
的依赖关系。给定
listing
在搜索结果中的位置 $ k $ 的条件下,用户检查examined
该listing
的概率。这可能取决于用户(例如,移动设备上的用户可能对top
结果有更高的bias
)或query
(例如,提前期lead days
较短的用户可能不太关注底部结果)。我们将这个概率表示为 $ P(\text{examined}=1\mid k,u,q) $ ,它独立于
listing
$ l $ 。即,用户看到这个
listing
的概率,它和设备相关(如,PC
端还是手机端,以及手机型号)、和用户紧迫程度有关(如,是今天就想入住,还是三个月之后入住)。
使用
$ P_{\text{booking}} = P(\text{relevant} = 1\mid l,u,q)\times P(\text{examined}=1\mid k,u,q) $《Click Models for Web Search》
中描述的position based
模型的简化建设,我们将用户预订listing
的概率简单地表示为两个分解概率的乘积:通过直接训练一个模型来预测预订,该模型学会预测了依赖于 $ P(\text{examined}=1\mid k,u,q) $ 的 $ P_{\text{booking}} $ 。这反过来又取决于位置 $ k $ ,这是先前
previous
的ranking
模型做出的决定。因此,当前的模型变得依赖于先前的模型(指的是模型的前一个版本)。理想情况下,我们希望模型专注于 $ P(\text{relevant} = 1\mid l,u,q) $ ,并仅按照相关性
relevance
对listing
进行排序。为了实现这一点,《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》
描述了在没有额外干扰的情况下构建倾向模型的方法。位置作为控制变量
Position As Control Variable
:我们的解决方案有两个关键亮点。首先,它是非侵入式
non-intrusive
的,不需要对搜索结果进行任何随机化。我们依赖
Airbnb
搜索结果的一些独特属性,这些属性使得listing
即使在排序分不变的情况下也可能出现在不同的位置:listing
代表给定日期范围内只能预订一次的物理实体physical entities
。随着listing
被预订并从搜索结果中消失,这会改变剩余listing
的position
。在
Airbnb
中,每个item
的库存只有一个,这和电商(每个item
库存很多个)、新闻(每个item
库存无限)不同。每个
listing
都有自己独特的日历可用性unique calendar availability
,因此对于跨日期范围的相似query
,不同的listing
会出现在不同的position
。
其次,我们没有明确建立一个倾向模型。相反,我们在
DNN
中引入位置position
作为特征,并通过dropout
进行正则化。在评分过程中,我们将position
特征设置为零。
接下来我们描述为什么这种方法有效的直觉
$ \text{dnn}_\theta(q,u,l) = \text{rel}_{\theta}(q,u,l)\times \text{pbias}_\theta(q,u,l) $intuition
。我们以前面描述的DNN
为基础,将query
特征、用户特征、listing
特征作为输入。利用符号 $ q $ (query
特征)、 $ u $ (用户特征)、 $ l $ (listing
特征)、 $ \theta $ (DNN
参数),我们将DNN
的输出表示为:这反映了
《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) $ 缺少
$ \text{dnn}_\theta(q,u,l,k) = \text{rel}_{\theta}(q,u,l,k)\times \text{pbias}_\theta(q,u,l,k) $listing
的位置 $ k $ 作为输入,而它试图估计的量依赖于 $ k $ 。因此,我们的第一步是将 $ k $ 作为输入特征添加到DNN
。因为相关性预测和位置偏差预测都是由DNN
的输入馈送fed
的,因此向输入中添加 $ k $ 会将我们的DNN
变为:假设 $ P(\text{examined}=1\mid k,u,q) $ 独立于
$ \text{dnn}_\theta(q,u,l,k) = \text{rel}_{\theta}(q,u,l,k)\times \text{pbias}_\theta(q,u,k) $listing
$ l $ ,位置偏差预测对 $ l $ 的任何依赖性dependence
都可以被视为误差error
。我们假设有足够数量的训练数据,待学习的参数 $ \theta $ 能够最小化该误差。我们将这个假设理解为:其中从 $ \text{pbias}_\theta(q,u,l,k) $ 中移除 $ l $ 。
评分时,我们将位置特征 $ k $ 设置为零。在给定的
$ \text{dnn}_\theta(Q,U,l,0) = \text{rel}_{\theta}(Q,U,l,0)\times \beta $query
中, $ q $ 和 $ u $ 在DNN
评分的listing
中是不变的。我们使用 $ Q $ 和 $ U $ 来表示给定搜索的query
特征和用户特征。因此,位置偏差预测变为 $ \text{pbias}_\theta(Q,U,0) $ ,它是对给定搜索结果中所有listing
不变invariant
的,我们将其记作 $ \beta $ 。那么DNN
的评分变为:这使得两个
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) $ 的排序。Position Dropout
:在position based
模型的假设下,增加position
作为控制变量有效地消除了listing
排序中的位置偏差预测,但是它引入了一个新的问题:相关性预测现在依赖于位置特征position feature
。这使得DNN
在训练期间依赖位置特征来预测相关性,但是在评分期间无法利用学到的、位置相关的知识(因为评分期间位置特征总是为零)。将具有位置特征的
DNN
和没有位置特征的baseline
进行比较,我们可以看到离线NDCG
下降了大约-1.3%
。因此,直接将位置作为控制变量引入模型似乎会损害相关性预测。为了减少相关性预测对于位置特征的依赖项,我们使用dropout
对其进行正则化。在训练期间,我们随机性地将listing
的position
设为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.15
的dropout rate
。测试结果:我们通过在线
A/B test
测试了这个想法,其中:对照组是没有位置偏差的DNN
;实验组是相同的DNN
,但是使用位置作为特征进行训练,并以0.15
的dropout rate
进行正则化。在在线测试中,我们观察到预订量增加了0.7%
。除了预订量增加之外,收入增长
1.8%
也是一个惊喜。收入增长这个副作用说明了位置偏差是如何在模型的多次迭代中累计起来的。对于排序模型来说,了解价格的影响相对容易,因为价格是一个非常清晰的特征,并且数据强烈表明人们更喜欢较低的价格。质量
quality
、地域location
等平衡力量balancing forces
更难学习。因此,最初的简单模型严重依赖较低的价格。经过多次模型迭代,我们提高了对质量和地域的理解,但那时对更便宜的价格的
bias
已经在训练数据中根深蒂固。这种黏性使得接下来的模型高估了对较低价格的偏好。消除positional bias
使得模型更接近客人的真实偏好,并在价格、质量、地域之间取得更好的平衡。观察到的收入增长是其直接后果。最后,我们观察到精品酒店的预订量增加了
1.1%
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论