[转]Auction算法介绍

注:阅读资料,无链接,感觉写得挺好的。


一、传统拍卖竞价策略

1、英式拍卖(English Auction)
英式拍卖又叫公开增价拍卖OAB(Open Ascending Bid),卖家提供物品,在物品拍卖过程中,买家按照竞价阶梯由低至高喊价,出价最高者成为竞买的赢家。为了保证竞价收敛,一般会为竞价设定一个终止时间。

2、荷兰式拍卖(Sealed-bid Auction)
荷兰式拍卖亦称公开减价拍卖ODB(Open Descending Bid),其过程与英式拍卖过程相反:竞价由高到低依次递减直到第一个买家应价时成交的一种拍卖方法。

3、第一价格密封拍卖FPSB(The first-price sealed auction)
第一价格密封拍卖,买方将自己的出价写在一个信封里,众多买方进行投标,同一时间揭晓信封价格,出价最高者竞价成功。

4、第二价格密封拍卖SPSB(The Second Price Sealed Auction)
又称为维克里拍卖(Vickrey Auction),其拍卖过程和第一价格密封拍卖过程一样,由出价最高的买家获得物品,但他只需要支付所有投标者中的第二高价。

二、互联网广告竞价策略

1、广义第一价格GFP(Generalized First Price)
与传统的第一密封竞价(FPSB)类似,出价高者得,需要支付自己提出的报价。
缺点:
1)平台方收益会非常不稳定。
2)竞价效率不高。

举例

广告位
平均每小时点击量
1 200
2 100
广告主
平均每次点击收益
A 10
B 4
C 2

出价过程:

  1. C -> 2
  2. B -> 2.01(出价超过2,C放弃出价)
  3. A-> 2.02
  4. B-> 2.03
  5. A-> 2.04
  6. ...
  7. A-> 4.01 (出价超过4,B放弃出价)

一方放弃之后,另一方失去竞争者,从而再次把价格拉低(A想,我没有竞争者了,为啥还出价这么高)。

放弃方得知价格被拉低后,又会开始新一轮的“微小差值策略”。

于是,广告位的价格极不稳定,呈现上图中的态势,Yahoo和Google初期都是采用这种策略,直到2002年Google提出了GSP竞价算法。

2、广义第二价格GSP(Generalized Second Price)
和传统第二密封竞价(SPSB)类似,出价高者得,需要支付出价第二高者提出的报价再加上一个最小值。

举例

广告位
平均每小时点击量
1 200
2 100
广告主
平均每次点击收益
A 10
B 4
C 2

此时:
    A的实际出价为4+0.01=4.01
    B的实际出价为2+0.01=2.01
    C竞价失败

【实际最终出价跟GFP一样啊,哪里有问题?】

GSP是一种稳定的竞价方式,可操作性很强,现阶段几乎所有的互联网广告平台都使用这一种竞价方式。
GSP的不足是,它也不是一种“鼓励讲真话”的机制,说实话不一定形成纳什均衡,竞价的结果不一定全局最优化的。于是,VCG竞价算法出现了。

3、VCG(Vickrey-Clarke-Groves)竞价机制
广告主为网民的一次点击支付他对其他广告主造成的效用损失。

举例

广告位
平均每小时点击量
1 200
2 100
广告主
平均每次点击收益
A 10
B 4
C 2

定价过程:
1)假设A不参加竞价,B和C的社会总效用为200*4 + 100*2 = 1000元
2)A如果参加竞价,B和C的社会总效用为100*4 + 0*2 = 400元
3)因为A参加了竞价,导致B和C的社会总效用损失了1000 – 400 = 600元
4)于是,A需要为每一次点击支付600 / 200 = 3元
但实际应用中,受损者的社会总效用损失难于计算,故VCG竞价机制几乎没有谁真的来使用。

三、GSP竞价策略公式

1、排序时,只考虑出价。按CPM收费时采用。

排序公式

rankScore=eCPM=bid

计费公式

chargei=rankScorei+1=bidi+1

2、排序时,不仅仅考虑出价,同时考虑CTR。CPC计费时采用。

排序公式

rankScore=eCPM=bid×ctr

计费公式

chargei×ctri=rankScorei+1=bidi+1×ctri+1
chargei=ctri+1ctri ×bidi+1

如果大家的CTR都一样,charge就是bid。如果CTR低,多出点钱,如果CTR高,少出点钱。很合理。

3、广告与非广告混排

首先,为什么要混排?为了更多的广告位?    

对于美团来说,在没有上广告之前,就有一部分收入——佣金收入,非广告排序模型目标就应该是最大化这个收入。【此处没有考虑流量的问题,为了保证流量,需要补贴,需要提供信息服务,很难以收入为目标】

     当引入广告之后,收入就变成了2部分:佣金收入和广告收入。我们在提高广告收入的时候可能会同时提升佣金收入,也可能降低佣金收入。所以我们建模就不能照搬一般的广告模型,我们的模型需要兼顾佣金收入与广告收入,模型的终极目标应该是最大化二者之和,所以我们的排序公式应该是这样的。

rankScore=eCPM_Profit+eCPM_Ads

    如果我们不唯利是图的话,还要保证用户体验,加上自然相关性的因素【个人觉得,在一个商业交易的平台上,访购率体现的就是相关性】。

rankScore==eCPM_Profit+eCPM_Ads+λ×relevanceprofit×ptr+bid×ctr+λ×relevance

    其中,profit为毛利,ptr为支付率【假设是以支付量来计算收入的话】。

    eCPM的单位是钱,relevance的单位不是钱,通过λ来进行转换并控制对整体分数的影响。

    这是我理想中的排序公式。

    理想很丰满,现实可能很残酷。

    佣金部分的收入计算面临一些问题,首先,佣金比较敏感,我们可能拿不到,其次佣金是以deal为单位的,而我们的模型是以POI为单位的,可能会带来很大误差。第一个问题是最主要的,没有数据我们根本无从计算。所以我们只能忍痛割爱。

    短期的解决办法是什么呢,我们假设自然排序的relevance能大概代表佣金部分的收入【理论上自然排序的目标是最大化佣金收入,实际上自然排序的核心KPI是访购率,所以自然排序模型是按点击率、下单率、支付率综合分排序的,POI的佣金根本不在其中,所以这个假设不太靠谱,但是我们目前只能这么假设了】。

    根据这个不靠谱的假设之后,公式变成了

rankScore=relevanceScore+adScore=relevance+λ×bid×ctr

计费公式

λ×chargei×ctri+relevancei=rankScorei+1
chargei=rankScorei+1relevanceiλ×ctri

进行分解之后

chargei=====rankScorei+1relevanceiλ×ctrirelevancei+1+adScorei+1relevanceiλ×ctrirelevancei+1relevanceiλ×ctri +adScorei+1λ×ctrirelevancei+1relevanceiλ×ctri +λ×ctri+1×bidi+1λ×ctrirelevancei+1relevanceiλ×ctri +ctri+1ctri ×bidi+1

可以看出计费包括2部分:一部分是自然排序上的,一部分是广告上的。

如果我们去掉自然排序上的收费,就变成了GSP计费。 那么,【为什么在主流的广告平台上采用固定广告位时,不考虑自然相关性的问题,只考虑广告部分呢?是为了简化模型?还是固定广告位不需要考虑自然相关性?】【如果说固定广告位不需要考虑自然相关性,为什么我们混排时要考虑呢?】

在考虑自然相关性的情况下,我们分情况分析下计费公式。

1)如果第i+1位不是广告,bid就是0。

chargei===relevancei+1relevanceiλ×ctri +ctri+1ctri ×bidi+1relevancei+1relevanceiλ×ctri +ctri+1ctri ×0relevancei+1relevanceiλ×ctri

charge跟bid没有任何关系了。【λ的计算跟bid也没有关系,是根据保底价计算的】

  • 如果广告位置没有提升,relevance_{i+1} - relevance_{i}就是负值,charge就是负值。相当于不需要为广告掏钱,算非广告展现。
  • 如果广告位置提升了,relevance_{i+1} - relevance_{i}就是正值,charge就是需要为位置提升支付的钱。relevance的值对charge的影响很大。

2)如果第i+1位是广告,bid非0

公式转换

chargei===rankScorei+1(rankScoreiλ×ctri×bidi)λ×ctrirankScorei+1rankScorei+λ×ctri×bidiλ×ctrirankScorei+1rankScoreiλ×ctri+bidi

从公式可以看出,正常情况下,rankScore_{i+1} - rankScore_{i} 是负的,所以charge会比bid低。

看一下charge跟bid的大小,判断charge是否会出现比bid大的情况。

  • 如果2个广告的次序没有变化,relevance_{i+1} - relevance_{i}就是负值,整体的charge会比单独广告部分的charge低。极端情况整体charge会是0或者负的,相当于不用花钱。这个感觉不太合理啊。不知道这种极端情况出现的概率有多高。
  • 如果2个广告的次序发生了变化,relevance_{i+1} - relevance_{i}就是正值,整体的charge会比单独广告部分的charge高。

四、λ的计算

1、目的

    设置λ是为了控制广告对自然排序的影响,把λ设置比较小时,广告对自然排序影响小,设置大时影响大。

     那么λ设置成多大可以利益最大化,目前还没有好的算法。

2、当前策略

    当前的策略是人工设置广告提升的位次,然后根据提升位次来计算λ。比如说,整个序列中,所有广告最少提升4位(头部的除外)。

3、计算第一步

计算每个广告提升4位需要的λ。

位置排序是按rankScore,再看下公式

rankScore=relevanceScore+adScore=relevance+λ×bid×ctr

如果我们要把广告从 i 位置提升到 i-4 的位置,那么必须满足下面的条件

rankScorei4<rankScorei<rankScorei5

设置

rankScorei==rankScorei4+rankScorei52relevancei+λ×bidi×ctri

得到λ的计算公式

λ=====rankScorei4+rankScorei52relevanceibidi×ctrirankScorei4+rankScorei52×relevancei2×bidi×ctrirankScorei4+rankScorei52×relevancei2×bidi×ctrirelevancei4+λ×bidi4×ctri4+relevancei5+λ×bidi5×ctri52×relevancei2×bidi×ctri(relevancei4+relevancei52×relevancei)2×bidi×ctri+(bidi4×ctri4+bidi5×ctri5)2×bidi×ctri×λ

化简

λ=(relevancei4+relevancei52×relevancei)2×bidi×ctri(bidi4×ctri4+bidi5×ctri5)

1)如果 i-4 跟 i-5 位置上都不是广告,对应的bid就是0,那么公式简化为

λ=(relevancei4+relevancei52×relevancei)2×bidi×ctri

2)如果 i-4 跟 i-5 位置上有广告,那么λ会比非广告的情况大。目前线上都是当非广告处理的,为什么?因为这2个位置的广告会被提升走?

3)  另外,线上使用的保底价而不是bid,为什么?

     如果召回序列中只有1个广告主时,如果使用bid计算λ,λ跟bid成反比,rankScore是固定的,最后广告最多只能提升4位,广告主提高bid也无法提升广告的位置【与提高出价提高位置的目的冲突】。这种情况下,如果使用保底价计算λ,λ就是固定的,rankScore随bid增长【计算rankScore使用的bid】,所以广告主提高bid,广告的位置就会随之提升。

rankScore=relevanceScore+adScore=relevance+λ×bid×ctr

    也可以这样理解保底价意图,如果广告主的bid出价跟保底价相同,那么给你提升4位,出价越高,位置越高。

4、计算第二步

根据每个广告计算得到的λ,得到一个整体的λ。计算办法包括:最大值、平均值、中位数。

1)如果取最大值会怎么样?

     如果λ取最大值,那么大家都至少提升4位,有点可能会提高非常大。

2)如果取平均值会怎么样?

3)如果取中位数会怎么样?

5、线上数据分析

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试