计算广告实时结算超投问题解决方案的分析

计算广告实时结算超投问题解决方案的分析

####1、超投问题应对方案
大流量高并发的实时结算系统会有一个令人十分头疼的问题,就是超投。在广告系统中,结算环节会实时计算各个广告主账户内的余额,如余额为0,既要立刻停止投放。所谓超投,就是指在结算系统发出停止投放的指令到系统实际将广告下线的这段时间内,投放系统错误的将下线广告投放出去。这部分被错误投放的广告是不能向广告主收钱的,也就造成了平台的损失。由于广告系统流量大,系统链路比较长,在广告检索环节又采用了分布式索引,因此一个小的系统RT抖动就可能造成大量损失。
解决超投有两点:一是缩短结算发出下线指令到引擎下线广告之间的RT;二是当账户余额较低时放慢该账户下广告的投放速度,虽然无法避免超投,但是可以大幅度的降低超投造成的损失。本文主要对第二点进行一些分析。
一个比较容易想到的方案是,在广告的检索环节,对在doc对应的表上定义一个多值类型的字段(设字段名称为minratio,可以存放10个数值)。在线投放时,会有一个过滤条件,具体逻辑是每次检索会随机生成一个取值范围为[1,10]的整数,如果一个doc对应的minratio字段的取值包含了这个数字,那么就保留进入后续流程,否则,这个doc会被过滤掉。比如,有一个doc的minratio取值为(1,2,3,4,5,6),随机生成的数字如果是6,那么这个doc就会被保留,如果随机生成的数字是9,那么这个doc就会被过滤掉。一般情况下,这个字段中存放了1~10十个数字,结算系统会根据账户余额不断的调整数字的个数。minratio字段中存放的数字个数决定了这个doc被投放的概率。
但是这里面有一个细节。假设一个doc的投放概率是40%,那么应该在minratio中存放哪四个数字呢?有两个选项:一是按顺序存放,40%即存放(10,9,8,7),如果概率是30%,就存放(10,9,8);二是每次更新的时候随机存放四个数字,比如(2,5,7,9),每次更新数字个数时都会随机生成N个数字。
先看看两种方案会分别带来什么结果。采用第一种方案,如果检索时生成的随机数是10,那么所有的doc都会被检索出来,随机数是9,会有90%的doc会被检索出来,依次类推;采用第二种方案,不管检索时生成的随机数是多少,检索出来的doc的数量是近似相等的,只不过随机数不同,检索出的doc会不同。
####2、方案对比
这两种方案哪个更好呢?下面就来分析一下。设a/10概率投放的doc的数量为D_a,设当检索随机数为x时,检索出来的doc数量为r(x)。
第一种方案: r 1 ( x ) = ∑ i = x 10 D i r_1(x)=\sum_{i=x}^{10}{D_i} r1(x)=i=x10Di
第二种方案: r 2 ( x ) = ∑ i = 1 10 i ⋅ D i 10 r_2(x)=\sum_{i=1}^{10}\frac{i\cdot D_i}{10} r2(x)=i=11010iDi
下面来做一个概率计算。设检索随机数是均匀分布的,那么 E [ r 1 ( x ) ] = 1 10 ∑ j = 1 10 ∑ i = j 10 D i = 1 10 ∑ j = 1 10 i ⋅ D i = E [ r 2 ( x ) ] E[r_1(x)]=\frac{1}{10}\sum_{j=1}^{10}\sum_{i=j}^{10}D_i=\frac{1}{10}\sum_{j=1}^{10}i\cdot D_i=E[r_2(x)] E[r1(x)]=101j=110i=j10Di=101j=110iDi=E[r2(x)],也就是说,两种方案的平均检索深度是一样的。那么究竟哪种方案对广告业务更好呢?
这个问题有很多种维度的解答,这里从收益角度进行分析。现在广告大都是竞价广告,收益和参加竞价的人数是正相关的,假设收益P和检索深度l之间的函数关系为 P = p ( l ) P=p(l) P=p(l),现在这个问题其实就是比较$P_1=\frac{1}{10} \sum_{i=1}{10}p(\sum_{i=x}{10}D_i ) 和 和 P_2=p(\frac{1}{10} \sum_{i=x}^{10}i\cdot D_i )=p(\frac{1}{10} \sum_{j=1}{10}\sum_{i=j}{10}D_i ) 的 大 小 。 上 面 的 式 子 看 起 来 很 复 杂 , 但 其 实 很 简 单 。 根 据 基 本 的 数 学 推 导 可 以 得 到 结 论 : 的大小。 上面的式子看起来很复杂,但其实很简单。根据基本的数学推导可以得到结论: P_2 大 于 大于 P_1 的 充 分 条 件 ( 注 意 ! 是 充 分 条 件 , 不 是 充 分 必 要 条 件 ! ) 是 : 收 益 P 和 检 索 深 度 l 之 间 关 系 函 数 p ( l ) 是 上 凸 函 数 。 也 就 是 说 , 归 根 结 底 就 是 比 较 的充分条件(注意!是充分条件,不是充分必要条件!)是:收益P和检索深度l之间关系函数p(l)是上凸函数。也就是说,归根结底就是比较 Plp(l)p(x_1 )/2+p(x_2 )/2 和 和 p(x_1/2+x_2/2)$的大小。
####3、方案解析
那么p(l)究竟是上凸函数还是下凸函数呢?先来定性分析一下。用通俗的语言来解释下上面的数学语言,其实就是:究竟是竞价人数更多的时候新加入一个人参加竞价带来竞得价格上涨的概率高,还是人数更少的时候新加入一个人参加竞价带来竞得价格上涨的概率高?
如果一个竞价者想要使得竞得价格上涨,那么他的出价必须高过所有现有的竞价者的价格,所以参与竞价人数越多,这个概率越低。虽然广告竞价采用的机制是GSP,与传统竞价规则不同,但是这个结论是一样的。从这个角度来看,p(l)应该是一个上凸函数。
针对这个问题,用MATLAB仿真,模拟广告GSP竞价过程,方便分析。假设有500个广告流量,每个流量的市场平均价值是100元(纯假设),有多个广告主对这些流量进行独立竞价(广告主数量即竞价深度),广告主对流量的出价服从均值为100元(即流量市场平均价值)的正态分布,正态分布的方差分别为1,10,100。仿真的目的是分析参与竞价的广告主数量与流量平均竞得价格之间的关系(仿真代码见附录1)。
计算广告实时结算超投问题解决方案的分析_第1张图片
上图分别体现了方差为1,10,100、竞价深度为1-500情况下的竞价结果,可以看到确实是一个上凸函数。且方差越大,竞得价格随竞价深度增长的幅度越大。最终,当竞价深度不断增长,竞得价格会趋于不变。
####4、结论
综上所述,在竞价广告的场景下,考虑到广告竞价收益,方案二要优于方案一。
同时,从广告业务出发,可以看出,当竞价深度比较小时提升竞价深度的收益要大于竞价深度比较大时提升深度。

附录1

avg_price=100;
bid_depth_range=1:500;
pv_num=500;
 
for std_derivation=[1,10^0.5,10]
    sum=zeros(size(bid_depth_range));
    for i=1:pv_num
        price=[];
        bid_member=randn(1,length(bid_depth_range))*std_derivation+avg_price;
        bid_member(bid_member < 0)=0;
        for k=bid_depth_range
            tmp=bid_member(1:k);
            [m,ind]=max(tmp);
            tmp(ind)=-inf;
            p=max(tmp);
            price=[price p];
        end
        sum=sum+price;
    end
    plot(bid_depth_range,sum/pv_num)
    hold on
end
grid on
xlabel('bid depth')
ylabel('bid result')

如果感兴趣,欢迎关注微信技术公众号
计算广告实时结算超投问题解决方案的分析_第2张图片

你可能感兴趣的:(问题解析,计算广告,广告超投)