问题描述
在做比赛的过程中,我们发现了有转化率这个指标在大量数据下是有效的。理想情况下,例如某个广告点击量是10000次,转化量是100次,那转化率就是1%。但有时,例如某个广告点击量是2次,转化量是1次,这样算来转化率为50%。但此时这个指标在数学上是无效的。因为大数定律告诉我们,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。后者点击量只有2次,不满足“重复试验多次”的条件。
那么如何解决这个问题呢?
整体思路:用估计值来模拟实际CVR。
解决方案
实际上,广告妆化率是随着时间迁移和用户喜好变化而变化的。因此我们可以利用先验知识来持续性地调整CVR。计算广告训练与平滑思想给出了一个很好的解决方案:贝叶斯平滑。
考虑到时序序列模型,我们把从第一天到第n天的所有先验知识汇总到第n天的结果,并以此来对第n+1天的CTR进行平滑。在广告平滑上,没有什么方法比贝叶斯平滑能够更好的利用先验知识了,而帮助贝叶斯平滑方法实现目标的就是Beta分布。Beta分布的强大之处在于,通过改变其中的两个参数α和β,你可以让Beta分布的图形变成任意形状,而且在加入先验知识前后,通过贝叶斯变换,对CTR的预估都可以表示为Beta分布。
Beta分布中参数α和β的本质含义,即:α表示点击数,β表示曝光数。因为贝叶斯平滑的具体公式(后面再讲这个公式的原理)就是:
\[SmoothCTR = \frac{(α + CurrentC - 1)}{( α + β + CurrentI -2)}\]
公式由来:
- 一般来说,点击还是不点击,这是服从伯努利二项分布的。
- 而二项分布的共轭分布就是Beta分布,也就是说,点击率服从Beta分布
- 我们可以从历史数据当中学到历史数据的Beta分布的具体参数,也就是先验分布\(\pi(r)\) (不加任何条件限制的分布)
- 共轭先验有一个特性:如果找到一个\(\pi(r)\),它是\(\pi(x|r)\)的共轭先验,那么r的后验分布\(\pi(r|x)\)和先验分布\(\pi(r)\)会有一样的形式。
- 这个特性告诉我们:先验分布\(\pi(r)\) (也就是历史数据)的分布与后验分布\(\pi(r|x)\) (也就是x条件下点击率r的分布)是一个形式的
- 既然我们知道了先验分布\(\pi(r)\) (也就是历史数据)的分布是beta分布,那么我们就知道了后验分布\(\pi(r|x)\) (也就是x条件下点击率r的分布)分布也是beta分布
- 也就是说 :先验分布\(\pi(r)\) (也就是历史数据) + 后验知识 ----> 后验分布\(\pi(r|x)\) (也就是x条件下点击率r的分布)
- 那么接下来我们就需要求解后验分布\(\pi(r|x)\)的beta分布参数了
- 根据什么什么证明,后验分布的参数\(\alpha = \alpha` + C, \beta = \beta` + I - C\)
- 其中I是展示数量,C是点击数量,\(\alpha` 和 \beta`\) 是历史数据的beta分布参数
- 那么后验分布\(\pi(r|x)\) 就是 \(beta( \alpha` + C, \beta` + I - C)\)
- 如果我们要让点击率误差最小,那么取后验分布的均值,就是最好的点击率了!!!!也就是: \[mean = \frac{\alpha}{\alpha + \beta} = \frac{\alpha` + C}{\alpha + \beta + I}\]
- 是不是很机智!!!
参数估计
能不能直接把历史点击和历史曝光分别赋值给α和β来进行计算呢?显然不行,因为这么做就会犯之前我们提到的那些问题,比如不同日期的曝光、点击权重应该不一样。所以基础的贝叶斯平滑是不能解决我们刚才提到的问题的,我们需要深入研究Beta分布的特性,用一种新的方法通过先验知识求解α和β,从而计算SmoothCTR。
参考文献CTR预估中的贝叶斯平滑方法(二)参数估计和代码实现
矩估计
矩估计的方法要追溯到19世纪的Karl Pearson,是基于一种简单的 “替换” 思想建立起来的一种估计方法。 其基本思想是用样本矩估计总体矩. 由大数定理,如果未知参数和总体的某个(些)矩有关系,我们可以很自然地来构造未知参数的估计。具体计算步骤如下:
Beta分布除了两个显性的重要参数α和β外,还有两个相对隐形但同样重要的参数,均值和方差,通过均值和方差可以唯一确定α和β的值,它们的数学关系如下:(见参考链接beta(贝塔)分布的数学期望和方差)
\[均值 mean =\frac{\alpha}{\alpha+\beta}\] \[方差 var =\frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta + 1)}\]
因此,如果我们根据数据集统计了平均值和方差,那么α和β的值也就确定了:
\[\alpha = mean \frac{mean(1-mean)}{var - 1}\]
\[\beta = (1-mean)\frac{mean(1-mean)}{var-1}\]
EM估计
这种估计方法其实叫Fixed-point iteration。只是有点类似EM的思想。
首先构造出似然函数,然后利用Fixed-point iteration来求得似然函数的最大值。
1)首先给出参数的一个初始值(通常可以使用矩估计得到的结果作为初始值)。
2)在初始值处,构造似然函数的一个紧的下界函数。这个下界函数可以求得其最大值处的闭式解,将此解作为新的估计用于下一次迭代中。
3)不断重复上述(2)的步骤,直至收敛。此时便可到达似然函数的stationary point。如果似然函数是convex的,那么此时就是唯一的最优解。
其实Fixed-point iteration的思想与EM类似。
代码
1 |
|
贝叶斯估计
参考文献转化率(CTR)预测的贝叶斯平滑
点击率平滑的假设
对于一件商品或一条广告,对于某次曝光,用户要么点击,要么没点击,这符合二项分布。因此下文中对于点击率类的贝叶斯平滑,都是基于以下假设:对于某件商品或广告XX,其是否被点击是一个伯努利分布(Bernoulli)。
\[X \sim Ber( r) \tag{3}\]
其中X表示某个广告是否被点击,点击取1,未被点击取0,r是某件商品被点击的概率,即点击率。
冷启动问题——点击率极大似然估计
在(3)式的假设下,可以使用极大似然法计算出点击率的估计值\(\hat{r}\) 。具体做法为:
从用户日志中随机抽取n条记录,对任一条记录i都有
\[X_i \sim Ber( r) \tag{4}\]
那么所有记录的点击数的联合概率密度就是上式的连乘,也就是构造了极大似然函数。将极大似然函数对r求导并令导数等于0,就可以解出\(r\) 的估计值\(\hat{r}\) 。\(\hat{r}\) 就是点击率的极大似然估计。当某个商品的点击次数或者曝光次数为0时,可以用\(\hat{r}\) 当成它的初始值。
然而这样并没有解决新上线广告问题。例如有两件商品A和B,其点击率分别为\(r_A=\frac{5}{10}\)和\(r_B=\frac{50}{100}\),\(r_A=r_B\),但商品A的曝光只有10次,商品B的曝光有100次,这样比较是否合理?那么我们就要用到贝叶斯估计来解决这个问题了!
广告投放不足问题——点击率的贝叶斯估计
在贝叶斯框架下,我们假设点击率r服从某个分布:
\[r \sim \pi(r) \tag{5}\]
因为这是基于经验的,这个分布称为先验分布。贝叶斯参数估计可以同时解决最开始提出的两个问题。其过程是基于经验或历史数据先给出一个r的估计值,然后基于现有的数据在这个估计值上修正,得到最终的点击率估计,此时的估计值已经是修正过的。更美好的是我们可以分离出修正参数,来进行更好的估计(即(2)式中的a和b)。
\[r = \frac{C+a}{I+b} \tag{2}\]
既然有先验分布,就有后验分布。r的后验分布记作\(\pi(r|x)\) 。 其中x表示输入数据或特征,对于点击率预测,x就是点击次数和曝光量。因为已经看到了数据,才确定r的分布,因此叫做『后验』分布。贝叶斯估计的实质就是求后验分布。即基于当前的点击次数和曝光量,求点击率的分布;而未看到数据之前点击率的分布是\(\pi(r)\)。下面会讲解如何计算后验分布\(\pi(r|x)\).
贝叶斯估计的过程可以简单认为:
用历史数据根据\(\pi(r)\)估计r,记作\(\hat{r}_{history}\);用当前数据根据\(\pi(r|x)\)估计r,记作\(\hat{r}_{current}\),然后用\(\hat{r}_{history}\)修正\(\hat{r}_{current}\)。
损失函数
r 的后验分布\(\pi(r|x)\)是个概率密度函数,无法知道r确切的值。需要求出最接近真实情况的r需要损失函数来约束。
适用于点击率的损失函数有:
\[L(\hat{r}, r) = (\hat{r} - r)^2\]
\[L(\hat{r}, r) = |\hat{r} - r|\]
贝叶斯参数估计的过程可以简单描述为:求\(\hat{r}\),使得损失函数在r的后验分布上的期望最小。这句话的数学定义为:
\[\arg \min \int L(r, \hat{r}) \pi(r|\boldsymbol{x})\ dr = E_{\pi} L(r, \hat{r}) \tag{6}\]
因此需要知道\(\pi(r|x)\)的形式,然而\(\pi(r|x)\)的形式一般不知道的,但是可以知道\(\pi(r)\)的形式(经验值嘛,我们指定的)。此外,数据的分布我们也是知道的,其概率密度函数(pdf)记为\(f(x|r)\),表示数据的分布跟参数r有关,r是要求解的参数,在这里就是点击率。
这时可以根据贝叶斯公式计算出\(\pi(r|x)\):
\[\pi(r|\boldsymbol{x}) = \frac{f(\boldsymbol{x}|r)\pi(r)}{f(\boldsymbol{x})} \tag{7}\]
其中,
\[f(\boldsymbol{x}) = \int_0^\infty f(\boldsymbol{x}|r) \pi(r) dr\ \mbox{ (边缘概率密度定义)}\]
上式好复杂,但其实一些常见的分布都可以求出上式积分的具体形式。但通常不用实际去积分,因为满足一定条件,\(\pi(r)\)跟\(\pi(r|x)\)有一样的形式。\(\pi(r)\)是已知的,如果形式一样,\(\pi(r|x)\)也就容易求得了。下面介绍共轭先验的概念。
共轭先验: 如果找到一个\(\pi(r)\),它是\(f(x|r)\)的共轭先验,那么r的后验分布\(\pi(r|x)\)和先验分布\(\pi(r)\)会有一样的形式。
『轭』是指驾车时套在牲口脖子上的曲木。古代拉扯的牲口通常有两只,因此轭是连接两只牲口的工具。在这里共轭是指\(\pi(r)\)和\(\pi(r|x)\)通过\(f(x|r)\)联系起来了。
之前假设广告是否点击服从伯努利分布,参数为r;对于点击次数,服从的是二项分布,即\(f(C, I|r) \sim Bin(r)\) ,二项分布的共轭先验是Beta分布。Beta分布的参数是α和β,即\(\pi(r) =Beta(\alpha, \beta)\) ,根据共轭先验的定义,r的后验分布\(\pi(r|x)\)的形式跟其先验分布\(\pi(r)\)一样,即\(\pi(r|x) = Beta(\alpha', \beta')\)。
对于点击率预测,求出\(\pi(r|x)\),带入公式(6),当\(L(\hat{r}, r) = (\hat{r} - r)^2\)时,
\[\hat{r} = \frac{C + \alpha}{I + \alpha + \beta} \tag{8}\]
上式的求解过程可以参考贝叶斯参数估计最后的例子。(8)式就是点击率估计(平滑)的最终形式。其中C和I就是点击次数和曝光量,α即为公式(2)中的a,α+β是公式(2)中的b。α和β是从历史数据中得到的。
上面的内容给出了为什么很多文章会假设点击率服从Beta分布的理由,因为最终的平滑的因子是Beta分布(先验分布)中的两个参数。