互联网产品里,我们经常想知道「新版本上线后,业务指标会不会变好」。直接全量上线的风险很大——万一效果差,DAU 与时长可能立刻跌一个台阶。A/B 实验的做法是从总体里随机抽一小部分流量,再把这部分切两份:一份用旧版本,一份用新版本,跑一段时间,比较两组指标。这套方法直观可行,但有一个常被忽略的前提:样本里看到的「实验组比对照组好」并不直接等于「全量改用新版本会让总体变好」。这里其实横着两层缺口:一是 样本到总体 的统计推断差距——哪怕分组完全随机,有限样本里观察到的差异也可能只是采样噪声,不反映总体真实差异;二是 关联到因果 的推断差距——数据里同时发生的两件事,未必是其中一件导致了另一件(可能来自混淆变量、霍桑效应、违反 SUTVA 的网络溢出等)。A/B 实验背后整套数理框架要补的,正是这两层缺口

这篇文章介绍 A/B 实验背后的两个核心数理工具:潜在结果框架(Rubin Causal Model) 与频率派假设检验。它们解决两件不同的事:前者把「因果效应」形式化成无法直接观测的潜在结果之差,后者用随机化与中心极限定理把这个不可观测的量从有限样本里渐近恢复出来。缺了任何一个,实验报出的「+1%」都没法解释成「新版本带来 +1% 的真实增长」。

1. 从总体统计到样本推断

统计推断是用样本性质反推总体性质的方法。当我们能直接对 总体(population) 做穷尽统计时——比如全国人口普查直接登记每个人——这并不是统计推断,而是 普查(census)。但绝大多数场景里,普查的代价高到无法承受,我们只能从总体中按某个机制采一批样本,用样本上算出来的统计量去 估计 总体的参数。统计推断的精度取决于采样机制能否让样本对总体保持「代表性」,而代表性本身是个数学问题,不是直觉问题

A/B 实验是统计推断在工业界的一个经典应用。它最早起源于医疗领域的 随机对照试验(RCT)——病人被随机分到用药组和安慰剂组,用样本上的疗效差异推断药物上市后对总体的整体效应。互联网产品把这套方法搬到算法迭代:一个新推荐算法上线前,直接全量推给所有用户的风险太高,万一效果差就直接拉低 DAU 与人均时长。一种工业标配做法是抽 5% 用户上线新算法,95% 用户继续用旧算法,跑一周后看人均时长的差异——这本质上是用一个 5% 的样本去推断「全量上线新算法后,总体的人均时长会怎么变」

但这里有一个微妙的问题。实验跑完,我们看到实验组比对照组高 1.2%——这能直接得出「新算法把人均时长提升了 1.2%」的结论吗?严格来说不能。实验组与对照组只在采样时被随机分开,被分到实验组的那 5% 用户不可能「再被分到对照组」让我们直接对比同一批人在新旧算法下的差异。真正想知道的是「同一个用户用新算法 vs 用旧算法,时长会差多少」——这是一个反事实(counterfactual)量,在个体层面无法被直接观测。把「组间差异」翻译成「因果效应」,需要一套数学框架。

2. 潜在结果框架

2.1 设定与潜在结果

我们沿用统计学家 Neyman 在 1923 年提出的潜在结果框架。设有 nn 个实验对象,用 Zi{0,1}Z_i \in \{0, 1\} 表示对象 ii 的分组:Zi=1Z_i = 1 进入实验组,Zi=0Z_i = 0 进入对照组。实验关心的指标 YiY_i 有两个版本:

  • Yi(1)Y_i(1):对象 ii 在「实验组下」的指标值(用了新算法)。
  • Yi(0)Y_i(0):对象 ii 在「对照组下」的指标值(用了旧算法)。

这两个量统称为对象 ii潜在结果(potential outcomes)——它们都「潜在地」存在,但 实际能被观测到的只有其中一个,取决于 ZiZ_i

Yiobs=ZiYi(1)+(1Zi)Yi(0).Y_i^{\text{obs}} = Z_i \cdot Y_i(1) + (1 - Z_i) \cdot Y_i(0).

2.2 个体因果效应与反事实

对象 ii个体因果效应 自然定义为

τi:=Yi(1)Yi(0),\tau_i := Y_i(1) - Y_i(0),

即同一个对象在两种处理下的指标之差。但因为我们最多只能观测到其中一个,τi\tau_i 是永远无法被精确算出的个体量。这就是因果推断的根本难题:任何因果效应在个体层面都涉及一个无法被同时观测的对照状态——也即所谓 反事实(counterfactual)

2.3 SUTVA:让因果推断能落地的两条假设

潜在结果框架在 Neyman 提出时只是一种统计语言,要把它真正用到因果推断,需要 Rubin 在 1980 年补的两条核心假设。学界统称这两条为 Stable Unit Treatment Value Assumption(SUTVA)

  • 无干扰(No-interference):对象 ii 的潜在结果只依赖自己的 ZiZ_i,与其他对象的分组 {Zj}ji\{Z_j\}_{j \neq i} 无关。工业反例:视频号社交分发场景下,实验组用户被新算法推到一条好内容,转发到朋友圈让对照组好友也看到了——对照组的指标被实验组的 treatment「溢出」了,无干扰假设破坏。
  • 同质处理(Treatment Variation Irrelevance):实验组所有对象接受到的 treatment 只有一种版本。工业反例:推荐算法在不同地域的服务器上部署存在版本错位,实验组内部分化成了若干个不同的「新算法」,treatment 不再唯一。

SUTVA 是大多数 A/B 实验默认成立的假设,但在社交、推荐这类高耦合场景下随时可能塌掉——网络效应下的实验设计本身是一个独立的研究方向(cluster randomization、switchback 等是其中的代表方法),本文不展开。

2.4 平均因果效应

个体因果效应 τi\tau_i 没法估计,但我们可以退一步,关心总体上的平均:平均因果效应(Average Treatment Effect, ATE) 定义为

τ:=1ni=1n(Yi(1)Yi(0))=Yˉ(1)Yˉ(0).\tau := \frac{1}{n} \sum_{i=1}^{n} \big(Y_i(1) - Y_i(0)\big) = \bar{Y}(1) - \bar{Y}(0).

即整个总体在实验组下的平均指标减去其在对照组下的平均指标。ATE 仍然由不可观测的潜在结果定义,但在合适的实验设计下可以被无偏估计——下一节展开为什么「合适的实验设计」等价于「随机分组」。

3. 随机化与 Difference-in-means 估计量

3.1 随机化为何能消化反事实

先把潜在结果框架的一个关键细节摆出来:每个个体都同时拥有 (Yi(0),Yi(1))(Y_i(0), Y_i(1)) 这一对潜在结果,它们是个体的固有属性;分组变量 ZiZ_i 只决定我们观测到哪一个,并不决定哪一个”存在”。被分到实验组的人,他自己的 Yi(0)Y_i(0) 仍然作为反事实存在,只是看不到,反之亦然。在这个前提下,当 ZiZ_i(Yi(0),Yi(1))(Y_i(0), Y_i(1)) 统计独立时,实验组与对照组都成了同一总体的随机子集——两组各自的 (Yi(0),Yi(1))(Y_i(0), Y_i(1)) 联合分布在期望上都等于总体的联合分布,所以两组之间也一致。这里的”一致”不是说”实验组观测到的 Y(1)Y(1) 与对照组观测到的 Y(0)Y(0) 同分布”(那是两个不同的量),而是”两组都是总体 (Y(0),Y(1))(Y(0), Y(1)) 的无偏微缩”。直接推论:实验组观测到的 Xˉ1\bar{X}_1Yˉ(1)\bar{Y}(1) 的无偏估计,对照组观测到的 Xˉ0\bar{X}_0Yˉ(0)\bar{Y}(0) 的无偏估计;任何能让一组系统性更高的偏差,都已经被分组过程的随机性平均掉。

更形式化一点,在 Neyman 视角下我们把 {Yi(0),Yi(1)}i=1n\{Y_i(0), Y_i(1)\}_{i=1}^n 当作总体的固有属性(不是 随机变量),唯一的随机性来自分组变量 {Zi}i=1n\{Z_i\}_{i=1}^n。实验设计若能保证 P(Zi=1)=n1/n\mathbb{P}(Z_i = 1) = n_1/n 对所有 ii 一致,这一条就让 ZiZ_i 与潜在结果统计独立。随机分组的本质,是用一个独立于潜在结果的伯努利变量,把「每个个体只能观测一种状态」切成「每种状态都各有一个对其无偏的子样本」

3.2 Difference-in-means 估计量

基于上面的观察,我们构造 ATE 的样本估计量:

τ^:=1n1Zi=1Yiobs1n0Zi=0Yiobs.\hat{\tau} := \frac{1}{n_1} \sum_{Z_i = 1} Y_i^{\text{obs}} - \frac{1}{n_0} \sum_{Z_i = 0} Y_i^{\text{obs}}.

它被称为 Difference-in-means(组均值差)。形式直白:实验组观测均值减对照组观测均值。下面证它是 τ\tau 的无偏估计。

3.3 无偏性的完整推导

把求和写成对所有 ii 求和加 Zi/(1Zi)Z_i / (1 - Z_i) 指示,再用 Yiobs=ZiYi(1)+(1Zi)Yi(0)Y_i^{\text{obs}} = Z_i Y_i(1) + (1 - Z_i) Y_i(0) 展开:

τ^=1n1i=1nZiYi(1)1n0i=1n(1Zi)Yi(0).\hat{\tau} = \frac{1}{n_1} \sum_{i=1}^{n} Z_i \, Y_i(1) - \frac{1}{n_0} \sum_{i=1}^{n} (1 - Z_i) \, Y_i(0).

在 Neyman 视角下,Yi(1),Yi(0)Y_i(1), Y_i(0) 是固定的(总体属性),n1,n0n_1, n_0 是设计参数,唯一的随机变量是 ZiZ_i。因此对 τ^\hat{\tau} 求期望时,期望算子只对 ZiZ_i 起作用:

E[τ^]=1n1i=1nE[Zi]Yi(1)1n0i=1n(1E[Zi])Yi(0)=1n1i=1nn1nYi(1)1n0i=1nn0nYi(0)=1ni=1nYi(1)1ni=1nYi(0)=Yˉ(1)Yˉ(0)=τ.\begin{aligned} \mathbb{E}[\hat{\tau}] &= \frac{1}{n_1} \sum_{i=1}^{n} \mathbb{E}[Z_i] \cdot Y_i(1) - \frac{1}{n_0} \sum_{i=1}^{n} \big(1 - \mathbb{E}[Z_i]\big) \cdot Y_i(0) \\ &= \frac{1}{n_1} \sum_{i=1}^{n} \frac{n_1}{n} \, Y_i(1) - \frac{1}{n_0} \sum_{i=1}^{n} \frac{n_0}{n} \, Y_i(0) \\ &= \frac{1}{n} \sum_{i=1}^{n} Y_i(1) - \frac{1}{n} \sum_{i=1}^{n} Y_i(0) \\ &= \bar{Y}(1) - \bar{Y}(0) \\ &= \tau. \end{aligned}

这个推导的关键,是 E[Zi]=n1/n\mathbb{E}[Z_i] = n_1/n 必须对所有 ii 同时成立——它正是「随机分组」这一实验设计的形式化表述。

3.4 失效条件:实验中途改变分组比例

任何让 E[Zi]=n1/n\mathbb{E}[Z_i] = n_1/nii 而异的操作,都会让 τ^\hat{\tau} 失去无偏性。一个工业里高频出现的失效模式是 实验中途改变 ctrl 与 exp 的比例:第一天对照组 1% / 实验组 1%(比例 1:1),第二天对照组 1% / 实验组 5%(比例 1:5)。如果只看最终累积的实验组与对照组样本均值差,那些第一天就进入实验的早期用户与第二天才进入实验组的晚期用户,它们的 E[Zi]\mathbb{E}[Z_i] 是不同的——简单的均值差会把比例调整带来的「时间分布差异」当成「实验效果」,产生类似 辛普森悖论 的偏差。

作为对照:如果是 等比放量——两组同步从 1%/1% 调到 5%/5%,ctrl:exp 比例始终是 1:1——那么所有用户的 E[Zi]\mathbb{E}[Z_i] 仍然都是 1/21/2,Diff-in-means 仍然无偏。失效的根源是「比例」被动,不是「总量」被动。等比放量带来的副作用是 day-1 用户和 day-2 用户的暴露时间不同,但这种异质性在 ctrl 与 exp 两组里对称存在,不破坏内部效度(无偏性);它只是让估计量对应的是”早晚期混合人群”的 ATE,外推到全量上线时需要额外考量。

修正方案是给每个观测加一个 inverse-probability weighting(见附录 B)。但更稳妥的做法是 实验全程保持 ctrl 与 exp 的固定比例;总量可以等比放大,比例不能动

4. 假设检验:从估计量到决策

4.1 零假设、备择假设与两类错误

有了 τ^\hat{\tau} 这个无偏估计,我们还差最后一步:怎么从一个有限样本上的 τ^\hat{\tau} 值,决定「接受还是拒绝『新算法有效』这件事」。这就是 假设检验 要做的事。

定义两个互斥的假设:

  • 零假设 H0H_0τ=0\tau = 0,新算法没有效果。
  • 备择假设 H1H_1τ0\tau \neq 0,新算法有正向或负向的效果。

判决规则有两类错误:

  • 第一类错误(Type I error,false positive)H0H_0 实际为真但被拒绝。概率记作 α\alpha,工程上常取 5%。
  • 第二类错误(Type II error,false negative)H1H_1 实际为真但 H0H_0 没被拒绝。概率记作 β\beta1β1 - \beta 称为该检验的 统计功效(power)

频率派假设检验的底层哲学是「小概率事件在一次实验中近似不会发生」——若在 H0H_0 成立的前提下我们观察到了在 H0H_0 下应当极少出现的样本,那就有理由怀疑 H0H_0 错了

4.2 中心极限定理

我们手上有一个 τ^\hat{\tau} 的具体值,要把它翻译成「在 H0H_0 下出现得多稀奇」,必须先知道 τ^\hat{\tau} 的分布。这里 中心极限定理(Central Limit Theorem, CLT) 登场。

Lindeberg-Lévy 形式:设 X1,X2,,XnX_1, X_2, \ldots, X_n 独立同分布,满足 E[Xi]=μ\mathbb{E}[X_i] = \muVar(Xi)=σ2<\mathrm{Var}(X_i) = \sigma^2 < \infty。当 nn \to \infty 时,

n(Xˉnμ)σ  d  N(0,1),\frac{\sqrt{n}\,(\bar{X}_n - \mu)}{\sigma} \;\xrightarrow{d}\; N(0, 1),

其中 d\xrightarrow{d} 表示 依分布收敛(convergence in distribution)

特征函数证明梗概。记 Yi:=XiμY_i := X_i - \mu,则 YiY_i 均值 0、方差 σ2\sigma^2,其特征函数 ϕY(t):=E[eitY]\phi_Y(t) := \mathbb{E}[e^{i t Y}]t=0t = 0 附近有泰勒展开

ϕY(t)=1σ2t22+o(t2),t0.\phi_Y(t) = 1 - \frac{\sigma^2 t^2}{2} + o(t^2), \qquad t \to 0.

设标准化和 Sn:=1σni=1nYiS_n := \frac{1}{\sigma \sqrt{n}} \sum_{i=1}^{n} Y_i。由 YiY_i 之间的独立性,

ϕSn(t)=i=1nE ⁣[exp ⁣(itYiσn)]=[ϕY ⁣(tσn)]n=[1t22n+o ⁣(1n)]n  n  et2/2.\begin{aligned} \phi_{S_n}(t) &= \prod_{i=1}^{n} \mathbb{E}\!\left[\exp\!\left(\frac{i t Y_i}{\sigma \sqrt{n}}\right)\right] = \left[\phi_Y\!\left(\frac{t}{\sigma \sqrt{n}}\right)\right]^n \\ &= \left[1 - \frac{t^2}{2 n} + o\!\left(\frac{1}{n}\right)\right]^n \;\xrightarrow{n \to \infty}\; e^{-t^2 / 2}. \end{aligned}

et2/2e^{-t^2/2} 正是标准正态 N(0,1)N(0, 1) 的特征函数。由 Lévy 连续性定理(特征函数逐点收敛蕴含分布弱收敛),SnS_n 依分布收敛到 N(0,1)N(0, 1)。完整推导(含 o(t2)o(t^2) 的精确含义)见附录 A。

直觉上:任意有限二阶矩的分布,被加和均化以后,三阶以上矩对分布形状的影响以更快的速度衰减,残留下来的只有均值与方差——这就是为什么「样本均值的分布会变正态」。

4.3 应用到 A/B 实验:检验统计量

设实验组与对照组样本都 i.i.d. 来自方差有限的总体,组间独立。在 n0,n130n_0, n_1 \gg 30 的工程实际下,由 CLT 与两组独立性,

Xˉ1Xˉ0  d  N ⁣(μ1μ0,  σ12n1+σ02n0).\bar{X}_1 - \bar{X}_0 \;\overset{d}{\approx}\; N\!\left(\mu_1 - \mu_0,\;\frac{\sigma_1^2}{n_1} + \frac{\sigma_0^2}{n_0}\right).

把总体方差用样本方差 σ^02,σ^12\hat{\sigma}_0^2, \hat{\sigma}_1^2 代替,构造检验统计量

T:=Xˉ1Xˉ0σ^02/n0+σ^12/n1.T := \frac{\bar{X}_1 - \bar{X}_0}{\sqrt{\hat{\sigma}_0^2 / n_0 + \hat{\sigma}_1^2 / n_1}}.

H0H_0TdN(0,1)T \overset{d}{\approx} N(0, 1)。给定显著性水平 α\alpha,双侧检验的拒绝域为 T>z1α/2|T| > z_{1 - \alpha/2}

4.4 p 值

p 值(p-value) 的定义是:在 H0H_0 成立的前提下,观察到当前结果或更极端结果的概率。形式化:

p=2(1Φ(T)),p = 2 \cdot \big(1 - \Phi(|T|)\big),

其中 Φ\Phi 是标准正态 CDF。p 越小,表示当前观测在 H0H_0 下越罕见,拒绝 H0H_0 的证据越强。

需要纠正一个常见误读:p<0.05p < 0.05 表示 H1H_1 为真的概率是 95%」是错的。频率派的 p 值是「H0H_0 给定时观察到现状的稀有度」,不是「H1H_1 的后验概率」——后者是贝叶斯学派要算的量,需要先验。美国统计协会(ASA)2016 年关于 p 值的声明 对这类常见误用做了系统梳理。

4.5 置信区间

p 值的「区间」版本:τ\tau1α1 - \alpha 置信区间为

τ^±z1α/2σ^02/n0+σ^12/n1.\hat{\tau} \pm z_{1 - \alpha/2} \cdot \sqrt{\hat{\sigma}_0^2 / n_0 + \hat{\sigma}_1^2 / n_1}.

置信区间(confidence interval) 的频率派语义是:「在反复用同样的实验设计采样估计 τ\tau 时,大约 95% 的实验所产生的置信区间会覆盖真实的 τ\tau」——它不是说「当前这一次区间有 95% 概率覆盖 τ\tau。真实的 τ\tau 是固定值,它要么在你这一次的区间里,要么不在,没有概率可言。概率落在采样过程上,不在参数本身。

4.6 Power 与最小样本量

显著性水平 α\alpha 控制的是 false positive,但不直接控制 false negative。后者由 power 1β1 - \beta 衡量,它依赖 真实效应大小 Δ:=μ1μ0\Delta := \mu_1 - \mu_0、样本量 nn 与方差 σ\sigma。在 σ0=σ1=σ,n0=n1=n\sigma_0 = \sigma_1 = \sigma, n_0 = n_1 = n 的近似下,双侧 α\alpha 显著检验在效应 Δ\Delta 处的 power 近似为

1β1Φ ⁣(z1α/2Δ2σ2/n).1 - \beta \approx 1 - \Phi\!\left(z_{1 - \alpha/2} - \frac{|\Delta|}{\sqrt{2 \sigma^2 / n}}\right).

反过来,给定目标 1β1 - \beta(工程常取 80%)与目标可识别效应 Δ\Delta,反解得每组所需样本量

n=2(σ(z1α/2zβ)Δ)2.n = 2 \left(\frac{\sigma \cdot (z_{1 - \alpha/2} - z_\beta)}{\Delta}\right)^2.

这条公式是「最小样本量」实务计算的出发点——任何合格的 A/B 实验都应在开实验前预估并固定 nn,不应该靠「边跑边看」。至于「边跑边看」的代价,进入下一节。

5. 真实场景下的两个陷阱

5.1 Fixed-sample size 与 peeking 问题

经典 t 检验和 z 检验有一个容易被忽视、底层却关键的前提:样本量 nn 必须在实验开始前确定,跑满之后再做一次性的检验。工程实务里业务经常这么干:实验上线后看板每天刷新,运营 / 算法 / PM 每天早上看一眼 p 值——「显著就停 / 不显著继续」。这种边跑边看、再基于看到的结果决定是否停的做法,叫做 peeking

Peeking 的代价是 false positive 率被严重放大。直觉上:每天检查一次、连看 14 次,每次都问「这次是不是已经显著」,那么「至少有一次显著」的概率远不止 5%——这是一个 多重比较(multiple comparison) 问题。Johari 等人在 Peeking at A/B Tests(KDD 2017) 里做过仿真:在 H0H_0 真的成立的前提下用经典 t 检验配 daily peeking,实际 false positive 率可以从名义的 5% 漂到 30% 以上——14 天的实验大约就是这个量级。

业务后果可以非常诡异:「去年做了 100 个实验,每个都报了显著的 +1%,但年底大盘指标反而跌了」。原因不复杂——peeking 选出来的那些「+1%」里,多数其实是 H0H_0 下偶然达标的那一波;当它们叠加到大盘上时,既不可重复也不可加。

修复 peeking 的工业方案是 序列检验(sequential testing)。经典的 Wald SPRT 用似然比配上下边界 A,BA, B 作为停时规则;大厂目前用的更多是它的混合先验版本——mSPRT(Always Valid Inference, Johari et al. 2015)——它可以在每个时刻给出一个有效的置信序列,业务从早期开始随时停都不会破坏 Type I 控制。代价是单次的检验功效会比 fixed-sample 的 t 检验略低。

不过这里有一条容易被忽视的前提:SPRT 与 mSPRT 的理论保证都建立在样本序列 i.i.d. 之上,但在真实 A/B 实验的流式数据里这条很难成立。同一个用户在不同 batch 之间的多条记录正相关(§5.2 会展开),用户行为还带工作日 / 周末、上午 / 晚间这类时间结构,导致 batch 之间也不是真正独立。

5.2 i.i.d. 假设破灭与方差低估

CLT 与 Var(Xˉ)=σ2/n\mathrm{Var}(\bar{X}) = \sigma^2 / n 这两条共同的前提是:样本两两 独立同分布(i.i.d.)。这条在互联网 A/B 实验里 经常被破坏

最常见的失效结构是 单个用户多条记录。例如曝光-点击实验,实验单位是用户,但点击数据的粒度是 (user, video)。同一个用户在一周里的多次曝光、多次点击之间显然正相关——一个重度活跃用户这周点击多,下周通常也点击多。

正相关的代数后果可以直接写出来。设第 ii 个用户在实验期内有 nin_i 条记录 {Xij}j=1ni\{X_{ij}\}_{j=1}^{n_i},用户间独立、用户内可能正相关。总和方差:

Var ⁣(i,jXij)=iVar ⁣(jXij)=i ⁣[jVar(Xij)+jkCov(Xij,Xik)].\begin{aligned} \mathrm{Var}\!\left(\sum_{i, j} X_{ij}\right) &= \sum_i \mathrm{Var}\!\left(\sum_j X_{ij}\right) \\ &= \sum_i \!\left[\sum_j \mathrm{Var}(X_{ij}) + \sum_{j \neq k} \mathrm{Cov}(X_{ij}, X_{ik})\right]. \end{aligned}

Cov(Xij,Xik)>0\mathrm{Cov}(X_{ij}, X_{ik}) > 0 时,真实方差比按 i.i.d. 假设算出的方差大。如果工程实现里直接套 i.i.d. 公式,方差会被算小、检验统计量被算大、p 值被算小——伪阳性率自然就上来了。

修正这件事的标准做法是 按分析单元合并数据(一般是按用户聚合):固定样本量的 t 检验本身没问题,问题在喂给它的样本不是用户级。最直接的办法是把分析单元从「多记录」抬升到「用户」——把同一用户的多条记录聚合成一条,“用户与用户之间 i.i.d.” 这条假设就重新成立。代价是指标语义从”次均”变成”人均”——两者数学含义不同。这种方案适合可以离线按日 / 按周聚合的场景;跨天且联合 key 的复杂指标,离线聚合的计算成本会高,需要工程上单独再设计。

6. 结语

A/B 实验真正在做的事,是把「实验组比对照组好」翻译成「换了新版本会让总体指标变好」——这不是文字游戏,而是一条从潜在结果框架出发,经过随机化、CLT、假设检验,再到 i.i.d. 失效与 peeking 两个真实陷阱的完整数理链路。下面这几条边界条件,用之前最好心里有数:

  • A/B 实验是统计 + 因果的复合系统,不是仅靠工程系统就能撑起来。曝光分流、看板渲染、灰度上下线都是工程问题,但「如何报数」本身是数理问题——工程做对而数理做错,报出来的「+1%」就是噪声。
  • 随机化是因果推断的「出厂价」。拿不到随机化(观察性数据、自然实验),就要靠更多假设把因果效应识别出来。Difference-in-Differences、Instrumental Variable、Propensity Score Matching 各有自己的失效场景,没有「免费」的因果识别。
  • CLT 与 i.i.d. 是基石、也是漏点。当样本结构里隐含了正相关(单用户多记录、社交网络溢出、双边市场),方差会被低估,伪阳性率从名义的 5% 漂到几十个百分点不奇怪。看到任何「显著」结果之前,先问一句:我的样本满足 i.i.d. 吗?
  • Peeking 是日常陷阱。边跑边看加上一显著就停,把 fixed-sample 检验玩成了多重比较——业务最难戒掉的就是这个习惯。工业上的解法是把序列检验做进 A/B 平台,让「随时看也合法」。

在这套基础之上,还有一系列工业界长期在打磨的进阶手段:

  • 方差缩减(variance reduction)CUPED(Deng et al. WSDM 2013) 用实验前的协变量构造控制变量,把方差消减一个常数因子;同样的置信宽度下,样本量需求成倍下降。
  • 网络效应下的实验设计:当 SUTVA 的「无干扰」在社交、推荐、双边市场塌掉时,业界用 cluster randomization(按城市 / 群组而非个人随机)、switchback(按时间片而非用户随机)等手段,尽量把溢出限制在「组内」而非「组间」。

把这两块串起来看,A/B 实验的「高级问题」基本都在围绕一件事:怎么在保证因果效力的前提下,把样本量需求降下来

附录 A:CLT 的完整证明

正文的特征函数证明梗概里有两处技术细节需要补全。

1. o(t2)o(t^2) 的精确含义。严格来说,「ϕY(t)=1σ2t2/2+o(t2)\phi_Y(t) = 1 - \sigma^2 t^2 / 2 + o(t^2)」是指存在函数 ϵ(t)\epsilon(t) 使得

ϕY(t)=1σ2t22+t2ϵ(t),ϵ(t)0 as t0.\phi_Y(t) = 1 - \frac{\sigma^2 t^2}{2} + t^2 \cdot \epsilon(t), \qquad \epsilon(t) \to 0 \text{ as } t \to 0.

这一展开要求 YY 的二阶矩有限,即 E[Y2]=σ2<\mathbb{E}[Y^2] = \sigma^2 < \infty。推导过程依赖特征函数的两次可微性以及 ϕY(0)=iE[Y]=0,  ϕY(0)=E[Y2]=σ2\phi_Y'(0) = i\,\mathbb{E}[Y] = 0,\;\phi_Y''(0) = -\mathbb{E}[Y^2] = -\sigma^2,这是特征函数的标准性质。

2. 极限的严格化。对 tt 固定,ϕY(t/(σn))n\phi_Y(t/(\sigma \sqrt{n}))^n 的对数极限计算如下:

ϕY ⁣(tσn)=1t22n+t2nϵ ⁣(tσn),nlnϕY ⁣(tσn)=n[t22n+o ⁣(1n)]=t22+o(1).\begin{aligned} \phi_Y\!\left(\frac{t}{\sigma \sqrt{n}}\right) &= 1 - \frac{t^2}{2 n} + \frac{t^2}{n} \cdot \epsilon\!\left(\frac{t}{\sigma \sqrt{n}}\right), \\ n \cdot \ln \phi_Y\!\left(\frac{t}{\sigma \sqrt{n}}\right) &= n \cdot \left[ -\frac{t^2}{2 n} + o\!\left(\frac{1}{n}\right) \right] = -\frac{t^2}{2} + o(1). \end{aligned}

第二步用了 ln(1+x)=x+O(x2)\ln(1 + x) = x + O(x^2)ϵ(t/(σn))0\epsilon(t/(\sigma \sqrt{n})) \to 0(因为 t/(σn)0t/(\sigma\sqrt{n}) \to 0)。两边取指数即得 ϕSn(t)et2/2\phi_{S_n}(t) \to e^{-t^2 / 2}

3. 弱收敛。由 Lévy 连续性定理:若一族特征函数 ϕn(t)\phi_n(t) 逐点收敛到某个在 t=0t = 0 处连续的函数 ϕ(t)\phi(t),则对应的概率分布弱收敛到以 ϕ\phi 为特征函数的分布。这里 ϕ(t)=et2/2\phi(t) = e^{-t^2/2}t=0t = 0 处显然连续,因此 SndN(0,1)S_n \xrightarrow{d} N(0, 1)

更弱条件下的版本(Lindeberg 条件、Feller 不需要同分布的版本)见任意一本测度论概率教材,例如 Durrett 的《Probability: Theory and Examples》第 3 章。

附录 B:不均等分配下的 Difference-in-means 修正

§3.4 提到,当 E[Zi]\mathbb{E}[Z_i]ii 而异时,简单的 Difference-in-means 估计量是有偏的。修正思路是给每个观测加一个 逆概率权重(inverse probability weighting),源自 Horvitz-Thompson estimator

πi:=P(Zi=1)\pi_i := \mathbb{P}(Z_i = 1) 已知(例如来自实验平台的分流配置)。定义

τ^IPW:=1ni=1n ⁣[ZiYiobsπi(1Zi)Yiobs1πi].\hat{\tau}_{\text{IPW}} := \frac{1}{n} \sum_{i=1}^{n} \!\left[\frac{Z_i \, Y_i^{\text{obs}}}{\pi_i} - \frac{(1 - Z_i) \, Y_i^{\text{obs}}}{1 - \pi_i}\right].

直接对 ZiZ_i 求期望可验证 E[τ^IPW]=τ\mathbb{E}[\hat{\tau}_{\text{IPW}}] = \tau不需要 πi\pi_i 对所有 ii 一致。

代价是估计量的方差比 Difference-in-means 大——尤其当某些 πi\pi_i 接近 0 或 1 时,权重剧烈放大。工程实践中,更稳妥的办法仍是从设计端保证 πi\pi_i 一致;IPW 是事后修复,不应作为流量调整的免责声明。关于 IPW 与更稳健的修正方案(doubly robust、PSM 等)的系统对比,见 Imbens 与 Rubin 的《Causal Inference for Statistics, Social, and Biomedical Sciences》(2015)第 12-15 章。