计算广告的训练与平滑思想(下)



  • 作者:Ivan

    我们在之前的文章(http://bit.ly/2aBbxRt )讨论了计算广告中新广告的CTR训练部分,但是仅有训练是不够的,因为广告的点击率是随着时间迁移以及用户喜好变化而改变的。举个例子,同一条京东的品牌广告在10月11日和11月11日的点击率肯定差别很大,因为双十一促销会带动人们进入京东购物的需求。那么,我们需要不断的对广告做训练吗?不完全是。因为我们虽然需要通过训练动态的调整广告的CTR预估,但和普通的训练不同,这次并非从0开始,而是在有先验知识的情况下做训练。所以,用一个新的名词来表述这个过程,即是:平滑,也就是在具有先验知识的情况下,持续性的训练过程。

    要做好平滑,一定要利用好先验知识,也就是历史CTR均值(HistoryCTR)。最先能想到的用法是给历史CTR一个权重,同时给近期CTR(CurrentCTR)也赋予一个权重,加权得到平滑的CTR(SmoothCTR),公式如下:

    SmoothCTR = HistroyCTR × a + CurrentCTR × b

    0_1469387755109_1.png

    如上图所示,这么计算非常简单,也能够起到一定平滑的效果,但是如果深入去想我们马上会遇到新的问题:1、用CTR计算足够准确可靠吗? 2、对所有天数的曝光一视同仁就足够了吗 (权重如何设定)? 3、如果加入新广告又对预测有什么影响?

    先回答第一个问题“用CTR计算足够准确可靠吗”。因为每一天广告的曝光数是不一的,比如在节假日广告平台的访问量激增,那么当天的曝光数会很多,而有的时候,广告平台访问量会比较少,那么广告的曝光也会减少。根据上篇文章的讨论,曝光量越多的天数,其CTR也就越准,那么对所有天数的CTR给予均等的权重显然是不合理的。

    那么让我们改进上面的公式,使用历史的曝光(HistoryI)和点击数据(HisotoryI)代替历史的CTR,同时对CurrentCTR做类似的替换,如下:

    SmoothCTR = a × (HistoryC /HistoryI) + b × (CurrentC/CurrentI)

    第二个问题,这样就对所有天数的曝光一视同仁了,但是应该就足够了吗?我们知道用户的喜好是影响广告CTR的主要因素,但用户的喜好往往是渐变的,就像双十一电商广告的CTR,并不是在双十一那一天瞬间变高的,而是在十一月七八号开始慢慢变高,到11号达到峰值。如下图:

    0_1469387864838_2.png

    显然,假如今天是11月10日,相比11月1日的CTR我用11月9日或11月10日的CTR更容易预估准11月11日的CTR。可以由此推论,在平滑公式中,近期的曝光及下载数据相比远期更具有代表性,也就里所应当有更大的权重,所以再次优化公式,把第一个权重a用一个指数函数代替。这不仅考虑一段时间HistoryC和History的变化,而且赋予不同的权重。公式如下:

    0_1469387895940_9.png

    n越小越代表离今天越近。因为引入了随着时间变化的CTR权重,可以把当前CTR作为历史CTR的一部分,在公式中进行合并(不是上面公式的直接转换)如下(为了保证权重加和等于1,令x=0.5):

    0_1469387916385_10.png

    到这里,一切看上去已经比较严谨,但如果考虑第三个问题,考虑新进入的广告就不是了。一个上线两天的广告,和一个上线一个月的广告相比,用上面的公式计算会非常不公平。为了消除这种不公,我们需要给这个公式加上很多逻辑条件,比如:对上线仅有两天的广告,做一些加成处理。这样一来,我们就要进入不断对公式修修补补的状态,这一方面增大了开发的难度,另一方面也增高了公式调优的困难。那么是否有简单的方式来用统一的逻辑实现所有广告的CTR平滑任务呢?

    既然我们需要考虑先验知识,同时又要兼顾上线时间不同的广告,我想到了马尔科夫链(先验知识联系到贝叶斯定理,而与时间的关系联系到时序序列模型),加入我们把从第一天到第n天的所有先验知识汇总到第n天的结果,并以此来对第n+1天的CTR进行平滑,问题就会迎刃而解。因此,只需要找到一种满足上面规则的平滑方法,我们甚至不需要记录每一个广告在之前每一天的曝光、点击数据,只需要知道广告在前一天的平滑CTR,即:SmoothCTR,加上今天的曝光、点击数据,就可以计算今天的平滑CTR了。这样可以大大降低数据的存储、计算量以及简化程序实现逻辑。而实现这一逻辑的平滑方法就是大名鼎鼎的贝叶斯平滑了。
    利用先验知识的鼻祖就是贝叶斯,在广告平滑上,没有什么方法比贝叶斯平滑能够更好的利用先验知识了,而帮助贝叶斯平滑方法实现目标的就是Beta分布。Beta分布的强大之处在于,通过改变其中的两个参数α和β,你可以让Beta分布的图形变成任意形状,而且在加入先验知识前后,通过贝叶斯变换,对CTR的预估都可以表示为Beta分布。具体的推导过程在这里就不做复述,感兴趣的同学可以阅读参考材料(http://maider.blog.sohu.com/306392863.html)。Beta分布的累积分布函数如下。

    0_1469387967746_3.png

    如果你认真阅读完了参考材料,我猜你已经非常清楚Beta分布中参数α和β的本质含义,即:α表示点击数,β表示曝光数。因为贝叶斯平滑的具体公式就是:

    SmoothCTR = (α + CurrentC - 1) / ( α + β + CurrentI -2)

    而参数α和β来自于先验知识。能不能直接把历史点击和历史曝光分别赋值给α和β来进行计算呢?显然不行,因为这么做就会犯之前我们提到的那些问题,比如不同日期的曝光、点击权重应该不一样。所以基础的贝叶斯平滑是不能解决我们刚才提到的问题的,我们需要深入研究Beta分布的特性,用一种新的方法通过先验知识求解α和β,从而计算SmoothCTR。

    Beta分布除了两个显性的重要参数α和β外,还有两个相对隐形但同样重要的参数,平均值和中位数,通过平均值和中位数可以唯一确定α和β的值,它们的数学关系如下:

    0_1469388015765_4.png

    因此,如果我们确定了平均值和中位数,那么α和β的值也就确定了(根据均值和中位数求解α和β的过程请读者自行推导),所以可以试着从平均值和中位数入手分析。让我们来看看beta分布的密度函数:

    0_1469388041494_5.png

    这是在α和β取不同值的时候Beta分布的样子,那么既然我们是希望用Beta分布模拟预估CTR的分布,我们需要知道预估CTR的分布是什么样子。假定我们在1000天中,对同一条广告每天给与100000次曝光,以测试其CTR,每一天都可以得到一个预估CTR,那么1000天一共可以得到1000个预估的CTR,把这1000个预估CTR做成直方图的话,根据中心极限定理,应该可以得到一个非常接近正态分布的图形。所以我们可以期望预估CTR的分布是近似服从正态分布的(之所以说近似是曝光数还不够多,如果每天可以有无穷多次曝光,那么就是正态分布),那么如果用Beta分布来模拟它,图形一定也是非常接近正态分布的。

    我们也知道,正态分布的均值和中位数是相等的,如果我们需要模拟出正态分布,我们就需要让Beta分布的均值和中位数接近,但不是越接近越好。因为,中心极限定理中,我们需要做无限多次实验,才能保证分布服从正态分布,这意味着我们要投入无限多次曝光,这显然是不现实的,因此中位数和均值(均值略大于中位数)的比值,记为:r,可以成为一个非常好的可调节参数,用来控制平滑基础的曝光量的多少,也就是β的大小。如果均值和中位数越接近,Beta分布就越像正态分布,β从而也就越大,那么上面公式中,CurrentI对于SmoothCTR的影响力也就越小,类比到公式一中就意味着近期CTR的权重比较低而历史CTR的权重比较高。下面列出一些r不同时候的平滑图像:

    当r=0.99时,平滑的效果并不明显,这个时候近期CTR的影响权重很大。

    0_1469388076405_6.png

    当r=0.998时,平滑的效果变得比较明显,历史CTR和近期CTR的影响力度较合适。

    1_1469388099308_8.png
    0_1469388099308_7.png

    最后一个关于平滑的细节是,均值用前一天的SmoothCTR代替,中位数用SmoothCTR/r来得到,因为分布的均值就是当前对CTR最合理的期望,即:SmoothCTR。至此,关于计算广告的训练和平滑思想就讲完了,虽然使用了很多数学概念,但理解起来相信并不复杂,实际的计算过程更加简单。在工业界,解决问题常常不是用复杂的公式和推导,如果有好的思维方式,用很简单的数学公式也可以解决很复杂的难题。关于计算广告的一切这仅仅是开始,希望将来能够和读者朋友们继续探讨这个行业其他更加深入的话题。


登录后回复
 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待