当前在货拉拉进行的诸多AB实验中,存在部分针对细分场景 或是分流粒度较粗 的策略评估,这些实验中实验单元少 ,简单随机分流会导致实验与对照 的实验前偏差(Pre-Experiment Bias)大。
本文档调研了业界先进的实验前偏差 应对技术(AA回溯、最优随机种子和方差缩减)后,在最优随机分组 的基础上,进一步提出了离线分流------用户或司机在实验中的行为与实验前有相关性,可以利用历史数据,将实验对象分为差异很小的两组或多组,以提升AB实验的可靠性和干预效应评估的准确性。
1. 实验前偏差
微软在Edge浏览器的一个AB实验中,改变了一些数据的存储格式,预计不会对用户产生影响。但实验数据显示关键用户参与度指标下降,p 值为0.01,且没有其他侧面指标可以解释这种指标变动。
这类问题通常会被解释为"数据波动",认为这个显著的实验结果是假阳性 (False Positive)。常见的解决方案是重开一次实验,但在实践中,未必有机会重开实验,即使可以重开也会花费额外时间,拖慢策略或产品功能的上线进度。
微软发现历史数据 可以有效地发现和应对实验前差异(Pre-Experiment Bias),提升AB实验的可信度。下文会简单介绍微软在其实验平台落地的三种技术:AA回溯 、最优随机分组 和方差缩减。
1. AA回溯(Retrospective-AA Analysis)
在实验进行或结束后,计算和检查在实验前某段时间内实验组和对照组的指标差异,如果确实在AA回溯中观察到两个组之间的指标存在较大差异,则实验期间指标的差异更有可能是随机化引入的偏差。
2. 最优随机分组(SeedFinder)
虽然实验后AA回溯可以识别实验结果的假阳性,但它有滞后性,在实验开始后才能知道是否存在实验前偏差。使用SeedFinder可以在实验前判断出实验和对照组是否存在差异。
在AB实验中,通常使用哈希函数和随机种子将用户随机 分配到实验组和对照组。在实验开始前,使用大量不同的随机种子,生成大量实验对象分组方案 ,并计算其中各组的核心指标的差异,然后选择一个最佳(差异最小) 的种子用于AB实验。
微软建议生成数百个种子,但最合适的数量会因选择的产品和指标而异。多次随机减少了与策略无关的噪声,并提高了实验效果测算的精度。
微软建议结合使用所有三种技术来提高实验结果的可信度。使用SeedFinder 找到使实验前核心指标差异最小的随机分组,方差缩减 可以提高指标的敏感性(更容易显著)并减少实验前差异,而AA回溯可以检查未经SeedFinder优化过的次要指标的实验前差异。
本文在SeedFinder 的基础上,结合货拉拉AB实验的实际应用场景(如定价、营销),提出了更通用的离线分流的概念。
2. 离线分流
1. 思路
目标:找到两组或多组同质的分群支持AB实验
解法 :实验期间的用户/司机行为和其历史行为有相关性,在此基础上通过随机搜索 或运筹优化的方式找到历史上差异最小的两组或多组
2. 流程图------以用户分流为例
以user_id 分流和随机搜索为例,同样也可以拓展到司机、空间分流
3. 操作流程
STEP 1 确定实验对象名单
根据实际业务场景,思考实验对象是否满足SUTVA假设(个体处理稳定性假设),例如实验对象是否存在Network Effect / Spillover Effect等,然后选择合适的实验分流单元(支持用户、司机、空间)。
根据AB实验需要评估的效应,按照与业务方达成一致的实验单元圈选逻辑,确定待分组实验单元名单。
STEP 2 确定分流相关参数
分组数量:将待分组实验对象名单分为几组
流量比例:子分组实验单元数量占总体实验单元数量的比例;如"对照(40%)、实验组A(30%)、实验组B(30%)"
核心指标:实验设计中关注的核心指标名称;如每个用户过去7天的完单量、完单流水等
历史数据切割:圈选训练日期、测试日期(可选,默认与训练日期一致)
同质性判断标准:如何判断随机出的分组在核心指标上有无差异;如近7天实验组和对照组的人均完单GTV无显著差异(阈值取0.05)或相对差异<1%
随机种子范围:确定需要尝试的随机种子的个数和范围
时空片轮播顺序 (仅适用于时空分流):交替轮播 (每天时间片奇数) 或 交替轮播+隔天反转(每天时间片偶数)
STEP 3 生成实验对象分流方案
随机搜索(Random Search)
使用不同的随机种子,利用与AB平台完全相同的哈希算法,根据STEP 2中输入的分流参数,生成多个实验对象分流方案
根据同质性判断标准 ,使用训练日期数据,计算每个实验对象分流方案 中两个或多个组之间核心指标的差异和显著性水平,并判断是否同质 。 如果满足同质性标准,则保留该实验对象分流方案 及同质性评估结果,供后续环节使用
运筹优化
相较于随机搜索,运筹优化可以找到最优解,或者在相同的时间内找到更优解。
输入离线分组对应的参数:
- 同质性要求: 如最小化实验和对照组某段周期(或每周、每天)的各个指标汇总差异
- 指标数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> I I </math>I:如I=2代表2个指标
- 时间片粒度 和数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> T T </math>T:如时间片粒度为天,T=7,代表实验和对照组一周内每天的指标相似
- 分组数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K:如K=2,将待分组实验对象名单分为均等的2组
- 总体数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ˉ \bar{X} </math>Xˉ:训练集的优化目标,是一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> I × T × K I \times T \times K </math>I×T×K的矩阵;假设要把完单总量为500单的100个用户分为两组,我们希望两组的用户的人数和人均单相等,其实是要求两组的人数接近50且每组人均完单接近500 / 100 = 5,因此优化的目标应该是和总体相似
- 训练集分组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X G X^G </math>XG: <math xmlns="http://www.w3.org/1998/Math/MathML"> X G X^G </math>XG是一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> I × T × K I \times T \times K </math>I×T×K的矩阵,对应着不同实验分组每个时间点每个指标的值;根据实验对象分流方案,计算各组的指标数据,支持遗传算法迭代
- 损失函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> L ( X G , X ˉ ) L(X^G, \bar{X}) </math>L(XG,Xˉ):根据训练集分组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X G X^G </math>XG和总体数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ˉ \bar{X} </math>Xˉ,计算两组或多组的核心指标差异;如MSE
使用遗传算法:
使用遗传算法,求解 <math xmlns="http://www.w3.org/1998/Math/MathML"> G ∗ = arg min G ∑ i = 1 I ∑ t = 1 T ∑ k = 1 K L ( X G , X ˉ ) G^* = \arg \min_G \sum_{i=1}^{I} \sum_{t=1}^{T} \sum_{k=1}^{K}L(X^G, \bar{X}) </math>G∗=argminG∑i=1I∑t=1T∑k=1KL(XG,Xˉ)
-
如果使用最简单的MSE损失函数,上述数据问题变为:
<math xmlns="http://www.w3.org/1998/Math/MathML"> G ∗ = arg min G ∑ i = 1 I ∑ t = 1 T ∑ k = 1 K ( x i t k G − x ˉ i t k ) 2 G^* = \arg \min_G \sum_{i=1}^{I} \sum_{t=1}^{T} \sum_{k=1}^{K} (x^G_{itk} - \bar{x}_{itk})^2 </math>G∗=argminG∑i=1I∑t=1T∑k=1K(xitkG−xˉitk)2
-
如果考虑的多个指标的尺度不同,可应用normalizaiton,如:
<math xmlns="http://www.w3.org/1998/Math/MathML"> G ∗ = arg min G ∑ i = 1 I ∑ t = 1 T ∑ k = 1 K ( x i t k G − x ˉ i t k x ˉ i t k ) 2 G^* = \arg \min_G \sum_{i=1}^{I} \sum_{t=1}^{T} \sum_{k=1}^{K} (\frac{x^G_{itk} - \bar{x}{itk}}{\bar{x}{itk}})^2 </math>G∗=argminG∑i=1I∑t=1T∑k=1K(xˉitkxitkG−xˉitk)2
-
如果指标中存在一些离群点,也可以使用更Robust的损失函数,如Huber loss
运筹优化执行举例:
|---------------|----------|-----------|-----------|-----------|----------|
| 城市分群 | 指标名称 | 日期 ||||
| 城市分群 | 指标名称 | 2022/7/1 | 2022/7/2 | 2022/7/3 | 2022/7/4 |
| 总体 | 执行单量 | 1,000,000 | 1,200,000 | 1,100,000 | 900,000 |
| 总体 | 配对单量 | 850,000 | 1,020,000 | 935,000 | 765,000 |
| 每组目标(均分为2组) | 执行单量 | 500,000 | 600,000 | 550,000 | 450,000 |
| 每组目标(均分为2组) | 配对单量 | 425,000 | 510,000 | 467,500 | 382,500 |
| 城市组1 | 执行单量 | 498,000 | 598,000 | 548,000 | 448,000 |
| 城市组1 | 配对单量 | 423,000 | 508,000 | 465,500 | 380,500 |
| 城市组2 | 执行单量 | 502,000 | 602,000 | 552,000 | 452,000 |
| 城市组2 | 配对单量 | 427,000 | 512,000 | 469,500 | 384,500 |
| 城市组1与目标DIFF | 执行单量 | -2,000 | -2,000 | -2,000 | -2,000 |
| 城市组1与目标DIFF | 配对单量 | -2,000 | -2,000 | -2,000 | -2,000 |
| 城市组2与目标DIFF | 执行单量 | 2,000 | 2,000 | 2,000 | 2,000 |
| 城市组2与目标DIFF | 配对单量 | 2,000 | 2,000 | 2,000 | 2,000 |
| 总体损失(MSE) | 64,000,000 |||||
保存该最优实验对象分流方案及同质性评估结果,供后续环节使用
STEP 4 实验设计评估
在测试日期上,输出满足同质性标准 的实验对象分流方案中,两两分组之间的核心指标相对差异,并判断差异是否显著(输出p值)
展示多个实验对象分流方案,供用户选择
3. 案例说明
1. 实验前差异有延续性
可以检验实验前差异和实验中差异存在相关性,若相关则说明实验前的差异可能延续到实验中
问题:将实验前的差异控制在0附近,是否能将实验中的差异更好地控制在0附近?
2. 发现最优分组增强实验可靠性
简单随机分流:user_id随机分流
控制实验前差异 :在user_id随机分流的基础上,只选择两组人均单量的相对差异在±0.25%以内的分流(这部分分流占总体分流大约16%)
两种抽样方式通过随机模拟各得到1000种分流,分别统计两种分流方式实验中a、b两组人均单量的相对差异
相对差异 = 实验组指标/对照组指标 - 1
由于两组受到的干预相同(AA实验),故希望差异在0附近越集中越好;越集中,说明两组越同质,分流同质性越好
控制实验前差异可以一定程度实验中差异在0附近的集中度,从而提高分流的同质性
左图:横轴表示实验前人均单量差异,纵轴表示实验中人均单量差异
右图:横轴表示实验中两组相对差异;纵轴表示相对差异出现的频次(大部分差异在0附近);蓝:简单随机抽样,黄:控制实验前差异
总结
实验前偏差会造成实验组和对照组之间存在差异,影响AB实验的实际效果。
本文在微软提出的SeedFinder基础上,结合运筹优化技术,提出了一种离线分流算法,在货拉拉的实际业务中取得了较好的实验效果。