前几天读了下Airbnb的KDD最佳论文Real-time Personalization using Embeddings for Search Ranking at Airbnb,收益颇多,所以就又把Airbnb的这篇论文也读了下,这篇论文主要是讲述了Airbnb对深度推荐算法的一些尝试和反思,论文地址是Applying Deep Learning To Airbnb Search,知乎上也有不错的相关技术分析博客。接下来记录下我对这篇文章的学习。文章中主要内容分布在session 2到session 7。
Session 2
Session 2提到了Airbnb尝试用的深度模型,文章并没有提出什么高大上的深度模型,都是简单的,很基础的DNN结构。不过说实话我现在对复杂模型也不是很感冒,在看了吴军老师的《数学之美》后,我现在觉得复杂模型有时还不如简单模型,与其把模型变得又深又复杂,还不如利用传统数据分析,机器学习和深度学习算法找出更好的特征,让模型能够在有限时间内多训练几个epoch,说不定效果更好。
Session 3
Session 3则讲述了Airbnb的失败尝试,主要是对listing id(就是租房id)的编码。像其他标准的深度推荐系统一样,Airbnb选择对listing id进行embedding操作,但是直接embedding很容易导致模型的过拟合,因为大部分listing id对应的样本数太少了,对应的embedding向量很难训练好。为了缓解这一问题,Airbnb建立了多任务学习,在模型中加入了long view(长时间浏览但是没有预定)的预测。其背后的想法是在对long view的预测学习的同时也对booking预测进行学习,但是最终并不是很好,因为long view和booking有关联,但是在一些场景下关联却不大,因此基于long view的booking预测模型还是有一定挑战性的。不过Airbnb在另外一篇论文中提出更好的解决方法,就是对稀疏的user id和listing id进行装桶,得到新的粒度更粗的user-type和listing-type特征,用这两种新的特征的embedding向量作为listing id的embedding向量的补充。
Session 4
Session 4讲述了Airbnb对特征的预处理技术,主要是特征值的normalization(树模型对特征的normalization不是很敏感,但是NN模型对normalization很是敏感)。Airbnb提出针对不同分布的特征采用不同的normalization技术:
- 对于服从正态分布的特征,normalization公式为
- 对于服从幂律分布(应该就是指长尾分布等)的特征,normalization公式为
Session 4.2讲述了对特征进行normalization是为了保证特征的平滑分布。而特征值分布的平滑性可以很好的帮助发现错误信息和促进模型的泛化性,具体可看原论文或者这篇博客。
Session 5
Session 5则是系统设计的反思,Airbnb发现系统的大部分时间都花在数据的读取上,对此的改进就是将数据的存储格式由传统的CSV文件改为了TensorFlow中的Dataset文件。同时,Airbnb放弃了其他特征,仅仅使用list id特征,将其对应的embedding表保存在GPU缓存中,这样就可以大大减少数据读取时间。
Session 6
Session 6讲的是模型超参数的尝试,Airbnb主要尝试了:
- Dropout,发现并没有什么用。相应的尝试了数据增强(根据特征分布加入随机噪声),在线下对模型有帮助,但是对线上没帮助。
- 初始化,对于模型权重采用Xavier初始化,对于embedding矩阵采用random uniform初始化。
- 学习率,采用自适应的Adam,不过不是原始Adam,而是LazyAdam。(原始Adam为每个可训练变量维护两个滑动平均累加器,每次反向传播时都会更新所有的累加器,但对于LazyAdam而言,则只会对batch中出现的稀疏变量对应的累加器进行更新)
- Batch size,参考了DON’T DECAY THE LEARNING RATE, INCREASE THE BATCH SIZE的意见。
Session 7
Session 7讲述了Airbnb对特征重要性的探索。NN模型的一大缺陷就是没有很好的解释性,我们没法判断参与训练的哪个特征更好。Airbnb做了下面这些尝试:
- Score Decomposition。对最终分数进行分解,查看NN中每个节点对结果的贡献,但是由于非线性激活函数的存在,这种分析是不对的。(文中是这样说明的,但我对具体实现还不是很理解,怎么对score进行分解呢?)
- Ablation Test。控制变量法,去掉一个特征,观察模型性能变化。但是没法确定这种波动是正常的,还是确实是由于去掉特征的影响。
- Permutation Test。对测试集中的某个特征的值进行随机打乱,观察最后结果的变化,但是由于特征之间并不是完全独立的,所以这种方法也不能很好地评估好的特征,但是可以大致衡量不好的特征(如果对某一特征值进行随机打乱,但是最后结果变化不大,那就说明这个特征不重要)。
- TopBot Analysis。对结果进行排序,比较Top的listing id和Bottom的listing id对应特征的取值分布,这个比较就反映了是如何利用这些特征分布的。
网友评论