提纲
- 解决的问题
- 方法
- 实验
- 疑问与启发
1.解决的问题
本文要解决两个问题:
- 针对短租市场,大部分的用户很少会多次预定同一类型的房间;房间分时段的,只能在某段时间内被某一个用户预订;大部分用户预订酒店是低频事件,更不用说是在同一个地方预订酒店。
- 实时个性化
2.方法
作者考虑到用户在预订酒店之前有大量的搜索、点击、联系商家等行为,可以利用这些信息来构建用户预订的房间与候选商品之间的相似关系;还可以根据这些信息捕捉用户的兴趣。本文中,作者对商品做了两个层面的embedding:一是每个商品;二是商品类型以及用户类型。
本文提出的方法基于skip-gram的word2vec,原理并不复杂。下面将详细介绍作者的改进之处。
首先对下面可能会出现的变量做一下说明:和表示商品的输入输出向量;表示上下文窗口大小,表示上下文;是所有商品的字典;表示正样本集合,表示负样本集合。
2.1 listing embedding
作者主要改进的地方在于数据集的处理上,有两点global text 和negative samples:
global text
如上图所示,作者根据用户在30s内点击商品的序列当做一个句子,但是相对原模型,作者做了一点改动:如果在这个点击序列中包含用户最后预订的商品,那么这个商品的向量会当做global context。其实就是,在每次窗口滑动的时候,都会被当做上下文中之一;在我看来这里有点像doc2vec中doc向量的作用。具体可见公式:
当然,如果序列中没有预订的商品,那上式中没有最后一项。
negative samples
在原word2vec模型中,负样本通过对采样得到的;但是在租房平台中,这样很可能负样本集合都是与预订商品处于不同的地区,这样会导致在同一地区中商品的相似性会有偏差。
We found that this imbalance leads
to learning sub-optimal within-market similarities.
因此,作者额外从同一地区的商品中采样一些负样本,因此上式变为:
冷启动
新商品的初始化用同一地区,同一价格区间中3个商品的平均向量。
2.2 user_type & listing_type embeddings
2.1部分用点击行为代表短期兴趣,更侧重于同一地区商品之间的相似关系。但是不同地区之间也能反映用户的一些喜。比如,用户A在深圳和上海预订过酒店,现在需要在北京预订酒店(假设用户没在北京预订过),但是在深圳和上海预订过的酒店也可以反映用户的某些偏好了。因此论文中通过用户的booking行为代表长期兴趣,构建Embedding向量。但是booking序列单个用户的行为比较稀疏,无法直接训练,一般会先对用户做聚类再训练。因此,作者通过对商品类别和用户类别embedding,希望能描述跨区域的相似关系。
在该部分,作者只用了用户预订的序列,根据时间顺序把用户预订过的所有商品当做一个序列。既然对商品和用户的类别进行embedding,那么首先需要标记类别。作者根据商品的属性以不同的值或者范围来划分多个类别,具体可见论文的Table 3和Table 4;可以看到user_type其实也是基于商品属性划分的。
个人的一点想法:
这里分类别其实可以看作是一种聚类或者分桶,因为booking的用户数据太少,因此需要先聚类然后再embedding。其实论文的Table 3和Table 4就是Airbnb根据他们的业务场景设计的一种分桶方式。这种方式对房源embedding来说也值得借鉴。
另外,为了让商品类别和用户类别在同一个空间维度,作者放在同一个训练集中一起训练。如下图(暂时可忽略rejection,booking)
然后公式变成:
当central item为用户时,
当central item为商品时,
这里有点不理解,我本来觉得将listing_type和user_type放在一起,那么应该是混着使用,相互作为对方的上下文,但是看目标函数不是这样的。如果按目标函数,listing_type和user_type还能训练成同一个空间吗?
3.实验
3.1 数据集
训练listing embedding的数据集
- 大小为80亿的点击序列,来自于所有登录用户几个月的日志
- 去掉了用户停留时间小于30s的点击以及长度小于2的点击序列
- 在训练集中将booked sessions上采样5倍
- d=32, m=5, iter=10
3.2 离线评估
地理信息
通过对房屋向量进行聚类,确认来自同一地区的房源被聚在同一个簇中。
listing_type和房价范围
相同类型的listing以及相同房价范围的listing的cosine相似度更高
房屋风格和建筑
越相似的listing有着更相似的房屋或者建筑风格
rank position of booked listing
通过计算clicked listing和candidate listings之间的cosine相似度对candidate listings进行排序,然后看booked listing的位置。booked listing的位置越往前,说明效果越好。
这里有点不明白,candidate listings包含用户最终预订的listing, 原文中"the most recent clicked listing"指的是最近的那一个listing吗?这个有时间范围吗?比如在预订前几天的点击列表?
4.疑问与启发
4.1 疑问
- 不同地区可能某些属性的范围不同,比如价格,因此感觉文中用硬区间来表示不同的类别有些不合理。
- 如果wide&deep之类的模型也能学习房源向量,那用word2vec模型的好处是什么呢?只是因为可以提前算出向量吗?
- listing_type和user_type训练时,是分别用不同的计算方式,但loss值一起计算吗?
4.2 启发
其实在此之前我也想过用word2vec来生成房源向量,但是没有想过global text,以及listing_type embedding。
另外,相比Airbnb的短租市场,贝壳找房的场景不同之处有:
- 购房周期比预定房间周期要长
- 在短时间内,房源不会被出售多次
- 用户几乎没有booked session,不过或许可能用其他代替,比如带看、联系经纪人等行为。
一点点题外话:感觉word2vec真的很好用,之前用word2vec根据用户的点击网页序列做过网页的相似度,效果也很不错。而且,在graph方面,也有node2vec、link2vec,这些都是应用word2vec模型。
相关资料
1.Real-time Personalization using Embeddings for Search Ranking at Airbnb
2.不一样的论文解读