写点什么

Embedding 技术在民宿推荐中的应用

2019 年 7 月 04 日

Embedding 技术在民宿推荐中的应用

民宿越来越成为旅游消费的新热潮,作为国内最大的民宿平台,途家在应用 AI 技术进行个性化商品推荐方面进行了不少探索。民宿行业的数据,具有用户消费频次低,用户兴趣点不好描述等特点,基于内容和普通协同过滤的方法效果都不明显,受 graphic embedding ,word2vec 的启发, 我们运用 Embedding 技术有效建立了商品之间的相似关系,运用在物物相似推荐场景通过 AB 测试效果明显胜出。这里对这方面的主要工作进行一个介绍和分享:


  • 背景:民宿推荐 & Embedding

  • 方案:业务中 Embedding 如何落地

  • 改进:落地时的摸索和技巧

  • 后续:未来计划


一、背景


民宿在国内还算是比较新的行业,发展比较快,在国外民宿已经发展很多年了,沙发客文化在国外比较流行。



图中右侧部分,为途家 APP 的界面,左边为 list ,右边为点击第一个房间的详情,如果没有用过民宿的同学可以感受下。民宿列表页和携程、去哪儿酒店有明显区别,他们的图是比较小的,而民宿看起来图片很大,什么原因呢?其实民宿是非标住宿,个性化较强,住酒店的话,可能你想好几星,位置,价位,就可以选择了,但是民宿,人们很多时候,会想住一个山景房,或者一个木屋,住在海边,或者是繁华地段,需求方面会注入更多个性化因素。


总结下,民宿个性化推荐特点:


  1. 消费低频,它是旅游需求,相对低频,且用户行为中位置选择占主导,这导致如果应用传统的协同过滤方法,不容易出效果,即使得到的结果也仅仅体现出位置相近的关系。

  2. 商品特色数据不易标注,民宿的商品比较特殊,除了房子基本信息,还有很多潜在信息,不容易表达和标注。

  3. 用户核心需求不好挖掘,当给出能住几个人,在什么位置,是别墅还是农家乐等信息,用户往往还是无法做出选择,还是会详细的看看房子的图片,或者和商户再进行一些沟通,询问些问题,比如是否适合小孩入住,是否有宠物,因此用户的核心需求也不好挖掘。


这就是民宿推荐上的一些特点。


二、方案



为了在民宿推荐上引入更多的个性化,我们考察了三类个性化推荐的方案:


1. 基于内容的推荐


依赖的数据:这个方法很直接,如果我们可以把房屋的各个维度的数据描述出来,都打上标签,我们就可以进行推荐,比如装修风格,图片怎么样,是否有些有趣的特色。


特点:可覆盖新品,需要大量前序数据挖掘和标注工作,潜在特性不易表达,数据描述的全面性和准确性难保证。


2. 基于协同过滤的 item-to-item 相似推荐


在这里我们不用 user-to-user ,因为它是低频消费的场景,用户之间的相似度很难挖掘,所以我们这里重点考察 item-to-item 相似推荐。


依赖的数据:用户行为日志


特点:不需要数据标注,从高层角度进行推荐;无法覆盖新品,在酒店民宿上应用会陷入以地标相似为主的囧境,弱化了其他个性化特征。


3. 基于 embedding 的 item-to-item 相似推荐


Embedding 可以挖掘商品多维度的潜在个性,通过向量之间的内积,发现物品之间的相似性。


依赖的数据:用户行为日志


特点:不需要数据标注,从高层角度进行推荐;无法覆盖新品,可以挖掘除了地标特征外的多维度相似性。


Embedding



下面介绍下 Embedding:


Embedding 是指把超高维 one hot 离散型变量,表达成一个相对低维的向量 ( 比如:从 100000 维降到 64 维 ) 。


在民宿场景下,把房子用一个向量表示,这个向量的内积越大,就表示相似度越高。


这种向量可以表示房屋的原理是:


我们收集了大量的用户日志,用户在短时间内会浏览很多房子,我们认为,用户在下单前,他的搜索都是基于同一个需求的,所以在短时间内浏览的房子是具有内在相似性的。


Embedding 方案比较


我们考察了几种 Embedding 方案:


Graphic Embedding:大家可以看到上图 ( a ) : 用户搜索时的时序,图 ( b ) :把时序用网络来表达,其中 u1 用户的行为 DAB ,就可以把 D-A-B 连线,多个用户的连线放在一起,就形成了网络。这种方式考虑了用户点击行为之间的顺序,和不同用户行为序列的交叠, 这在我们的场景中没有必要性,且会增加很多计算量。


Rnn-Language Model:这个模型复杂度高,有顺序考虑,在数据集不大时,收益也不明显。


Skip-Gram Model:回归到简洁的模型,其实模型的复杂度是跟我们的数据和真实的场景有关的,有时候需要复杂的模型,有时候可能简洁的模型更好。这个模型简单来说是一个短时词袋模型,复杂度低,很适合对大量的语料进行建模计算。2013 年 Mikolov 等人正是回归到简单的 Skip-Gram 模型开启了 NLP 领域的新阶段。


Skip-Gram Model



简单介绍下 Skip-Gram Model


它是实现 word to vector 的经典方法,利用词语在上下文中的共现现象,为每个词生成一个低维向量表示(几百维)。


我们可以看右边的网络图,非常简洁,输入为 w(t) ,中间层为高维的 projection 层,最后为输出层,可以采用 sotfmax、也可以采用二分类,Skip-Gram 采用了二分类,通过负采样的方式,避免了对大量输出的分类。


下面为一个语言的例子,输入为 quick ,输出为 the 或者 brown ,然后做了负采样 java ,这就构建了正负样本,可以进行学习了。


网络参数


Projection 层:Enxd,这个就是我们说的 Embedding ,n 指 n 个词,d 指我们想把这个词表达成多少维的向量。


Output 层:Wnxd,也是每个词都有 d 维的参数,然后还有一个偏置 bn


我们用 wi 表示输入,wo 表示输出,Vwi表示 Embedding 向量。


预测概率


可以看到这里我们要预测某个词出现在上下文中的概率,就是求解在给定输入词 wi 的时候,wo 的概率是多大。


正负采样


这里 Skip-Gram 采用的是正负采样,取前后 A 词作为正样本,在词典中任取 B 词作为负样本。为什么取负样本?因为不能只去学习正样本,两个词之间不是所有属性都相近,需要负样本来学出来到底哪些属性相近,哪些属性不相近。


损失函数



Skip-Gram Model 实现 HouseToVector



接下来把 Skip-Gram 落地到民宿场景中,把一个个民宿表达成向量。


如右图,左边为自然语言的一个句子,可以看到白框 The cat plays with the dog 是一个正常的句子,后面俩个黄色的词其实和这个句子无关,我们把它采样进来做一个负例。学习的时候 The 作为输入,cat 和 plays 作为正样本,car 和 driving 作为负样本,这样构成一个学习样本去学习它的 Embedding 。在我们的业务中,这个序列其实就是一个个房子,就是用户在列表页看到的房子,并且是点击过的房子,黄色为用户跳过的房子,这样就和我们的语言模型对应上了,也有正样本和负样本,图中蓝色的框为用户的 book ,即用户的下单。可以看出,用户的潜在需求与短期内点击过的房子具有相似性,与跳过的房子不相似,与下单房子的相似性具有高权重。


可以看下,上图左边的概述,就是我们如何把 Skip-Gram Model 如何映射到民宿场景中的:


  • 连续的浏览点击行为作为单一需求上下文 w(1),w(2)…w(t)….

  • 若两个行为间隔在半小时以上,则分到两个不同需求上下文中

  • 一个上下文中点击的房子作为正样本 wa ,跳过的房子作为负样本 wb

  • 当天下单的房子作为当天所有上下文的正样本 wa ,且权重更大(当作5个点击)

  • 正样本中任何一个房子可以作为输入 wi

  • 其前后2个正样本及下单房子作为输出中的正样本 wa

  • 采样一个上下文中跳过的8个房子作为输出中的负样本 wb

  • 补充采样上下文中目的地(可能多个)的若干个房子作为负样本 wb

  • 一个训练样本包括,输入:1个房子,输出:64个房子


模型训练



说一下我们的模型训练,百万级的房源,用 64 维的向量来表达,参数其实就是 E 矩阵和 W 矩阵,对 W 矩阵进行 L2 正则化,Batch size 为 1024,使用了 100 个 Epoch ,训练了 1 天,训练的样本量是由 800 万浏览点击上下文对应的 4000 万训练样本,700 万评估样本,采用 Tesla M40 训练平台。


可以看下我们的 loss 曲线,黄色为评估集,蓝色为训练集,可以看到这个曲线是比较符合预期的,没有太大的抖动,说明这样的方法合适民宿 Embedding 建模。



模型评估除了刚刚的 loss 曲线评估,我们还需要一些产品维度的评估,包括:预测准确率,单一维度相似性。右图为单一维度相似性的对比图。



我们再说个具体的例子,就是途家 app 列表页的一个变化。上图中红直线标出了几个房子位置发生了上移,原因是和作图中用户点击的房子具有相似性,直线上小字是相似度。



这个是我们在线 ABtest 的一个效果,可以看到蓝色是我们的上线日期,上线之后,有一个明显的转化率的提升。


另外我们还做了一个工具提供给供应链的同事使用,用来进行联想搜索,左上角是输入的房子,下面是根据 Embedding 最相似的若干房子:



三、改进


1. 落地中的一些技巧


关于训练集和训练参数:


  • 过滤掉停留时长太短的点击行为

  • 过滤掉点击数量太多的用户行为

  • 上下文不能太长: +/-2个点击,行为间隔<30分钟

  • 下单参与到用户当天所有上下文中

  • 负采样:

  • √ 一定要采样用户跳过没点的房子,数量不能比正样本多太多

  • √ 一定要采样同目的地的其他房子,数量和用户跳过房子相当

  • 学习率:足够小,自适应降低

  • L2正则化:针对 W ,采用较强的约束,batch-related:只把当前 batch 里出现的房子加入到 L2 正则项里。


2. 应用 Embedding 中的一些技巧


  • 数据后处理:

  • √ 预测前需要对所有 Embedding 向量规范化

  • √ 过滤掉在训练集中总出现次数小于10的房子

  • 推荐方案:对用户一天内最近5次点过的房子向量求均值,再求与候选房子的相似度

  • 冷启动问题:

  • √ 找到与新上房子最接近的房子小集合,对小集合中的 Embedding 向量求均值作为该新房子的 Embedding 向量

  • √ 小集合确定方法:在距离,房型,价格,图片分,面积,人数等已有数据方面尽量接近


3. Embedding 的迭代更新



说下比较重要的一点,就是训练一次生成百万级向量之后,过了一段时间,由于民宿增长非常快,每天都有很多新的民宿进来,过一段时间,我需要重新训练,这个代价是比较大的,就是说如果用新的训练样本去训练,可能以前的房子最近没什么人看,那么它的向量可能会丢失,我们的做法:


  • 收集最近2月的用户行为日志,生成新训练样本

  • 预加载上一版模型参数:



  • 新增的 p 个房子补充到参数矩阵末尾随机初始化:



  • 只用新训练样本进行训练,导出 Embedding 矩阵同步到线上推荐模型。


这样方式的特点:


  • 老的房子向量可以存留和持续更新

  • 及时加入新的房子向量


4. 预加载和重新学习的效果对比




然后我们对比一个房子,假设这个房子在新的训练集中不存在,只在老的训练集中存在,通过右图,可以看到,第二列是预加载后训练的模型,第三列是重新训练(不预加载参数进行训练),发现,如果把原来老房子的向量加到重新训练的 Embedding 矩阵中,其实没意义,可以看到第三列的相似度差了很多,基本上像在随机乱猜。可见预加载训练很有必要。


四、后续



我们优化的未来计划:


  • 引入丰富的行为类型,包括收藏,聊天,点评;聊天其实是比较重要的,用户下单前往往会和商户简单聊几句,如果发生聊天,我们会认为这是一个更重的正样本。

  • 考虑用户的时序行为,引入 Attention 机制。

  • 引入其他属性,作为副信息和 Embedding 一起学习,顺便把其他属性的 Embedding 也提取出来。


作者介绍


周文彪,目前担任途家网算法负责人, 专注于机器学习在商业场景的落地,参与和主持去哪网、途家网智能客服机器人,搜索推荐,运营智能化方面的工作, 为企业运营效率提升,和流量转化提升做出重要贡献。


本文来自 DataFun 社区


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247491647&idx=1&sn=787f20dad8e613c0f72142df6789d91d&chksm=fbd75253cca0db45abed1a13b555f358ce059b4e9477afaeb872cab12d4fc310f119d65f797a&scene=27#wechat_redirect


2019 年 7 月 04 日 08:003409

评论

发布
暂无评论
发现更多内容

支撑2715​亿元海量订单 揭秘京东大促背后的数据库基石

京东智联云开发者

数据库 数据仓库 云服务 云数据库

这才是图文并茂:我写了1万多字,就是为了让你了解AQS是怎么运行的

鄙人薛某

Java 并发编程 AQS 并发 ReentrantLock

【应用运维】公司业务迭代迅速,运维如何高效进行应用发布?

嘉为蓝鲸

可视化 PaaS 运维自动化 部署与维护 发布

厉害了!阿里内部都用的Spring+MyBatis源码手册,实战理论两不误

小Q

Java spring 学习 面试 mybatis

甲方日常 52

句子

工作 随笔杂谈 日常

响应式关系数据库处理R2DBC

程序那些事

MySQL R2DBC 程序那些事 响应式系统 响应式数据库

2020年底备战—从技术到面试合集

iOSer

ios 编程 面试题 大厂面试 面试题总结

为什么容器内存占用居高不下,频频 OOM

996小迁

Java 架构 容器 面试 k8s

区块链数字货币商城系统开发模式

薇電13242772558

区块链 数字货币

直播卖货已成趋势

anyRTC开发者

音视频 WebRTC RTC

解读登录双因子认证(MFA)特性背后的TOTP原理

华为云开发者社区

算法 totp 密钥

基于Vue实现一个有点意思的拼拼乐小游戏

徐小夕

Java GitHub H5游戏 H5 游戏开源

go-zero 如何扛住流量冲击(一)

Kevin Wan

go microservice go-zero goctl

渣本全力以赴33天,四面阿里妈妈(淘宝联盟),拿下实习岗offer

小Q

Java 学习 编程 架构 面试

.net core增强工作流组件,基于稳定平台,多项目整合开发

雯雯写代码

Java中NullPointerException的完美解决方案

Silently9527

java8 Optional

《程序员面试金典》.pdf

田维常

面试

SQL数据库集合运算

大规模数据处理学习者

SQL表联结 SQL集合运算

数字货币交易所开发源码,币币撮合交易系统搭建

WX13823153201

什么是服务器租用?

德胜网络-阳

这份算法攻略,我拿到了5个大厂的offer

yes的练级攻略

面试 算法 笔试

6个JDK自带JVM调优工具,一次性打包给你说清楚

田维常

jvm调优

接口测试并不只是测试参数和返回值

测试人生路

接口测试

SpringBoot-技术专题-Hystrix学习介绍

李浩宇/Alex

【JVM】肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!

冰河

性能优化 内存模型 JVM 堆栈 JVM笔记

容器和虚拟机到底有啥区别?

网管

容器 虚拟机 容器化

微服务架构中的“参天大树”:SpringBoot+SpringCloud+Docker

小Q

Java 学习 容器 面试 微服务

影视剪辑类自媒体运营心得:如何抓住观众的痛点

石头IT视角

Vokenization:一种比GPT-3更有常识的视觉语言模型

脑极体

Java中的线程与C++中的区别

jiangling500

Java c++ 线程

2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕

阿里云视频云

架构 云直播 直播 流媒体 直播架构

Embedding 技术在民宿推荐中的应用-InfoQ