面对强烈竞争,简直每个零售商都在致力为客户提供量身定制的个性化体验。但在失当的工夫,通过失当的渠道,将失当的产品,以失当的形式,举荐给失当的客户……这真想做好谈何容易!
来自美国底特律的初创公司 StockX 次要围绕运动鞋和街头潮牌服饰发展本人的业务,他们致力于通过独特的交易双向报价变革现有电商销售模式。为了用更加个性化的体验吸引客户,他们通过宽泛比照和评估,决定基于 Amazon Personalize 服务来打造本人的个性化举荐引擎。
借助本文,StockX 公司的 Sam Bean 与 Nic Roberts II 将分享本人在构建该个性化举荐引擎过程中,后期技术选型、架构设计、施行等工作中取得的教训和考量。
===
2019 年,StockX 公司正经验调整增长,咱们的机器学习(ML)工程师小组也开始尝试应用 Amazon Personalize 在主页上增加产品举荐行。最终,这项新性能成了主页上最受欢迎的局部。在本文中,咱们将分享 StockX 应用 Amazon Personalize 的整个过程,探讨如何借此提供杰出的定制化用户体验。
咱们的市场动态须要提供个性化的用户体验。StockX 网站的流量激增,在很大水平上源自相干商品市场供应量的降落。没错,在运动鞋与街头潮牌服饰市场上,最受欢迎的肯定是那些须要提前预订的限量版产品。尽管客户对于产品多样性的谋求始终在减少,但最受关注的永远是那些稀缺、简直买不到的商品。这导致咱们的平台经验一波又一波相似于 DDoS 的非法流量,让咱们意识到后端的规模伸缩能力曾经成为顺利开展业务的基本前提。另外,咱们的团队还打算在彩色星期五之前上线产品举荐行性能。这就须要基于弱小的举荐引擎 —— 该引擎须要具备良好的扩大能力,并能够实时变动以适应一直变动的客户用意。
在公司成立的三年当中,咱们逐步将用户体验的个性化视为外围倒退指标。咱们的客户群体曾经从单纯的运动鞋爱好者,稳步发展领有越来越多休闲及新潮设计服饰的客户。感恩节购物季则为咱们提供绝佳机会,以更具个性化的体验吸引这些新客户,最终进步整体客户忠诚度。只管行将到来的 2019 年假期给咱们的打算减少了额定的限度,但 Amazon Personalize 切实帮忙咱们为一直倒退的用户群体打造精心设计且引人入胜的体验,最终顺利应答季节性流量激增带来的一系列挑战。
晚期阶段
咱们的团队最后打算寻求第三方供应商来填补平台中的个性化缺失环节。然而,购买现成解决方案不仅老本昂扬,而且对于咱们独特的电商业务而言也短少灵活性。咱们须要更大的灵便施展空间,但又不太可能单纯依附外部自建形式搞定全副难题。
接下来,咱们开始思考构建起与 Amazon Personalize 外围举荐引擎(分层循环神经网络,简称 HRNN)相似的自定义神经网络。尽管咱们的团队具备自主建模能力,但却须要思考一系列令人头痛的因素:健壮性、可扩展性以及开发周期等等。咱们须要争分夺秒地构建优质服务,为咱们的客户提供引人入胜的体验并在假期购物季降临前及时将其上线。为了明确到底是自建模型还是间接抉择现成解决方案,咱们列举了构建机器学习微服务架构的根本要求。通过整顿,咱们的具体要求如下:
- 数据收集 —— 建设高性能举荐程序的第一步,天然是对网站进行正确跟踪。除了通过考察、评级以及偏好设置等形式收集明确的客户爱好指标之外,咱们还须要思考从原始点击流中提取隐式证据,借此建设起更加精彩的应用体验。而收集点击流数据,也成为创立高性能举荐程序的重要根底。
- 数据地位 —— 在收集到正确的数据类型之后,下一步就是为该数据确定精确的存储地位。为此,咱们须要找到点击流与产品目录数据所在的地位,并获取拜访权限。
- 数据整顿与特色工程 —— 在找到数据源与存储地位之后,接下来须要找到其中真正有价值的局部。这是一项高度依赖于教训的过程,因为在进行理论尝试之前,咱们往往很难预判算法如何从数据当中提取信号。
- 模型开发 —— 这一步也是整个开发生命周期当中,数据迷信元素最为密集的局部。大多数团队会以 Notebook 中的原型为终点,逐渐尝试解决业务问题,而后以面向对象的形式进行模型训练。这一步骤与之前各步骤相互依存,前者中的数据可用性也将间接影响候选模型集的理论组成。
- 模型测试与评估 —— 在实现模型训练之后,必须启用疾速合理性测验以执行定性分析,借此补充训练指标。咱们倡议大家创立一款小型的可视化应用程序,用于在模型提出的举荐内容旁边提醒用户正在与哪些产品进行交互。这能让咱们更直观地扫视不同算法及超参数设置对举荐后果产生的影响,同时联合业务教训对其进行比拟。
- ETL 开发 —— 在确定数据中的次要特色之后,咱们还应该建设一套自动化 ETL 体系,用于提取原始数据、执行特色工程,并将数据搁置在生产训练程序可能轻松拜访的地位。这一步至关重要,因为 ETL 中的任何轻微谬误都可能拉低输出数据品质、最终影响输入后果的置信度。更可怕的是,这类谬误往往很难在训练完结后、输入可视化之前被检测进去。
- 后端服务开发 —— 将模型推理机制与后端服务打包在一起,能够显著改善监控、稳定性与抽象性程度。对咱们来说,这也是一条重要的「防护堤」,避免流量的适度涌入。咱们在 AWS Lambda 中抉择了无服务器解决方案,将 getRecommendations API 打包在 Amazon Personalize 当中。
- 生产部署 ——CI/CD 等自动化流程,用于训练并部署模型的最新版本,保障举荐后果始终合乎客户的理论需要。一旦这一步骤呈现问题,可能导致举荐后果过期,最终升高客户参与度。在实现这一部分之后,咱们的机器学习微服务架构也就构建实现了。
构建本地解决方案,意味着咱们须要从头开始实现以上八个具体步骤。Amazon Personalize 提供自动化特色工程与模型开发(步骤 3 和 4)性能,帮忙咱们疾速搞定这两个最为耗时的环节。应用 Amazon Personalize 提供的规范 HRNN(一套由 Amazon 自身应用过的、通过重重考验实际模型),咱们的用例只须要一套仅蕴含五列数据的简略数据集即可开始训练。将这两个步骤交由 Amazon Personalize 之后,咱们得以专一于实现弱小的 ETL、后端与生产部署零碎。此外,咱们还省下了更多工夫用于实现第 5 步中提到的可视化流程 —— 这是以往须要开发残缺技术栈时,咱们基本不敢设想的。当然,间接应用 Amazon Personalize 也会带来肯定斗争,意味着对于咱们的算法,咱们将无奈用 Amazon Forecast 内置办法以外的伎俩进行针对性调整。
这天然在咱们的团队外部引发强烈探讨:咱们到底是该承当起昂扬的老本,以换取对模型的齐全管制;还是以可调整性为代价,齐全信赖 AWS 提供的解决方案?最终,咱们决定信赖 AWS 在构建企业级机器学习模型方面的业余程度。咱们的团队预见到,外部开发的深度学习推理引擎在可扩展性方面肯定会带来微小危险。如果不拿出工夫进行负载测试,咱们将很难计量估算大规模流量涌入时零碎的理论弹性,这将把 StockX 的整体业务置于随时可能解体的危险地步。另外,生产型深度学习微服务架构是个绝对较新的议题,与此相关的文献资料并不丰盛,这也导致问题变得更加简单。
开发
在决定将举荐程序的外围模型开发与生产推理扩大到 AWS 之后,咱们开始应用 Amazon Personalize 进行开发,并很快感触到将其集成至全扩大机器学习管道所带来的卓越便捷性。下图所示,为这套解决方案架构的根本状况。
咱们将 Amazon Personalize 插入两局部代码库当中,这两套代码库别离用于创立数据集以及配置 Amazon Personalize 基础设施。以此为根底,咱们胜利实现了由 Amazon Personalize 驱动的实时举荐引擎的创立、部署与从新训练流程的全面自动化。
创立数据集
Amazon Personalize 为用户提供多种选项,可能依据用户特色与举荐引擎的特定利用形式进行抉择。局部配置选项容许咱们在模型训练过程中考量用户特色(例如 HRNN 元数据),另一部分配置则只关注平台上各用户间的交互(与繁多特色 /HRNN 无关)。咱们对具体配置的抉择,决定了训练数据集的理论构建形式,以及最终将向 Amazon Personalize 提供多少训练数据集以建设模型解决方案。
咱们首先开发出用于训练及测试所有三种 HRNN 变体(纯文本、元数据以及冷启动)的根底,并对后果做出比拟。在增加元数据集时,咱们刚开始并未发现举荐方面的重大改良,而且发现 HRNN – 冷启动在未进行额定特色工程开发的状况下并不能生成天然的举荐后果。尽管咱们狐疑在元数据特色工程方面投入更多精力兴许能最终进步性能,但咱们仍决定尝试其余更为简略、且同样无望提供高质量举荐的解决方案。
要应用 Amazon Personalize HRNN 配置,咱们须要为其提供繁多数据集,并在其中蕴含任意时段之内的用户交互行为。这套交互行为数据集将蕴含并定义影响外围举荐算法的训练特色。对于像 StockX 这样的电子商务平台,这种交互行为特色可能体现为产品页面浏览量、搜寻后果点击流或者与购买行为相干的操作等指标。
为了构建起交互行为数据集,咱们创立了一条自动化 Python ETL 管道以查问咱们的点击流数据源与产品目录、解决交互数据以提取所需特色,并最终执行 CSV 格式化操作以反对 Amazon Personalize 的数据提取要求。因为 Amazon Personalize 原生反对从 Amazon Simple Storage Service (Amazon S3) 导入数据集,因而创立这样的自动化管道并不艰难,咱们能够节俭大量工夫和精力来思考如何抉择最佳配置以及最佳交互时段。
主动创立 Amazon Personalize 基础设施
接下来,咱们开始着手对 Amazon Personalize 整体基础设施进行自动化构建。大家当然能够在 AWS 管理控制台上手动创立 Amazon Personalize 服务,但配合 AWS SDK for Java,咱们可能在规模更大的举荐服务管道中实现全自动与可反复能力。在这里,咱们抉择 Scala 作为客户端以创立 Amazon Personalize 基础设施,具体蕴含以下内容:
- 数据集组
- 数据集
- 导入作业
- 解决方案
- 解决方案版本
- 实时营销
对于一次性训练来说,在管制台上构建基础设施的确更为简略;但要打造出一套真正的全自动可复用管道,SDK 相对是不二之选。
部署策略
更重要的是,咱们的 Scala 客户端还能够承当对生产部署流程进行仲裁的额定职能,确保对举荐模型的从新训练不会造成停机情况。随着用户与平台的继续交互,有必要对模型进行从新训练,从而及时退出新的交互行为并据此提供新的举荐。在进行日常训练时,通过新的交互数据从新训练模型会使得营销端口处于离线状态,导致长时间服务中断。咱们能够建设两个独立的实时营销端口(以及计划版本)来缓解这个问题,但代价昂扬 —— 它意味着即便不提供任何实时流量,咱们都须要为各端口领取对应的 AWS 费用。
为了解决这种部署问题并建设更具老本效益的微服务架构,咱们建设起独特的部署策略 —— 采纳 Lambda 函数居中调度。该函数负责拜访营销端口并向前端客户端提供举荐内容。咱们还将一套非凡的数据集组标签(下图最左侧的两个框体)打包成为 Lambda 的一个环境变量,用于标识以后处于活动状态并解决生产负载的营销端口。
每天夜间,Scala 客户端会启动新的训练作业,并首先查看 Lambda 环境变量中的实时数据集组信息。客户端将加载新的交互数据集,重建休眠数据集组,而后在端口上执行心跳查看以保障端口创立胜利。接下来,客户端会批示 Lambda 函数更新其营销相干环境变量并指向新的端口。最初,不再应用的 Amazon Personalize 基础设施将被撤销。
通过这种形式,咱们的微服务架构可能主动高效对 Amazon Personalize 模型进行从新训练,每天更新用户举荐内容,且不会带来低廉的冗余收入或者任何服务停机问题。另外,应用 Lambda 函数还容许咱们启用自定义指标对系统进行跟踪与故障监控,及时公布训练问题或端口流动谬误告警。这种围绕 Amazon Personalize 精心设计的弱小的基于微服务的部署策略,使得 StockX 的举荐引擎即便在在公司成立至今有史以来最为忙碌的购物季期间也实现了近乎完满的可用性。具体架构如下图所示。
实时能力
在实现了训练与部署流程的设计之后,咱们只剩下最初一个问题须要解决:如何在不同训练执行轮次之间,随用户趣味的变动更新举荐内容。Amazon Personalize 在这方面提供一套简略的解决方案,即事件交互数据集。咱们应用 Amazon Personalize putEvents API 将点击流事件增加到模型当中。点击流作为源端将事件实时推送至 Lambda 函数,函数将事件归集为 Amazon Personalize 所需的特定格局。事件被增加至数据集后的几秒内,举荐内容即可取得相应体现。下图所示,为这一工作流的根本状况。
测试与部署
咱们的公布打算当初曾经成为 StockX 公司的外部规范 —— 通过设置 A / B 测试的特色标记进行「向您举荐」主页的部署,这使得团队在初始阶段能够平安地执行金丝雀测试,将该性能仅公布给 1% 的用户。最终,咱们的测试范畴将涵盖 60% 的用户 —— 其中 30% 的用户持续取得原有体验,30% 的用户则取得个性化首页体验,另外 40% 用户不受测试影响。在逐渐扩充性能涵盖范畴的过程中,咱们发现错误率或提早并没有随之增长。为了保障万全,咱们进行了为期两周的测试。
只管「向您举荐」显示在首页中的第二行地位,但其点击率却超过了显示在最顶端的「最受欢迎」行。按百分比计算,「向您举荐」曾经成为咱们体现最好的购买通道。受其影响,咱们整个主页的总体客户参与度进步了 50%,这证实个性化、甚至只是繁多页面的个性化,也足以大大晋升其余商品的点击率。
个性化始终是企业高管团队的外围战略目标之一。而咱们的举荐引擎,则是其中最要害的成绩。与负责产品发现体验的产品负责人独特制订战术策略。作为独角兽初创企业的咱们粗浅意识到个性化的重要性,并通过 A / B 测试实际证明了个性化的弱小能力。在取得初步成绩之后,困扰咱们的曾经不再是要不要推广个性化,而是如何保障个性化元素浸透至 StockX 客户体验的每一个角落。机器学习团队始终是 StockX 外部最具数据驱动能力的工程团队之一,通过试验也展示了基于测试 KPI 如何确保咱们以可掂量的形式改善客户的理论体验。
总结
在我的项目施行期间,机器学习团队播种许多对于构建机器学习微服务架构的常识。咱们将这些心得体会总结如下:
- 尽早集成 —— 在我的项目生命周期中尽早搭建可行的演示十分重要。即便是简略的举荐算法,也会给各相干方留下粗浅的印象,并帮忙咱们顺利争取到外部资源与更高的我的项目优先级。
- 可视化 —— 可视化工具对于机器学习模型的测试至关重要。单纯将原始产品 ID 作为完整性检查对象还远远不够,咱们须要同时提供举荐产品的图片与隐性关联证据,借此评估举荐程序的实际效果。
- 防止适度简单 ——Amazon Personalize 提供多种机器学习框架选项,各选项在复杂度方面也有着微小差别。咱们也曾尝试从简单的配置起步,并发现很难了解其为何会提出一些奇怪的举荐。而从简略的 HRNN 起步,咱们得以疾速开发出效果显著的例子。
- 估算老本 —— 机器学习老本昂扬。请保障对于相应估算需要有明确的预计。除了云基础设施应用老本之外,开发人员为此投入的工夫也是一种重要的老本形成元素。
- 理解扩展性 —— 要构建本人的深度学习举荐程序,请首先确保对推理作业的扩展性充沛理解。发现自己辛苦搭建的解决方案不能满足流量峰值期间的业务要求是一件令人丧气的事。
- 彻底消除手动操作 —— 机器学习微服务架构相较于传统后端服务架构,蕴含更多组成部分。主动解决管道中的各个环节 —— 只有还有任何一部分 ETL 或者部署流程须要人工干预,思考潜在的谬误。机器学习的工程局部曾经相当艰难了,防止引入人为操作故障。
「向您举荐」成为咱们团队乃至整个 StockX 公司的一次巨大胜利。咱们开始迅速将机器学习技术整合至企业中的各个层面。而咱们取得的胜利,也使得企业决策者批准在更多 StockX 体验场景当中集成 Amazon Personalize,并不断扩大咱们在机器学习畛域投入的精力。能够必定地讲,个性化现在曾经成为 StockX 外部的头等大事。
咱们的团队在这次假期购物季的几周之前着手我的项目开发,并在购物季到来时及时将其上线。能够骄傲地说,在 Amazon Personalize 的帮忙下,咱们的微服务架构在整个假期当中都体现出近乎完满的可用性。