搜索双链路实时计算体系@双11实战

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
推荐全链路深度定制开发平台,高级版 1个月
OpenSearch LLM智能问答版免费试用套餐,存储1GB首月+计算资源100CU
简介: 该文章来自阿里巴巴技术协会(ATA)精选集  0. 前言 何为双链路实时计算体系?微观实时计算链路 a) 最细粒度商品/店铺/用户数据的实时 b) 底层模型的实时宏观实时计算链路 相比微观实时,宏观实时的对象粒度更粗,更上层 a) 以实时效果为目标,基于bandit learning的实

该文章来自阿里巴巴技术协会(ATA)精选集 

0. 前言

何为双链路实时计算体系?
微观实时计算链路
a) 最细粒度商品/店铺/用户数据的实时
b) 底层模型的实时
宏观实时计算链路
相比微观实时,宏观实时的对象粒度更粗,更上层
a) 以实时效果为目标,基于bandit learning的实时策略寻优
b) 以流量实时匀速化投放为目标,基于PID控制理论的实时流量调控
在整个实时计算算法优化工作中,金榕教授给予了细致指导,使得项目得以顺利开发和落地。

1. 搜索实时计算体系

1.1 系统架构

ss_realtime_platform

1.2 重要组件介绍

Pora:

Pora是淘宝搜索基于iStream(自主研发的运行在Hadoop YARN上的实时计算引擎)+ HBase基础平台打造的一套实时计算和在线学习系统,支持在秒级别内对海量用户行为及其相关联的海量商品作实时分析处理,从中提取多维度的用户/商品数据特征,并采用分布式Parameter Server架构进行在线学习,从而使用户行为可以在几秒内影响搜索排序等在线服务。Pora目前已经应用于实时个性化搜索/推荐、实时反作弊、实时流量优化等诸多领域。
双11期间,Pora实现7*24持续运行无重启,双11当天共处理消息量1300亿,峰值QPS 500万。

iGraph:

iGraph是淘宝搜索打造的实时在线图存储与查询的系统,可以提供大规模KV/KKV数据的存储、查询、更新和计算服务。目前支持了包括搜索/推荐个性化在内的众多业务线。
双11期间,iGraph 访问峰值QPS 245W,同时支持大规模实时数据更新,如用户实时点击表峰值更新QPS 28WQPS,用户信息表 40W QPS

SP :

SP(search planer)是搜索面向前端应用的统一服务接口,根据用户指定的查询条件制定查询计划,查询包括QP,igraph,ISearch5引擎在内的各个搜索后端系统,得到最终结果返回个前端。SP通过将业务逻辑从前端往后端下沉,简化了搜索调用逻辑,提升了前端系统性能。

Isearch5引擎:

ISearch5是搜索最新一代引擎平台,服务于淘宝、天猫、B2B等各个搜索业务线,支持秒级实时索引,数据实时更新等众多特性。

实时报表系统:

基于Galaxy平台的实时报表系统,实时统计分平台/桶/策略/商品类型/用户类型等多维度业务指标数据(包括但不限于曝光,点击,成交与加购等)。该系统提供分钟级别的实时反馈精度,让算法、产品、运营同学能够在功能升级、大促、运营推广中及时准确了解业务指标的变化,通过强大的数据闭环功能为快速响应及决策提供依据。该系统同时提供了丰富的使用接口,为算法同学在大促中在线寻优提供了可靠实时数据。

BtsServer:

BtsServer是搜索的分桶测试管理服务平台,能够随时调整每个分桶的测试内容。依托实时报表系统产出的实时数据,今年在BtsServer平台上开发了实时策略寻优和实时流量调控两个模块,可以根据实时报表做智能化的分桶测试寻优,实现整体效果的最优化。

2. 在线学习

数据和模型是算法的两大核心,14年基于Pora我们现实了数据的实时更新。15年我们又在Pora上开发了基于Parameter Server架构的在线学习框架,实现了模型的实时更新。
why在线学习?
在batch learning中,一般会假设样本独立服从一个未知的分布D,学习得到的模型都是基于该分布的,如果分布变化,模型效果会明显降低。而在实际业务中,很多数情况下,一个模型生效后,样本的分布会发生大幅变化,因此学到的模型并不能很好的fit线上数据。而实时模型,能通过不断的去拟合最近的线上数据,解决这一问题;同时实时模型还能catch用户和商品的实时特征,因此效果会较离线模型有较大提升,特别是在实时数据极为丰富的情况下,例如双11和双12这种大促。
why秒级更新?
相比历史长期模型,小时级模型和纯实时秒级模型的时效性都有大幅提升,为什么我们选择了纯实时模型?一个方面是系统工程能力的允许,另外更重要的原因是业务需要,特别是在双11这种成交爆发力强,变化剧烈的场景,秒级实时模型时效性的优势会更加明显。下图是大家都看到的今年双11实时成交额情况,前面1小时已经完成了大概总成交的1/3,小时模型无法很好的catch这段时间里面的变化。
ss_201511111_hour_trans

2.1 在线学习框架

ss_onlinelearning_platform
模块介绍:
Sample Worker:处理日志生成训练样本,Fetch最新的模型计算特征梯度
FeatureHQ:将相同特征的梯度送到同一个FeatureWorker
Feature Worker:接收梯度,计算更新模型
Hbase:模型存储(lr模型的w,ftrl的z,n,矩阵分解的user,item向量)

特点:异步,并行,平台化
异步,并行:整个训练过程就像不断迭代的map-reduce,需要注意的是Sample Worker中的各个worker和Feature Worker中的各个worker是完全异步的,并没有做任何同步。一开始我们也非常担心这种纯异步的sgd训练方式是否有问题,但实验发现这套系统能够很好做到模型收敛,并且得到和同步训练差不多的准确性。
平台化:做为一个在线学习框架,我们不仅仅只是提供现成的算法,也可以让大家能够在这个框架下方便地开发实现自己定制的在线学习算法。目前是把三个主要的接口开放给开发者自己来实现:CalcSample(样本采样,样本特征,目标构建),CalcGradient(梯度计算),CalcWeight(模型更新)

目前这套在线学习框架已经支持训练样本百亿级别/每天,特征十亿级别。包括pc搜索,手淘搜索,天猫搜索,聚划算,淘金币在内的多个业务场景已经有10+的在线模型跑在上面。

2.2 pointwise model

2.2.1 LR/FTRL

Logistical Regression(逻辑回归)作为最常用算法之一,是我们实现的第一个在线学习算法。随后在lr基础上了做了简单的改动实现了Ftrl,模型更新(CalcWeight的实现)这一步不同。这里就不介绍lr和ftrl的原理了,有非常多的资料可以参考。下面说一下遇到的一些问题:
a) 纯异步训练的收敛性和准确性
前面提到过,异步训练的收敛性和准确性是我们非常担心的点,实际的实验效果表明模型能够正确收敛,并且准确性和离线同步训练比也差异不大。
下面是某一场景下的ctr预估应用在不同训练方式下的auc对比:
在线异步训练的auc比离线同步训练的auc是要差一点,但差异很小。有初值下效果更好一点。都远好于使用历史长期模型(历史数据训练的模型)的效果。
ss_ftrl_auc
b) 模型稳定性
模型不稳定是在线学习在实际应用中遇到的一个大问题,比如在搜索排序场景下,如果短时间内模型变化太大,会造成排序结果剧烈变化,用户体验不连续。为了解决这个问题,预测打分的时候使用模型的平均值,可以有效地平滑掉这种不稳定。
实际操作中,还可以考虑把最开始的n轮去掉后再做平均(无初值情况下,最开始n轮模型的效果可能还比较差)。
当然了,模型的稳定性和时效性是一个trade off,为了兼顾这两点,更好的做法是使用移动平均(当前轮的前面t轮模型做平均)。
c) 热点问题
通过前面的框架图可以看到,feature worker其实就是一个reduce的过程。如果存在热点特征,比如截距特征beta0,这类特征的梯度会非常非常多,会造成这个特征所在的feature worker处理不过来,出现阻塞,从而造成这个worker节点上的所有特征的更新都延迟。为了解决这个问题,我们在sample worker上做了feature grad的合并(类似于mapreduce的map节点做local combine),大幅减少了往FeatureHQ发送的数据。

2.2.2 Online AUC Optimization

与online LR/FTRL 不同的是,在线学习中有一类是直接针对 AUC 进行优化的算法。AUC 直接优化是 NP-Hard,但有一些近似算法能够进行高效的求解。我们实现了 AUC 最大化算法- One-Pass AUC (Refence One-Pass AUC Optimization, Wei Gao, Rong Jin, Lu Wang, Shenghuo Zhu, Zhi-Hua Zhou. Artificial Intelligence Journal, 2014 )

2.3 pairwise model

why pair-wise?
在搜索中,算法更关注的是商品的排序,而不是单个商品的算分。使用point-wise算法,是通过回归单个样本的分数从而得到排序效果;而使用pair-wise算法,是直接优化商品之间的序关系。因此从loss的角度来看,point-wise上会有不必要的约束,这些约束常常会对序关系产生负向影响;pair-wise算法目标明确,是没有这些约束的。另外,从工程框架上来开,日志的不均匀会对point-wise的算法产生极大的不良影响,而pair-wise则不受此干扰。
因此,我们设计了一套针对排序优化的实时协同过滤框架,并在这个框架上设计和实现了2个pair-wise算法。2个算法均有实时和离线2部分,离线模型会作为实时模型的初始值使用,使用ODPS Graph实现;在线模型由PORA实现。下面会简单介绍模型的含义和实验结果

2.3.1 实时矩阵分解(Realtime Matrix Factorization for Ranking with Side Information)

假设我们有m个用户和n个商品,除用户向量screenshot和向量_2015_08_05_10_36_52外,我们还为每个商品j学习一个bias,screenshot。此时的我们将每个用户对每一个商品的偏好标示为:
screenshot
在搜索排序中,我们更关注的是商品之间的顺序,而不是模型对偏好程度的预测值和真实值之间的平方误差或绝对值误差。从搜索日志中我们抽取训练三元组screenshot,其中每一个三元组screenshot表示用户i更偏好商品j,相比于商品k。对于这样的一个三元组,我们定义损失函数如下
screenshot
其中,screenshot是用户在商品j和k上的真实偏好程度,例如对于一次搜索展现引导的行为,可以设置偏好程度为:成交>加购>收藏>点击>PV。注意这里我们引入了Hinge loss,目的是当我们的模型排序正确时不去做冗余的抑制。此外,我们还使用了已有的一份数据screenshot,描述的是商品之间关于被购买行为的相似度矩阵。如果2个商品在被购买的行为上相似,那么它们在隐空间的向量应该是尽可能靠近的。因此,类似于经典的拉普拉斯特征映射(Laplacian Eigenmap),我们使用了一个正则项体现这项约束
screenshot
  最后,我们需要优化的目标函数可以形式化为
screenshot

2.3.2实时双线性模型(Realtime Bayesian Personalized Bilinear Model)

定义U为全体用户,I为全部商品,用户反馈S表示implicit feedback,screenshot,每个商品,Item(screenshot),由2部分组成,分别是静态特征(Static descriptors)和动态特征(Temporal characteristics); 每个用户,User(screenshot),同样由2部分组成,分别是特征(U)与用户ID(B);行为,screenshot(Interactive Feedback),其中screenshot是0/1(实际上也可以是实数,这里只考虑0/1的implicit feedback),表示用户u对商品i的偏好。

我们排序的目标是对用户设置全部商品上的排序方案,screenshot,其中screenshot表示偏序关系。
另外,我们定义screenshot为用户u点击的全部商品,screenshot为点击过商品i的全部用户。
在bilinear model中,每个用户对商品的偏好表示为:
screenshot
D和C分别表示用户和商品的特征维度,B表示每个用户ID在商品特征上的偏移。将用户的B看做自身feature的一个稀疏维度,那么考虑商品有静态和动态2类属性,有:
screenshot
该模型可以看做是将用户feature的每个维度向item的每个维度做投影,然后在商品空间上做点乘,W表示投影矩阵。
有了上面表示后,根据贝叶斯公式,我们求一个最大后验估计(MAP)。假设所有参数表示为screenshot,则后验分布为:
screenshot
右边第一项screenshot,这里screenshot这里表示判断函数。考虑到数据全局上的反对称性,可以对它进行简化:
screenshot
在已知
screenshotscreenshot的情况下,偏好i与j的差值表示为:
screenshot
那么点击i而没有点击j的概率为:
screenshot
我们算法的目标是最大化后验,于是:
screenshot

2.3.3 实验与结果

实时个性化算法的目标是在淘宝搜索中提升用户的搜索体验,提高流量效率。从指标上表现为搜索的NDCG/MRR等指标,以及线上的CTR等指标。
下面2张图是一天的模型曲线,左图是矩阵分解的NDCG变化情况,右图是双线性模型的MRR变化情况。可以明显的看到随着模型的运行,MRR和NDCG值在不断上升,直接达到收敛。在收敛时候的指标值较最开始的初期,会有20%以上的提升。
ss_pairwise_metrics

3. 宏观实时(实时策略寻优,实时流量平衡)

3.1 系统架构

ss_macrorealtime_platform

3.2 实时策略寻优

从广义上讲,策略可以是非常宽泛的概念。但在这里我们讲的策略主要是指排序中的特征融合策略。说起特征融合,ltr(learn to rank)是最传统的特征融合方法,也在我们搜索排序得到了广泛应用。但传统的ltr在特定场景下有一些局限:
a) 特征分无法通过历史数据准确获取。比如双11当天的实时特征分,日常流量下和大促流量下,特征分的分布完全不一样。
b) ltr的优化目标是我们定义的一个目标函数,并不是最终的线上结果,但任何目标函数的假设,都与线上真实的目标有一定的gap。所以离线效果(比如NDCG)提升,并不代表线上测试效果一定提升。
基于上面的局限性,今年我们尝试了另外一个思路,直接基于线上最终bts结果做策略优化。而bandit learning和zero-order优化是正是解决这类问题的方法。

3.2.1 算法流程

在学术领域,与bandit learning和zero-order 优化问题相关的方法非常多。但我们实际线上排序系统特征多,参数空间大,同时我们希望整体收益的最大化,即对不好的策略投入做尝试的流量尽量少,并尽快收敛到比效好的策略;因此,我们接合了bandit learning和zero-order opt设计整体算法流程图如下:
基本的思路就是:先用MAB从有限的离散策略集合里面选出最优策略,然后在最优策略基础上用ZeroOrderOpt做连续参数空间的进一步寻优。在寻优过程中会不断把当前的最优策略全量到接受桶。
screenshot

3.2.2 Multi-Armed Bandit

根据已知的知识找到最优的策略,同时还能发现是否有新的策略收益更大,这是典型的增强学习里的double E(exploitation and exploration)问题。定义N个策略集, μ1,..,μN N 个策略收益分布的均值,每轮 t 选择某一个策略 It=i ,都可以得到其收益 g(i,Yt) ,因此,在 T 轮之后,定义损失函数 ρ=TμTt=1g(i,Yt) μ 是每轮最大收益的均值,即 μ=maxn{μn} 。如果每一轮都选择都是最优的,那么损失 ρ 就等于0。定义 g(i,Yt) 的无偏估计 g˜(i,Yt)
screenshot
显然, E[g˜(i,Yt)|I1,...,It1]=g(i,Yt)
具体算法如下:screenshot
其中 β η γ 是参数。
首先需要选择参与融合的特征,然后将这些特征按照权重高、中、低档组合成候选策略集(特征a低中高 * 特征b低中高*..),并剔除一些人工认为不靠谱的策略。最终,我们选择 N=18 个策略。
开始寻优时,会从所有测试捅中拿出m个桶做bandit,剩余的桶做接受桶。每轮按照概率p选择m个策略做测试,每轮测试半个小时。然后根据这半个小时的实时反馈数据计算收益 g(i,Yt) ,并更新每个策略的概率 pi,t 。如此反复执行上述过程。同时每轮将当前概率 pi,t 最大的策略发送到接受桶。
当MAB收敛后(某一两个策略的概率p明显胜出),因为策略集是有限的,全局最优的策略可能并不在里面,因此,我们会再采用extra gradient算法在连续参数空间内继续寻优,找出更优的策略。
Question
为什么MAB收敛前就发送接收桶了?
Answer
判断MAB(从候选离散策略集合选最优)是否收敛的目的是用来判断是否可以开始run ExtraGradient了(作为ExtraGradient的初值),MAB本身并不是一定要收敛才发送。因为MAB收敛需要时间(双11当天早上大概7点才第一次收敛),如果收敛之前不发送,那么这段时间(7点之前)接受桶的效果是浪费了的,没有享受到测试桶更好的效果。
那么没有收敛的情况下是否能发送呢?
a) 我们判断收敛的条件比较严格,即使没收敛当前的最优策略也是不错的。
b) 我们在发送之前还有一个和接受桶做PK的最后保障环节(不管是否收敛都会有这个环节),PK赢了才会发送。


3.3 实时流量调控

3.3.1 关键词红包中的流量控制

今年的双11红包有了很多不同于往年的新鲜玩法,其中个在搜索发放的关键词红包就利用到了实时流量调控技术。关键词红包发放有两个方面的要求:一方面,需要履行与商家签订的合同,完成承诺给商家的到店 uv 数量;另一方面,要求完成的过程是平稳可控的。在 uv 资源充分的情况下,只要设置较大的发放概率,就能完成第一个目标。 然而发放概率过大容易导致很快就会将一天的目标完成了, 达不到平稳发放的目的。 在这里,我们采用 PID 控制器技术来控制发放的速度。
a) PID 控制器介绍
在控制理论和实践中,PID 是一类广泛使用的控制方法。PID 是“比例-积分-微分”的简写, PID 控制器根据控制原理,对偏差进行比例、积分、微分的调节,从而使被控变量的实际值与既定目标保持一致。
screenshot
上图是PID控制系统的图示,其中 e(t) 是误差信号,u(t) 是控制量,Kp, Ki, Kd 分别是 P、I、D 的系数。
比例(P)控制:直接针对误差进行比例调节,误差越大,比例信号输出越强。举个例子,热水器温度调节系统,当前温度离设定温度差异较大时,就会开启较强的加热功率,等到离设定温度很近时,加热就会缓一些了。
积分(I)控制:对累积误差进行控制,其功能就是消除累积误差。
微分(D)控制:以误差的变化率作为控制因素,例如温度上升较快时,虽然没有达到设定温度,微分控制此时会适当降低加热功率,而单纯的比例控制器则可能导致超调现象。

3.3.2 搜索流量的平衡

搜索作为流量一大入口,除了做好流量的利用效率,还需要从宏观上做一些流量平衡。比如集市和天猫之间流量平衡,大/小/腰部卖家之间的流量平衡。我们目标并不仅仅是短期成交的最大化,而是考虑平台长期利益,在一些流量平衡约束条件下的最大化。实时操作中也利用了PID控制器的技术。

4. 双11实战效果

上述实时计算体系在今年双11发挥了至关重要的作用,是我们搜索成交增长的核动力。下面是各业务线和基准桶(平时全流量生效的最优效果)对比的提升数据。
pc搜索/手淘搜索
预热期引导成交提升 11%,当天成交提升 8%
天猫搜索/猫客搜索
当天成交提升 7%
店铺内搜索
当天成交提升 3.4%

5. 结束语

要感谢的人太多,搜索大部分同学都或多或少参与了实时计算体系的建设,要感谢大家的共同努力。
去年双11,实时计算第一次在大促展露头角,并初露锋芒。今天双11,实时计算在各条业务线全面开花,实时计算体系也更加丰富。我们相信这远远不是终点,期待未来实时给我们带来更多的精彩!

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
7月前
|
SQL Java 关系型数据库
Flink DataSet API迁移到DataStream API实战
本文介绍了作者的Flink项目从DataSet API迁移到DataStream API的背景、方法和遇到的问题以及解决方案。
224 3
|
1月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
141 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
4月前
|
大数据 API 数据处理
揭秘!Flink如何从默默无闻到大数据界的璀璨明星?起源、设计理念与实战秘籍大公开!
【8月更文挑战第24天】Apache Flink是一款源自Stratosphere项目的开源流处理框架,由柏林理工大学等机构于2010至2014年间开发,并于2014年捐赠给Apache软件基金会。Flink设计之初即聚焦于提供统一的数据处理模型,支持事件时间处理、精确一次状态一致性等特性,实现了流批一体化处理。其核心优势包括高吞吐量、低延迟及强大的容错机制。
83 1
|
4月前
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
101 0
|
7月前
|
传感器 存储 缓存
[尚硅谷flink学习笔记] 实战案例TopN 问题
这段内容是关于如何使用Apache Flink解决实时统计水位传感器数据中,在一定时间窗口内出现次数最多的水位问题,即"Top N"问题。首先,介绍了一个使用滑动窗口的简单实现,通过收集传感器数据,按照水位计数,然后排序并输出前两名。接着,提出了全窗口和优化方案,其中优化包括按键分区(按水位vc分组)、开窗操作(增量聚合计算count)和过程函数处理(聚合并排序输出Top N结果)。最后,给出了一个使用`KeyedProcessFunction`进行优化的示例代码,通过按键by窗口结束时间,确保每个窗口的所有数据到达后再进行处理,提高了效率。
195 1
|
Java 程序员 网络安全
Flink处理函数实战之四:窗口处理
学习Flink低阶处理函数中的ProcessAllWindowFunction和ProcessWindowFunction
142 0
Flink处理函数实战之四:窗口处理
|
机器学习/深度学习 Java 程序员
Flink处理函数实战之三:KeyedProcessFunction类
通过实战学习和了解处理函数的KeyedProcessFunction类
141 1
Flink处理函数实战之三:KeyedProcessFunction类
|
Kubernetes 网络协议 Java
Flink Native Kubernetes实战
Flink Native Kubernetes是1.10版本才有的新功能,通过bin目录下的工具控制kubernetes环境下的flink操作
140 1
Flink Native Kubernetes实战
|
程序员 API 数据库
Flink的sink实战之一:初探
学习和实践Flink的data sink相关的技术细节
242 1
Flink的sink实战之一:初探
|
消息中间件 SQL NoSQL
Flink的sink实战之三:cassandra3
实践flink数据集sink到cassandra3
137 1
Flink的sink实战之三:cassandra3