林师傅在街角开了家面馆,招牌是“经典红烧牛肉面”。最近他研究出一个新配方“番茄牛腩面”,想试试顾客更喜欢哪一碗。但他只有几十位老顾客,如果等攒够一百个评价再决定,新配方可能早就过季了。隔壁老张用传统方法:列个表格、记下每次好评差评,然后说“数据不够,再多等等”。林师傅却换了个思路——他把自己多年的做面经验当成“初始直觉”,每来一位顾客就悄悄更新一次直觉:今天三位顾客都夸番茄牛腩,他对新配方的信心就涨一点;明天有两位嫌酸,他又微微回调。他不是在等一个“最终审判”,而是像在水边不断调整重心的人,每走一步都重新感知平衡。 这种方法,就是贝叶斯 A/B 测试。它不像传统统计那样死等样本量凑够,而是把“不确定性”随时摆在桌面上:此刻我心里,番茄牛腩胜过红烧牛肉的概率是 73%——这就够了。本文会用林师傅面馆的故事,带你认识先验、后验、贝塔分布、胜率计算这些概念,让你明白为什么 AI 产品团队正在用概率思维做更快的实验决策。

岗位关联

掌握贝叶斯 A/B 后,你能在样本量不足时依然给出量化决策依据,把实验周期从“攒够数”变成“随时可停”,这是 MLOps 工程中做模型与策略灰度决策的核心技能。

目录
  1. 可视化演示
  2. 贝叶斯思维
  3. 贝塔分布
  4. 后验更新
  5. 胜率计算
  6. 贝叶斯因子
  7. 停时规则
  8. 工程落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

贝叶斯 A/B 测试后验分布实时更新:随着样本累积,Beta 后验分布逐步收敛,P(B>A) 概率趋于稳定,支持动态停时决策。

贝叶斯思维

林师傅做面二十年,心里对“经典红烧牛肉面”早有底:老顾客回头率极高,几乎十有八九满意。这种“我早就知道大概水平”的底,就是先验。但他也知道,新配方番茄牛腩面可能更好——只是不确定。每当一位顾客咬下第一口,皱眉头还是点头,都构成一条新证据。他会把新证据跟自己的老经验揉在一起,得出一个更准确的综合判断。这种“老经验 + 新证据 → 更新判断”的循环,就是贝叶斯思维。

把这个循环写成数学语言,就是贝叶斯定理。假设 $\theta$ 表示“某碗面的真实好评率”,$D$ 表示今天观察到的顾客反馈。贝叶斯定理告诉我们:对 $\theta$ 的最终判断,等于“数据在某个 $\theta$ 下出现的可能性”乘以“对 $\theta$ 的初始判断”,再除以一个归一化常数。翻译成面馆的话:新判断 = 证据强度 × 老经验 ÷ 所有可能解释的总和。

贝叶斯思维的本质,就是林师傅那句口头禅:“我信自己的经验,但顾客的嘴更诚实。”先验让他不必从零开始,数据让他不被旧经验绑架。两者一加权,判断自然越来越精准。

P(θ∣D)=P(D∣θ) P(θ)P(D)\displaystyle P(\theta \mid D) = \frac{P(D \mid \theta) \, P(\theta)}{P(D)}
后验概率 = 似然 × 先验 ÷ 边际概率。它把“旧信念”和“新数据”拧成一股绳。
  1. 先验 $P(\theta)$这是林师傅在开卖前对“经典红烧牛肉面好评率”的初始判断。比如他估计好评率在 0.5 左右,且不会差太多。
    P(θ)P(\theta)
  2. 似然 $P(D \mid \theta)$假设好评率真的是 $\theta$,那么今天看到“3 人点赞、1 人差评”这种数据的可能性有多大——这衡量证据在支持哪个 $\theta$。
    P(D∣θ)P(D \mid \theta)
  3. 边际 $P(D)$不管好评率是多少,看到这种反馈模式的总概率。它起归一化作用,让后验总和为 1。
    P(D)P(D)
  4. 后验 $P(\theta \mid D)$看完数据后,林师傅心里每个“好评率水平”的新权重。它比先验更尖、更接近真实值。
    P(θ∣D)P(\theta \mid D)

贝塔分布

林师傅记录好评率时,不想用“一个数”来概括,而是用“一条曲线”来表现“可能的水平有哪些、各自有多可信”。这条曲线在贝叶斯世界里有个专门的名字——贝塔分布。它就像一张画满山峰的地形图:横轴是好评率从 0 到 1,纵轴是“这个好评率有多可信”。

贝塔分布由两个参数 $\alpha$ 和 $\beta$ 控制。直观理解:$\alpha$ 是“成功次数”(顾客点赞数),$\beta$ 是“失败次数”(顾客摇头数)。$\alpha = 42, \beta = 42$ 表示林师傅相当于已经有了 42 次好评和 42 次差评的经验——曲线又宽又平,说明他不太确定。如果 $\alpha = 90, \beta = 10$,曲线会尖尖地立在 0.9 附近——这时他信心十足。

贝塔分布的妙处,正是它能随着 $\alpha$、$\beta$ 的变化自由伸缩:数据少时像摊开的煎饼,数据多时像立起的筷子。林师傅把这两种配方的“好评率地图”挂在墙上,随时看得见自己的信心在哪座山峰上。

f(p;α,β)=pα−1(1−p)β−1B(α,β),0≤p≤1\displaystyle f(p; \alpha, \beta) = \frac{p^{\alpha-1} (1-p)^{\beta-1}}{B(\alpha, \beta)}, \quad 0 \le p \le 1
贝塔分布是“关于概率的概率”:它描述的是“好评率本身有多大可能在某个值附近”。
  1. 分子 $p^{\alpha-1}(1-p)^{\beta-1}$当 $p$ 接近 $\frac{\alpha-1}{\alpha+\beta-2}$ 时这个乘积最大;$\alpha$ 大则峰值右移(更倾向好评),$\beta$ 大则峰值左移。
    pα−1(1−p)β−1p^{\alpha-1} (1-p)^{\beta-1}
  2. 分母 $B(\alpha, \beta)$一个归一化常数,保证曲线下方的总面积为 1,让它成为真正的概率分布。它由伽马函数组合而来。
    B(α,β)=∫01pα−1(1−p)β−1 dpB(\alpha, \beta) = \int_0^1 p^{\alpha-1}(1-p)^{\beta-1} \, dp
  3. 后验均值贝塔分布的均值 $\frac{\alpha}{\alpha+\beta}$,恰好是“好评数 / 总人数”,这就是林师傅心理预期的最好概括。
    E[p]=αα+βE[p] = \frac{\alpha}{\alpha+\beta}

后验更新

有了贝塔分布这张“地图”,林师傅的日常就简单了:每来一位顾客,根据反馈修订一次地图。顾客点头,就把 $\alpha$ 加 1;顾客摇头,就把 $\beta$ 加 1。不需要重新做复杂计算——这是贝塔分布最迷人的“共轭”特性:先验是贝塔分布,更新后后验依然是贝塔分布,只是参数变了。

为什么可以这么简单?因为“先验是 Beta(α, β)”加上“数据是二项分布(成功/失败)”,两者相乘后化简,后验还是 Beta 分布。于是林师傅的记分板变成了两个数字的简单加法:旧的成功数 + 新的成功数。这让他即使在最忙的午市高峰,也能一边煮面一边心算更新。

这就像林师傅记账本上永远只有两栏:“满意”和“不满意”,每来一位顾客就在对应栏画一笔。一笔一笔画下去,账本越来越厚,他对真实好评率的判断也越来越笃定——这正是贝叶斯更新“用加法实现智能”的优雅之处。

α′=α+x,β′=β+n−x,E[p′]=α′α′+β′\displaystyle \alpha' = \alpha + x, \quad \beta' = \beta + n - x, \quad E[p'] = \frac{\alpha'}{\alpha' + \beta'}
后验更新就是“成功数入 α、失败数入 β”的加法游戏。数据越多,先验的影响被稀释得越淡。
  1. 成功计数 $x$当前数据中点赞的顾客数。把它加到先验的 $\alpha$ 上,得到新的 $\alpha'$。
    α′=α+x\alpha' = \alpha + x
  2. 失败计数 $n-x$当前数据中差评的顾客数。把它加到 $\beta$ 上,得到新的 $\beta'$。
    β′=β+n−x\beta' = \beta + n - x
  3. 后验均值 $E[p']$更新后的期望好评率,等于新 $\alpha'$ 占总体 $\alpha'+\beta'$ 的比例。这是最直观的“当前最优估计”。
    E[p′]=α′α′+β′E[p'] = \frac{\alpha'}{\alpha' + \beta'}

胜率计算

林师傅现在有两张地图:经典红烧牛肉面的后验分布,和番茄牛腩面的后验分布。他想知道一个最直接的问题:“新配方打败老配方的概率到底是多少?”这不能靠盯曲线看出来,因为两条曲线有重叠区域。林师傅的办法很接地气:他从两条分布里各抽一个“可能的真实好评率”,比比谁大,重复几千次,数数新配方赢的占比。

这种“反复抽样、数比例”的方法就是蒙特卡洛模拟。它不追求解析解,而是用计算机暴力掷骰子逼近答案。只要抽样次数足够多,胜率估计就会像大数定律说的那样,稳定地贴近真实值。

林师傅每天打烊后掷几千次“虚拟骰子”,第二天就能告诉服务员:“番茄牛腩目前有 73% 的胜率。”这不是算命,而是把两张地图做了一次彻底的像素级对比——用概率的语言说出“谁更可能赢、赢面多大”。

P(pB>pA∣D)≈1N∑i=1NI(pB(i)>pA(i)),pA(i)∼Beta(αA,βA), pB(i)∼Beta(αB,βB)\displaystyle P(p_B > p_A \mid D) \approx \frac{1}{N} \sum_{i=1}^{N} \mathbb{I}\left(p_B^{(i)} > p_A^{(i)}\right), \quad p_A^{(i)} \sim \text{Beta}(\alpha_A, \beta_A), \ p_B^{(i)} \sim \text{Beta}(\alpha_B, \beta_B)
胜率 = 蒙特卡洛抽样中“新配方赢”的比例。它是贝叶斯 A/B 最直觉的输出货币。
  1. 采样 $p_A^{(i)}, p_B^{(i)}$从两组后验分布中各抽一个值,代表“可能的好评率”。抽样方向偏向分布高的地方,所以更可能是真实值附近。
    pA(i)∼Beta(αA,βA), pB(i)∼Beta(αB,βB)p_A^{(i)} \sim \text{Beta}(\alpha_A, \beta_A), \ p_B^{(i)} \sim \text{Beta}(\alpha_B, \beta_B)
  2. 比较 $\mathbb{I}(p_B > p_A)$若新配方样本大于老配方样本,计 1,否则计 0。一个指示函数,把“谁赢”变成 0/1 信号。
    I(pB(i)>pA(i))\mathbb{I}(p_B^{(i)} > p_A^{(i)})
  3. 平均 $\frac{1}{N} \sum_{i=1}^{N}$把所有 0/1 加起来除以总次数,就是新配方获胜的频率,即胜率的估计。
    1N∑i=1NI(pB(i)>pA(i))\frac{1}{N} \sum_{i=1}^{N} \mathbb{I}\left(p_B^{(i)} > p_A^{(i)}\right)

贝叶斯因子

有时候林师傅会追问一个更深刻的问题:“新配方到底比老配方好多少?这个'好'的证据有多硬?”胜率 73% 听起来不错,但万一只比老配方好了 1% 呢?为了回答“证据强度”,统计学家发明了贝叶斯因子——它像一杆天平,左边放“数据支持 H1(新配方更优)”的力度,右边放“数据支持 H0(两配方无差异)”的力度,比值越大,说明证据越偏向新配方。

贝叶斯因子的计算,本质是比较两个模型的边际似然:在 H1 下看到当前数据的概率,除以在 H0 下看到当前数据的概率。如果比值大于 3,说明这组数据更可能是 H1 产生的,值得认真考虑;如果大于 10,就是“掷地有声”的强证据。

林师傅把这杆天平挂在墙上,告诉自己:胜率 60% 可能只是“风向往这边吹”,而贝叶斯因子大于 10 才是“这阵风真的能推动帆船”。前者告诉你方向,后者告诉你这股风的力道够不够。

BF=P(D∣H1)P(D∣H0)\displaystyle BF = \frac{P(D \mid H_1)}{P(D \mid H_0)}
贝叶斯因子是“数据更支持哪个假设”的倍率。它比胜率多了一层“证据硬度”的视角。
  1. 分子 $P(D \mid H_1)$假设新配方确实比老配方好,那么看到当前顾客反馈数据的概率有多大。这需要按先验对新配方的效果取平均。
    P(D∣H1)P(D \mid H_1)
  2. 分母 $P(D \mid H_0)$假设新配方和老配方其实没差别,那么看到同样数据的概率有多大。
    P(D∣H0)P(D \mid H_0)
  3. 比值 $BF$两个概率相除。$BF > 3$ 表示证据支持 H1,$BF < 1/3$ 表示证据支持 H0,中间地带则说明数据还不够硬。
    BF=P(D∣H1)P(D∣H0)BF = \frac{P(D \mid H_1)}{P(D \mid H_0)}

停时规则

实验做多久才算完?传统做法是“攒够数再揭晓”,像等一锅水烧开;林师傅的做法是“随时评估,该停就停”。但他不是盲目早停——他给自己立了规矩:只有当新配方的胜率超过 95%,且累计顾客数不小于某个底线(比如 100 位)时,才宣布结果。这就避免了“刚来三位顾客里两位夸新配方就急着下结论”的冒进。

更严谨地看,停时规则是在权衡两种错误:新配方其实没更好却宣布它赢(误判),以及新配方更好却宣布平局或放弃(错过)。这两种错误带来的损失不一样,贝叶斯框架允许你显式地把损失写进决策。

停时规则就像林师傅品汤的节奏:汤滚了三分钟,香气出来了,但他一定要再确认“火候到了、食材熟透了”才关火。贝叶斯框架让这种“敢停”有据可依——你不是碰运气,而是在概率上已经把赌注压得很稳。

Stop if P(pB>pA∣D)≥τ and nA+nB≥nmin⁡\displaystyle \text{Stop if } P(p_B > p_A \mid D) \ge \tau \text{ and } n_A + n_B \ge n_{\min}
停时规则 = 胜率阈值 + 最小样本量双重保险。它让“快”和“稳”不再是敌人。
  1. 胜率条件 $P(p_B > p_A \mid D) \ge \tau$后验胜率必须达到阈值 $\tau$(如 0.95),才说明新配方优势足够可信。
    P(pB>pA∣D)≥τP(p_B > p_A \mid D) \ge \tau
  2. 样本条件 $n_A + n_B \ge n_{\min}$两组总人数必须不少于最小样本量,防止极小样本下的偶然性。
    nA+nB≥nmin⁡n_A + n_B \ge n_{\min}
  3. 决策输出两条件同时满足时停止实验。若胜率没到阈值,继续观察;若样本太少,再等等。
    Stop if P(pB>pA∣D)≥0.95 and n≥100\text{Stop if } P(p_B > p_A \mid D) \ge 0.95 \text{ and } n \ge 100

工程落地

林师傅的面馆开了分店,他不能每天都亲手记账本了。于是他把这套“贝叶斯记分板”做成了收银系统里的一个小程序:每笔订单自动记录顾客选择,每晚自动更新两张贝塔分布,胜率超过阈值时自动给店长发短信:“番茄牛腩面胜率 96%,可以推广到全部门店。”这就是贝叶斯 A/B 在工程上的落地姿态——埋点、计算、决策、预警,全部自动化。

在 AI 产品团队中,这套流程对应实验平台的三个模块:数据埋点(记录每个用户看到哪个版本、做了何种行为)、实时计算(流式更新后验分布与胜率)、决策通知(胜率达标时触发上线或回滚建议)。贝叶斯方法因为不需要预设固定样本量,天然适合流式数据的实时决策场景。

林师傅的分店系统每晚十点自动推送一封简报:两张分布图、胜率、贝叶斯因子、建议动作。店长只需要在手机上点“确认”或者“再看一周”。这就是贝叶斯 A/B 工程化的魅力——把复杂的概率推断封装成一个安静可靠的数字管家。

Decision={发布 B 版本P(pB>pA∣D)≥τ and n≥nmin⁡继续观察otherwise\displaystyle \text{Decision} = \begin{cases} \text{发布 B 版本} & P(p_B > p_A \mid D) \ge \tau \ \text{and} \ n \ge n_{\min} \\ \text{继续观察} & \text{otherwise} \end{cases}
工程落地就是把贝叶斯决策规则写进代码,让实验从“人工看报表”进化为“系统自动刹车和加速”。
  1. 胜率阈值 $\tau$团队根据业务风险设定,比如核心支付流程要 0.99,推荐位文案可以放宽到 0.90。
    P(pB>pA∣D)≥τP(p_B > p_A \mid D) \ge \tau
  2. 样本量下限 $n_{\min}$防止上线第一天噪音过大就触发误报,通常由历史经验和业务量共同决定。
    n≥nmin⁡n \ge n_{\min}
  3. 规则匹配满足条件则输出“发布”动作,否则维持现状。这个二元决策可以用一个 case 结构描述。
    Decision={发布 B条件满足继续观察否则\text{Decision} = \begin{cases} \text{发布 B} & \text{条件满足} \\ \text{继续观察} & \text{否则} \end{cases}

AI 应用场景

推荐策略灰度发布

阶段:模型评估与策略上线

解决的问题:传统 A/B 需要固定两周观察期,导致优质推荐策略上线慢,坏策略迟迟不被发现。贝叶斯 A/B 用后验胜率动态评估,新策略仅需 3-5 天即可达到 95% 胜率阈值,大幅缩短优质策略的灰度周期。

具体案例:某电商 App 的推荐团队用贝叶斯 A/B 测试对比“基于注意力机制的排序模型”与旧模型。系统每 4 小时自动更新一次后验分布,第 3 天时新模型胜率达到 97%,系统自动触发全量上线流程,同时保留一周的回滚观察期。

智能客服话术优化

阶段:在线实验与效果监控

解决的问题:客服话术的改动通常发版频繁,用频次统计需要大量对话样本,测试周期漫长。贝叶斯方法允许随时评估“新话术是否显著提升满意度”,不满意时快速回滚。

具体案例:某 SaaS 公司的智能客服团队测试两种开场白话术,采用 Beta(1,1) 弱先验启动,每积累 30 次对话就计算一次胜率与贝叶斯因子。第 5 天胜率 91%、贝叶斯因子 4.2,虽未达硬阈值,但业务方结合成本选择继续观察,第 9 天达到 96% 后宣布新话术胜出。

模型版本替换决策

阶段:模型生命周期管理

解决的问题:模型迭代时,新旧版本效果差异微弱,传统显著性检验容易误判。贝叶斯 A/B 通过后验分布可视化,让工程师直观看到“新模型比旧模型好 0.3% 且置信区间很窄”,决策不再依赖一刀切的 p 值。

具体案例:某广告投放平台的 CTR 预估模型升级,团队用贝叶斯 A/B 对比 AUC 与单次请求收益。系统实时绘制两条后验分布曲线,第 4 天新模型胜率 82%,但贝叶斯因子只有 1.8,团队判断证据不足,继续观察一周后胜率攀升至 94% 才决定切换。

Python 演示

python83 行
import randomfrom math import lgamma, log  def log_beta(a, b):    """Beta 函数的对数,用于计算概率密度。"""    return lgamma(a) + lgamma(b) - lgamma(a + b)  def beta_pdf(p, a, b):    """计算 Beta 分布在 p 点的概率密度。"""    return (a - 1) * log(p) + (b - 1) * log(1 - p) - log_beta(a, b)  def draw_from_beta(a, b):    """用 Gamma 变量构造 Beta 分布采样:Beta(a,b) ~ Ga(a)/(Ga(a)+Ga(b))。"""    ga = random.gammavariate(a, 1.0)    gb = random.gammavariate(b, 1.0)    return ga / (ga + gb)  class BayesianABTest:    """贝叶斯 A/B 测试器:维护两组 Beta 后验,计算胜率并判断是否停止。"""     def __init__(self, alpha_a=1, beta_a=1, alpha_b=1, beta_b=1):        self.alpha_a = alpha_a        self.beta_a = beta_a        self.alpha_b = alpha_b        self.beta_b = beta_b        self.n_a = 0        self.n_b = 0     def observe(self, arm, success):        """观察一个用户反馈,success=1 表示转化成功,0 表示失败。"""        if arm == "A":            self.alpha_a += success            self.beta_a += 1 - success            self.n_a += 1        else:            self.alpha_b += success            self.beta_b += 1 - success            self.n_b += 1     def win_probability(self, samples=5000):        """蒙特卡洛估计 P(B 优于 A)。"""        wins = 0        for _ in range(samples):            pa = draw_from_beta(self.alpha_a, self.beta_a)            pb = draw_from_beta(self.alpha_b, self.beta_b)            if pb > pa:                wins += 1        return wins / samples     def should_stop(self, threshold=0.95, min_total=100):        """胜率达标且总样本足够时,建议停止实验。"""        if self.n_a + self.n_b < min_total:            return False, self.win_probability()        win = self.win_probability()        return win >= threshold, win  def main():    random.seed(42)    ab = BayesianABTest(alpha_a=50, beta_a=50, alpha_b=50, beta_b=50)    true_a, true_b = 0.50, 0.56     for step in range(1, 1000):        # 交替给 A/B 两组观察数据        if step % 2 == 1:            ab.observe("A", 1 if random.random() < true_a else 0)        else:            ab.observe("B", 1 if random.random() < true_b else 0)         if step % 50 == 0:            stop, win = ab.should_stop()            print(f"step={step:3d}  win={win:.3f}  stop={stop}")            if stop:                print("B 组胜率已达阈值,实验停止。")                break  if __name__ == "__main__":    main()
目的:模拟一个在线贝叶斯 A/B 测试过程——交替观察 A/B 两组的转化数据,实时更新后验分布,并通过蒙特卡洛采样估计胜率,最终在胜率达标时自动停止。
  1. beta_pdf(p, a, b)计算 Beta 分布的概率密度,用于后续绘制后验曲线,是可视化和诊断的基础。
  2. draw_from_beta(a, b)用两个 Gamma 随机变量构造 Beta 样本,为蒙特卡洛胜率估计提供随机源。
  3. self.alpha_a += success观察成功后把成功数累加进 α,体现贝叶斯共轭更新的“加法规则”。
  4. win_probability(samples=5000)循环采样 5000 次,统计 B 组样本大于 A 组的比例,即后验胜率。
  5. should_stop(threshold=0.95, min_total=100)胜率达到 95% 且总样本量超过 100 时建议停止,双保险避免早停。
  6. random.seed(42)固定随机种子,保证实验结果可复现,便于团队评审和回归验证。

常见误区

误区「贝叶斯不就是先拍一个数,然后让数据跟着它走吗?那结论还能客观吗?我只要把先验设成支持自己观点的值,结果不就随便编了?」

正解先验不是拍脑袋,而是对已有信息的显式编码。林师傅的二十年经验、历史实验数据、行业基准,都可以转化为先验。更关键的是,数据量越大,先验的影响被稀释得越厉害——就像一勺老汤加到一锅水里,水多了味就淡了。即使先验设得离谱,只要样本足够,后验依然会被数据拉回真相。

为何常见:人们习惯把“主观”等同于“不科学”,忽略了所有统计推断其实都隐含假设,贝叶斯只是把假设摆到明面上。

误区「贝叶斯不是随时都能算胜率吗?那我看三位顾客都觉得新配方好吃就直接上架呗,反正胜率都算出来了。」

正解小样本下的胜率方差极大,三位顾客全好评可能是运气。贝叶斯 A/B 必须设置最小样本量下限,且胜率阈值要足够高(如 0.95)。林师傅的规矩是“胜率达标 + 顾客数达标”双条件缺一不可,否则就是拿噪音当信号。

为何常见:看到“实时更新”就误以为“无需等待”,混淆了“能更新”与“更新足够可靠”。

误区「后验胜率 95% 不就是 p 值小于 0.05 吗?这两个说法应该是一回事吧?」

正解两者哲学完全不同。胜率是 $P(B优于A \mid 数据)$,直接回答“新配方更优的概率是多少”;p 值是“假设新旧无差异时,看到这种数据的概率”。一个把概率给假设,一个把概率给数据。林师傅关心的是“我该不该信新配方”,显然胜率的提问方式更贴合实际决策。

为何常见:初学者习惯把所有统计量都往 p 值框架里套,忽略了贝叶斯答案本身就是一个决策用的概率。

误区「贝叶斯因子 10,说明新配方肯定赢,可以直接上线了,不用再看其他指标。」

正解贝叶斯因子衡量“数据更支持哪个假设”,但“支持”不等于“效果大”。它可能倍数很大,实际提升却只有 0.1%。林师傅的决策还要兼顾业务成本、收益规模和风险容忍度,胜率、贝叶斯因子、效应量三者要一起看,不能单凭一个数字拍板。

为何常见:人脑喜欢寻找“一个数字说了算”的安全感,而现实决策总是多维度的。

面试题

Q1. 贝叶斯定理中,P(θ|D) 被称为什么?

单选题 · easy

  • A.先验概率
  • B.后验概率← 正确答案
  • C.似然函数
  • D.边际概率

答案:B。P(θ|D) 表示看到数据 D 之后对参数 θ 的概率判断,即后验概率。先验是 P(θ),似然是 P(D|θ),边际是 P(D)。就像林师傅看完顾客反馈后更新的判断,自然是“后验”。

Q2. Beta 分布的均值公式是哪个?

单选题 · easy

  • A.α × β
  • B.α / (α + β)← 正确答案
  • C.(α + β) / α
  • D.β / (α + β)

答案:B。Beta 分布的均值是 α/(α+β),即成功数占总次数的比例。另外三个都是错误变形。可以联想好评率 = 点赞数 ÷ 总评价数,分子是 α,分母是 α 加 β。

Q3. 两个变体都使用 Beta(1,1) 作为先验,这属于什么?

单选题 · mid

  • A.强信息先验
  • B.无信息先验← 正确答案
  • C.共轭后验
  • D.经验贝叶斯

答案:B。Beta(1,1) 等价于 [0,1] 上的均匀分布,表示“所有好评率水平同等可能”,没有任何偏向,因此是无信息先验。林师傅对新配方完全没把握时,就会选它当起点。

Q4. 蒙特卡洛估计胜率时,为什么要从后验分布中反复抽样?

单选题 · mid

  • A.为了减少数据量
  • B.因为解析积分难以直接计算← 正确答案
  • C.为了让数据更准确
  • D.为了替换先验分布

答案:B。两个 Beta 分布之差的积分没有简单的解析式,所以用大量随机样本“数一数谁赢得多”。蒙特卡洛不是让数据更准,而是用计算换解析解。就像林师傅反复掷骰子模拟口味对决。

Q5. 贝叶斯因子能够告诉我们哪些信息?

多选题 · mid

  • A.数据支持备择假设的程度← 正确答案
  • B.效应量的实际大小
  • C.与零假设相比的证据强度← 正确答案
  • D.实验所需的最小样本量

答案:AC。贝叶斯因子是 P(D|H1)/P(D|H0),衡量数据在两个假设间的相对支持度,所以 A 和 C 对。它不直接给出效应量(B 错),也不负责计算样本量(D 错)——那是停时规则中由团队设定的。

Q6. 后验更新中,若观察到 10 次成功、5 次失败,且先验为 Beta(20,20),新 α 是多少?

单选题 · mid

  • A.20
  • B.25
  • C.30← 正确答案
  • D.35

答案:C。共轭更新是加法规则:新 α = 旧 α + 成功数 = 20 + 10 = 30。失败数 5 会加到 β 上变成 25。这正像林师傅把今天 10 位点赞顾客记入满意栏。

Q7. 关于贝叶斯 A/B 与频次 A/B 的对比,哪些说法正确?

多选题 · hard

  • A.贝叶斯可以随时评估胜率← 正确答案
  • B.频次方法依赖预设样本量← 正确答案
  • C.贝叶斯方法无法控制误判风险
  • D.频次方法给出更直观的概率解释

答案:AB。贝叶斯后验随时可算,A 正确;频次方法确实需要事先确定样本量,B 正确。C 错误,贝叶斯通过阈值和损失函数同样控制误判;D 错误,频次方法的 p 值不如胜率直观。

Q8. 先验取 Beta(500,500) 后,观察 100 次新增数据,后验均值接近哪个值?

单选题 · hard

  • A.完全由观测数据决定
  • B.0.5 附近,受数据微弱牵引← 正确答案
  • C.观测数据的平均值
  • D.会直接变成 1.0

答案:B。强先验 α=β=500 相当于 1000 次历史经验,后验均值约为 (500+x)/(1000+n),非常接近 0.5,100 条新数据只能轻微拉动它。这告诉工程师:强先验需要大量新数据才能被“说服”。

Q9. 停时规则中,为什么既要胜率阈值又要最小样本量?

单选题 · easy

  • A.为了展示更多图表
  • B.防止小样本偶然导致误判← 正确答案
  • C.为了满足监管要求
  • D.为了降低计算成本

答案:B。如果只看胜率,前三位顾客恰好都喜欢新配方时胜率就冲到 100%,但这极可能是随机波动。加上最小样本量就像林师傅坚持“尝过一百碗再下结论”,能显著降低小样本下的误判风险。

Q10. 贝叶斯 A/B 工程落地时,监控预警模块通常包含哪些能力?

多选题 · hard

  • A.后验分布自动更新← 正确答案
  • B.胜率实时计算与展示← 正确答案
  • C.触发阈值后自动通知← 正确答案
  • D.直接修改线上代码版本

答案:ABC。埋点数据流入后自动更新后验、实时算胜率、达标后推送通知,这些都是监控预警的典型能力。但系统不会直接改线上代码——最终发布动作通常需要工程师或自动发布流水线审批,贝叶斯模块只负责建议,不负责操作版本库。