首先,作者介绍了airbnb的业务流程:从客人在airbnb上搜索合适的房子,系统给出具有一定顺序的列表房间。
同时介绍了airbnb的技术变迁,从最早的人力手动打分,后面又使用gbdt模型有了很大的提高,再是顺应时代变迁在神经网络有持续性的探索,最后收获了满意的结果。
搜索排序模型的主要生态是预测主人接受客人的概率以及客人对旅途体验的打分。作者主要关注于根据客人的预定概率对房子列表进行排序的问题。
文章总体对模型架构的变迁有一个总结,同时结合特征工程,系统工程,超参数调优来进一步说明。
第一个上线的架构是一个单隐藏层,有32个relu的激活单元,所有用到的特征和评估目标都是与GBDT一样的,用户预定了就是1,没有预定就是0,目标函数是最小化L2 regression loss。
lambdarank NN的主要提升在于两点:
在研究NN模型的同时,Airbnb还探索了GBDT和FM模型。三者线下表现差不多,但是得到的排序结果却很不相同。所以,Airbnb尝试了将三种模型进行模型结构的融合,也算是常用的做法:
原来的模型过于复杂,以及有很多问题的出现,后来作者只是简单的将训练数据变大了十倍,然后将模型调整为了有2层隐藏层的DNN。输入层是195个特征,第一个隐藏层是127个全连接的relu单元,第二个隐藏层是83个全连接的relu单元。
虽然将id进行embedding在很多应用上都获得了成功,但是作者尝试各种变化,但是都导致了过拟合。
作者给出的解释是:listing id太稀疏了,即时是最热门的listing一年也就只能预定365次。而embedding需要一定数量的样本来给出相对合理的取值。
为了解决listing id过于稀疏带来的过拟合的问题,作者尝试用Multi-task learning同时对long view和probability of booking进行建模。期待相对不那么稀疏的view能够给booking proba的学习到来一定的额外信息,以解决过拟合的问题。
因为long view 的标签数量远大于booking的标签数量,因此booking给了较大的权重,而long view用log(view_duration)进行scale。线上实验发现,booking并没有提升,但是long views的比例却大大的提升了。
作者观察了一些long view比例比较高的listing,发现一些可能的原因导致上述结果。比如说高端但是价格太高昂的的listing,listing的描述太长的,比较独特,有趣的listing等等。
对于工程来说,真正了解业务才能实现好的模型。
对于神经网络来说,对于数值比较敏感,较大的梯度更新可能会使梯度消失,因此归一化势在必行。主要包括两种转换:
spotting bugs
平滑的分布有利于发现在普通分布中的错误
Facilitating generalization
这些曲线解释了DNN泛化能力强的原因,lower layer的平滑输出保证upper layer可以对没有见过的特征取值做出正确响应。同样的道理,input layer的输入应该也是平滑的才好。
虽然有些特征经过合适的归一化可以获得一个顺滑的分布,但是有一些特征比如经纬度,就需要取log将经纬度转换为基于距离的属性而不是具体地理位置的属性
Checking feature completeness
作者根据(a)图看出分布不是那么的顺滑,通过调查发现业务特征不够完善,再补充上缺失的特征之后,分布相对平滑如(b)所示。
用户对于城市区域的偏好是一个重要的位置信号。原来GBDT需要做很多特征工程,NN处理起来非常简单。 使用hash函数对query进行编码得到类别型特征,然后Embedding并训练,最终得到针对当前city query的偏好的地点的编码。
####Drop out
首先尝试了dropout,但是对于airbnb的这个业务来说没有丝毫提升,作者给出的解释是dropout类似于一种数据增强技术,对于数据有缺失的随机模拟场景有效,但是对他们来说随机性只会分散模型的注意力。
最初weights,bias全部被初始化为0,NN效果非常差。最后选择Xavier对weights进行初始化,针对Embedding使用{-1, 1}范围内的均匀分布进行初始化。
####Learning rate
利用adam很难对airbnb的应用有很大的提高,因此作者使用一个不同的LazyAdamOptimizer,对于大embedding的训练速度会快一些
Batch size对模型训练速度影响很大,但是对模型性能影响不好说。最终选用的是200.
对于神经网络来说,想要理解每一个单独特征的重要性总会带来一些影响,因为我们无法去分离输入结点的影响,因为激活函数是非线性的。
基础的想法是每次删去一个特征然后观察模型表现的差别。但是可能会因为特征集的冗余使得模型能够弥补单个特征的缺失,从而使得无法说明该特征是否对模型有作用,
随机修改某些特征的在测试集中的取值,查看模型性能的改变。同样假设特征之间相互独立,这是不可能的。 但是,随机修改一个特征没有引起模型性能变化,也许能说明模型不需要这个特征。
通过观察在列表中排名较高的与排名较低的特征分布情况:
如上图所示,我们可以观察到模型对于价格比较敏感。