当您应该选择“汤普森抽样”而不是A/B测试

深入解释“汤普森抽样”,一种在线学习更高效的 A/B 测试替代方案

[Image by Author]

假设您有两个广告可供选择:红色和蓝色。当然,您想向用户展示点击率最高的广告。

向用户展示红色广告还是蓝色广告?[图片来自作者]

但是如何确定哪个广告具有最高的点击率?

回答这个问题的最常见方法是进行 A/B 测试。这意味着将一些用户分开,并向其中一半展示第一个广告,向另一半展示第二个广告。最后,您可以计算每种替代方案的点击率并选择最佳的一个。

假设,在 A/B 测试的结束时,您有以下结果:

10,000 次展示后 A/B 测试的结果。[图片来自作者]

蓝色版本明显优于红色版本:点击率为 18%,而点击率为 11%。但是这意味着我们失去了许多机会:我们本可以向更多的用户展示蓝色广告,从而获得更多的点击

另一方面,如果我们在很早的时候停止实验,比如仅在 20 个用户之后?

20 次展示后 A/B 测试的结果。[图片来自作者]

我们直观地知道,在 20 个用户之后,结果还不足以将表现最好的变体发送给所有用户。

一般来说,A/B 测试的问题是:

  • 如果我们分开太多的用户,我们会失去表现较差替代方案的机会
  • 如果我们分开太少的用户,测试结果会无法得出结论

换句话说,A/B 测试效率不高,因为它们太静态了。理想情况下,我们需要一个智能系统,它能够随着获取更多数据而动态学习。

这个系统应该:

  • 在结果还不足以可靠时探索不同的替代方案;
  • 在结果开始变得足够可靠时,通过向表现最好的替代方案发送越来越多的流量来利用结果。

好消息:这样的系统存在,被称为汤普森抽样。

使用概率分布而不是数字

我们上面看到的方法尝试使用单个数字评估每个替代方案:它的点击率。这种方法的问题在于,单个数字并不能表达与估计本身相关的不确定性。

为解决这个问题,汤普森抽样建议使用完整的概率分布而不是单个数字。

概率分布的目的是表达有关度量估计的不确定性。

一旦我们有了我们的分布——每个替代方案一个——汤普森抽样通过从每个分布中抽取一个随机数来工作。然后,显示与最高数字相关联的替代方案给用户。

做这件事情的意义是什么?那么,如果分布表达了高度的不确定性,结果就更多地依赖于机会。

换句话说,我们对信念的信心越低,系统就会探索不同的选择。相反,随着信心的增强,系统越来越多地利用表现最佳的选择。

让我们看看可以从我们上面看到的结果中获得的两个概率分布。

Probability distributions after 20 impressions. [Image by Author]

如果您尝试从这两个分布中提取随机数,您会发现从红色分布中提取的数字大于从蓝色分布中提取的数字24%的时间。这在数字上证明了我们的直觉,即差异仍然不具有统计学意义。

但是10,000次印象后呢?

Probability distributions after 10,000 impressions. [Image by Author]

现在我们非常有信心,蓝色页面的表现要比红色页面好。实际上,从红色分布中提取的数字大于从蓝色分布中提取的数字几乎是不可能的。

我应该使用什么分布?

在我们的例子中,由于我们有一个二元结果(单击或未单击),因此可以使用Beta分布。 Beta分布的好处是它完全基于两个参数ab,可以非常直观地解释:

  • a:成功次数(在我们的情况下是单击次数)。
  • b:失败次数(在我们的情况下是未单击次数)。

分布的期望值为a / (a + b),这是我们感兴趣的数量:单击率。

Beta分布也可在Scipy中使用,因此非常容易计算:

import numpy as npfrom scipy import stats# input: number of clicks and number of missesclicks = 1misses = 4# get 1000 equally spaced points between 0 and 1 for plotting purposesx = np.linspace(start = 0, stop = 1, num = 1_000)# calculate probability distribution function of betabeta_pdf = stats.beta(a = clicks, b = misses).pdf(x = x)

让我们来看几个例子。以20%的单击率为例:当印象数量增加时,Beta分布会发生什么变化?

How beta distribution changes when the number of clicks and misses increase proportionally. [Image by Author]

正如我们所预期的那样,随着用户数量的增加,结果越来越确定:这转化为分布越来越集中在预期值20%周围。

换句话说,使用概率分布可以为我们的定性评估分配量化的确定度量。

为什么不使用正态分布?

如果您学过统计学101,您可能会问:“等等。根据中心极限定理,如果我们有独立试验,我们应该使用正态分布。那么为什么我们要使用Beta分布?”

确实,这是一个很好的观点。让我们看看如何在Python中计算Beta和Normal概率分布函数。

import numpy as npfrom scipy import stats# input: number of clicks and number of missesclicks = 1misses = 4# compute n and click raten = clicks + missesclick_rate = clicks / n# get 1000 equally spaced points between 0 and 1 for plotting purposesx = np.linspace(start = 0, stop = 1, num = 1_000)# calculate the probability distribution function of betabeta_pdf = stats.beta(a = clicks, b = misses).pdf(x = x)# calculate the probability distribution function of normalnormal_pdf = stats.norm(  loc = click_rate,   scale = np.sqrt(click_rate * (1 - click_rate) / n)).pdf(x = x)

让我们重复这个过程,针对不同用户数量比较这两个分布:

当观察次数变大时,Beta分布和正态分布几乎相同。[图片由作者提供]

正如您所看到的,Beta分布和正态分布随着印象数量的增长变得越来越相似。只需50次迭代后,它们就几乎相同。

因此,使用Beta分布或正态分布不会有太大的区别。这是一个好消息,因为这意味着我们始终可以使用正态分布,而不管我们选择哪个指标,这得益于中心极限定理。

Thompson抽样的应用

让我们做一个例子来看看Thompson抽样的应用。

我们想要测试一则广告的4个版本:灰色,红色,绿色和蓝色。假设我们还知道每个版本的真实点击率。

4个不同广告及其真实点击率。[图片由作者提供]

与前一段落一样,我们将使用Beta分布。但是我们需要进行小的调整。由于Beta的参数(a和b)必须严格大于0,因此如果至少一个参数为0,则我们将每个参数都加1。

import numpy as npdef draw_from_beta(clicks, misses):  """Draw a random number from Beta."""    if min(clicks, misses) == 0:    clicks += 1    misses += 1    return np.random.beta(a=clicks, b=misses)

对于每个新用户,我们必须执行以下操作:

  1. 基于每个变体当前点击和未点击的计数,获取相应的Beta分布。
  2. 从1中获得的每个变体分布中抽取一个数字。
  3. 向用户展示与最高数字相关联的变体。
  4. 使用当前用户的结果(点击或未点击)更新计数器。

让我们看一下这个过程在前1000个用户中的图形表示:

Thompson抽样算法在前1000个用户中的应用图。[图片由作者提供]

正如您所看到的,经过100次迭代后,我们的信念仍然不符合真相:绿色变体的预期值大于蓝色。但这只是偶然的。随着经验的累积,我们的估计将会收敛于真实情况。这意味着:

  • 分布的平均值将更接近真实率;
  • 分布的标准差将越来越接近零。

让我们看一下这两个量在前400次迭代中的变化。

算法的前400次迭代。随着迭代次数的增加,标准差和平均值的变化情况。[图片由作者提供]

正如我们所看到的,经过1000次印象,这是结果:

通过Thompson抽样获得的点击和未点击次数。[图片由作者提供]

汤普森抽样非常有效,仅经过1,000次迭代,就已经将50.6%的展示集中在最佳替代品(蓝色)上,37.7%的展示在第二佳替代品(绿色)上。

相反,如果我们使用A/B测试方法,将每个替代品发送给相同数量的用户会发生什么?将每个广告展示给250个用户会产生以下结果:

如果我们以纯随机方式分配变量(A / B测试方法),则预期的点击次数和丢失次数。[图像由作者]

使用汤普森抽样,我们有145次点击,而使用A/B测试,我们只有135次点击。这意味着汤普森抽样比A/B测试多获得7.4%的点击量!如果我们进行更多迭代,差异会变得更大。

结论

汤普森抽样非常适合在线学习,因为它有效地解决了探索/利用困境。

它通过为应该测试的每个变量分配概率分布来实现。分布的目的是表达与估计值相关的不确定性。

汤普森抽样能够根据从先前迭代中积累的知识动态地适应,使其比A/B测试更有效。

例如,我们已经看到了一个有4个变量的示例,仅经过1,000次迭代,汤普森抽样就比A/B测试多获得了7%的点击量。

本文中使用的所有代码都可以在此笔记本中找到。

谢谢您的阅读!希望您喜欢这篇文章。如果愿意,请在Linkedin上添加我!