写点什么

Burger King 使用 RayOnSpark 进行基于实时情景特征的快餐食品推荐

  • 2020 年 8 月 12 日
  • 本文字数:4421 字

    阅读完需:约 15 分钟

Burger King使用RayOnSpark进行基于实时情景特征的快餐食品推荐

基于深度学习的推荐模型已广泛应用于各种电商平台中,为用户提供推荐。目前常用的方法通常会将用户和商品 embedding 向量 连接起来输入 多层感知器 ( multilayer perceptron )以生成最终的预测。但是,这些方法无法捕获实时用户行为信号,并且没有考虑到重要的 情景特征 (例如时间和位置等)的影响,以致最终的推荐不能准确地反映用户的实时偏好,这个问题在快餐推荐的应用场景中更为重要,因为:


  1. 如果当用户的购物车中已经添加了饮料时,用户不太可能再购买其他饮料。

  2. 用户的购买偏好会在给定的地点、时间和当前的天气条件下发生很大变化。例如,人们几乎从不在半夜给孩子们买食物,也不太可能在寒冷的雨天购买冰镇饮料。


在此文章中,我们介绍了 Transformer Cross Transformer ( T x T )模型,该模型可以利用到实时用户点餐行为以及情景特征来推断用户的当前偏好。该模型的主要优点是,我们应用了多个 Transformer编码器来提取用户点单行为和复杂的 情景特征 ,并通过点积的方法将 Transformer 输出 组合在一起以生成推荐。


此外,我们利用 Analytics Zoo提供 的 RayOnSpark功能, 使用 Ray, Apache SparkApache MXNet 构建了一个完整的端到端的推荐系统。它将数据处理(使用 Spark )和分布式训练(使用 MXNet 和 Ray )集成到一个统一的数据分析和 AI 流水线中,并直接运行在存储数据的同一个大数据集群上。我们已经在 Burger King成功部署了这套推荐系统,并且已经在生产环境中取得了卓越的成果。


T x T 推荐模型

我们提出了 Transformer Cross Transformer ( T x T )模型,该模型使用 Sequence Transformer 对客户订单行为进行编码,使用 Context Transformer 对 情景特征 (例如天气,时间和位置等)进行编码,然后使用 点积的方式 将它们组合(“ cross ”部分)以产生最终输出,如图 1 所示。我们利用 MXNet API 实现了我们的模型代码。



1: T x T 模型结构


Sequence Transformer 我们基于 Transformer架构创建了一个 Sequence Transformer ,用于学习客户购物车中包含每件产品加入顺序信息的 embedding 向量 ,如图 1 的左下部分所示。为了确保商品位置信息可以在其原始的 购物行为 中得到考虑,除了商品特征 embedding 之外,我们还对商品进行基于位置的 embedding 。两个 embedding 的输出加在一起,输入到一个 multi-head self-attention 神经网络 中。


为了从每个商品的隐藏向量中提取客户整个购物车信息的向量表示,我们将 mean-pooling 和 max-pooling 分别与最终 Sequence Transformer 的输出连接起来。通过这种方式, pooling 层的输出既考虑到了在 购物车 中包含的所有产品,同时又专注提取了少数关键产品的显著特征。


Sequence Transformer 可以使用 Analytics Zoo 中的 API 直接构建,如下:


from zoo.models.recommendation import SequenceTransformersequence_transformer = SequenceTransformer(                                  num_items=num_items,                item_embed= 200 ,                item_hidden_size= 200 ,                item_max_length= 10 ,                item_num_heads= 4 ,                item_num_layers= 2 ,                item_transformer_dropout= 0.1 ,                               item_pooling_dropout= 0.1 ,               cross_size= 100 )item_outs = sequence_transformer(input_items, padding_mask)  

复制代码


Context Transformer 合并情景特征的一种常见方法是将它们与带时间序列 的输入特征 直接连接起来。但是简单地将 非时间序列的 特征与 时间序列的 特征连接起来的意义不大。以前的一些解决方案使用相加来处理多个 情景特征 ,然而 简单的相加 只能综合多个情景特征对输出做出的贡献,但大多数情况下,这些 情景特征 对用户最终决策的贡献并不相等。


因此,我们使用 Context Transformer 对情景特征进行编码,如图 1 右下方所示。使用 Transformer 的 multi-head self-attention ,我们不仅可以捕获每一个 情景特征 的影响,还可以捕获不同 情景特征 之间的内部关系和复杂的交互作用。


Context Transformer 可以使用 Analytics Zoo 中的 API 直接构建,如下:


context_transformer = ContextTransformer(                              context_dims=context_dims,              context_embed= 100 ,                context_hidden_size= 200 ,               context_num_heads= 2 ,                              context_transformer_dropout= 0.1 ,               context_pooling_dropout= 0.1 ,               cross_size= 100 )context_outs = context_transformer(input_context_features)  
复制代码


Transformer Cross Transformer 为了联合训练 Sequence Transformer 和 Context Transformer ,我们在这两个 transformer 输出之间做 点积 进行联合训练,同时优化商品的 embedding , 情景特征 的 embedding 及其交互的所有参数。最后我们使用 LeakyRelu 作为激活函数,使用 softmax 层来预测每个候选商品的概率。


T x T 由 Sequence Transformer 和 Context Transformer 组成,可以使用 Analytics Zoo 中的 API 直接构建,如下:


from zoo.models.recommendation import TxTnet = TxT(num_items, context_dims, item_embed= 100, context_embed= 100 ,           item_hidden_size= 256 , item_max_length= 8 , item_num_heads= 4 ,           item_num_layers= 2 , item_transformer_dropout= 0.0 ,                     item_pooling_dropout= 0.1 , context_hidden_size= 256 ,           context_max_length= 4 , context_num_heads= 2 ,                     context_num_layers= 1 , context_transformer_dropout= 0.0 ,                     context_pooling_dropout= 0.0 , activation= "leakyRelu" ,                    cross_size= 100 ) 
net .hybridize(static_alloc=True, static_shape=True) output = net(sequence, valid_length, context)
复制代码


端到端的系统架构 通常情况下,构建一个完整的推荐系统会建立两个单独的集群,一个集群用于大数据处理,另一个集群用于深度学习(例如,使用 GPU 集群)。但这不仅会带来跨集群数据传输的巨大开销,而且还需要在生产环境中去管理独立的系统和工作流。为了应对这些挑战,我们在 Analytics ZooRayOnSpark之上构建了我们的推荐系统,将 Spark 数据处理和使用 Ray 的 分布式 MXNet 训练集成到一个统一的流水线中,直接运行在数据存储的集群上。


图 2 展示了我们系统的总体架构。Spark 的程序中,在 Driver 节点上会创建一个 SparkContext 对象去负责启动多个 Spark Executor 来运行 Spark 任务。 RayOnSpark 会在 Spark Driver 上 另外创建一个 RayContext 对象,去自动把 Ray 进 程和 Spark Executor 一起启动,并在每个 Spark Executor 里创 建一个 RayManager 来管理 Ray 进程(例如, 在 Ray 程序退 出时自动关闭进程)。



2: 基于 RayOnSpark 的推荐系统流水线架构


在我们的推荐系统中,我们首先启动 Spark 任务去读取存储在分布式文件系统上的餐厅交易数据,然后使用 Spark 对这些数据 进行数据清理, ETL 和预处理。 Spark 任务完成后,我们将处理后在内存中的 Spark RDD通过 Plasma直接输入给 Ray 进行分布式训练。


参考 RaySGD的设计,我们实现了 MXNet Estimator,它提供了一个轻量级的 wrapper ,可以在 Ray 上自动地部署分布式 MXNet 训练。 MXNet worker 和 parameter server 都是用 Ray actor 实现和 运行的,它们之间通过 MXNet 提供的分 布式 key-value store 来相互通信,每个 MXNet worker 从 Plasma 中拿取本地节点上的部分数据来训练模型。通过这种方式,用户就可以使用下面简单的 scikit-learn 风格的 API, 通过 Ray 无缝地将 MXNet 的模型 训练代码从单个节点扩展到生产集群:


from zoo.orca.learn.mxnet import Estimator
mxnet_estimator = Estimator(train_config, model, loss, <br>metrics, num_workers, num_servers)
mxnet_estimator.fit(train_rdd, validation_rdd, epochs, batch_size)
复制代码


这种统一的设计架构将基于 Spark 的 数据处理和基于 Ray 的分布式 MXNet 训练集成到一个端到端的、基于内存的流水线中,能够在存储大数据的同一集群上直接运行。因此,构建整个 推荐系统的 流水线我们只需要维护一个集群,避免了不同集群之间额外的数据传输,也不需要额外的集群维护成本。这样充分地利用了现有的集群资源,并且显著地提升了整个系统的端到端性能。


模型评估 我们使用了过去 12 个月中 汉堡王 客户的交易记录进行了离线的实验,其中前 11 个月的历史数据用于训练,最后一个月的数据用于验证。我们用这些数据对模型进行训练,让模型能够预测客户下一个最有可能购买的产品。从图表 1 中,我们可以看到我们的 T x T 优 于其他用于推荐的基准模 型(包括 Association Rule LearningGRU4Rec)。相比 GRU4Rec ,我们可以看到, T x T 能 利用各种 情景特征 大大提高了 预测的 准确性 (Top1 和 Top3 准确 率分别提升了约 5.65 %和 7.32 %)。


选用的模型Top1准确率Top3准确率
1Association Rule Learning20.14%35.04%
2GRU4Rec30.65%45.72%
3Transformer Cross Transformer (T x T)35.03%53.04%


图表 1: 不同推荐模型的离线训练结果


为了评估我们的模型在实际生产环境中的有效性,我们在 Burger King 的手机客户端上同时对比了 T x T 模型和 Google Recommendation AI*提供的推荐模型 。我们从推荐转化率和附加销售额的提升这两个方面评估了不同模型的在线效果,在生产环境做了 4 周的 A/B 测试。我们随机选择了 20 %的用户作为对照组,为他们提供之前在生产环境使用的基于规则( Rule Based )的推荐系统。如图表 2 ,与对照组相比, T x T 将下单页面上的推荐转化率提高了 264 %,附加销售额提高了 137 %。与运行 Google Recommendation AI 的测试组相比, T x T 进一步提高了 100 %的转换收益和 73 %的附加销售收益。


推荐系统转化率提升附加销售额提升
Rule Based Recommendation (Control)0%0%
Google Recommendation AI+164%+64%
Transformer Cross Transformer (T x T)+264%+137%


图表 2: 不同推荐解决方案的在线结果


结论 这篇文章描述了我们如何在 Burger King 的生产环境 中构建一个端到端的推荐系统。我们通过 Transformer Cross Transformer ( T x T )模型成功地捕获了用户订单行为和复杂的 情景特征为用户做合适的推荐 ,并且使用 RayOnSpark 实现了统一的数据处理(使用 Spark )和 深度学习模型 训练(使用 Ray )的流水线。 TxT模型和 RayOnSpark均已在 Analytics Zoo项目中开源。


  • 其他名称和品牌可能是其他所有者的财产


作者简介


Luyang Wang (lwang1@rbi.com), Kai Huang (kai.k.huang@intel.com), Jiao Wang (jiao.wang@intel.com), Shengsheng Huang (shengsheng.huang@intel.com), Jason Dai (jason.dai@intel.com)


2020 年 8 月 12 日 10:421339

评论

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

为什么要云原生?

Aaron_涛

架构 云原生

程序员的修行之路-培养工作兴趣

牧马人

程序员

云上数据库类产品的模式与发展趋势

韩超

数据库 redis 腾讯云 阿里云

健康饮食和定期运动带给我们的一点启示

董一凡

生活质量

用友2019财报:你们看到的是数字,我却看到了office

人称T客

SaaS生态比拼,谁会是这场PK中的主角?

人称T客

首厚智能:嵌入 SpreadJS 表格组件,搭建实验室信息管理系统(LIMS)

Geek_Willie

SpreadJS 实验室管理系统 Lims

用Serverlss部署一个基于深度学习的古诗词生成API

刘宇

自然语言处理 学习 Serverless

汇总一下Intellij IDEA常用的牛逼插件

公众号:V5codings

k8s上运行我们的springboot服务之——简单的架构思考

柠檬

k8s springboot

科学理论的反思

美多丽可

学习

Linux 常用命令

Jayli

Linux

市场调研分析师走向末法时代

人称T客

《3个月9门课,谈下我的极客时间学习活动的心得》

王伟鹏

乙己说:NUMA是个啥?

再见小飞侠

jdk G1 ZGC 内存

3亿办公族合力,第三代SaaS抵达战场

人称T客

金蝶2019财报在此——比头条更精彩

人称T客

BPM产业数字观察:中国市场趋向成熟,蛰伏的BPM即将醒来

人称T客

忙于数字化转型,你避坑了吗?

人称T客

5天掌握以太坊 dApp 开发

陈东泽 EuryChen

比特币 区块链 智能合约 以太坊 dapp

python实现·十大排序算法之冒泡排序(Bubble Sort)

南风以南

Python 排序算法 冒泡排序

一文搞懂Spring依赖注入

麦洛

c++代码整洁之道

圣保罗爷爷

c c++ C#

JVM源码分析之JVM启动流程

猿灯塔

KubeSphere权威指南(一)--------使用KubeSphere创建Percona Server,并对外暴露端口

赵欣

k8s percona server

k8s上运行我们的springboot服务之——热点数据

柠檬

redis

程序员的修行之路-人生是一场修行

牧马人

程序员

教你快速升职加薪(毒鸡汤,慎服……)

无箭的丘比特

团队管理 企业文化 个人成长 团队建设

kube-prometheus抓取jvm监控指标

天飞

Java JVM Prometheus kubernete

极客时间学习心得:用分类和聚焦全面夯实技术认知

Anfernee Hu

学习

永中云转换新升级 文档在线预览增添更多选择

DT极客

Burger King使用RayOnSpark进行基于实时情景特征的快餐食品推荐_AI_汉堡王公司数据科学部门_InfoQ精选文章