近线召回 TFMS 在阿里妈妈广告平台的实践
作者:梁尔舒 未经授权禁止转载
导读: 阿里妈妈作为国内互联网领先的电商广告平台,拥有海量的广告数据,随之而来的是在广告引擎的召回模块面临着日益严重的截断问题,因此提出了TFMS的近线召回方案来应对面临的问题,进一步推高了召回的天花板。论文(原文 1)中较详细的给出了工程落地细节,更重要的是交付了一种处理类似问题的通用思路,值得学习。
背景及挑战
广告系统通常提供着一些定向投放的工具,广告主可以使用这些工具选择广告目标受众进行出价(Targeting)。以阿里妈妈为例:
- 重定向: 目标用户是近期曾经浏览过、点击过或加购过广告主产品的
- 关键词定向:目标用户是对某些关键词感兴趣的,如“旅行”、“游泳”
- 基于统计的定向:目标用户是符合某些统计学信息,比如匹配年龄、性别等
- 自动定向:使用基于大规模用户历史行为数据 训练学习的模型为广告主自动选择定向用户人群,如之前TDM实践
当用户流量请求过来时,广告系统处理请求通常分为三步:
- 召回阶段
检索为这个用户出价的相关广告,选择Top-n个广告。有些活跃用户可能匹配上万的广告,通常会结合广告收入和相关性以一种比较粗暴的方式选择出部分广告进入下一阶段(可以理解为小粗排吧) - 排序阶段
使用复杂模型精确评估广告收益来进行排序 - 竞拍阶段
其中召回阶段主要有两个功能性诉求:
- 召回系统应确保广告主出价的目标受众都有机会触达
- 召回系统要肩负起平台收益和用户体验的平衡
广告召回内部一般可以抽象为两个阶段,(user -> crowd)、(crowd -> ad),crowd可以视为用户标签,比如使用基于统计的定向,为年龄18-25的用户出价, 那 年龄18->25 就可以理解成一个crowd。用户请求来了先根据user找crowd,将各个定向渠道里的用户crowd merge起来,然后从倒排索引中拉取crowd下的ad候选集。由于阿里妈妈crowd千万规模,ad达百万规模,考虑到在线请求性能时延和计算资源开销的系统限制,所以会在两个阶段根据简单规则策略分别做截断。线上请求crowd少于100,每个crowd的ad拉链离线截断2000。
两阶段截断的召回系统造成了两个问题:
- 截断造成了广告主出价投放广告没有机会被召回,不公平,哪怕广告主提升出价也没用
- 截断毕竟使得召回率变低,使得更匹配的ad可能漏召回,导致只能拿到平台收益和用户体验的次优解
所以阿里妈妈提出了无截断近线召回系统(TFMS)
无截断召回方案
将召回过程从在线搬到近线,由近线召回模块预计算处理生成每个用户最终的Top ad候选集,在线过程仅需直接拉取预计算的召回结果。由于近线过程基本无时延约束,近线过程在两个阶段均不做截断,并且可以使用更复杂的模型来预估所有ad,使得生成的最终的Top n精确度更高。
由于近线过程将Top n结果缓存到kv,和kv真正被在线请求拉取的时间不同,缓存value结果可能部分ad失效,也可能缺少最新用户应匹配到的ad,比如用户标签被更新,影响(user -> crowds),广告主在后台调整了策略,影响(crowds -> ad)。所以一个核心的设计考量是如何保证近线和在线kv结果的“一致性”。阿里妈妈设计了两种近线召回结果的更新策略: 增量、全量。
全量: 每天离线全量更新所有用户的Top-n kv结果
增量:作为全量更新策略的补充,每5分钟执行一次,增加Top-n kv结果的时效性
(crowd -> user service)
是相比在线召回系统来说,在近线召回系统里新增加的模块,提供 crowd -> user的kv服务。比如当广告主在广告管理平台操作他的广告所对应的crowd,能够通过(crowd -> user service)
快速查询到影响的user,进而及时更新(user -> ad) Top-n 结果集。
近线流程中的ranking-service
模块能够使用更复杂、精确的预估模型来计算出Top-n的结果集,比之前两阶段粗暴或简单规则策略截断来的效果好得多
全量挑战:由于系统每天亿级用户访问,对所有用户全量更新挑战很大,在实践中阿里妈妈选择了只对近期有行为的用户进行每天的“全量更新”,线上依然覆盖98%请求命中。并行流处理资源可弹性扩展
增量挑战:广告主在管理端一个广告的更新操作,可能会触发百万量级的消息更新,计算开销非常大。 文中提到两种解决思路,其一是在实时性和计算资源开销之前做一个折中,使用窗口函数的机制每5-10分钟聚合相同用户的更新消息,显著的降低了更新qps。其二是选择性的从用户视角丢弃广告主触发的更新消息,只针对活跃用户才执行更新消息,当天有行为的用户会自动触发“全量更新”的流程,重新计算Top-n结果集。阿里妈妈线上选择了前者。
实验结果
离线模拟
在两阶段截断方案下,对于不同的定向模式,文中列出了对ad和user的截断比例影响
在线召回系统中,对于仅一阶段无截断、仅二阶段无截断、两阶段均无截断的情况下性能、效果、(user-ad) pair的表现如下。均无截断时 user ->ad pair可增加259%,而在线时延增加51% ,在线召回过程时延不可接受,极大约束了召回潜力的天花板
采用近线召回相比在线是否增加了计算量呢?文中以需要计算的(user->ad) pairs的数量为衡量指标,将两阶段截断方案设为基准1,如果在线召回中两阶段均不截断,计算量为3.59。而采用TFMS近线召回,全量增量加起来计算量也不超过0.86。由于全量只需要计算一次,而线上活跃用户每天平均能触发8.2次广告请求,TFMS省去了大量重复计算
线上效果
采用TFMS近线召回,耗时和两阶段阶段方案基本持平,指标看着好多都正向,我没啥体感😕
不同定向渠道的广告投放曝光量也提升明显