1、写在前面
广告是绝大多数互联网公司的商业变现方式,但是在广告推荐领域,一直面临这很多的挑战。百度凤巢在精确匹配推荐方面积累了很多丰富的经验。从2010年以来,百度在广告技术中做的一系列世界领先的AI创新工作:
1、2010年,百度开始使用分布式超大规模机器学习模型和分布式参数服务器存储学习模型。
2、2013年,百度开始使用分布式超大规模深度学习模型,参数达到了千亿级。
3、2014年以来,百度开始开展大规模向量近邻检索(ANN)技术和最大内积检索(MIPS)技术研究并用于商用。(注:百度科学家因MIPS工作获得AI顶级学术会议NIPS2014最佳论文奖。)百度广告AI团队开始广泛使用ANN与MIPS技术来提高广告召回质量。
4、2017年以来,百度广告AI团队开始尝试使用分布式GPU系统(4-8块GPU卡)来取代已经在百度使用了10多年的MPI CPU集群。
在2019年夏天美国阿拉斯加州举办的数据挖掘顶级学术会议KDD上,百度发表了使用近邻检索和最大内积检索技术来极大提高百度广告效果的论文:MOBIUS: Towards the Next Generation of Query-Ad Matching in Baidu’s Sponsored Search。论文来自百度研究院李平老师团队(CCL实验室),一作范淼老师也是数据挖掘领域的大牛。论文地址:https://dl.acm.org/doi/pdf/10.1145/3292500.3330651
2、背景
目前的商业搜索引擎通常采用两步来召回广告,也就是我们所说的广告召回和广告排序,第一步是根据给定的query检索出相关的广告,第二部是考虑商业指标和用户体验等进行排序。百度凤巢广告系统采用三层系统架构图,如下图。第一层是matching层:利用用户的 query 和用户画像,包括进行一系列query 的处理,从十亿级的广告库中召回跟用户 query 相关的千级别的广告队列, 第二层和第三层是ranking 层,粗排和精排,粗排的性能比精排好,粗排从千级别的广告候选中中召回top 的上百条,精排选出 top 的前几条。ranking 关注的是业务指标以及用户体验指标,比如 cpm、roi 等。
为什么采用这样的三层漏斗架构?主要是作为每天提供几亿人查询的在线系统,以及十亿级的广告库,每次检索需要从上亿的广告中筛选出相关的出来。工程架构上要求低响应延迟,同时有计算资源的约束,通过三层漏斗架构,达到工程架构和算法效率上的一个折衷。
3、问题
这样的漏斗架构存在什么样的问题呢?最主要的一个问题是matching 层和 ranking 层的优化目标不一致,matching 层侧重优化相关性,而 ranking 层主要优化商业指标 ctr、cvr、roi 等。两层的目标不一致导致,matching 层相关性较低但是 cpm 高的广告被挤占,matching 层召回的广告在 ranking 层由于 cpm 比较低被截断,从而影响展现。为了解决这个问题,百度提出了一种基于多任务的下一代广告推荐系统Mobius。这个项目是将广告召回和广告排序层融合,统一不同的学习目标,兼顾相关性和业务指标。
4、挑战
将 matching 层和 ranking 层融合,Mobius 就需要有能力针对数十亿的 query-ad 进行精确的 ctr 预估。要实现这个目标,需要解决两个问题:
<1>点击样本不足:ranking 层的训练数据大多是高频的 query 和高频的 ads,在 matching 层,很多 ads 之前都没有展现机会。只要高频展现的 ad 或者 query 出现,模型就明显的高估,这样长尾样本的泛化能力不好。
Mobius 最开始是直接复用之前的 ctr 模型,之前的 ctr 模型包含了千亿级别的特征,但是对于低频样本的预测,比如长尾和冷启动的用户和广告,会存在比较严重的预估偏差。因为模型去掉了之前的 matching 层的相关性约束,模型容易预估出高 ctr 但是 相关性很差的结果。
比如,用户查询Tesla model3
和 white rose
两个query。传统的漏斗型架构,首先通过matching 层保证Mercedes-Benz
跟Tesla model3
的相关性,
然后 ranking 层预估 ctr很高,从而得到展现。
但是在用 mobius 预估时,广告库是上亿量级的候选集,自然很多是出于长尾的,
white rose
是长尾,但是Mercedes-Benz
出现频繁,但是如果query和或者ad中有一个频繁出现,那么ctr模型也会认为这个query-ad pair的ctr很高,那么Mercedes-Benz
可能跟很多query组合都会被认为ctr很高,从而针对white rose
系统也会召回相关性没那么高的Mercedes-Benz
广告,这就出现不正确的召回了
<2>高计算和存储成本:传统广告推荐系统采用多层漏斗架构,减少每一层需要预估的条数,从而缓解性能问题,Mobius 预计要预测数十亿用户 query 和广告的多个指标(相关性、ctr、roi 等),面临这计算资源消耗更大的挑战。
5、问题表达
原来的 ranking 层的目标是:
而 mobius 的目标是:
6、方法
为了解决上面的问题,文中认为主要是怎么让模型识别出低相关性并且高 ctr 的 query-ad 作为 badcase。为了学习 badcase 的稀疏样本,就要构造出足够的 badcase 样本,再通过模型的目标函数中加上额外的 badcase 进行学习。
Mobius 采用了如下的方法,将原来三层结构中的相关性模型用来做 teacher 模型筛选 query-ad 对,同时指导 mobius 的排序模型 student 在引入额外主动学习进行数据增强后的 badcase 样本上更好地训练。
整体流程分为数据增强和点击率模型学习。
数据增强
目标是希望模型有更多的低相关性高 ctr 的样本,拿到训练样本,得到 query-ad 对,然后拆分出 query的集合 和 ad 的集合,做笛卡尔积。假设用户的点击样本中有 m 个query 和n 个 ad,那么数据增强之后可以得到 m x n个 query-ad 对。然后 teacher 对每一个 query-ad 评分,用一个门槛把相关性低的 query-ad 找到,再把 query-ad 给 ctr 模型,找到相关性低但是高 ctr 的数据作为 badcase
在模型训练阶段,点击历史中点击数据、未点击数据和数据增强中的 badcase 都被输入给模型,模型由 user query DNN 和 ad DNN组成双塔模型,两个子网络分别产出三个32维的向量,然后三个向量分别去做内积,得到的三个结果输入给 softmax 层得到概率
对于一个查询 query,mobius 必须从数十亿个广告候选中检索出最相关和cpm 最高的广告,暴力搜索是不现实的,因为在线服务往往具有有限的延迟约束,广告检索必须在短时间内完成。文中采用ANN(Approximate Nearest Neighbor)和MIPS(Maximum Inner Product Search)算法来加快计算速度
7、未来工作
将优化用户体验和业务目标统一起来
引入更多的业务目标
采用 GPU 的快速神经网络系统
欢迎经验交流