数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 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
- 并发
六、Airbnb Search Ranking [2018]
在过去的十年中,典型的基于传统信息检索的搜索体系架构中,已经看到机器学习在其各种组件中的出现越来越多。尤其是在搜索排序
Search Ranking
中,根据搜索的内容类型,搜索排序通常具有挑战性的目标。这种趋势背后的主要原因是可以收集和分析的搜索数据量的增加。大量收集的数据为使用机器学习根据历史搜索,从而为用户个性化搜索结果、并向用户推荐最近消费内容相似的内容提供了可能性。任何搜索算法的目标都可能因为当前平台的不同而有所不同,不存在一刀切
one-size-fits-all
的解决方案。尽管某些平台旨在提高网站的互动engagement
(如在搜索到的新闻文字上的点击click
、消费时间time spent
),而另一些平台则旨在最大化转化conversion
(如,购买搜索到的商品或者服务)。而在双边市场two-sided marketplace
的情况下,我们通常需要优化市场双方(即卖方seller
和买方buyer
)的搜索结果。双边市场已经成为很多现实世界应用
application
中可行的商业模式。特别是,我们已经从社交网络范式social network paradigm
转变为一个由两种不同类型的参与者participant
(分别代表供给和需求supply and demand
)组成的网络。对于Airbnb
而言,它是一个双边市场two-sided marketplace
,其中需要同时优化房东host
和租客guest
的偏好preference
。实际上,用户很少两次消费相同的item
,而一个listing
在某个日期只能接受一个租客(电商领域一个listing
表示一个商品详情页)。这意味着给定一个带有位置location
和行程日期trip date
的输入query
:- 对于位置
location
、价格price
、风格style
、评论review
等等对租客有吸引力的listing
,我们需要给该listing
一个比较高的排名ranking
。 - 与此同时,对于租客的行程持续时间
trip duration
和提前天数lead days
方面很好地匹配了房东偏好的listing
,我们需要给该listing
一个比较高的排名。 - 此外,我们需要检测可能因为差评
bad review
、宠物pet
、逗留时间、团体人数、或任何其它因素而可能拒绝租客的listing
,并将这些listing
的排名降低。
为了实现这一目标,论文
《Real-time Personalization using Embeddings for Search Ranking at Airbnb》
求助于使用Learning to Rank
。 具体而言,我们将问题形式化为pairwise regression
,其中正效用positive utility
用于预定booking
、负效用negative utility
用于拒绝rejection
。我们使用Lambda Rank
模型的修改版本对问题进行优化,该模型共同优化了市场双方的排名。由于租客通常会在预定之前进行多次搜索,即在他们的搜索
session
中点击多个listing
并联系多个房东。因此我们可以使用这些session
中的信号(即点击click
、房东联系host contact
等等)从而进行实时个性化Real-time Personalization
,目的是向租客展示更多的listing
。这些推荐的listing
相似于similar to
我们认为从搜索session
开始以来租客喜欢的那些listing
。与此同时,我们可以利用负向信号negative signal
(如用户跳过排名比较top
的listing
、反而选择了排名较bottom
的listing
)从而向租客少展示一些相似于similar to
我们认为租客不喜欢的listing
。为了能够计算租客互动的
listing
和待排序的候选listing
之间的相似性,我们提出使用list embedding
,一个从搜索session
中学到的低维向量representation
。我们利用这些相似性为我们的搜索排序模型Search Ranking Model
创建个性化特征,并为我们的相似listing
推荐Similar Listing Recommendation
提供支持。搜索排序Search Ranking
和Similar Listing Recommendation
这两个渠道在Airbnb
带来了99%
的转化conversion
。使用了即时
immediate
的用户行为(如点击)的实时个性化Real-time Personalization
可以作为短期用户兴趣short-term user interest
的代理信号proxy signal
。除此之外我们还引入了另一种类型的embedding
。这种embedding
通过预定booking
数据来训练,从而能够捕获用户的长期兴趣long-term interest
。由于旅游业务
travel business
的特性nature
,用户平均每年旅行1~2
次,因此预定是一个稀疏的信号,并且也是长尾long tail
的信号(大多数用户只有单次预定)。为了解决这个问题,我们提出在用户类型级别level of user type
、而不是在特定的user id
上训练embedding
。其中用户类型user type
是使用many-to-one
的、基于规则的映射来确定的类型。这些规则利用了已知的用户属性attribute
。同时,我们在于user type embedding
相同的向量空间中学习listing type embedding
。这使得我们能够计算正在进行搜索的用户的user type embedding
,和需要排序的候选listing
的list type embedding
之间的相似性。和之前发表的、互联网个性化
embedding
的工作相比,本文的创新之处在于:实时个性化
Real-time Personalization
:之前关于使用embedding
的个性化推荐和item
推荐的大多数工作都是通过离线创建user-item
和item-item
推荐表recommendation table
,然后在推荐时从它们中读取而部署到生产环境中的。我们实现了一种解决方案,其中用户最近交互
item
的embedding
以在线方式进行组合,以计算与待排序的item
的相似性。针对聚集搜索的适配训练
Adapting Training for Congregated Search
:和互联网搜索web search
不同,旅游平台travel platform
上的搜索通常是聚集的congregated
。用户通常仅在特定市场market
(例如巴黎)内进行搜索,而很少在不同的市场之间搜索。我们调整了
embedding
训练算法,以便在进行负采样时考虑到这一点,从而可以更好地捕获市场内within-market
的listing
的相似性。利用转化作为全局上下文
Leveraging Conversions as Global Context
:在我们的预定案例中,我们认识到以预定结束的click session
(即booked listing
)的重要性。在学习
listing embedding
时,我们将booked listing
视为全局上下文global context
。当滑动窗口在session
中移动时,始终会对booked listing
进行预测。用户类型
embedding
User Type Embeddings
:先前关于训练用户embedding
以捕获其长期兴趣的工作为每个用户训练了一个单独的embedding
。当目标信号target signal
稀疏时,没有足够的数据来训练每个用户的良好embedding representation
。更不用说为每个用户存储embedding
以执行在线计算将需要大量内存。因此,我们提出在每个用户类型级别上训练
embedding
,其中具有相同类型的用户组user group
将具有相同的embedding
。拒绝作为显式的负样本
Rejections as Explicit Negatives
:为了减少会导致拒绝rejection
的推荐,我们在训练过程中将房东拒绝host rejection
视为显式的负样本,从而在user type embedding
和listing type embedding
中编码房东偏好。
对于短期兴趣个性化
short-term interest personalization
,我们使用超过8
亿次搜索click session
来训练listing embedding
,从而获得了高质量的listing embedding representation
。我们对真实的搜索流量进行了广泛的离线和在线评估。结果表明:在排序模型中添加emebdding
特征可以显著提高预定booking
增益。除了搜索排序算法之外,listing embedding
还成功地测试并发布于相似listing
推荐similar listing recommendation
,其效果比现有算法的点击率click-through rate: CTR
高出20%
。对于长期兴趣个性化
long-term interest personalization
,我们使用5000
万用户的booked listing
序列来训练user type embedding
和listing type embedding
。user type embedding
和listing type embedding
都是在相同的向量空间中学习的,这样我们就可以计算出user type
和待排序listing
的listing type
之间的相似性。这个似性被用作搜索排序模型的附加特征,并且也成功进行了测试和发布。- 对于位置
相关工作:
在很多自然语言处理
Natural Language Processing:NLP
应用application
中,经典的、将单词表示为高维稀疏向量的语言建模方法已经被神经语言模型Neural Language model
所取代。神经语言模型通过使用神经网络来学习单词embedding
,即单词的低维representation
。这些神经网络是通过直接考虑单词顺序、以及单词之间的共现co-occurrence
来训练的,基于这样的假设:句子中经常一起出现的单词也共享更多的统计依赖性statistical dependence
。随着用于单词
representation learning
的高度可扩展的continuous bag-of-words:CBOW
语言模型和skip-gram:SG
语言模型的发展,embedding
模型已经被证明在大规模文本数据上训练之后,在许多传统语言任务language task
上获得了state-of-the-art
的性能。最近,
embedding
的概念已经从word representation
扩展到了NLP
领域之外的其它应用程序application
。来自互联网搜索Web Search
、电商E-commerce
、市场Marketplace
等领域的研究人员很快意识到:就像可以通过将句子中的单词序列视为上下文来训练word embedding
一样,也可以通过将用户行为序列视为上下文来训练用户行为的embedding
。这些用户行为包括用户点击或购买的item
、query
以及被点击的广告。从那以后,我们看到embedding
被用于互联网上的各种类型的推荐,包括音乐推荐music recommendation
、求职搜索job search
、应用推荐app recommendation
、电影推荐movie recommendation
等等。此外,已经表明:可以利用用户交互的
item
来直接学习用户embedding
,其中用户embedding
和item embedding
位于相同的向量空间。通过这种方式可以做出直接的user-item
推荐。对于冷启动推荐
cold-start recommendation
特别有用的另一种方法是:仍然使用文本embedding
,并利用item
和/或user
元数据(如标题、详情description
)来计算它们的embedding
。最后,已经为社交网络分析
Social Network analysis
提出了embedding
方法的类似扩展,其中图上的随机游走random walk
可用于学习图结构中定点的embedding
。
embedding
方法在学术界和工业界都产生了重大影响。最近的行业会议出版物和讨论表明,embedding
方法已经成功地部署在各大互联网公司的各种个性化、推荐和排序引擎中。
6.1 模型
下面我们介绍用于
Airbnb
上搜索的、针对listing recommendation
任务和listing ranking
任务提出的方法。我们描述了两种不同的方法,即:用于短期实时个性化
short-term real-time personalization
的listing embedding
,用于长期个性化long-term personalization
的user-type embedding & listing type embedding
。
6.1.1 Listing Embedding
假设给定一组从 $ N $ 个用户获得的 $ S $ 个
click session
的集合 $ \mathbb S $ ,其中每个session
$ \mathbf s=(l_1,\cdots,l_M)\in \mathbb S $ 定义为用户点击的 $ M $ 个listing id
的不间断序列uninterrupted sequence
。每当两次连续用户点击之间的时间间隔超过30
分钟时,我们认为就开始新的session
。给定这个数据集,我们的目标是学习每个
unique listing
$ l_i $ 的 $ d $ 维实值real-valued
的representation
$ \mathbf{\vec v}_{l_i}\in \mathbb R^{d} $ ,使得相似的listing
在embedding
空间中距离较近。更正式地说,该模型的目标是通过在整个
$ \mathcal L = \sum_{\mathbf s\in \mathbb S}\sum_{l_i\in \mathbf s}\left(\sum_{-m\le j\le m,j\ne 0}\log P(l_{i+j}\mid l_i)\right) $click session
集合 $ \mathbb S $ 上,通过最大化目标函数 $ \mathcal L $ 来使用skip-gram
模型从而学习listing representation
。即:其中概率 $ P(l_{i+j}\mid l_i) $ 表示从点击的
$ P(l_{i+j}\mid l_i)=\frac{\exp\left(\mathbf{\vec v}_{l_i}^\top \mathbf{\vec v}_{l_{i+j}}^\prime\right)}{\sum_{l=1}^{|\mathbb V|}\exp\left(\mathbf{\vec v}_{l_i}^\top \mathbf{\vec v}_{l}^\prime\right)} $listing
$ l_i $ 的上下文邻域中观察到listing
$ l_{i+j} $ 的概率,其定义为:其中:
- $ \mathbf{\vec v}_l $ 和 $ \mathbf{\vec v}_l^\prime $ 分别表示
listing
$ l $ 的input vector representation
和output vector representation
。 - 超参数 $ m $ 定义为点击
listing
的上下文窗口的长度。 - $ \mathbb V $ 是数据集中
unique listing id
组成的词汇表vocabulary
。
从上式可以看到:我们提出的方法对点击
listing
序列的时间上下文temporal context
进行建模,其中具有相似上下文的listing
(如,在click session
中具有相似的邻域listing
)将具有相似的representation
。这里的
listing embedding
没有考虑到listing
的属性信息,仅考虑了listing id
。- $ \mathbf{\vec v}_l $ 和 $ \mathbf{\vec v}_l^\prime $ 分别表示
计算上述目标函数的梯度 $ \nabla \mathcal L $ 所需的时间和词表大小 $ |\mathbb V| $ 成正比,这对于具有数百万个
listing id
的大规模词表是不可行的。作为替代方案,我们使用了负采样方法,该方法大大降低了计算复杂度。 负采样方法具体做法为:首先生成由点击
listing
$ l $ 和它的上下文 $ c $ (即,在长度为 $ m $ 的窗口内,同一个用户在点击listing
$ l $ 之前、之后点击的其它listing
)组成的正的pair
对 $ (l,c) $ 所构成的集合 $ \mathbb D_p $ 。然后生成由点击
listing
$ l $ 和整个词表 $ \mathbb V $ 中随机抽取的 $ k $ 个listing
组成的负的pair
对 $ (l,c) $ 所构成的集合 $ \mathbb D_n $ 。其中这里的 $ c $ 为负采样的listing
,而不是上下文listing
。最后,优化的目标函数为:
$ \arg\max_{\theta}\sum_{(l,c)\in \mathbb D_p} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_l^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(l,c)\in \mathbb D_n} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_l^\top \mathbf{\vec v}_{c}^\prime\right)} $其中 $ \theta $ 为模型参数。
然后我们通过随机梯度下降来最优化该目标函数。
预定的
listing
作为全局上下文Booked Listing as Global Context
:我们可以将click session
集合 $ \mathbb S $ 细分为:booked session
:即以用户预定了一个listing
作为结束的click session
。注意,这涉及到预定之后的点击如何处理。如果预定之后立即跟随一个点击(
30
分钟内),那么这个点击应该直接丢弃掉。exploratory session
:即不是以用户预定作为结束的click session
,用户仅仅只是在浏览。
从捕获上下文相似性的角度来看,这两者都是有用的。但是
$ \arg\max_\theta \sum_{(l,c)\in \mathbb D_p} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_l^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(l,c)\in \mathbb D_n} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_l^\top \mathbf{\vec v}_{c}^\prime\right)}\\ + \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_l^\top \mathbf{\vec v}_{l_b}^\prime\right)} $booked session
可以用于适配性adapt
优化,使得在每个step
中,我们不仅可以预测相邻的点击listing
,还可以预测最终的预定listing
。这种适配可以通过将预定的listing
添加为全局上下文来实现,这样无论它是否位于上下文窗口内,都将始终对其进行预测。因此,对于booked session
,embedding
更新规则调整为:其中:
- $ l_b $ 为预定
listing
, $ \mathbf{\vec v}_{l_b }^\prime $ 为预定listing
的output vector representation
。 - 对于
exploratory session
,因为没有预定listing
,因为它的目标函数没有最后一项。
下图显示了如何使用 $ m $ 的滑动窗口从
booked session
中使用skip-gram
模型来学习list embedding
。- 该窗口从第一次点击的
listing
滑动到预定的listing
(booked session
以预定作为结束)。 - 在每个
step
,正中central
的listing
的embedding
$ \mathbf{\vec v}_l $ 被更新,使得它预测来自 $ \mathbb D_p $ 的上下文listing
的embedding
$ \mathbf{\vec v}_c^\prime $ 、以及全局上下文预定listing
的embedding
$ \mathbf{\vec v}_{l_b}^\prime $ 。 - 随着窗口的滑动,一些
listing
进入或移出上下文集合,而预定的listing
始终作为全局上下文被保留(虚线)。
针对聚集搜索适配的训练
Adapting Training for Congregated Search
:在线旅游预定网站online travel booking site
的用户通常只在一个市场market
内搜索,即他们想去的地方。结果, $ \mathbb D_p $ 很可能仅包含来自同一个市场的listing
。另一方面,由于随机的负样本采样,因此 $ \mathbb D_n $ 很可能包含大多数不是位于相同市场的listing
, 这与 $ \mathbb D_p $ 不同。在每个
step
,对于给定的central listing
$ l $ ,正的上下文positive context
主要由与 $ l $ 相同市场中的listing
组成,而负的上下文negative contex
主要由与 $ l $ 不同市场中的listing
组成。我们发现这种不平衡会导致学到次优sub-optimal
的市场内within-market
相似性。为了解决这个问题,我们提出添加一组从central listing
相同市场内随机采样的负样本 $ \mathbb D_{m_n} $ 。此时目标函数为:
$ \arg\max_\theta \sum_{(l,c)\in \mathbb D_p} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_l^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(l,c)\in \mathbb D_n} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_l^\top \mathbf{\vec v}_{c}^\prime\right)}\\ + \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_l^\top \mathbf{\vec v}_{l_b}^\prime\right)} + \sum_{(l,c)\in \mathbb D_{m_n}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_l^\top \mathbf{\vec v}_{c}^\prime\right)} $这里是不是应该去掉 $ \mathbb D_n $ 比较好?感觉 $ \mathbb D_n $ 是
easy
负样本,因为是跨市场的,所以用户大概率对这些负样本不感兴趣。另外,这意味着非均匀的负采样:
hard
负样本vs
easy
负样本。listing embedding
的冷启动Cold start listing embeddings
:房东每天都会创建新的listing
,并在Airbnb
上发布。此时,这些listing
没有embedding
,因为它们没有出现在click session
$ \mathbb S $ 训练数据中。为了为新listing
创建embedding
,我们提出利用现有的listing embedding
。创建
listing
后,房东需要提供有关listing
的信息,例如位置location
、价格price
、listing type
等等。我们使用新listing
的元数据meta-data
来查找3
个具有embedding
的已有的listing
,其中已有的listing
需要满足以下条件:- 和新
listing
距离很近(距离半径在10
英里以内)。 - 和新
listing
具有相同的listing type
(如,Private Room
)。 - 和新
listing
具有相同的价格区间(如$20 ~ $25
一晚)。
接下来我们使用这
3
个识别到的embedding
的向量均值,从而作为新listing
的embedding
。使用这种技术,我们可以覆盖超过98%
的新listing
。基于
listing embedding
我们可以找到相似的listing pair
。反之,基于相似的listing embedding
我们也可以得到listing embedding
。- 和新
listing embedding
检查Examining Listing Embedding
:为了评估通过embedding
捕获了listing
的哪些特征,我们检查了在8
亿次click session
中训练的 $ d=32 $ 维embedding
。首先,通过对学习的
embedding
执行k-means
聚类,我们评估是否对地理位置相似性geographical similarity
进行了编码。下图展示了加利福利亚州的
100
个簇的结果,证明了来自相似位置similar location
的listing
是聚集在一起clustered together
的。我们发现这些簇对于重新评估re-evaluating
我们的旅游市场的定义非常有用。接下来,我们评估洛杉矶不同类型的
listing
之间的平均余弦相似度(表1
所示),以及不同不同价格范围的listing
之间的平均余弦相似度(表2
所示)。从这些表中可以看出:与不同类型、不同价格范围的
listing
之间的相似度相比,相同类型、相同价格范围的listing
之间的余弦相似度要高得多。因此,我们可以得出结论:这两个
listing
特性characteristics
在学到的embedding
中也得到了很好地编码。虽然有些
listing
特性(例如价格)不需要学习,因为它们可以从listing meta-data
中直接获取,但是其它类型的listing characteristics
(如结构architecture
、风格style
、体验feel
)则很难抽取为listing
特征。为了评估这些特性是否被
embedding
捕获,我们可以检查listing embedding
空间中不同architecture listing
的k
近邻k-nearest neighbor
。下图给出了这样的一个例子,其中对于左侧的
listing
,右侧给出了具有相同风格和结构的、最相似的listing
。为了能够在
listing embedding
空间中进行快速、简单的搜索,我们开发了一个内部的相似度探索工具Similarity Exploration Tool
,如下图所示。
6.1.2 User-type Embedding & Listing-type Embedding
前面介绍的
listing embedding
使用click session
来训练,并非常善于寻找同一市场的listing
之间的相似性。因此,它们适用于短期的short-term
、session
内的in-session
个性化,目的是在即时搜索会话immanent search session
期间向用户展示与他们点击的listing
相似的listing
。然而,除了
in-session
个性化(它基于同一session
内刚刚发生的信号)之外,根据用户的长期历史记录中的信号进行个性化搜索也会很有用。例如,假设某个用户当前正在搜索洛杉矶的listing
,并且历史上曾经发过纽约和伦敦的预定 ,那么推荐与先前预定listing
相似的listing
将很有用。点击个性化是短期的、基于点击的、单个市场的个性化,预定个性化是长期的、基于预定的、跨市场的个性化。
虽然一些跨市场
cross-market
相似性在使用点击训练的listing embedding
中被捕获,但是学习这种cross-market
相似性的更主要方式是给定用户的、随时间的预定listing
所构建的session
中学习。具体而言,假设给定从 $ N $ 个用户获得的
booking session
集合 $ \mathbb S_b $ ,其中每个booking session
$ \mathbf s_b=\left(l_{b_1},\cdots,l_{b_M}\right) $ 被定义为用户 $ j $ 按时间顺序的一个预定listing
序列。尝试使用这种类型的数据来学习每个
listing_id
的embedding
$ \mathbf v_{l_{id}} $ 在很多方面都具有挑战性:- 首先,
booking session
数据 $ \mathbb S_b $ 比click session
数据 $ \mathbb S $ 小得多,因为预定不是太频繁的事件。 - 其次,很多用户历史上仅预定了一个
listing
,而我们无法从长度为1
的session
中学习。 - 第三,要从上下文信息中为任何实体
entity
学习有意义的embedding
,数据中至少需要该实体出现5~10
次。而平台上的很多listing_id
被预定的次数少于5~10
次。 - 最后,用户的两个连续预定之间可能会间隔很长的时间。在此期间,用户的偏好(例如价格
price
)可能会发生变化,例如由于用户的职业发生变化。
为了在实践中解决这些非常常见的市场问题
marketplace problem
,我们建议在listing_type
级别、而不是listing_id
级别学习embedding
。给定某个
listing_id
可用的元数据meta_data
(例如位置location
、价格price
、listing
类型listing type
、容量capacity
、床位数number of beds
等 ),我们使用下表中定义的、基于规则的映射来确定其listing_type
(注:listing type
表示整租合租等固有属性,listing_type
是人工映射得到的)。例如,来自
US
的一个整租Entire Home
的listing
,它具有:2
个人的capacity
、1
张床、1
间卧室和1
间浴室、每晚平均价格为60.8$
、每位租客每晚平均价格为29.3$
、5
条评论、五星占比100%
、100%
的新客接受率New Guest Accept Rate
。因此这个
$ \text{listing_type} = US\_lt_1\_pn_3\_pg_3\_r_3\_5s_4\_c_2\_b_1\_bd_2\_bt_2\_nu_3 $listing
将被映射到 :buckets
以数据驱动的方式来确定,从而最大化每个listing_type bucket
的覆盖范围。从
listing_id
到listing_type
的映射是多对一manty-to-one
的映射,这意味着许多listing
将映射到相同的listing_type
。这里通过人工规则对
listing
进行了聚类:具有相同属性的listing
被划分到同一个簇cluster
,然后模型下一步学习cluster id
的embedding
。这里的规则由业务专家来指定,事关任务成败。- 首先,
为了解决用户随时间变化的偏好,我们提出在与
listing_type embedding
相同的向量空间中学习user_type embedding
。user_type
的确定方法与listing_type
类似,即通过利用下表中定义的、有关用户及其历史预定的元数据metadata
来确定。例如,对于来自旧金山的、使用
$ \text{user_type} =SF\_lg_1\_dt_1\_fp_1\_pp_1\_nb_1\_ppn_2\_ppg_3\_c_2\_nr_3\_l5s_3\_g5s_3 $MacBook
笔记本电脑的用户,他使用英文配置setting
、带有用户照片的完整资料、来自房东的平均83.4%
的租客五星好评级Guest 5 star rating
。用户历史进行了3
次预定,这些预定的平均统计数据为:52.52$
每晚、31.85$
每个租客每晚、2.33
容量capacity
、8.24
个评论、76.1%
的listing
五星好评Listing 5 star rating
。最终这个用户的user_type
为:在生成用于训练
embedding
的booking session
时,我们会计算user_type
直到最近一次预定。 对于正在进行首次预定的用户,user_type
是基于上表的前5
行计算的,因为在预定时我们没有关于历史预定的先验信息。这很方便,因为基于前5
行的user_type
学到的embedding
可以用于注销logged-out
用户、以及没有历史预定的新用户的冷启动个性化cold-start personalization
。同样地,这里也是通过人工规则对用户进行了聚类,这里的规则由业务专家来指定,事关任务成败。
训练过程
Training Procedure
:为了在同一个向量空间中学习user_type
和listing_type
的embedding
,我们将user_type
融合到booking session
中。具体而言,我们使用来自 $ N $ 个用户的 $ N_b $ 个
booking session
构成集合 $ \mathbb S_b $ ,其中每个session
$ \mathbf s_{b} = \left(u_{\text{type}_1}l_{\text{type}_1},\cdots, u_{\text{type}_M}l_{\text{type}_M}\right)\in \mathbb S_b $ 定义为booking event
(即(user_type, listing_type)
元组)按时间顺序的序列 。注意,每个
session
都是由同一个user_id
进行预定,但是对于同一个user_id
,其user_type
可能会随时间的推移而变化。这类似于同一个listing
的listing_type
也会随着时间的推移而变化,因为它们会收到更多的预定。目标函数类似于
listing embedding
的目标函数,其中需要更新的center item
不是listing
$ l $ ,而是user_type
$ u_t $ 或listing_type
$ l_t $ ,具体取决于滑动窗口中捕获的是哪一个。如果需要更新
$ \arg\max_{\theta} \sum_{(u_t,c)\in \mathbb D_{\text{book}}} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_{u_t}^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(u_t,c)\in \mathbb D_{\text{neg}}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_{u_t}^\top \mathbf{\vec v}_c^\prime\right)} $user_type
的center_item
$ u_t $ ,则我们优化以下目标函数:其中:
- $ \mathbb D_{\text{book}} $ 包含来自用户历史记录中、距离
center item
窗口内的user_type
和listing_type
,具体而言是关于center item
时间戳的最近过去near past
、最近将来near future
的用户预定 。 - $ \mathbb D_{\text{neg}} $ 包含作为负样本的随机采样的
user_type
或者listing_type
。
- $ \mathbb D_{\text{book}} $ 包含来自用户历史记录中、距离
类似的,如果
$ \arg\max_{\theta} \sum_{(l_t,c)\in \mathbb D_{\text{book}}} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_{l_t}^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(l_t,c)\in \mathbb D_{\text{neg}}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_{l_t}^\top \mathbf{\vec v}_c^\prime\right)} $central item
是listing_type
$ l_t $ ,则我们优化以下目标函数:
更新
user_type
和更新listing_type
有两点不同:a.
input/output representation
不同:更新user_type
时,user_type embedding
采用input representation
的格式,而listing_type embedding
采用output representation
的格式。更新listing_type
时,刚好相反。b. 负样本不同:更新
user_type
需要采样负的listing
,更新listing_type
需要采样负的user
。由于根据定义的
booking session
主要包含来自不同市场market
的listing
,因此没有必要从相同市场的预定listing
中额外负采样(就像Adapting Training for Congregated Search
那样) 。下图给出了这个模型的图形化表示,其中
central item
表示user_type
$ u_t $ ,并对其进行更新。针对拒绝
Rejection
的显式负样本Explicit Negatives for Rejections
:与只反映房客偏好的点击不同,预定也反映了房东的偏好,因为房东会以接受房客预定、或者拒绝房客预定的形式给出明确的反馈。房东拒绝的原因包括:房客的guest star rating
较差、房客资料不完整或者为空、房客资料中没有照片等。这些特性是user_type
定义的一部分。除了房客偏好信号之外,可以在训练期间利用房东拒绝
host rejection
来将房东的偏好信号编码到embedding
空间中。纳入拒绝信号的整体目的是:一些listing_type
对没有预定 、个人资料不完整、guest star rating
低于平均水平的user_type
不太敏感,我们希望这些listing_type
的embedding
和user_type
的embedding
在向量空间中更为紧密。这样,基于embedding
相似性的推荐除了最大化预定机会之外,还可以减少将来的拒绝future rejection
。我们通过下面的方式将拒绝的使用形式化为显式的负样本。除了集合 $ \mathbb D_{\text{book}} $ 和 $ \mathbb D_{\text{neg}} $ 之外,我们还生成了一个涉及拒绝事件
rejection event
的user_type
或者listing_type
的pair
对 $ (u_t,l_t) $ 组成的集合 $ \mathbb D_{\text{rej}} $ 。如下图所示,我们特别关注这样的情况:同一个用户在房东拒绝(以减号标记)之后,成功
booking
了另外一个listing
(以加号标记)。注意:我们仅仅把这类有
-
有+
的房东拒绝作为显式负样本。新的优化目标可以表述为:
在
$ \arg\max_{\theta} \sum_{(u_t,c)\in \mathbb D_{\text{book}}} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_{u_t}^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(u_t,c)\in \mathbb D_{\text{neg}}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_{u_t}^\top \mathbf{\vec v}_c^\prime\right)}\\ + \sum_{(u_t,l_t)\in \mathbb D_{\text{rej}}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_{u_t}^\top \mathbf{\vec v}_{l_t}^\prime\right)} $central item
为user_type
$ u_t $ 的情况下,优化目标为:在
$ \arg\max_{\theta} \sum_{(l_t,c)\in \mathbb D_{\text{book}}} \log \frac{1}{1+\exp\left(-\mathbf{\vec v}_{l_t}^\top \mathbf{\vec v}_c^\prime\right)}+\sum_{(l_t,c)\in \mathbb D_{\text{neg}}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_{l_t}^\top \mathbf{\vec v}_c^\prime\right)}\\ +\sum_{(l_t,u_t)\in \mathbb D_{\text{rej}}} \log \frac{1}{1+\exp\left(\mathbf{\vec v}_{l_t}^\top \mathbf{\vec v}_{u_t}^\prime\right)} $central item
为listing_type
$ l_t $ 的情况下,优化目标为:
给定所有
user_type
和listing_type
学到的embedding
,我们可以根据用户当前的user_type embedding
和候选listing
的listing_type embedding
之间的余弦相似度,向用户推荐最相关的listing
。例如,在下表中,我们展示了
user_type
为 $ SF\_lg_1\_dt_1\_f p_1\_pp_1\_nb_3\_ppn_5\_ppg_5\_c_4\_nr_3\_l5s_3\_g5s_3 $ 和美国的几种不同listing_type
之间的余弦相似性,其中这种类型的用户通常会预定高质量、宽敞、并且有很多好评的listing
。可以看到:- 最匹配这些用户偏好的
listing type
(即整租entire home
、很多好评、价格高于平均水平)具有较高的余弦相似性。 - 而不匹配这些用户偏好的
listing type
(即空间较小less space
、较低价格、较少评论)具有较低的余弦相似性。
- 最匹配这些用户偏好的
6.2 实验
这里我们首先介绍训练
Listing Embedding
以及其离线评估Offline Evaluation
的细节。然后,我们在
Listing Page
上显示了将Listing Embedding
用于相似Listing
推荐Similar Listing Recommendation
的在线实验结果Online Experiment Result
。最后,我们给出我们搜索排序模型
Search Ranking Model
的背景知识,并描述如何使用Listing Embedding
和Listing Type & User Type Embedding
来实现搜索中的实时个性化Real-time Personalization
特征。embedding
的两个应用(相似Listing
推荐、搜索排序)都已经成功地投入生产。
6.2.1 Training Listing Embedding
对于
listing embedding
的训练:- 我们从登录用户中获取所有的搜索,然后以
user id
为单位,将该用户点击的所有listing id
按时间顺序排序 。最终我们获得了8
亿次click session
。 - 随后,根据
30
分钟的不活跃规则(即,如果用户两个相邻点击间隔超过30
分钟,则我们认为这是两个session
),我们将一个较大的listing id
的序列拆分为多个序列。 - 接下来,我们删除了偶发的和短暂的点击,即用户在
listing
页停留不到30
秒的点击,并且仅保留由2
次或者更多次点击组成的session
。 - 最后,通过删除用户
id
列来匿名化session
。
如前所述,
click session
由探索session
(exploratory session
) 和booked session
组成。根据离线评估结果,我们在训练数据中对booked session
进行了5
倍的过采样,从而得到了表现最佳的listing embedding
。过采样等价于
booked session
的样本进行加权。- 我们从登录用户中获取所有的搜索,然后以
日常
Daily
训练的配置:我们学习了
450
万个Airbnb
的listing
的listing embedding
,并使用下面介绍的离线评估技术调整了我们的训练数据实用性practicality
和参数。我们的训练数据在几个月内以滑动窗口的方式天级更新,方法是处理最近一天的
search session
,并将它们添加到数据集中,并从数据集中丢弃最早一天的search session
。我们为每个
listing_id
训练embedding
,在训练之前随机初始化向量(每次使用相同的随机数种子)。我们发现,如果我们每天从头开始重新训练
listing embedding
,而不是在现有向量上增量地连续训练,我们会获得更好的离线性能。天级别的
day-to-day
向量差异不会在我们的模型中造成不一致discrepancy
,因为在我们的应用中,我们使用余弦相似性作为主要信号,而不是实际的向量本身。即使向量随着时间变化,余弦相似性度量的含义及其范围也不会改变。listing embedding
的维度设置为 $ d=32 $ ,因为我们发现:要在离线性能、以及为实时相似性计算目的而将向量存储在RAM
中所需内存之间进行tradeoff
。上下文窗口大小设置为 $ m=5 $ 。我们对训练数据执行了
10
轮迭代。为了实现算法的聚集搜索的修改
change
,我们修改了原始的word2vec
代码。训练使用了
MapReduce
,其中300
个mapper
读取数据,而单个reducer
以多线程方式训练模型。端到端的天级数据生成和训练
pipeline
是使用Airflow
(Airbnb
的开源调度平台) 来实现的。
6.2.2 Offline Evaluation of Listing Embeddings
为了能够对优化函数、训练数据构造、超参数等方面的不同想法做出快速决策,我们需要一种快速比较不同
embedding
的方法。评估训练好的
embedding
的一种方法是:根据用户最近的点击来预测embedding
在推荐用户想要预定的listing
方面有多好。更具体而言,假设我们得到了最近点击的listing
和需要排序的候选listing
,候选中包含用户最终的预定listing
。通过计算点击listing
和候选listing
的embedding
之间的余弦相似度,我们可以对候选listing
进行排序,并观察预定listing
的排序位置rank position
。出于评估的目的,我们的baseline
由Search Ranking model
(它是采用embedding
方案之前的线上模型,从而作为对比)给出的排名,如下图的Search Ranking
曲线所示。注:这里评估的是预订
listing
在所有候选listing
中的排序位置。如何生成候选listing
,论文并未给出。常见的做法是在全局listing
中随机负采样,也可以在同一市场内的listing
中随机负采样。下图我们展示了离线评估的结果。我们比较了 $ d=32 $ 的
embedding
的几个版本,看它们如何根据之前的点击来对预定listing
进行排序。预定listing
的排名是针对导致预定的每次点击进行平均的,从预定前的17
次点击到预定前的最后一次点击,较低的值意味着较高的排名、较小的点击意味着较长的点击序列(last
表示预定前的所有点击,16
表示仅使用最久远的那个点击)。我们比较的
embedding
版本为:d32
:使用原始负采样训练的embedding
。
d32 book
:在负采样中使用预定作为全局上下文来训练的embedding
。d32 book+neg
:在负采样中使用预定作为全局上下文、并在相同市场显式负采样来训练的embedding
。
可以看到:
- 由于使用记忆特征
memorization feature
,随着点击次数的增加Search Ranking
模型效果更好。 - 基于
embedding
相似性对listing
进行重排re-ranking
是很有用的,尤其是在搜索漏斗search funnel
的早期阶段early stage
。 d32 book + neg
优于其它两个embedding
版本。
最终这一类的实验结果图被用于做出关于超参数、数据构造等等的决策。
6.2.3 Similar Listings using Embeddings
每个
Aribnb
主页listing page
包含Similar Listing
轮播,该轮播会推荐相似的、且相同日期可用的listing
。在我们进行测试时,Similar Listing
轮播的现有算法是在给定listing
的相同location
调用主搜索排序模型main Search Ranking model
,然后根据可用性availability
、给定listing
的价格范围和listing type
来过滤。我们进行了
A/B test
,将现有的相似listing
算法和基于embedding
的解决方案进行了比较。在基于embedding
的解决方案中,相似listing
是通过在listing embedding
空间中找到k
个最近邻k-nearest neighbor
来生成的。给定学到的
listing embedding
,通过计算给定listing
$ l $ 与可用于同一日期(如果入住check-in
日期、退房check-out
日期已确定)的、同一市场内的所有listing
的向量 $ \mathbf{\vec v}_j $ 的余弦相似度,可以找到listing
$ l $ 的相似listing
。相似度最高的k
个listing
被检索为相似listing
。计算是在线执行的,并使用我们的分片架构sharded architecture
并行进行,其中部分embedding
存储在每台搜索机器search machine
上。A/B test
表明:基于embedding
的解决方案导致Similar Listing
轮播的点击率CTR
提高了21%
(如果listing page
输入了日期,则为23%
;如果未输入日期,则为20%
)。并且在Similar Listing
轮播中找到他们最终预定的listing
的租客增加了4.9%
。根据这些结果,我们将基于
embedding
的Similar Listing
部署到生产环境中。
6.2.4 Real time personalization in Search Ranking using Embeddings
背景:为了正式描述我们的搜索排序模型
Search Ranking Model
,这里介绍下背景。假设我们获得了有关每个搜索的训练数据 $ \mathbb D_s=(\mathbf{\vec x}_i,y_i),i=1,2,\cdots,K $ ,其中:
$ K $ 为搜索返回的
listing
数量。$ \mathbf{\vec x}_i $ 为第 $ i $ 个结果
listing
的特征向量。第 $ i $ 个
listing
结果的特征向量 $ \mathbf{\vec x}_i $ 由listing
特征、用户特征、query
特征、以及交叉特征组成。listing
特征是与listing
本身相关的特征,如每晚价格、listing type
、房屋数量、拒绝率rejection rate
等。query
特征是与发出的query
相关的特征,如租客数量、停留时间length of stay
、提前多少天lead days
等。用户特征是与进行搜索的用户相关的特征,例如平均预定价格、租客评级等等。
交叉特征是从以下两个或多个特征源
feature source
(listing, user, query
)中导出的特征。这类特征的例子包括:query listing distance
:query location
和listing location
之间的距离。capacity fit
:query
的租客数量和listing capacity
之间的差异。price difference
:listing
价格和租客历史预定均价之间的差异。rejection probability
:房东拒绝这些query
参数的概率。- 点击百分比
click percentage
:实时的memorization
特征,它跟踪租客在特定listing
上的点击比例。注意,它不是点击率,而是点击分布。
这里使用人工交叉特征,理论上
DNN
模型也能够自动学习这类交叉特征。但是人工交叉特征相当于提供了先验知识,有助于模型的泛化和更快的收敛。
该模型使用大约
100
个特征。为简明起见,我们不一一列举。$ y_i\in \{0,0.01,0.25,1,-0.4\} $ 为第 $ i $ 个结果
listing
分配的标签label
。为了将标签分配给搜索结果中的特定
listing
,我们会在搜索发生后等待1
周以观察最终结果:- 如果
listing
被预定,则 $ y_i=1 $ 。 - 如果租客和房东联系单没有预定,则 $ y_i=0.25 $ 。
- 如果房东拒绝了租客,则 $ y_i=-0.4 $ 。
- 如果租客点击了
listing
,则 $ y_i=0.01 $ 。 - 如果租客仅是查看但未点击,则 $ y_i=0 $ 。
这里的
label
配置相当tricky
,并没有理论指导,需要根据实验效果来调优。- 如果
经过
1
周的等待之后,集合 $ \mathbb D_s $ 也被缩短从而仅保留直到用户点击 $ K_c\le K $ 的最新结果的搜索结果。即 $ K_c $ 之后的搜索结果直接丢弃,(防止被窗口截断)。最后,为了形成数据集 $ \mathbb D = \bigcup_{s=1}^N \mathbb D_s $ ,我们仅保留包含至少一个
booking label
的 $ \mathbb D_s $ 集合。每次我们训练一个新的排序模型,我们都使用最近30
天的数据。接下来,我们将问题形式化为
pairwise
回归regression
问题,以搜索标签search label
作为工具,并使用数据集 $ \mathbb D $ 来训练GBDT
模型,而且使用经过修改以支持Lambda Rank
的package
。我们将 $ \mathbb D $ 的80%
用于训练、20%
用于测试,并在测试机上使用NDCG
(一个标准的排序指标)来离线评估不同的模型。最后,一旦模型被训练好,它就被用于搜索
listing
的在线评分。用户 $ u $ 执行的搜索query
$ q $ 返回的每个listing
的特征向量 $ \mathbf{\vec x}_i $ 所需的信号都是在线计算的,并且使用我们的分片架构sharded architecture
进行评分。给定所有分数,listing
以预估效用predicted utility
的降序向用户展示。Listing Embedding Features
:向我们的搜索排序模型添加embedding
特征的第一步是将450
万个embedding
加载到我们的搜索后端search backend
,以便可以实时访问它们以进行特征计算和模型打分model scoring
。接下来,我们引入了几个用户短期
short-term
历史行为记录,其中包括了最近两周的用户行为信息,并随着新的用户行为发生而实时更新。该逻辑是使用Kafka
实现的。具体而言,对于每个user_id
,我们收集并维度(定期更新)以下listing id
的集合:- $ \mathbb H_c $
clicked listing_ids
:用户在过去两周内点击的listing
。 - $ \mathbb H_{l_c} $
long-clicked listing_ids
:用户在过去两周内点击、且在listing page
上停留了60
秒以上的listing
。 - $ \mathbb H_s $
skipped listing_ids
:用户在过去两周内跳过这些listing
而点击了更低位置lower positioned
的listing
。(因此这些listing
可以视为负样本)。 - $ \mathbb H_w $
wishlisted listing_ids
:用户在过去两周内添加到愿望清单wishlist
中的listing
。 - $ \mathbb H_i $
inquired listing_ids
:用户在过去两周内联系、但是没有预定的listing
。 - $ \mathbb H_b $
booked listing_ids
:用户在过去两周内预定的listing
。
这些
listing_id
都是用户历史行为记录。我们进一步将每个短期历史行为记录 $ \mathbb H_* $ 划分为多个子集,每个子集包含来自同一个市场的
listing
。例如,如果用户点击了纽约和洛杉矶的listing
,则他们的 $ \mathbb H_c $ 集合将进一步划分为 $ \mathbb H_c(NY) $ 和 $ \mathbb H_c(LA) $ 。最后,我们定义
embedding
特征,这些特征利用上述定义的集合和已经学到的listing embedding
为每个候选listing
产生得分score
。下表总结了这些特征(搜索排序中的embedding
特征)。我们描述如何使用 $ \mathbb H_c $ 来计算
EmbClickSim
特征。使用相应的用户短期历史行为记录 $ \mathbb H_* $ ,我们以相同的方式计算上表顶部各行中的其它特征。这里计算的是:候选
listing
和用户历史行为的相似性。为了计算候选
$ \text{EmbClickSim}\left(l_i,\mathbb H_c\right) = \max_{m\in \mathcal M}\cos\left(\mathbf{\vec v}_{l_i},\sum_{l_h\in \mathbb H_c(m) }\mathbf{\vec v}_{l_h}\right) $listing
$ l_i $ 的EmbClickSim
特征,我们需要计算它的listing embedding
$ \mathbf{\vec v}_{l_i} $ 和 $ \mathbb H_c $ 中listing
的embedding
之间的余弦相似度。为此,我们首先计算 $ \mathbb H_c $ 的市场级别中心market-level centroid
的embedding
。为了说明这一点,我们假设 $ \mathbb H_c $ 包含5
个来自纽约的listing
、以及3
个来自洛杉矶的listing
。这将需要通过平均每个市场的listing id
的embedding
来计算两个market-level centroid embedding
,一个用于纽约、一个用于洛杉矶。然后,EmbClickSim
被计算为listing embedding
$ \mathbf{\vec v}_{l_i} $ 和 $ \mathbb H_c $ 的market-level centroid embedding
之间的两个相似性中的最大值。具体而言,EmbClickSim
可以表述为:其中:
- $ \mathcal M $ 为用户点击
listing
所属的市场的集合(去重)。 - $ \mathbb H_c(m) $ 为用户在城市 $ m $ 点击
listing
的集合。
除了与所有用户点击的相似性之外,我们还添加了一个特征,用于衡量与最近一次长点击的相似性,即
$ \text{EmbLastLongClickSim}\left(l_i,\mathbb H_{l_c}\right) = \cos\left(\mathbf{\vec v}_{l_i},\mathbf{\vec v}_{l_{\text{last}}}\right) $EmbLastLongClickSim
。对于候选listing
$ l_i $ ,通过找到其embedding
$ \mathbf{\vec v}_{l_i} $ 和来自 $ \mathbb H_{l_c} $ 的最近长点击listing
$ l_{\text{last}} $ 的embedding
之间的余弦相似度,我们得到:- $ \mathbb H_c $
User-type & Listing-type Embedding Features
:我们遵循类似的过程来引入基于user type embedding
的特征和list type embedding
的特征。我们使用
5000
万个用户booking session
,为50
万个user type
和50
万个list type
训练了embedding
。embedding
的维度是 $ d=32 $ 维的,并且在booking session
上使用 $ m=5 $ 的滑动窗口来训练。user type embedding
和list type embedding
被加载到搜索机器search machine
的内存中,这样我们就可以在线计算type
相似性。为了计算候选
$ \text{UserTypeListingTypeSim}\left(u_t,l_t\right) = \cos\left(\mathbf{\vec v}_{u_t},\mathbf{\vec v}_{l_t}\right) $listing
$ l_i $ 的UserTypeListingTypeSim
特征,我们简单地查找 $ l_i $ 的当前listing type
$ l_t $ ,以及执行搜索的用户的当前user type
$ u_t $ ,并计算它们的embedding
之间的余弦相似度:上述表格中的所有特征都记录了
30
天,因此可以将其添加到搜索排序训练集合 $ \mathbb D $ 中。特征的覆盖率(即具有特定特征的样本在 $ \mathbb D $ 中的占比)在下表中进行了报告。观察到基于用户点击的特征和基于用户skip
的特征具有最高的特征覆盖率。最后,我们训练了一个新的、添加了
embedding
特征的GBDT
搜索排序模型。表中显示了embedding
特征的重要性(在104
个特征中的排名)。排名靠前的特征是:- 与用户点击
listing
的相似性(EmbClickSim
特征,总体排名第5
)。 - 与用户
skip listing
的相似性(EmbSkipSim
特征,总体排名第8
)。
前
20
个特征中有5
个embedding
特征。不出所料,长期long-term
特征UserTypeListingTypeSim
(它使用所有历史的用户预定)的排名要好于短期short-term
特征EmbBookSim
(仅考虑最近2
周的预定)。这也表明:基于历史预定的推荐更适合使用历史booking session
训练的embedding
,而不是使用历史click session
训练的embedding
。这里将
Embedding
和GBDT
结合,事实上可以直接进行端到端的DNN
学习。Embedding + GBDT
的优势是可解释性强。- 与用户点击
为了评估模型是否学会了按照我们的意图使用特征,我们绘制了
3
个embedding
特征的部分依赖性partial dependency
:EmbClickSim
、EmbSkipSim
、UserTypeListTypeSim
。这些图给出了:如果我们固定目标特征(我们正在检查的特征)之外的所有特征的值,那么会对listing
的排序分ranking score
产生什么样的影响。- 在左侧的子图中,可以看到较大的
EmbClickSim
值(表示该listing
和用户最近点击的listing
更相似)会导致较高的模型得分。 - 在中间的子图中,可以看到较大的
EmbSkipSim
值(表示该listing
和用户最近跳过的listing
更相似)会导致更低的模型得分。 - 在右侧的子图中,可以看到较大的
UserTypeListingTypeSim
值(表示该listing
的listing type
和user type
相似)会导致更高的模型得分。
- 在左侧的子图中,可以看到较大的
在线实验结果
Online Experiment Results Summary
:我们进行了离线和在线的实验(A/B test
)。首先我们比较了在相同数据上训练的两个搜索排序模型,它们分别带有
embedding
和特征、以及不具备embedding
特征。在下表中,我们根据每个效用(曝光、点击、拒绝、预定)的贴现累计效用Discounted Cumulative Utility: DCU
和总体归一化的贴现累计效用Normalized Discounted Cumulative Utility:NDCU
来给出结果。可以看到:- 对于
NDCU
,添加embedding
特征导致了2.27%
的提升。 - 对于预定的
DCU
,添加embedding
特征导致了2.58%
的提升。 这意味着预定listing
在测试集中排名更高。 - 对于拒绝的
DCU
,添加embedding
没有任何下降(DCU-0.4
持平),这意味着拒绝listing
没有比对照组(不带embedding
特征的模型)的排名更高。
从下表中观察到的事实、以及前述表格中
embedding
特征在GBDT
特征重要性中排名较高的事实、以及上图中发现的特征行为与我们直观预期相匹配的事实,足以让我们做出继续进行在线实验的决定。在在线实验中,我们看到了具有统计意义的预定增益
booking gain
,并且embedding
特征也在投入到生产环境中。几个月后,我们进行了一次反向测试,其中我们试图移除embedding
特征,结果导致负向的预定结果,这是实时embedding
特征有效的另一个证明。- 对于
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论