一句话回答
多臂老虎机(Multi-Armed Bandit,MAB)是一种自适应分配流量的测试方法:随着结果陆续出来,表现更好的方案分到更多流量,在「探索」(弄清哪个更好)和「利用」(多用目前领先的)之间取得平衡。
公式: 遗憾 = n × μ* − 实际总收益;UCB1 得分 = x̄ᵢ + √(2 ln t ÷ nᵢ)
什么是多臂老虎机?
多臂老虎机(Multi-Armed Bandit)是一种「边测边赚」的测试方法:它不是把流量平均分到最后,而是随着数据积累,逐步把更多访客分给表现更好的方案。它在探索(多试几个方案,弄清哪个更好)和利用(多用目前领先的方案)之间取得平衡。
名字来自老虎机,英语里叫「独臂强盗」。想象一排回报率未知的老虎机:只拉最先出钱的那台,可能错过更好的;每台都平均地拉,又会在差的机器上浪费钱。Bandit 算法要解决的,就是怎样分配这些拉杆次数。
探索、利用和「遗憾」
测试的代价叫遗憾(Regret):因为没有一直选收益最高的方案而少拿到的收益。
示例(示例数据):两个落地页的转化率分别是 5% 和 6%。经典 A/B 测试把 10,000 个访客五五分:
- 5,000 × 5% + 5,000 × 6% = 250 + 300 = 550 次转化
- 如果全部给更好的页面,能得到 10,000 × 6% = 600 次
- 遗憾 = 600 − 550 = 50 次转化
Bandit 会随着证据积累把流量往 6% 那个页面倾斜,从而减少遗憾。代价是较差的页面分到的访客更少,你对「它到底差多少」的估计就没那么准。
常用的 Bandit 算法
| 算法 | 怎么选 | 优点 | 缺点 |
|---|---|---|---|
| ε-贪心 | 大部分时间展示当前领先的方案,固定比例(ε,比如 10%)的流量随机分给任一方案 | 简单,好解释,好实现 | 会一直以同样比例去试差的方案 |
| 置信上界(UCB1) | 选 x̄ᵢ + √(2 ln t ÷ nᵢ) 最大的方案:平均值加上一个「测得少就多给机会」的加分 | 不靠随机,有理论保证 | 假设转化率稳定不变 |
| 汤普森抽样 | 为每个方案保留一个概率分布,每次各抽一个值,展示抽到最大值的方案 | 调整快,实际效果好 | 向业务方解释起来更难 |
示例:汤普森抽样怎么分流量
示例数据:三个邮件标题,先发出 1,000 封后的结果。
| 标题 | 发送数 | 转化数 | 转化率 |
|---|---|---|---|
| A | 334 | 13 | 3.9% |
| B | 333 | 17 | 5.1% |
| C | 333 | 21 | 6.3% |
汤普森抽样把每个转化率建模成 Beta 分布:Beta(1 + 转化数, 1 + 未转化数)。从三个分布里反复抽样(我们模拟了 20 万次),C 抽到最大值的比例是 71.3%,B 是 23.9%,A 是 4.9%。所以下一批大致按 71 / 24 / 5 分配。B 还能分到不少流量,因为它仍然有可能是赢家;A 基本被淘汰,但没有被完全排除。每一批之后更新分布,重新计算分配。
多臂老虎机和 A/B 测试怎么选
| A/B 测试 | 多臂老虎机 | |
|---|---|---|
| 目标 | 弄清真实差异 | 测试期间尽量多转化 |
| 流量分配 | 到结束前保持不变 | 向表现好的方案倾斜 |
| 产出 | 效果大小、置信区间、p 值 | 主要是「留哪个」 |
| 适合 | 产品决策、定价、长期指标 | 短期活动、标题、促销、方案很多的情况 |
| 风险 | 测试期间损失转化 | 估计有偏;用户行为随时间变化时容易误导 |
经验法则:想多赚用 Bandit,想弄清楚用 A/B 测试。如果这个方案要用好几年,弄清楚的价值远大于测试期间多出的几天转化。
上下文 Bandit
上下文 Bandit(Contextual Bandit)在选择时还会用到访客的信息(设备、国家、新老访客)。它能学到「移动端用标题 B 好、桌面端用 C 好」。它需要多得多的流量和精心设计的特征,更像一个推荐系统,而不是一次测试。
常见坑
- 转化有延迟:如果购买发生在点击几天之后,算法按不完整的数据分配,会偏向那些转化得快的方案。
- 用户行为在变:工作日和周末的人群转化不同。分配比例随时间变化时,合并后的结果可能误导,这是辛普森悖论的一种表现。
- 没有干净的统计推断:常规的 p 值假设分配比例固定。如果需要显著性,用 A/B 测试,或者为自适应设计准备的方法,比如序贯检验。
- 方案太多、流量太少:十个方案、每周 500 个访客,什么都收敛不了。
多臂老虎机和 TapCub
TapCub 是统计分析工具,不负责分配流量,不做 A/B 测试,也不做 Bandit。如果是你的测试工具或邮件工具在跑 Bandit,可以把方案作为事件属性上报,比如 tapcub.track('headline_view', { variant: 'C' }),再在事件分析里按这个属性拆分转化事件。这样能独立核对测试工具报告的结果,还能看到它看不到的后续结果,比如留存。
资料来源
- Thompson, W. R. (1933). On the Likelihood that One Unknown Probability Exceeds Another in View of the Evidence of Two Samples. Biometrika, 25(3/4), 285–294.
- Auer, P., Cesa-Bianchi, N. and Fischer, P. (2002). Finite-time Analysis of the Multiarmed Bandit Problem. Machine Learning, 47, 235–256.
- Russo, D. et al. (2018). A Tutorial on Thompson Sampling. Foundations and Trends in Machine Learning.
- Slivkins, A. (2019). Introduction to Multi-Armed Bandits.
这个解释清楚吗?
我们会根据反馈修改和补充这篇内容。
提交没有成功,请稍后再试。
谢谢你的反馈,我们会据此改进这篇内容。你已经反馈过这篇了,谢谢。
