实验平台只要展示“B 胜过 A 的概率”,就算采用了贝叶斯 A/B 测试吗?不一定。Spotify Engineering 这次澄清的核心,正是不要仅凭结果页面上的概率指标,就给整套实验方法贴上“贝叶斯”标签。
来源摘要没有披露 Spotify 内部方法的完整实现,因此本文不推测其具体统计模型,而是借这个问题拆清楚:什么条件才能让一项 A/B 测试称为贝叶斯测试,以及团队在实践中最容易混淆哪些层次。
一个概率指标,不等于一套贝叶斯实验方法
真正的贝叶斯分析通常包含三个明确组成部分:
- 先验分布:实验开始前,如何描述参数的不确定性。
- 似然函数:观测数据在不同参数下出现的可能性。
- 后验分布:通过贝叶斯公式,把先验与数据结合起来。
如果系统只是输出“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 测试”提醒了一个重要边界:统计术语不是产品功能名。团队应该先明确概率的来源、实验停止方式和发布损失,再决定使用哪种模型。
频率学派方法可以严谨,贝叶斯方法也可以严谨;两者也都可能因为指标定义、分流污染或随意停止而失效。可靠的实验系统并不依赖一个醒目的“胜出概率”,而依赖可审计的假设、预先约定的规则,以及能够映射到业务成本的决策标准。