别把“胜出概率”当成贝叶斯 A/B 测试:理解 Spotify 的澄清

2026-09-08 42 预计阅读时间: 1 分钟
来源: engineering.atspotify.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

实验平台只要展示“B 胜过 A 的概率”,就算采用了贝叶斯 A/B 测试吗?不一定。Spotify Engineering 这次澄清的核心,正是不要仅凭结果页面上的概率指标,就给整套实验方法贴上“贝叶斯”标签。

来源摘要没有披露 Spotify 内部方法的完整实现,因此本文不推测其具体统计模型,而是借这个问题拆清楚:什么条件才能让一项 A/B 测试称为贝叶斯测试,以及团队在实践中最容易混淆哪些层次。

一个概率指标,不等于一套贝叶斯实验方法

真正的贝叶斯分析通常包含三个明确组成部分:

  1. 先验分布:实验开始前,如何描述参数的不确定性。
  2. 似然函数:观测数据在不同参数下出现的可能性。
  3. 后验分布:通过贝叶斯公式,把先验与数据结合起来。

如果系统只是输出“B 胜过 A 的概率”,却没有定义先验、生成模型与后验更新过程,这个概率可能来自 bootstrap、随机化检验、正态近似或其他统计程序。它看起来很像贝叶斯结果,但不能仅凭名称或 UI 文案判断方法论。

还要区分三个经常被揉在一起的层次:

  • 估计方法:如何计算差异、区间或概率。
  • 监控规则:实验运行期间能否持续查看数据,何时允许停止。
  • 决策规则:达到什么收益、风险或成本条件后才发布 B。

其中任何一层使用概率表达,都不意味着另外两层自动采用了贝叶斯框架。

贝叶斯模型也不会自动解决提前停止

一个常见误解是:只要用了后验概率,就可以每天查看实验,并在“B 胜率超过 95%”时立刻停止。

这种做法仍然需要事先定义运行策略。频繁查看与选择性停止会改变实际决策过程;模型本身并不会替团队回答以下问题:

  • 最少需要运行多少天,是否要覆盖完整业务周期?
  • 样本量或曝光量是否存在下限?
  • 允许检查多少次结果?
  • 95% 是统计阈值,还是经过业务损失校准的决策阈值?
  • 如果 B 的收益极小,但实施成本很高,是否仍值得发布?

贝叶斯分析的优势之一,是可以自然地表达不确定性并连接损失函数,但前提是团队真的写出了损失函数或决策规则。单独设置一个后验概率阈值,只是规则的一部分。

可以这样实践:运行一个最小 Beta-Binomial 实验

下面是一个可直接运行的教学示例。它假设指标是二元转化事件,并为 A、B 两组的转化率使用 Beta(1, 1) 先验。修改脚本顶部的访客数、转化数和最小实际提升门槛即可。

from random import Random

# 替换为实验数据
visitors_a, conversions_a = 10_000, 1_200
visitors_b, conversions_b = 10_100, 1_260

# 只有超过 1% 的相对提升,才视为具有实际意义
minimum_relative_uplift = 0.01
samples = 200_000
rng = Random(42)

# Beta(1, 1) 先验与二项数据结合后的后验参数
alpha_a = 1 + conversions_a
beta_a = 1 + visitors_a - conversions_a
alpha_b = 1 + conversions_b
beta_b = 1 + visitors_b - conversions_b

wins = 0
practical_wins = 0
uplift_sum = 0.0
regret_if_choose_b = 0.0

for _ in range(samples):
    rate_a = rng.betavariate(alpha_a, beta_a)
    rate_b = rng.betavariate(alpha_b, beta_b)

    if rate_b > rate_a:
        wins += 1
    if rate_b > rate_a * (1 + minimum_relative_uplift):
        practical_wins += 1

    uplift_sum += (rate_b - rate_a) / rate_a
    regret_if_choose_b += max(rate_a - rate_b, 0.0)

print(f'P(B > A): {wins / samples:.2%}')
print(
    f'P(B relative uplift > {minimum_relative_uplift:.1%}): '
    f'{practical_wins / samples:.2%}'
)
print(f'Posterior mean relative uplift: {uplift_sum / samples:.2%}')
print(
    'Expected conversion-rate regret if B is chosen: '
    f'{regret_if_choose_b / samples:.6f}'
)

运行方式:

python experiment.py

这个示例比单纯输出“胜率”多做了两件事:

  • 将“任何正提升”与“达到业务意义的提升”分开。
  • 估计选择 B 后可能承担的期望遗憾,即 B 实际较差时损失多少转化率。

它仍然只是教学模型。真实实验还要处理用户重复曝光、分流单元、指标延迟、多个指标、方差降低和多重实验等问题。收入、播放时长等连续或长尾指标,也不能直接套用这个二项模型。

判断一套方案是否真的“贝叶斯”

评审实验平台或分析报告时,可以逐项询问:

  • 先验是什么?由历史数据、专家判断还是默认值产生?
  • 数据对应什么似然或生成模型?模型假设是否适合当前指标?
  • 页面上的概率究竟是后验概率、bootstrap 比例,还是其他量?
  • 停止规则是否在实验前确定?
  • 是否定义最小实际效果,而不只判断差异是否大于零?
  • 决策是否计入错误发布、错过收益和工程实施的成本?
  • 先验变化后,结论是否稳定?

如果这些问题没有清楚答案,最稳妥的做法不是争论“贝叶斯还是频率学派”,而是使用更准确的描述,例如“基于 bootstrap 的胜出概率”或“带固定停止规则的后验决策”。

采用建议:先统一决策语义,再选择统计工具

Spotify 标题中的“不使用贝叶斯 A/B 测试”提醒了一个重要边界:统计术语不是产品功能名。团队应该先明确概率的来源、实验停止方式和发布损失,再决定使用哪种模型。

频率学派方法可以严谨,贝叶斯方法也可以严谨;两者也都可能因为指标定义、分流污染或随意停止而失效。可靠的实验系统并不依赖一个醒目的“胜出概率”,而依赖可审计的假设、预先约定的规则,以及能够映射到业务成本的决策标准。


相关推荐