【计算广告】在线分配算法之 —— HWM(High water mark)介绍

article/2025/11/6 15:03:31

该算法是雅虎工程师提出的一个解决合约制广告或者说GD(担保式投放)投放系统在线分配问题的贪心算法,思路很直接,下面是本人对照其论文整理的思路,里面有自己的理解。

论文题目:Ad Serving Using a Compact Allocation Plan

google一下即可得到。

===========================================================================================

摘要:

在线广告有很大一部分是通过担保式合约来售卖的。这类广告的特点是:广告系统要保证广告主要求的定向条件的曝光量,有时间限制,超过时间没有完成可能会赔偿。这对广告系统意味着,当一次曝光机会到来时,可能会有多个广告主的单子满足曝光要求,广告系统需要决定这次曝光该展示哪一个合约,并且保证其他所有合约也完成。这个问题有两个挑战:(1)问题的数量级,可能会有百万级别的广告主合约和百万级别的流量;(2)不可预见性,合约通常是提前签订,因此需要预估流量。同时在分配流量时,也无法得知当天总流量的分布。我们这里提出了一种对担保式投放系统的分配方案。
我们提出了一个结局担保式投放系统分配问题的解决方案。分配方案离线计算,可以被广告投放系统有效使用。每一个合约的分配方案只需要O(1)空间。整个分配算法是无状态,可以方便地在分布式系统中使用。

简介:

GD(Guarantee delivery,担保式投送)广告投放系统中的核心问题是匹配supply和demand。当用户展示发生时,广告服务器需要在秒级延迟下选择出合适的合约,使得所有的合约都被满足。这是第一需求,也是核心需求。与此同时,还有很多次级需求,比如平滑,即广告不能在一瞬间展示完,应该均匀分布在合约期内。这个问题的难点在于一个是计算量很大,另一个是在做online决策时,并不知道这一刻流量的整体分布,只能基于历史数据做预测。
先看两种比较直观的思路:一种是基于完成度,一种是基于服务率。
完成度:广告服务器在选择合约时是基于每一个合约的历史展示情况来决定的。比如,如果来一个展示,有两个合约满足,一个合约马上就完成了,另一个还差很多,那么肯定优先展示差很多的那个,即按照完成率来定。这个思路很简单,但是会有一些问题:第一,这里需要给出完成度的确切定义,什么样的合约是快完成了,什么样的合约是还差很多。可能最直观的定义是,每一个合约都均匀显示在合约期内,比如30天展示30万次的合约,那么每天需要展示1万次。这可以让展示非常平滑,但是却忽略了一个事实,即实际的流量是变化的,工作日的流量会少于周末,晚上的流量会少于白天的。而且每一天都可能发生定向的流量骤降的情况,这就需要算法能够动态调整展示的概率。第二,由于需要记录每一个合约的完成度,整个系统是有状态的,这对于分布式系统有一些挑战,但是不是不可解,通过消息队列来处理曝光打点可以解决。
服务率:这种方案不需要考虑每一订单的完成度,而是离线计算出每一个订单的服务率。每来一个展示,就把符合条件的合约按照概率展示即可。这种方案的问题在于:第一,计算服务率肯定是需要流量预测的,那么对预测的准确性要求很高;第二,整个计算的过程是一个分配求解的过程,求解的规模很大。
那么,这里我们提出了一个结合上述两种思路的two-step的解决方案——HWM。第一,我们引入了一个离线计算分配方案的轻量级算法,分配方案是无状态的且是基于服务率的。第二我们提出了一个反馈模型,可以根据最近的历史数据来调整流量预测带来的误差。


问题定义:


图一
考虑上图的例子。有三个广告主的合约和六个流量节点。每一个都被标注了定向条件。如果每一个流量符合某一个合约,那么他们之间会有一条线相连。对于200k{male}的demand,我们可以把{male,ca,age=5}的100k流量给他,那么200k{ca}的demand就无法满足了,除非我们只把{male,ca,age=5}的100k流量给{ca}的demand。这里我们其实已经感受到了分配问题的含义。再强调一下现实问题中的挑战,每一个demand和supply的节点都成百万,而且标签的数目也相当大,远比这个例子复杂得多。
设I是预测的supply集合,J是合约集合。那么分配问题可以定义成一个二部图G。图中任一边e代表流量满足合约j。每一个supply节点被si标记,代表该节点的展示量,同理每一个demand节点被dj标记,代表合约约定的展示量。那么解决这个分配问题其实是找到xij,xij表示每一个supply节点i分配给合约j的占比。xij必须满足:


图二
另外,虽然不是强制,但是上述问题最好能考虑到平滑特性。
整体架构:

图三
离线部分,输入流量预测和合约,生成分配方案。在线部分根据分配方案来决定展示哪一个合约。离线部分,当然可以去解之前的分配方案,得到每一个xij,很直接。但是在在线部分,就需要把整个二部图载入内存,代价很大(xij意味着所有的边都需要载入)。所以关键点就是得到xij,但是不需要存储。我们的方案是通过一个aj来代替xij。aj代表每一个符合条件的supply展示合约j的概率。所有符合条件的supply节点的aj都是相同的。数学依据在另一篇论文。这样的方案,在线模块就只需要加载合约以及每一个合约的aj值即可。

算法:

HWM的离线算法会生成每一个合约的服务率,服务率的大小取决于合约的紧急程度。算法会把每一个demand连同符合条件的supply标记。设对于合约j,所有满足条件的supply节点的流量和为Sj,然后按照Sj/dj升序排序(原文是按照Sj排序,在另一篇论文里是按照Sj/dj排序,个人认为后者更合理,具体见附录),这个值越小,意味着这个合约优先级越展示。按照这个值对合约升序排序,得到一个叫allocation order的排序结果。接着计算服务率,算法如下:


图四
第一步:设ri为每一个supply节点的剩余流量,si为预测流量,那么最开始,ri=si;
第二步:对于所有的合约j,先按照allocation order排序,再求解aj。这个式子的含义是,把所有合约j满足的supply节点拿出来,对每一个supply节点都求出min{ri,si*aj}值,然后求和,使得和等于dj。如果没有解,那么aj=1;再更新每一个ri。
这个式子什么含义呢?
aj代表合约应该被展示的概率,si*aj代表supply节点i应该给合约j的量,但是可能这时i节点已经没有这么多量了,这时i节点应该给j的量就是ri,所以对每一个节点i,取的是最小值。对所有符合条件的节点i都求出展示量并且求和,就是节点j可以得到的展示量,这个值应该等于合约量dj。至此,一个合约的aj求出来了,然后再更新supply的ri值。下一次迭代。
现在来直观地理解一下这个算法:首先按照allocation order排序,那么最紧急的合约已经被排到了第一位。然后根据Sj/dj算出aj。aj表示你每一个服务条件的supply节点给我的量的比例。因为这是第一个demand点,所以不存在流量不够的情况。那么对于后面的demand节点,就可能存在某些supply节点量不够的情况,这时只能用ri代替,那么其他节点就需要多出量,所以这时得到的aj肯定是大于Sj/dj的。当然也可能所有的supply节点都不够,那么就把aj设为1。

图五

看上面的例子,排序结果是2-1-3。先算2,a2=200/200 = 1,更新第三个supply节点的ri=0;再算1,由于第三个节点ri=0,所以只能用前两个节点,a1=200/800 = 1/4;a3留给读者。
至此离线算法结束,我们已经为每一个合约都赋予了一个服务率aj。
下面是在线部分。
第一步:给定一个展示i,设J={c1,c2,。。。,c|J|}为所有符合条件的合约集合,并且按照allocation order升序排序;
第二步:设l是[1, |J|]中的最大值,A = a1+...al <= 1,但是a1+...a(l+1) > 1,那么令a(l+1) = 1 - A;
第三步:对于1 <= j <= l,每一个合约j的服务率就是aj,而j=l+1的服务率是上面计算得到的a(l+1)。然后按照这个服务率作为这些合约的概率,从中选出此次展示的合约。
注意,这里假设是aj求和大于1的情况,如果小于1,则意味着有些流量是浪费的。
看之前的例子:
如果展示{CA,age=5}到达,那么l=1,则合约1总是被选中;
如果展示{Male,age=5}到达,那么l=2,1/4的概率分给合约1,5/8的概率分给合约3,1/8的流量会不会被分配。这些流量可以被其他变现途径利用。
至此,HWM算法就介绍结束了。原文的评估部分没有继续探讨了,有兴趣的可以自行查阅。

小结:

GD系统的挑战:
1.计算量大;
2.依赖预测的准确性;
HWM的思路:
1.2-step;
2.用aj代替了xij,较少内存消耗;

附录:这是另一篇shale算法论文中对HWM的描述,其中allocation order的一句被定义为Sj/dj,与本文不同,个人认为shale论文的定义更合理。


http://chatgpt.dhexx.cn/article/a84grkae.shtml

相关文章

IMEI 码的校验和生成

IMEI 码的校验和生成 文章目录 IMEI 码的校验和生成IMEI 码Luhn算法代码实现C IMEI 码 IMEI 码&#xff0c;即手机的串号。它是 International Mobile Equipment Identity( 国际移动设备身份) 的简称&#xff0c;就像是手机的身份证&#xff0c;是用来帮助辨别手机身份真伪的。…

Android获取手机设备识别码(IMEI)和手机号码

最近看了下获取手机设备ID和手机信息以及SIM的信息例子&#xff0c;主要还是借鉴别人的&#xff0c;现在自己写一下&#xff0c;算是巩固加深了&#xff0c;也希望能给大家一个参考 必要的条件还是一部真机&#xff0c;SIM卡或者UIM卡。 首先&#xff0c;在AndroidMainfest.x…

手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)

文章目录 Android篇1 IMEI和MEID2 DeviceId3 mac地址4 ANDROID_ID5 UUID6 OpenUDID7 Serial Number8 IDFA9 GAID iOS篇1 IMEI2 IDFA3 mac地址4 UDID5 UUID6 如何正确的获取设备的唯一标识7 什么是钥匙串 Android篇 1 IMEI和MEID (1) IMEI (International Mobile Equipment Id…

什么是IMEI / MEID?他们有什么不同?

摘要: 最近小编了解到一个新的概念&#xff1a;MEID码。说实话&#xff0c;一开始小编并不了解这是个什么。小编以为是不是打字的时候打错了啊&#xff0c;是不是要了解的是IMEI码呢&#xff1f;后来百度了一下才知道我理解错了。小编就做一回好学生&#xff0c;在苹果手机找回…

手机IMEI码规则介绍

2019独角兽企业重金招聘Python工程师标准>>> 手机IMEI码由15-17位数字组成。 第一部分 TAC&#xff0c;Type Allocation Code&#xff0c;类型分配码&#xff0c;由8位数字组成&#xff08;早期是6位&#xff09;&#xff0c;是区分手机品牌和型号的编码&#xff0c…

android 华为 imei,华为手机怎么查看IMEI码?华为手机查询IMEI串号两种方法,华为imei...

华为手机怎么查看IMEI码&#xff1f;华为手机查询IMEI串号两种方法&#xff0c;华为imei 每一部手机的串号都是不同的&#xff0c;如果想要查看华为手机的IMEI串号&#xff0c;我们该怎么样来查询呢&#xff1f;下面一起来看看操作的方法吧。 华为手机查询IMEI串号两种方法 方法…

IMEI是什么? 怎样查手机串号IMEI

IMEI的基本含义 IMEI&#xff08;International Mobile Equipment Identity&#xff0c;移动设备国际识别码&#xff0c;又称为国际移动设备标识&#xff09;是手机的唯一识别号码。我们从这个缩写的全称中来分析它的含义&#xff1a;“移动设备”就是手机&#xff0c;不包括便…

智能手机串号IMEI码丢失(无效IMEI)解决恢复办法

本方法本少爷亲测可行&#xff0c;故做一记录如下&#xff1a; 准备工作&#xff1a; 1、手机已经ROOT。没有ROOT的下载ROOT大师即可ROOT。 2、下载移动叔叔工具箱 3、下载MTK6575主板序列号及IMEI生成器 详细步骤 1、记录你的手机IMEI串号&#xff1a;IMEI串号&#xff0c;可以…

手机的imei号的获取

手机的设备信息&#xff0c;是我们在做证书验证的时候不可缺少的&#xff0c;这里我会写一些我们常用的手机信息获取办法。TelephonyManager是我们手机管理的一个大的类&#xff0c;继承的Object。 1核心代码和权限 Context.getSyste…

获取手机唯一识别码IMEI

前言 获取IMEI相信大家非常熟悉&#xff0c;但是项目中使用时&#xff0c;发现当手机卡为电信的时候&#xff0c;获取的并不是IMEI&#xff0c;而是MEID&#xff0c;什么是MEID&#xff0c;为什么会出现这种情况呢&#xff1f; IMEI国际移动设备识别码&#xff08;IMEI&#xf…

IMEI、IMSI、ICCID、SN是什么?意义和区别?通信模组或手机的唯一识别码

最近在做几个4G移动端的产品&#xff0c;初入行门有很多生涩的名词。想获取一个全球唯一ID作为设备后台管理编号&#xff0c;就扯出了 IMEI、IMSI、ICCID、SN 这几个东西。 IMEI IMEI&#xff1a;国际移动设备识别码 &#xff08;International Mobile Equipment Identity&…

ProtcolBuffer基础原理

Protocol Buffer由Google出品的一款轻量而高效的数据序列化和反序列化的方法,下面的我们来介绍一下Protocol Buffer的内部实现原理。 1.类实例 编码包括数据的编解码和函数方法的还原 2.ProtcolBuffer的数据类型 TypeMeaningUsed For0Varintint32, int64, uint32, uint64,…

ADI Blackfin DSP处理器-BF533的开发详解13:LDF内存分配的详解(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP上的LDF&#xff08;Linker Description Files&#xff09;连接器描述文件是处理器用来进行资源分配的文件&#xff0c;通过对LDF文…

M4内核的FPU/DSP使用总结

FPU简介 近年&#xff0c;在Cortex-M3之后ARM公司又推出Cortex-M4内核&#xff0c;ARM Cortex-M4处理器是由ARM专门开发的最新嵌入式处理器&#xff0c;在M3的基础上强化了运算能力&#xff0c;新加了浮点、DSP、并行计算等。Cortex-M4处理器的最大亮点之一&#xff0c;也是本文…

【STM32F407的DSP教程】第37章 STM32F407的FIR低通滤波器实现(支持逐个数据的实时滤波)

完整版教程下载地址&#xff1a;http://www.armbbs.cn/forum.php?modviewthread&tid94547 第37章 STM32F407的FIR低通滤波器实现&#xff08;支持逐个数据的实时滤波&#xff09; 本章节讲解FIR低通滤波器实现。 目录 37.1 初学者重要提示 37.2 低通滤波器介绍…

【STM32F429的DSP教程】第41章 FIR滤波器的群延迟(重要)

完整版教程下载地址&#xff1a;http://www.armbbs.cn/forum.php?modviewthread&tid94547 第41章 FIR滤波器的群延迟&#xff08;重要&#xff09; 本章节为大家介绍FIR滤波器的群延迟问题。 目录 41.1 FIR滤波后的群延迟 41.2 总结 41.1 FIR滤波后的群延迟 波…

STM32F407 DSP+FPU进行FFT变换(2)

STM32F407 DSPFPU进行FFT变换 接着上一篇继续&#xff0c;要用FFT运算的话&#xff0c;F4有FPU和DSP库&#xff0c;可以很方便让我们去对数据进行傅氏变换。首先得配置好DSP库和FPU。 配置DPS库和FPU CubeMX一般是默认配置开启FPU&#xff0c;但是DSP库需要自己去添加。这里…

【STM32F407的DSP教程】第41章 FIR滤波器的群延迟(重要)

完整版教程下载地址&#xff1a;http://www.armbbs.cn/forum.php?modviewthread&tid94547 第41章 FIR滤波器的群延迟&#xff08;重要&#xff09; 本章节为大家介绍FIR滤波器的群延迟问题。 目录 41.1 FIR滤波后的群延迟 41.2 总结 41.1 FIR滤波后的群延迟 波…

Powell算法、Powell修正算法_matlab仿真

1.鲍威尔基本算法的运算流程 1.采用坐标轮转法顺次沿n个坐标轴方向[e1,e2,...,en]进行一维搜索。然后以初始点X(0)和终点Xn(1)构成一个新的方向S(1)&#xff0c;并以此方向为搜索方向在做一维搜索得到极小值点X(n1)(1)。 2.去初始点X0(2)X(n1)(1)&#xff0c;并去掉元搜索方向组…

SVPWM仿真和基于DSP28335的PIL(处理器在环) 仿真模型(将matlab仿真算法生成代码在DSP中在线运行返回数据给Matlab)验证算法可行性和实时性

SVPWM仿真和基于DSP28335的PIL(处理器在环) 仿真模型&#xff08;将matlab仿真算法生成代码在DSP中在线运行返回数据给Matlab&#xff09;验证算法可行性和实时性。 对于数字信号处理很有用。 ID:73400638006173885书院街登山的兰瓜