谷歌A/B实验——重叠实验基础设施解读
- 〇、来源
- 一、背景介绍
- 二、如何划分参数
- 三、谷歌设计的ab实验系统
- 3.1 域和层的设计
- 3.1.1 基础重叠域和层设计
- 3.1.2 具备非重叠和重叠的域和层设计
- 3.1.2 具备非重叠的域的嵌套设计优点
- 3.1.3 具备非重叠的域的嵌套设计缺点
- 3.1.4 启动层(launch layers)设计
- 四、引用
〇、来源
谷歌ab实验论文Overlapping Experiment Infrastructure: More, Better, Faster Experimentation第四章——OVERLAPPING EXPERIMENT INFRAS- TRUCTURE
一、背景介绍
统计解决方案是一个多因素系统,其中每个因素对应于系统中的一个可变参数。
实际上,一个请求将在 N 个同时进行的实验中进行,其中每个实验将修改不同的参数,N 等于参数的数量。多因素实验得到了大量理论和实践的支持 [^1]。
然而,多因素系统在我们的复杂环境中根本不可行,因为并非所有参数都是独立的,并且并非我们可能想要测试的所有参数值都与另一个参数的值一起使用(例如,粉色background
上的粉色text
)。
鉴于此约束,谷歌的主要思想是将参数划分为 N 个子集。每个子集都与一个实验层相关联。每个请求最多同时进行 N 个实验(每层一个实验)。
每个实验只能修改与其层相关联的参数(即在该子集中),并且同一参数不能与多个层相关联。
二、如何划分参数
首先,我们可以将模块化利用到多个二进制文件中:来自不同二进制文件的参数可以位于不同的子集中,这解决了饥饿和偏差问题。
然而,给定二进制文件的所有参数不需要在单个子集中。我们可以通过:
a.检查了解哪些参数不能相互独立地改变;
b.检查过去的实验,即凭经验查看在以前的实验中哪些参数被一起修改。
查看图 1,我们可以为 Web 服务器、搜索结果服务器和广告结果服务器分别设置一个或多个layer
。
三、谷歌设计的ab实验系统
谷歌设计的系统比简单地将参数划分为子集然后与层相关联更灵活。
为了解释灵活性,谷歌引入了几个定义。 在传入流量和系统参数的空间内工作,我们有三个关键概念:
domain
:域,是流量的分段。
layer
:层,一个层对应于系统参数的一个子集。
experiment
:实验,实验是流量分段,其中可以为零个或多个系统参数指定替代值,以改变传入请求的处理方式。
3.1 域和层的设计
我们可以嵌套域和层。
a.域可以包含层。
b.层可以包含实验,也可以包含域。
c.在层内嵌套域允许与该层相关联的参数子集在该嵌套域内进一步分区。
在包含所有流量和所有参数的默认的域和层。 我们可以:
3.1.1 基础重叠域和层设计
针对图 2a设计,只需将参数分为三层。 在这种情况下,每个请求最多同时进行三个实验,每一层一个。 每个实验只能修改该层对应的参数。
3.1.2 具备非重叠和重叠的域和层设计
针对图 2b设计,首先将流量分成两个域。 一个域可以是具有单层的域(非重叠域),另一个域将是具有三层的重叠域。
在这种情况下,每个请求将首先分配给非重叠域或重叠域:
a.如果请求在非重叠域中,则该请求最多在一个实验中(并且可以更改整个参数空间中的任何参数)。
b.如果请求在重叠域中,则请求最多在三个实验中,每层一个,每个实验只能使用该层对应的参数。
3.1.2 具备非重叠的域的嵌套设计优点
a.拥有一个不重叠的域,允许我们运行真正需要更改大量通常不会一起使用的参数的实验。
b.它允许我们对参数划分不同的分区;
可以想象三个域:
- 不重叠的域。
- 具有一个参数分区的重叠域。
- 具有不同参数分区的重叠域。
c.嵌套允许我们更有效地利用空间,这取决于哪些分区最常用,哪些跨层参数实验最常用。
请注意,将当前未使用的参数从一层移动到另一层很容易:只要确保参数可以安全地与原始层分配中的参数重叠即可。
如果层具有语义上有意义的名称,例如“广告结果层”和“搜索结果层”,工程师往往不愿意移动违反该语义的标志。 当实验配置不正确时,有意义的名称可以通过使其更加明显来帮助提高稳健性,但它也会限制工程师将利用的灵活性。
还要注意,对于基于 cookie-mod 的实验,使用mod = f(cookie) % 1000,为了确保不同层的实验独立转移,谷歌使用 mod = f(cookie, layer) % 1000 代替。
3.1.3 具备非重叠的域的嵌套设计缺点
虽然这种嵌套复杂性确实增加了灵活性,但更改配置(尤其是域的配置)是有成本的:更改流量分配到域的方式会改变可用于实验的流量。
例如,如果我们将非重叠域从 10% 的 cookie mods 更改为 15%。则额外 5% 的 cookie mods 来自重叠域。
3.1.4 启动层(launch layers)设计
另一个概念是启动层。 启动层在几个关键方面与迄今为止讨论的实验层不同。
启动层始终包含在默认域中(即,它们在所有流量上运行)。
a.启动层是参数的单独分区,即一个参数最多可以同时位于一个启动层和最多一个“正常”层(在一个域内)。
b.为了使启动层和正常层之间的参数重叠起作用,启动层内的实验在语义上略有不同:启动层中的实验为参数提供了替代默认值。
换句话说,如果正常实验层中没有实验覆盖参数,那么在启动层实验中,将使用指定的替代默认值,并且启动层实验的行为就像正常实验一样。
c.但是,如果普通实验层中的实验确实覆盖了此参数,则该实验将覆盖参数的默认值,无论该值是指定为系统默认值还是在启动层实验中。
启动层的示例如图 2c、d 所示。 以这种方式定义启动层使我们能够在不干扰现有实验的情况下逐步向所有用户推出更改,并以标准化方式跟踪这些推出。
启动层的一般用法是为每个启动的功能创建一个新的启动层,并在功能完全推出时删除该层(并且新的参数值被纳入默认值)。
最后,由于启动层中的实验通常更大,因此它们可用于测试特征之间的交互。
虽然理论上我们可以测试正常实验层中的交互作用(假设我们要么在参数在同一层时手动设置实验,要么在参数在不同层时查看交集),因为实验在正常层中,交叉点更小,因此交互更难检测。
四、引用
[^1] D. Cox and N. Reid. The theory of the design of experiments, 2000.