论文地址: https://dl.acm.org/doi/10.1145/3292500.3330658
本文是 Airbnb 被 KDD 2019 录用的论文,非常详细地记录了他们将深度学习引入搜索排名(Search Ranking)的探索过程,写得相当好,字字珠玑,干货满满。
在拿了 KDD 2018 的最佳论文之后,这一次,他们想必是冲着 KDD 2019 的最佳论文来的。只是可惜了。
好玉不雕。在这篇笔记中,我将按照原文的顺序,尽可能原原本本地记录本文的重要内容。(笔记有点长,4800+字,建议收藏阅读。这也证明了论文确实是好论文,真・字字珠玑。)
首先需要注意的是,本文的讨论仅限于搜索排名模型。这个模型是 Airbnb 整个模型生态中的一环,其作用是根据房客(Guest)预订的可能性,对房源(listing,参考官方的翻译)进行排序。
模型的演化
在尝试深度模型之前,他们使用 GBDT(Gradient Boosted Decision Tree)做搜索排名。
按照他们的说法,将模型迁移到深度模型并非一蹴而就的,而是一系列迭代优化的最终结果。截止 18 年 6 月,主要有四个阶段性的成果,模型性能的提升如下所示。
Simple NN
Andrej Karpathy(特斯拉的AI主管)曾经发表过关于深度模型结构的看法:Don't be a hero。不要(妄想)成为一个英雄。大意是劝人不要一开始就上复杂的模型。
不听老人言,吃亏在眼前。Airbnb 的众人不听劝,上来就搞了一个相当复杂的模型,结果被其复杂性所压垮,最后不了了之。
不再妄想成为一个英雄,Airbnb 的深度学习之旅才正式拉开了序幕。
他们回过头来从一个简单的单隐层神经网络入手。这个 NN 只有 32 个神经元,直接使用了原来 GBDT 的输入特征作为输入。
上线之后,NN 的性能与 GBDT 的相当。这说明 NN 是有效的,能够服务于他们的真实流量。因此,他们有了继续探索的动力和勇气。
Lambdarank NN
简单的神经网络并没有带他们走得很远。在实践中,他们对 Karpathy 的建议有了新的认识:don't be a here, in the beginning。不要在一开始就想做大英雄。隐含的意思是,英雄还是要当的,不过要慢慢来。
第二次进化的契机是,引入了 Lambdarank 的思想1。这使得他们能够直接针对 NDCG(Normalized Discounted Cumulative Gain,一个线下评价指标)进行模型优化,从而同时提高了模型在线下和线上的性能。
引入 Lmabdarank 思想,对简单神经网络的主要改进有二:
将数据整理成
{预订的房源,展示但没预订的房源}
的形式,采用 pairwise 的训练方式代替了原来 pointwise 的方式;对 pairwise loss 进行加权。具体地,交换构成训练数据的两个房源在搜索排名中的位置,根据交换引起的 NDCG 的差异来设置加权系数。按照文章的说法,这还有助于提高预订的房源在搜索结果中的排名。
Decision Tree/Factorization Machine NN
NN 逐渐成为了 Airbnb 提供搜索排名的主要模型。不过依然有其他的模型在研,其中最值得关注的两个分别是:GBDT 和 FM(Fatorization Machine)。这些模型在测试集上的性能与 NN 具有可比性,但是它们给出的搜索排名与 NN 的差异巨大。
受混合模型的启发,他们将 FM 输出的最终预测作为 NN 的一项输入,并将 GBDT 中每棵决策树中最终被激活的叶节点的索引视为类别特征输入 NN,构造了一个搜索排名的混合模型。模型结构如下所示。
Deep NN
Airbnb 的简单神经网络经过 3 次进化之后,在2018年6月,终于脱胎成了深度神经网络。说它深,其实也不深,只是从单隐层变成了双隐层。
一个典型的模型设置是:
195 维的输入层,这还是算上类别特征嵌入的 embedding size 的结果;
127 维 + 83 维的隐藏层,使用 ReLU 作为激活函数;
输入的特征多是房源的基本特征,如价格、历史预订数等。
在这里,作者们多提了一句,说,DNN 在 CV 等领域取得了人类水平的性能,但是“我们”并不清楚自己现在处于什么位置。这个问题的部分原因是,在搜索排名或者推荐系统中,难以定义人类的水平。
借着作者开的话头,我也来多说几句。
我是研究 NLP 的,在我的认知中,NLP 的研究是落后于 CV 的。2018 年,预训练语言模型爆火,Sebastian Ruder 将之称为 “NLP's ImageNet moment”2。如果按 ImageNet 诞生的 2009 年算起,NLP 落后 CV 9年;如果按 AlexNet 横空出世的 2012 年算起,NLP 落后 CV 6 年。
NLP 落后 CV 的一个重要原因是:CV 处理的对象以及评价标准,相对更加客观。相比之下,NLP 受限于人的主观感受,对于一个任务,很难给出客观的评价标准,比如如何评价“主观”和“客观”?这样的莫衷一是,加上语言本身的模糊性,使得 NLP 比 CV 更“难”一些。
从处理对象的复杂性来看,假设 CV 处理的图片和视频是简单对象,NLP 处理的语言文字是复杂对象,那么,搜索排名或者推荐系统处理对象——人,就是超级复杂的对象。尽管一千个人有一千个哈姆雷特,但是语言文字一旦说出口写下来,它作为客观存在的那部分就固定了。人,却无时无刻不在变化之中。
我甚至怀疑,Resys's ImageNet moment 会不会到来。
失败的模型
看上面的四个例子,似乎 Airbnb 对深度学习的探索,只是在起步的时候走了弯路,后面就顺风顺水了。其实不然。
正所谓,一将功成万骨枯。每一个成功的模型背后,都是数不清的失败的尝试。文中举了两个失败的案例。
Listing ID
在这个例子中,他们尝试使用房源 ID 来学习房源嵌入,就像词嵌入一样。但是在尝试过各种方法之后,发现房源嵌入总会导致过拟合,以致于不可用。
公认有用的 Embedding 技术,为什么不适用了?对此,Airbnb 的思考是:Embedding,需要一个 item 出现的次数足够多,才能收敛到一个合理有效的值,反之则不行。比如词嵌入对于生僻词的表示就是欠佳的。反观房源,最火爆的房源一年的预订数也不过 365 次,一般的房源的预订数就更加远远不如了。这使得每个房源 ID,都像是生僻词,难以学到高质量的房源嵌入。
Multi-Task Learning
观察