Luyang Wang, Kai Huang, Jiao Wang, Shengsheng Huang, Jason Dai作者

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

利用 Analytics Zoo 提供 的 RayOnSpark 功能,使用 Ray , Apache Spark 和 Apache MXNet 构建了一个完整的端到端的推荐系统。Burger King 成功部署了这套推荐系统,并且已经在生产环境中取得了卓越的成果。

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

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

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

此外,我们利用 Analytics Zoo 提供 的 RayOnSpark 功能, 使用 Ray , Apache Spark Apache 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:TxT模型结构

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 SequenceTransformer
sequence_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 TxT
net = 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 Zoo RayOnSpark 之上构建了我们的推荐系统,将 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 Learning GRU4Rec )。相比 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 )的流水线。 模型和 RayOnSpark 均已在 Analytics Zoo 项目中开源。

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

Analytics Zoo是一个统一的大数据分析+AI平台,它无缝地将Spark、TensorFlow、Keras和BigDL程序集成到一个整合的流水线中,可以透明地扩展到大型Apache Hadoop/Spark集群,用于分布式训练或预测,方便用户构建深度学习端到端的应用。通过该专栏希望和大家一起探讨AI在实际生活中各个领域的创新。

工程SparkRayMLBigDataAI
1
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

Apache Spark技术

Apache Spark是一款快速、灵活且对开发者友好的工具,也是大型SQL、批处理、流处理和机器学习的领先平台。它是一个围绕速度、易用性和复杂分析构建的大数据处理框架,提供了一个全面、统一的框架用于管理各种不同性质(文本数据、图表数据等)数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。

数据清理技术

数据清理(data cleansing)指删除、更正数据库中错误、不完整、格式有误或多余的数据。数据清理不仅仅更正错误,同样加强来自各个单独信息系统不同数据间的一致性。专门的数据清理软件能够自动检测数据文件,更正错误数据,并用全企业一致的格式整合数据。

推荐系统技术

推荐系统(RS)主要是指应用协同智能(collaborative intelligence)做推荐的技术。推荐系统的两大主流类型是基于内容的推荐系统和协同过滤(Collaborative Filtering)。另外还有基于知识的推荐系统(包括基于本体和基于案例的推荐系统)是一类特殊的推荐系统,这类系统更加注重知识表征和推理。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

MXNet技术

MXNet是开源的,用来训练部署深层神经网络的深度学习框架。它是可扩展的,允许快速模型训练,并灵活支持多种语言(C ++,Python,Julia,Matlab,JavaScript, Go,R,Scala,Perl,Wolfram语言)

A/B 测试技术

一种统计方法,用于将两种或多种技术进行比较,通常是将当前采用的技术与新技术进行比较。A/B 测试不仅旨在确定哪种技术的效果更好,而且还有助于了解相应差异是否具有显著的统计意义。A/B 测试通常是采用一种衡量方式对两种技术进行比较,但也适用于任意有限数量的技术和衡量方式。

推荐文章
暂无评论
暂无评论~