该文章来自阿里巴巴技术协会( ATA )精选集
0. 前言
何为双链路实时计算体系?微观实时计算链路 a) 最细粒度商品/店铺/用户数据的实时 b) 底层模型的实时宏观实时计算链路 相比微观实时,宏观实时的对象粒度更粗,更上层 a) 以实时效果为目标,基于bandit learning的实时策略寻优 b) 以流量实时匀速化投放为目标,基于PID控制理论的实时流量调控 在整个实时计算算法优化工作中,金榕教授给予了细致指导,使得项目得以顺利开发和落地。
1. 搜索实时计算体系
1.1 系统架构
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这段时间里面的变化。
2.1 在线学习框架
模块介绍: 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是要差一点,但差异很小。有初值下效果更好一点。都远好于使用历史长期模型(历史数据训练的模型)的效果。 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个商品,除用户向量和向量外,我们还为每个商品j学习一个bias,。此时的我们将每个用户对每一个商品的偏好标示为: 在搜索排序中,我们更关注的是商品之间的顺序,而不是模型对偏好程度的预测值和真实值之间的平方误差或绝对值误差。从搜索日志中我们抽取训练三元组,其中每一个三元组表示用户i更偏好商品j,相比于商品k。对于这样的一个三元组,我们定义损失函数如下 其中,是用户在商品j和k上的真实偏好程度,例如对于一次搜索展现引导的行为,可以设置偏好程度为:成交