使用Vowpal Wabbit个性化大数据产品指南

你好 我叫Nikita Uchetelev。 我代表Lamoda研究与开发。 我们有20余人,我们正在现场和应用中研究各种建议,我们正在搜索,确定目录中的商品分类,我们提供了进行各种功能的AB测试的可能性,我们还支持一些内部开发,例如用于预测需求弹性和优化交付物流的系统。


图片


未来几年,整个公司发展的主要方向之一是我们的产品和服务的个性化。 从汇编个人产品选择到选择特定的销售代表将您的商品交付给您,此类计划在各地都得到测试和实施。 作为研发产品个性化过程的一部分,我担任团队负责人,在本文中,我想谈谈我和我的团队去年设计和开发的平台,以及目前正在接受AB测试的首批个性化研发产品。


产品推荐思想


任何人都熟悉的在线商店的属性是产品页面。 它通常提供详细说明,几张大照片,客户评论,“添加到购物车”按钮以及其他熟悉的导航元素。 这些页面的底部是一个或多个与其他产品(称为“相关产品”,“购买此产品”或其他产品)的货架。 每个架子都有自己的用途。


例如, 具有类似产品货架被设计为在当前选择的上下文中为用户提供更多种类的产品。 如果库存中没有用户规模,或者如果他处于选择阶段并且想要相同的产品,但“带有珍珠纽扣”,这将很有用。 同时,货架将买方带离产品页面,他可能不再返回该产品页面,因此不再购买。


网站和Lamoda应用程序中都有第二个架子,我们称之为交叉推荐架子 。 它位于装有类似商品的货架的正下方,我们尝试在其上放置与当前SKU(存货单元或更简单的商品)一起在购物车中最常发现的异类商品。 因此,例如,建议将裤子和鞋子用于外套,围巾和帽子作为毛衣。 有一组最便宜的便宜商品。 通常,它们是袜子和内衣,因此通常可以在此架子上看到它们。


这种销售技巧类似于销售。 如果用户喜欢当前产品,我们将尝试出售一些大型的补充产品。 同时,这是客户可以了解我们的产品系列的少数几个地方之一。 例如,查看他们不知道其存在的品牌或子类别。 我们称其为“ 灵感与发现” -当我们激励客户进行新购买并告诉我们我们的产品范围时,我们会显示价格和折扣。
图片


从历史上看,这些货架的填充是脱机计算的(有余量,以防某些产品在下一次计算之前缺货),并通过某种相似性度量或条件转换进行排序。 因此,所有用户在白天看到的东西大致相同。 我们决定从这些架子上开始个性化实验,因为在产品页面上,我们有足够的流量来进行质量实验。 从技术角度来看,这是在我们的基础结构中最方便实施的地方之一(在图中用红色标记)。
图片


想法是这样的 :我们训练一种模型,该模型可以为“用户+产品”对分配转化概率或仅单击一次,然后以该概率从左到右的顺序在架子上显示它们。 由于在圆盘传送带的第一个屏幕上仅显示4到6个SKU,具体取决于屏幕分辨率,因此我们总共可以计算多达数百个SKU,因此可以实现完全可接受的个性化“深度”。


我们从头解决问题


让我们继续到技术部分。 我们对API的响应时间有限制。 例如,在应用程序中,将来的服务将需要及时负责100 ms。 在这段时间中,您需要转到不同的数据库来获取用户和产品数据,并在负载最高达到100 QPS的情况下安排一百个示例。 这导致我们需要使用毫秒级的机器学习框架。 Vowpal Wabbit是最著名的之一。


此框架的典型应用领域是adtech,即在优化RTB竞标出价时预测广告的点击率。 从数学的角度来看,我们可以提出类似的问题。 假设我们想通过在产品展示上训练模型来预测点击的可能性。 高达10k QPS的模型上的负载可与广告指标相提并论,并且总的来说,证明了只需要在原型设计阶段和MVP上限制自己使用线性算法是合理的。


现在,让我们考虑一下哪些用户数据可以包含我们所需的信号,并很好地区分用户。 由于我们在谈论产品推荐和用户访问的产品页面,因此他很可能处于选择阶段。 他脑海中有某种“完美的鞋子”的形象,可以用来比较所有引起他注意的商品。 让他首先进入所需类别的商品目录,然后通过单击或多或少与他的演示类似的内容来开始搜索。 因此,用户保留了所查看产品的某些“数字跟踪”。 基于此路线上的单位,我们将进行个性化设置。


对象的矢量表示


所有产品之间的差异均以表格形式显示,包括以下属性:颜色,材料,织物,印刷类型,袖子长度,罩盖存在,鞋跟高度等。 因此,可以使用这些属性的每个值的出现分数来编码任何数字迹线。 假设我们有三种颜色和三个品牌的产品,您可以查看并放入购物篮。 然后,根据用户的操作历史记录,他可以匹配以下形式的向量:
图片


在这种情况下,用户查看了10种产品:5种黄金,​​2种黑色和3种红色。 他在篮子里加了2红色和2黑色,没有加金。 与品牌A,B和C以及任何属性值相似。 此外,可以将这样的向量与特定产品的属性值的单次热编码向量进行级联。


因此,我们可以向量化特定事件。 在当前会话的框架内,已经查看了具有给定颜色分布的许多产品的用户正准备看到一些新产品,例如红色。 使用有关印象和点击的历史数据,您可以建立一个模型来预测红色产品的点击可能性,前提是该产品具有以前查看过的产品的现有颜色分布。


如果查看我们已经学会显示历史集团的空间,您会看到一个部分被二进制子空间占据,另一部分是物质空间,并且它们之间没有相互联系。 在这种情况下,我们的线性模型是该空间中点的坐标的线性组合(加权和)。 如果她从这样的例子中学到了,她将简单地学习先验概率。 例如,对应于商品红色的坐标前的权重将是与红色商品的点击率成正比的值。 因此,特定用户坐标将通过目录中任何产品的不同用户点击频率特征来加权。 但这不是我们想要的。


多项式特征可以挽救-所有二进制量与所有实数相乘的结果。 Vowpal Wabbit框架具有一个强大的工具 ,可以从名称空间生成强大的功能。 让我们尝试为示例编写vw格式的字符串,将用户和商品功能分布在不同的命名空间中。


|user_color :0.5 :0.2 :0.3 |product_color  

现在,如果在训练过程中添加-q pu开关,则将出现以下非零二次特征:


 user_color^ * product_color^ = 0.5 user_color^ * product_color^ = 0.2 user_color^ * product_color^ = 0.3 

因此,该模型不仅在寻找一种信号,不仅在于用户如何查看观看的红色产品比例很高,还在于他们如何点击红色产品。 这样的特征在训练模型中的权重应该是正的并且相当大。


这种用于特征工程的方法极大地增加了进行培训的空间的大小。 在只有4种颜色的情况下,此空间的尺寸为8(产品4种颜色,用户4种颜色)。 增加16个二次方属性后,它增加到24个。在生产中,除了颜色外,我们还使用商品的13个以上属性,例如品牌。 因此,我们的模型在其中工作的空间的总大小最多可以达到300万个要素。 同时,我们希望将训练示例的数量与空间尺寸的比例保持在1:100的水平。 为此,我们需要总共生成大约3亿个观测值。


个性化平台架构


我们将用户的点击流存储在Hadoop(从Apache Kafka到Hive表的火花流)中。 我们通常每天获得约30 GB的压缩数据-这是用户可以在网站和应用程序中执行的一百多种不同类型的操作,包括在不同位置展示商品。


此外,在建议书架上,还提供了有关显示哪些产品以及在何处进行点击的信息。 过去,每次此类单击的任务是根据该单击之前的时间点内所查看产品的属性值的分数比例来计算用户状态。 然后,向量对“用户” +“被点击的产品”对的串联将给出一个积极的训练示例,货架上在其旁边显示但无点击的产品对类似的对将成为负面的示例。 在附近展示产品非常重要。 然后,我们可以确保用户看到了它们,但是没有单击。 另外,借助这种机制,我们可以控制问题中类的比率。


我们的解决方案是每天使用Spark聚合用户数据,并将这些数据增量加载到HBase中。 考虑这样一个聚合的结构。


因此,此任务中的主要对象是用户。 会话与会话相关联,会话由一系列操作组成,每个操作根据操作类型具有某些特征。 例如,如果正在查看产品页面,则产品的商品编号和查看时间属于我们需要的属性。 作为将来的储备,我们立即在日志中写入库存商品的价格和两种价格:基础价格和考虑到库存和个人优惠券的价格。 我们不需要单独的展示,因此在汇总时会即时将其归因于点击并生成一种新的事件,其中除了带有点击所涉及产品的商品编号的字段外,在显示时还会有一系列围绕着它的文章。


HBase是一个版本化的列数据库,具有用于连接到Spark进行批处理的本机接口,并且能够通过键访问数据。 它的另一个特点是HBase缺少电路的概念。 它只能在适合于HDFS块结构的特殊HFile中存储字节或偏移量。


有些人可能会发现选择存储库存在争议,但是我在类似项目中使用HBase的经验非常丰富。 此外,在Lamoda中,该数据库已经被积极使用,因此,使用已经部署的系统进行MVP无需花费任何成本。 我们目前不使用版本控制功能,但是通过密钥访问对于将来进行模型的多线程训练以及组织用于加载数据和其他实时情况的lambda体系结构的可能性似乎很有用。


由于HBase中没有架构,因此我们需要自己的数据容器。 您可以使用lambda x:json.dumps(x).encode() ,但是我想要更快的东西。 完全标准的解决方案是使用protobuf容器。 由于整个项目的开发都是使用python进行的,因此对我来说,更常见的是使用AppNexus的自定义pyrobuf库,而不是Google的官方库。 通过基准测试,原型的基本功能的性能是原始性能的几倍。 我们的原型的大致方案如下:


 enum Location { ru = 1; by = 2; ua = 3; kz = 4; special = 5; } enum Platform { desktop = 1; mobile = 2; a_phone = 3; a_tablet = 4; iphone = 5; ipad = 6; } message Action { enum ActionType { pageview = 1; quickview = 2; rec_click = 3; catalog_click = 4; fav_add = 5; cart_add = 6; order_submit = 7; } required uint64 ts = 1; required ActionType action_type = 2; optional string sku = 3; required bool is_office = 4; repeated string skus = 5; optional uint32 delta = 6; optional string sku_source = 7; optional bool stock = 8; optional uint32 base_price = 9; optional uint32 price = 10; optional string type = 11; } message Session { required string session_id = 1; repeated Action actions = 2; required uint64 session_start = 3; required uint64 session_end = 4; optional uint32 actions_count = 5; } message LID { required string uid = 1; repeated Session sessions = 2; required Location location = 3; required Platform platform = 4; optional uint32 sessions_count = 5; } 

简而言之,有一个“用户”对象(LID,Lamoda ID)。 在它内部有一个“会话”对象数组,每个对象都是一个“动作”对象数组。 我们将操作按类型划分,并将它们存储在不同的列族中,这使我们在只需要某些类型的事件(产品视图,对不同类型的建议的归因点击)等情况下就可以优化阅读效果。


测试中


我们用以下设计在桌面网站lamoda.ru上进行了为期三周的AB测试:


  • 控制:API建议指的是个性化服务,等待结果,但以原始顺序提供商品,每个人都一样。
  • 测试:产品以点击概率预测的降序从左到右显示。

分为两个选项是基于用户的LID-本质上是由他的cookie。 我们的实验平台可确保收集到的两个版本的观测值相互独立且均匀分布,并且以5%的显着性水平评估度量标准变化(p值0.05)。 结果,我们获得了整个展示架+ 10%的点击率,并且收入出现了明显的正向变化。 上周,我们向网站的所有用户推出了此功能。


要检查您自己的个性化设置,只需查看几种不同的产品,然后在两个不同的浏览器中或使用“隐身”模式,比较其中一个货架上的“他们购买此产品”的建议的排序。 当然,如果您以前从未访问过我们的网站,那么平台上仍然没有关于您的数据。 尝试选择冬季外套,过一会儿再比较一下商品的顺序。


从服务到平台


因此,我们有了一个完整的平台-一组用于汇总数据并存储数据的软件工具,以及一个用于在过去的任意时间点对业务对象进行矢量化的框架,该框架使您可以建立评分模型来评估各种操作的可能性。 通过Web服务提供模型干扰,该服务可以从各种数据源收集相关向量,并通过模型运行它们。 它接受一个LID(用户标识符),需要打开的SKU列表以及各种其他信息,将相同的产品列表返回到充实了预测的点击概率预测中。 下面是我们平台的概念架构图:
图片


ML Core元素是一组虚拟机,在其上安装了Hadoop客户端和Airflow worker。 我们设置配置,使用什么参数训练模型,在哪里获取历史数据等等。 结果,该模型经过人工训练和发布,有关学习过程和我们感兴趣的质量度量的信息存储在元存储库中。


现在已经在邮件列表,主页和货架上测试或准备对推荐个性化系统进行测试,并准备针对类似产品的建议,针对内部和外部广告的外观相似的细分,等等。




这是一篇介绍性文章。 在其他出版物中,我可以专注于体系结构的技术方面并讨论其开发,或者相反,更广泛地扩展产品组件,并告诉我们如何在产品任务中使用和评估ML。 在评论中写下您对此的愿望。

Source: https://habr.com/ru/post/zh-CN467597/


All Articles