百度双塔召回引擎MOBIUS

1. 概述

对于一个搜索或者推荐系统来说,分阶段的设计都是当下的一个标配,主要是为了平衡效率和效果,在百度的广告系统中,也是分成了如下的三层结构:

在这里插入图片描述

最上层的Matching阶段负责从全库中找到与query相关的候选集,接下来的两个阶段则是根据不同的指标对候选集进行筛选,通常称中间的筛选过程为粗排,最下面的筛选过程为精排。

这种分层的方式虽然带来了性能上的保证,但同时也带来了诸如一致性的问题。一致性,简单来讲就是在召回阶段的目标是相关性,但是在排序阶段的目标是效率指标,如CPM等。这就会导致高相关的召回item由于其CPM预估分并不高,导致了在最终未能被展出。

上述也在提醒我们,尤其是做召回的同学,扩召回有可能并不会带来业务指标的提升,这在很大程度上是因为指标的不一致导致。

那么,能不能在召回阶段,综合考虑相关性和CPM,其实这就是一个多目标的问题,这样就能保证前后的一致性。在百度的Mobius[1]系统中就是要解决这样的一个问题,同时,Mobius的目标是要将召回和排序合并成一个大模型。

2. Mobius系统

2.1. 双塔召回

在Mobius系统中也是采用的双塔的召回模型,一个典型的双塔模型[2]如下所示:

在这里插入图片描述

双塔召回模型的左侧塔是一个query侧的塔,也可以加上user侧的特征,做成user & query侧的塔,右侧塔是一个item侧的塔。在双塔召回模型一般需要解决的一个最重要的问题是样本空间的问题,即召回模型需要处理的是全量数据,在组织样本的时候就需要考虑训练样本的分布与预测时的数据分布是否一致。

双塔召回在分层的系统中存在着以下的一些优势:

  • 能够独立生成query向量和item向量,这样在检索过程中便可以直接利用ANN的方法实现query向量和item向量的计算;
  • 基于模型的方法,能够方便增加side-information。

2.2. Mobius模型结构

Mobius模型结构也是一个双塔的模型结构,具体结构如下所示:

在这里插入图片描述

左侧的塔是user & query侧的塔,右侧的塔是ad侧的塔。与上述的双塔结构不同的是,在Mobius的目标中,包括了三个指标,分别为click,unclick和bad的概率。

2.2.1. 样本构造

对于召回模型来说,最困难的是如何组织训练样本。首先,对于数据的来源,通常选择线上的真实点击日志作为训练数据的来源。对于上述的双塔结构,其有三个目标,分别为click,unclick以及bad,需要双塔模型计算三个目标的概率。抛开bad来说,这就是典型的CTR模型,我们知道在CTR模型中的样本分别为:

  • 正样本:点击的样本;
  • 负样本:曝光未点击的样本;

那么此时需要增加bad情况下的样本,那么此处的bad是如何定义的呢?bad定义为:低相关性但高CTR的case。

Why?为什么是这么定义bad呢,其实可以这么理解:对于我们即将要训练的找回模型,其实我们最终的目标是希望训练好的模型能够针对特定的query和user挑选出“满足相关性要求且CTR高的ad”。但是直接利用上述的CTR的正负样本来训练CTR模型,最终将模型应用于召回模块,会存在严重的样本空间选择的问题。引入的一类case便是高CTR但是低相关性,我们需要对这部分样本建模。

因此,bad部分的样本选择为:高CTR低相关性。同时,在样本的构造过程中,有以下的一些策略:

  • 为了缓解样本选择的问题,在这里选择使用数据增强(data augmentation)的方法;
  • 通过相关性的计算模块得到低相关性的样本;
  • 采样得到bad部分的样本。

具体的算法逻辑如下图所示:

在这里插入图片描述

2.2.2. 数据增强

由于利用曝光样本直接训练召回模型会存在样本选择的问题,因此需要从全库中抽取样本来作为训练样本,在传统的双塔中一般可采用:

  • 点击样本作为正样本,负样本根据频率在全库采样;
  • 点击样本作为正样本,负样本batch内采样。

那么此处的数据增强则更像是两者的结合,通过对曝光样本中的query和ad做 ⊗ \otimes 操作,其操作过程如下所示:

在这里插入图片描述

假设有 m m m个query, n n n个ad,最终生成的query和ad对为 m × n m\times n m×n个。

2.2.3. 主动学习Active learning

主动学习主要是用来降低样本的标注成本的学习方法,其主要思路是通过机器学习的方法获取到“难”样本,使用人工标注并将其继续放入到模型中继续学习。将主动学习应用于这里,主要是用于产出bad目标的那部分样本。

将相关性模型Relevance作为主动学习中的Teacher,计算上述 m × n m\times n m×n个query和ad对的相关性得分,并将得分小于阈值threshold的样本挑选出来。将训练的双塔模型作为主动学习中的Student,将上述的增强数据通过双塔模型,得到CTR的预估分,根据CTR得分采样出低相关性的样本作为bad部分的样本,这部分样本标记为badCases,与曝光日志data合并为双塔的训练样本[data, badCases]。完整的流程如下图所示:

在这里插入图片描述

从上图中可以看到,在双塔模型中,对于User & Query侧以及Ad侧,最终都是生成了3个向量( 32 × 3 32\times 3 32×3)。

2.2.4. 线上的检索过程

与其他的向量召回过程不同,在Mobius系统中,是将召回和排序合并成一个过程了,在其他系统中,向量召回只是召回环节中的一路,Mobius的线上检索过程如下图所示:

在这里插入图片描述

这里画出了两路,其实意思是一致的。首先对于User和Ad向量,先采用Vector Compression,即压缩的方法对其压缩以节省存储空间,后经过近似近邻搜索找到最匹配的ad,再通过business related weight(BRW)重新排序,即左侧蓝色部分。这个过程也就等价于右侧的MIPS,即:

c o s ( x , y ) × w = x T y × w ∥ x ∥ ∥ y ∥ = ( x ∥ x ∥ ) T ( y × w ∥ y ∥ ) cos\left ( x,y \right )\times w=\frac{x^Ty\times w}{\left\| x\right\|\left\| y\right\|}=\left ( \frac{x}{\left\|x \right\|} \right )^T\left ( \frac{y\times w}{\left\| y\right\|} \right ) cos(x,y)×w=xyxTy×w=(xx)T(yy×w)

另一个问题,这里计算向量相似性采用的是cos距离,即:

c o s ( x , y ) × w = x T y ∥ x ∥ ∥ y ∥ = ( x ∥ x ∥ ) T ( y ∥ y ∥ ) cos\left ( x,y \right )\times w=\frac{x^Ty}{\left\| x\right\|\left\| y\right\|}=\left ( \frac{x}{\left\|x \right\|} \right )^T\left ( \frac{y}{\left\| y\right\|} \right ) cos(x,y)×w=xyxTy=(xx)T(yy)

实际上是向量的乘积,但是这里需要对两个向量做归一化,因此就对应了cos距离。另外一点,在模型中,cos距离计算完后,还需要经过一个softmax层,得到对应指标的概率值,且其和为1,而概率值正比于cos距离。因此在检索阶段只需要计算click的cos值。

3. 总结

3.1. 多目标的理解

Mobius的目标是要做一个统一的模型,在这个模型中融合了召回和排序,检索出来的最终的结果是高点击且高相关性,为了完成这样的目标,一个方法是常规的多目标,画一个简单的图如下:

在这里插入图片描述

这是常用的多目标的建模方式,两个目标共享底层的特征以及网络参数,只是在上层的目标上有不同。在线上检索过程中需要先根据CTR分找到潜在候选,再根据相关性得分过滤。当然在这个建模的过程中还可以考虑诸如多专家等策略,详细参考[3]。

在本文中则是绕过了这个常规方法,将两个目标合并,其实通过组合有如下的几种组合:

  • 高CTR,高相关(需要的,positive)
  • 高CTR,低相关(bad)
  • 低CTR,高相关(negative)
  • 低CTR,低相关(negative)

可以发现,其实是可以将两个目标合并的,这便有了Mobius的结构。为了能得到“高CTR,低相关”这部分bad的样本,用到了Teacher-Student的主动学习。

3.2. 交叉特征

另一个问题就是双塔结构在求解CTR问题中是缺乏交叉特征的,而交叉特征对于CTR的计算是很重要的,这一点在Mobius中是没有考虑的,毕竟这也是Mobius-v1,估计会在后面的版本中继续优化吧。

参考文献

[1] Fan M, Guo J, Zhu S, et al. MOBIUS: towards the next generation of query-ad matching in baidu’s sponsored search[C]//Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2019: 2509-2517.

[2] Huang J T, Sharma A, Sun S, et al. Embedding-based retrieval in facebook search[C]//Proceedings of the 26th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2020: 2553-2561.

[3] 多目标建模总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KD2511N系列微电阻测试仪

一、产品概述 KD2511N系列微电阻测试仪是一款对变压器、电机、开关、继电器、接插件等各类直流电阻进行测试的仪器。其基本测试精度最高可达 0.05%,并具有较高的测量速度。 KD2511N微电阻测试仪使用了高精度恒流流经被测件以及四端测量,有效的消除了 引线…

Kafka 如何保证消息的消费顺序

文章目录先直接给出答案吧。在集群或者多partition下无法保障完全顺序消费,但是可以保障分区顺序消费。具体下面讲解。我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作…

蓝桥杯——根据手册写底层

一、 DS18B20温度传感器 1.官方所给源码 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码…

ssm入门

文章目录1.介绍ssm2.Spring篇基础内容🪅什么是IOC(控制反转)Spring和IOC之间的关系IOC容器的作用以及内部存放IoC入门案例📬DI(Dependency Injection)依赖注入依赖注入的概念IOC容器中哪些bean之间要建立依…

函数微分和导数的定义

1.我们先来看可导的定义: 相信这个大家都看的懂。 2.接下来我们看可微的定义: 你们有没用想过为什么会有可微,他是用来干什么的,我们接下来看下面这张图,特别是结合图2-11来说, 我们可以看到书上说可微是在…

【day2】Android Jetpack Compose环境搭建

【day2】Android Jetpack Compose环境搭建 以下是适用于 Jetpack Compose 的环境要求: Android Studio 版本:4.2 Canary 15 或更高版本Gradle 版本:7.0.0-beta02 或更高版本Android 插件版本:4.2.0-beta15 或更高版本Kotlin 版本…

MySQL 幻读问题

承接上文MySQL多版本并发控制MVCC实现原理 幻读现象 因为在RR(可重复读)隔离级别里,事务1的第二次查询没有生成新的readview,而是用的第一次查询时生成的readview,所以第二次查询返回2条数据,而不是3条数据…

看过来,这里有JavaScript技术干货?

今天是一篇正经的技术分享,针对JavaScript技能的十来个专业小技巧,如果你想提升一下JS方面的能力成为一个更好的前端开发人员,那么就可以接着看下去哦。 1、使用逻辑运算符进行短路评估 您可以使用逻辑运算符进行短路评估,方法是…

云边协同与人工智能AI的深度融合(云端训练、边端推理)

在面向物联网、大流量等场景下,为了满足更广连接、更低时延、更好控制等需求,云计算在向一种更加全局化的分布式节点组合形态进阶,边缘计算是其向边缘侧分布式拓展的新触角。 以物联网场景举例,设备产生大量数据,上传到…

都2023了,学习自动化测试还有必要么?会不会浪费我时间

最近收到不少小伙伴私信提问,其中问得比较多的就是“学习自动化测试有那么重要吗?”。 我的回答是肯定的——很重要。 相信不少同学都有诸如此类的疑问,例如:“日常工作中好像用不上自动化?”、“手工点点点好像也可…

【从零开始学习 UVM】9.1、UVM Config DB —— UVM Resource database 资源库详解

文章目录 resource 是一个参数化的容器,可以保存任意数据。资源可用于配置组件、为序列提供数据或在TestBench不同部分之间启用信息共享。它们使用作用域信息(scope)存储,因此其可见性可以限制在TestBench的某些部分中。您可以将任何数据类型放入资源数据库中,并使另一个组…

若依后端管理系统学习日志

文章目录遇到的问题1. 自定义模块404解决方案1. 自定义后台异常返回2. 添加导入按钮3. 树形列表搜索遇到的问题 1. 自定义模块404 idea没有报错,但是点击进去页面显示404。 F12查看错误信息,原来是访问后端controller接口没有成功,找不到导…

上传文件—ajax

目录 一、上传图片文件 1.写基本html 完成页面主框架 2.script部分 2-0 主框架 上传文件按钮被点击触发事件 2-1验证使得否选择文件 2-2 介绍 FormData 2-3 监听onreadystatechange事件 小结 二、实现上传文件进度条 1. 在bootstrap找进度条组件 2.script 完成进度条算法…

Java锁深入理解2——ReentrantLock

前言 本篇博客是《Java锁深入理解》系列博客的第二篇,建议依次阅读。 各篇博客链接如下: Java锁深入理解1——概述及总结 Java锁深入理解2——ReentrantLock Java锁深入理解3——synchronized Java锁深入理解4——ReentrantLock VS synchronized Java锁…

QT Qwidget 事件处理机制

qlineEdit Qt事件处理是指在Qt应用程序中处理各种事件的过程。事件是指在应用程序中发生的各种操作,例如按键、鼠标点击、窗口移动等。Qt提供了一个事件处理机制,使得开发者可以对这些事件进行处理,以实现应用程序的各种功能。 Qt中的事件处…

CMake设置Visual Studio工程的调试环境变量和工作目录cwd的方法

1、设置在Visual Studio中调试的环境变量,此设置仅仅在VS中点击那个绿色三角运行时有效,与你直接双击打开exe文件运行无关,有效避免多版本动态库全部写入系统环境变量的污染问题; # Visual Studio中调试依赖的独立环境变量 set_p…

代码随想录算法训练营第五十天| ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

309.最佳买卖股票时机含冷冻期 看完题后的思路 dp[i][] 0: 第i天不持有股票的最大利润 1: 持有 递推公式 dp[i][0]max(第i-1天不持有,第i-1天持有,在第i天卖了) dp[i][1]max(第i-1天持有, 第i-2天不持有,第i天持有) 初始化 dp[0][0]0; dp[0][1]-price[i]; dp[1][0]max(x,x) d…

PCB模块化设计23——LDO线性稳压电源模块PCB布局布线设计规范

目录PCB模块化设计23——LDO线性稳压电源模块PCB布局布线设计规范一、LDO线性稳压电源组成与概念二、LDO的电路的主干道布局要点PCB模块化设计23——LDO线性稳压电源模块PCB布局布线设计规范 一、LDO线性稳压电源组成与概念 LDO线性稳压器是最基本的稳压电源变换,…

STM32时钟与定时器

目录 一、STM32的时钟系统 二、SysTick定时器 三、HAL_Delay的实现 四、通用定时器 一、STM32的时钟系统 概念时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。 意义时钟是嵌入式系统的脉搏&…

自然语言处理中的数据预处理:理论与实践

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…