airbnb 房源预定 embedding 论文学习

《Real-time Personalization using Embeddings for Search Ranking at Airbnb》
其核心在SKIP-GRAM上根据业务做了一个改进点为:当序列中存在下单动作的时候,认为序列中的任意一个商品都与该下单动作的商品应该存在一定的关系,因此在SKIP_GRAM算法中仅需要将在有下单序列中每个窗口中多加入一个商品即下单的商品即可。

1:基础符号解释说明

https://zhuanlan.zhihu.com/p/55259412
假定从 个用户获得了一个点击的session集合,其中每个session 为用户点击的一个LIST,其中session的切割方式为:当以个点击时间距离下一个点击时间大于30分钟后,该session被切割。目标是对于每一个listing 学习一个维的向量使得相似的listing在embedding空间中更接近。

2:模型设计

记的正样本对为,记其集合为。即窗口为大小的,同一个用户点击序列中的上下文为其正样本对。随机选取个负样本对$$,记其集合为,则目标函数变为(实际上就是交叉熵损失函数,与SKIP-GRAM的损失函数一致):

通过随机梯度下降进行求解。

3:切割SESSION的机制

将SESSION切分为两个部分
1)预定序列 booked session。即序列的终止动作为下单。此时优化目标要变为:


可以这样理解最后加的一项,相当于,无论下单动作的商品在不在窗口内,都把它当做中心商品 的一个上下文。
2)探索序列 exploratory session 。即序列中切分为时间间隔大于30分钟了,被切割的SESSION中没有下单的动作,全是浏览点击的动作。
3)???不太理解这块的含义:

关于负采样部分

通俗地理解是不是可以这样想,如果全局选取负样本,会导致同一个market 的房源的 embedding 接近,非同一 market 就会远,内部区分不是很明显,但是若负采样在 的market 里进行选取的话,是否可以将内部房源区分得更开?此处相当于作者关于随机负采样根据业务需求做了一些优化。

4:冷启动的问题

提出了一种利用其它的已经存在的embedding 向量去表示未知的embedding 向量 。采取的策略是找10 miles为半径的范围内,与已知embedding 房源属性最近的3个房源,然后求平均得到未知EMBEDDING房源的办法。

5:uer_type 和 listing_type

假定我们给定了一个由 个用户预订的商品序列集合,其中每个预订的session 为 ,通过预订商品序列生成embedding 向量存在如下的几个问题:
1)预订的商品序列会比点击序列的长度短很多
2)很多用户可能就预订一单,也就是序列的长度为1,无法学到
3)为了学到有意义的 emebdding 向量,一般要求商品出现的次数要大于5-10次,但是很多商品实际上出现的次数是少于5-10次的,比如那些比较少见的商品。
4)用户预订的两个商品若时间间隔过久,这两个时间段用户可能因为职业改变等导致价格偏好发生改变。
为了解决上述问题,作者提出了,我们倾向于学习 listing_type 而不是listing_id。具体是如何做呢?
首先给定listing_id必要的元数据信息,比如像JD商品id对应的属性三级品类、品牌等。文章给出的是位置、价格、大小、床的数量等。给出了一个映射规则,对应的论文的 table3 。文章中给了一个例子, 一个房间的信息为:

1)国家为US,对应第一行第一个,映射表中取值为US
2)Listing_type是Ent,对应第二行第一个,映射表中取值为lt1表示 list type缩写lt 且为第1列
3)每晚价格60.8$,对应第三行第3个在56-69区间内,映射表中取值为pn3,pn是per night 的缩写,3表示第3列
4)平均每个顾客29.3$,对应第四行第3个,映射表中取值为pg3,pg 表示per gust缩写,3表示第3列

依次查表,最终可以表示为listing_type = US_lt1_pn3_pд3_r3_5s4_c2_b1_bd2_bt2_nu3,显然这是一种多对一的映射关系。问题,映射关系很重要,实际上此处的映射关系已经决定了,哪些房源满足什么基础条件的时候,就一定相似,比如映射成同一个listing_type的lsiting_id 的emebdding 表示肯定是一致的。此处价格区间的划分等映射表的构建也是至关重要的。以同样的方式构建用户的映射关系,映射表见论文的table4。
现在的问题是如何让listing_type 和user_type 的emebdding 的向量是在一个向量空间中?
首先构造book session ,只不过和之前的相比,在 session 中不仅有商品还有用户 ,即

6:在 word2vec的基础上修改源码,实现论文 ,初步构思方向

1)将原始sentence 后加上一个判断是否是下单的符号,比如-1表示该sentence 有booked 的商品,LOSS加上 含booked 一项。若尾部的ID不等于-1就表示该sentence 没有booked 的商品,在更新的过程LOOS沿用之前的。但是这样处理后,就会发现-1会被当做词在构建huffman树的时候当做词被构建进树中,且由于每个带booked的sentence中几乎都有-1,就会导致其词频很高,在构建树的过程中很大概率会离根节点很近,导致使用层次softmax的时候,几乎很多词的路径中都包含了该节点,显然是不合理的。
2)介于第一步引入赘余词后的不合理点,需要在统计词频和构建词典的过程中将这两个词filter掉。
3)基于论文的思想,当引入booked 的商品后,在更新每个中心词的输入向量的过程中,需要将booked 的商品也当做窗口词进行更新其参数向量。因此首先要判断尾部的商品ID是否等于-1,若是则sentence-1,不更新尾部的词。且每次更新的过程中先记录尾部词,在窗口词更新完后,将尾部词都更新一遍。有个问题(booked 的词是否要作为中心词更新一遍????此处个人理解是不需要更新)
基于上述分析,最终修改的代码见:https://github.com/Hongqiong12/Embedding/tree/main/aribnb
建议:
当sentence的长度为2的时候,尾部是下单词,不要在尾部加-1。尾部词也作为中心词进行训练。

你可能感兴趣的:(airbnb 房源预定 embedding 论文学习)