在线实验是互联网公司软件基础设施设计和评估不可或缺的一部分。为了应对这些实验日益增长的规模和复杂性,公司为其设计和部署开发了软件框架。确保这些框架中的实验结果是值得信赖的内部效度可以是困难的。目前,验证内部有效性需要在实验设计方面有大量专业知识的人进行人工检查。
我们提出了第一种静态检查在线实验内部有效性的方法,即仅从代码中检查。我们发现了在实验设计和因果推理中出现的一些众所周知的问题,当这些问题被表达为计算机程序时,它们可能会以不同寻常的形式出现:随机化和处理分配的失败,以及因果充分性错误。我们的分析以PLANOUT为目标,这是一个流行的框架,它以特定于领域的语言(DSL)为特征来指定和运行复杂的实验。我们已经建立了PLANALYZER,这是一个检查PLANOUT程序内部有效性威胁的工具,然后自动生成重要数据,用于大量实验设计的统计分析。我们在Facebook生产部署的PLANOUT脚本的语料库上演示了PLANALYZER的实用功能,并评估了它识别该语料库突变子集上的威胁的能力。PLANALYZER对突变语料的精确度和召回率都达到92%,它生成的82%的对比匹配手工指定的数据。
许多组织进行在线实验以辅助决策。3.,13,21,22这些组织经常开发软件组件,使实验设计更容易,或自动监控实验结果。这些系统可以与执行以下任务的现有基础设施集成记录感兴趣的指标或专业根据用户、设备或其他实验对象的特征进行软件配置。一个流行的例子是Facebook的PLANOUT:一种特定领域的实验设计语言。2
用PLANOUT编写的脚本是一个分配治疗(例如,一个被测试的软件)单位(例如,用户或设备的行为-或结果——在评估)。处理方法可以是从软件定义的数据传输比特率到Web页面的布局。结果通常是公司感兴趣的指标,可能包括点击率、在页面上花费的时间,或观看视频与完成视频的比例。关键的是,必须记录治疗和结果,以便估计效果对结果的治疗。通过抽象单元如何分配治疗的细节,PLANOUT有可能降低那些没有实验设计背景的人尝试实验驱动开发的门槛。
不幸的是,目前的验证技术实验设计(例如,进行实验的过程,在这里被编码为PLANOUT程序)是人工评审。Web上最常见的实验设计是A/B测试,它需要相当简单的分析来估计处理效果。然而,更复杂的实验可能需要更复杂的分析,通常在设计和分析之间存在多对多的关系。许多用领域特定语言(DSL)编写的实验,例如PLANOUT,手动验证可能很麻烦,而且不能使用现有的自动化方法分析它们。这是因为用程序表示的实验可能会有错误,这是实验和软件的交集所特有的。
我们提出了第一个工具,PLANALYZER,用于静态识别编程定义的实验中统计偏差的来源。此外,PLANALYZER自动生成对比而且调节为大量的实验设计设置(即,可以使用平均处理效应(吃)或条件平均处理效果(美食);因为ATE是CATE的一个特例,当不需要区分两者时,我们将它们统称为(C)ATE)。我们作出以下贡献:
实验静态分析软件。PLANALYZER产生三个关键信息:(1)环境中实际被随机分配的变量列表;(2)记录用于分析的变量;(3)计算因果效应时可以合理比较的变量。为了确定实验记录的结果是否有任何有效的统计分析,以及在可能的情况下,这些分析是什么,这三条信息是必需的。
描述程序定义的实验中特有的错误和不良实践。离线实验中的传统错误可以在编程定义的实验中表现出不同寻常的形式。此外,在下游统计分析过程中,一些编码实践可能导致错误,这突出了为实验中的不良实践定义“代码气味”的潜在效用。8我们引入了实验和软件交叉产生的错误和代码气味。
真实实验的实证分析。我们报告PLANALYZER在来自Facebook的真实PLANOUT脚本的语料库上的表现。由于Facebook的审查过程,自然存在的错误很少。因此,我们执行突变分析来近似真实世界的误差分布。我们还会考虑每个脚本的作者生成的对比集(重新确定要进行比较的变量值集,这对于估计因果效果是必要的)。我们展示了PLANALYZER在发现有效性的主要威胁和自动生成对比方面的有效性。
由于DSL是由领域专家构建的,所以PLANOUT只实现与实验相关的功能。因此,PLANOUT不是图灵完备的:它缺少循环、递归和函数定义。它有两个控制流构造(如果/其他
而且返回
)和一个内置函数的小核心(例如,weightedChoice,伯努利试验
,长度
).
尽管不是实验语言所必需的,PLANOUT也允许外部函数调用和变量的运行时绑定。这允许与现有(但更受约束的)系统轻松集成,以进行实验、数据记录和配置。我们期望PLANOUT脚本在另一个执行环境中运行,比如Web浏览器,并且能够访问调用上下文,以便绑定自由变量和函数。
PLANOUT抽象了采样机制,提供了一个接口,从预先填充的单元标识符分区中随机选择,对应于感兴趣的总体中的样本。PLANOUT框架提供了一种提取PLANOUT脚本操作的应用程序参数的机制,并将它们与当前实验名称一起散列到一个或多个样本中。映射避免了同时运行的实验之间的冲突,这是在线实验的主要挑战之一。12,13对PLANOUT用于缩放并行实验的哈希方法的细节感兴趣的读者可以参考一篇早期的论文2;它与PLANALYZER的分析无关。
从表面上看,PLANOUT似乎与概率编程语言(pls)有共同的特征。11,16PPLs完整地描述了数据生成过程;相比之下,PLANOUT程序只指定了数据生成过程的一部分——如何随机分配治疗方案——这个代码用于控制作为实验重点的产品或服务的各个方面。
PLANOUT与相关的dsl(如pls)有两个重要的区别:(1)要求所有随机函数都有一个明确的随机化单元,(2)通过PLANOUT的真值对数据记录进行内置控制返回
.只有终止于的路径上的命名变量还真
被记录。这类似于ppl中条件概率实现中的丢弃执行。PLANOUT和pls之间的一个主要语义区别是,我们期望PLANOUT对输入具有确定性的执行。《规划纲要》的可变性源于投入的数量;ppl中的可变性来自于程序本身的执行。
随机试验的统计结论通常用来估计治疗的效果T在一个结果Y对于某些单位的总体。的因果效应估计函数T在Y可能有多种形式。几乎所有这些函数都可以被提炼为估计一种治疗的结果与其治疗的结果之间的真正差异潜在后果(s)在另一个治疗。
在随机实验中,如果T完全随机分配,例如,根据:
T = uniformChoice(choices=[400, 750], unit= userid);
然后是因果效应T(平均处理效应(ATE))可以通过简单地取所分配单位的平均结果的差来估计T= 400,T= 750:Avg(Y|T= 400)Avg(Y|T= 750)。这样的实验对于了解一些结果是如何产生的很有用Y(例如,视频观看时间)对于同等的个人来说,在400或750kbps设置下观看视频的时间是不同的。
对不同类型的用户使用不同的处理概率是很常见的;我们把用户的分区称为子群。我们仍然可以估计因果效应,但必须分别计算中变量的不同值的平均值之差年代。这通常被称为亚组分析。这个估计被称为条件平均处理效果(美食)。定义子组的变量称为调节设置并且可以被认为是可以被任何给定对比比较的单位的约束。在有限的治疗集上,像(C)ATE这样的平均效果估计量可以用它们的有效对比来表示:知道T = 400和T = 750的分配概率足以描述如何计算治疗效果。
通常,专家必须手动验证估计器与实验设计相符。有一些例外:一些自动监测非常简单的实验的系统,如A/B测试,其中处理的是两个值之一的单一变量,估计和ATE。
作为DSL, PLANOUT为更复杂的实验设计提供了一种机制。控制流操作符、对外部服务的调用和数据记录的语言内部机制禁止简单的自动变量监视。例如,一个根据用户的当前国家设置不同变量的实验不能naïvely聚合实验中所有参与者的结果。这样的实验需要在实验后分析期间进行额外的调整,因为用户当前的国家是“(即,导致治疗和结果的变量)。PLANALYZER自动生成适当的分析,包括对比和调节集。
Shadish et al。19列举九个易于理解的实验设计错误的分类,称为内部有效性的威胁也就是说,在研究的背景下,得出有效因果结论的程度。当研究人员采用一种方法时,这些错误中有七个可以避免随机试验这符合预期。剩下的两个威胁是不被随机排除的是摩擦而且测试。在在线实验的背景下,磨损可能没有一个有意义的定义,特别是在治疗暴露后不久测量结果时。实验设计中的测试是指先进行初步测量,然后用测试仪器进行实验。分析可能无法区分设计测试的效果和受试者学习测试本身的效果。测试是一种受试在线现场实验中通常不使用的分析,其分析超出了本工作的范围。因此,随机分配失败是我们认为的内部有效性的主要威胁。程序中的随机化失败的表现与物理世界中的随机化失败不同:例如,程序不能违背实验协议,但如果一个概率被错误地设置为零,数据流可能破坏随机化。
我们描述了在语法上有效的PLANOUT程序可能无法随机分配治疗的方式。请注意,由于目前没有明确映射到编程语言上下文的在线现场实验正确性的底层形式主义,我们不能为编程定义的实验定义一个健壮性定理。这里描述的一些威胁可能是更恰当的代码气味,而不是完全的错误。8
4.1.随机化失败
PLANOUT程序在三种情况下可能包含随机化失败:当它沿着非随机化的路径记录数据时,当随机化的单位具有低基数时,以及当它遇到路径诱导的决定论时。PLANALYZER自动检测这三种。
当通过程序至少存在一条记录的路径时,将沿非随机路径记录数据是随机的,至少有一条经过程序的记录路径不随机:
if (inExperiment (userid=userid)) {
T = bernoulliTrial (p=0.5, unit=userid);
其他}{
T = true;
}
返回true;
这类程序通常可以通过添加返回假
寻找合适的路径。
随机化单元,如userid或deviceid,必须具有明显高于实验处理的基数,以确保每个治疗都分配了足够数量的实验单元,以对总体进行有效的统计推断。如果单位是PLANALYZER不熟悉的外部变量,它将假设该变量具有低基数。PLANALYZER允许用户定义注释,使其分析更精确。因此,PlanOut用户可以通过将随机化的单位注释为具有高基数,或者重新评估他们对单位的选择,来纠正他们的程序。
当不适当的计算流入单元时,就会发生随机化的数据流故障。PLANOUT允许单位是任意计算的结果。例如,我们的评估语料库中的一个PLANOUT脚本将随机化的单位设置为用户标识
* 2。PLANOUT用户可能希望在重新运行实验时这样做,以确保至少有一些用户被分配到新的治疗。然而,如果使用不当,该特性可能导致确定性赋值。下面是一个在PLANALYZER中触发错误的语法有效的PLANOUT程序:
T1 = uniformChoice (choices= [400, 900], unit= userid);
T2 = bernoulliTrial (p=0.3,单位=T1);
在编写这段代码时,研究人员可能认为这对变量有四种可能的赋值。但是,由于将输入单元赋值为特定值是确定性哈希函数的结果,因此每个被赋值的用户T1 = 400
分配相同的值T2
因为哈希函数的输入bernoulliTrial
总是400。因此,他们永远不会在数据中同时记录(400,true)和(400,false),这很可能与程序员的意图相矛盾。
4.2.治疗任务失败
PLANALYZER要求沿着一条路径分配的所有处理都有可能被分配到至少一个单元,并且至少有一些处理可以被比较。PLANOUT程序可能包含治疗分配失败的三种情况:当某些治疗被分配的概率为零时,当沿着一条路径可以比较的治疗少于两个时,以及当死代码块包含治疗分配时。
检测后两种情况是静态程序分析中的标准任务。我们注意到,对于第一种情况,语法正确的PLANOUT代码允许作者将概率或权重设置为零,可以直接设置,也可以作为求值的结果。在程序分析中检测这种依赖于价值的行为也并不罕见,但我们希望避免它的原因可能并不明显:要在变量之间建立因果关系,必须在比较中至少有两种替代处理。
4.3.因果充分性错误
因果推理的一个主要假设是因果充分性,或假设在估计治疗效果时不存在未测混杂因素。除了运行时故障,我们对PLANOUT程序中的赋值机制有了一个完整的了解。不幸的是,PLANOUT程序可能允许一个未记录的变量对治疗分配产生偏见。
考虑一个根据用户国家分配治疗的程序getUserCountry
功能:
if (getUserCountry (userid=userid) == 'US') {
T = uniformChoice (choices= [7,9], unit=userid);
其他}{
T = uniformChoice(choices= [4,7,9], unit=userid);
}
处理任务T
这取决于用户国家,所以用户国家是一个潜在的混淆因素。因为这个变量没有出现在输入的程序文本中,所以它不能被PLANOUT框架的数据记录系统记录。因此,程序和结果分析将违反因果充分性假设。
如果PLANALYZER遇到静态错误或威胁,它将报告脚本未能通过验证,并向用户提供原因。有些修复很容易从错误中确定,并且可以自动应用。我们把这个留给以后的工作。其他错误需要对脚本所代表的实验有更复杂的理解,只能由脚本的作者来确定。
PLANALYZER是一个用OCaml编写的命令行工具,它执行两项主要任务:检查输入脚本是否代表随机实验,并为脚本生成所有有效的对比及其相关的条件集,以便使用(C)ATE进行分析。图1提供PLANALYZER系统的概述。
图1。PlanAlyzer系统将输入PlanOut程序(可能使用用户提供的变量标签)转换为规范化形式,然后将程序转换为中间表示(IR)。PlanAlyzer生成一个数据依赖图,以生成数据依赖图(DDG)和结果估计量。在分析的每一步,PlanAlyzer都可能产生误差。当产生估计量的信息不足,但输入程序对有效性没有已知的威胁时,PlanAlyzer提供尽可能多的局部输出。
5.1.规划中间表示(IR)
在解析过程中,PLANALYZER执行几个例行程序转换,包括将变量转换为类似于SSA的识别方案,执行常数传播,并以a正规形式重写函数和关系(如等式)。1,4,15,18由于存在外部函数调用,可能无法推断PLANOUT程序中定义的变量的最终值,因此PLANALYZER只能推断中间值,并通过部分求值的程序报告结果。10
在这些例行转换之后,PLANALYZER通过尾部复制将程序分割成直线代码,这样通过程序的每一条路径都可以在隔离其他路径的情况下进行计算。尽管这种转换在条件分支的数量上是指数级的,但在实践中PLANOUT程序的分支因子是相当小的。
PLANALYZER然后将保护转换为断言,并使用Z3 SMT求解器确保沿路径分配的变量与这些断言一致。5对于每个断言,PLANALYZER查询Z3两次,首先获得一个满意的解,然后测试这个解是否唯一。中间表示的求值可能包含未求值的代码,因此如果有多个解决方案,PLANALYZER将保持代码块抽象。
PLANALYZER使用SSA和a范式,因为它们有助于对比生成:PLANOUT程序的一次执行对应于一个单元的处理分配。然而,当试图对一个编程定义的实验进行因果建模时,附加的中间变量可能具有一些模糊的语义;尽管它们有助于,例如,检测因果充分性错误,但它们使使用因果图形模型等方法进行因果推理变得相当困难。
5.2.因果推断的变量标签
PLANOUT语言只包含了推理实验有效性的一些必要特征。由于只有PLANOUT编写的程序,PLANALYZER可能无法推理出内部有效性的一些常见威胁。随机算子和控制流之间的相互作用会导致变量失去随机性或变异性。此外,我们需要某种方法来保证外部运算符不会引入混淆。
为了表达这些缺失的信息,我们引入了一个由变量标签组成的4元组(兰德,卡,电视,科里), PLANALYZER试图对它遇到的每个PLANOUT程序进行推断和传播。17,6毫无疑问,对于具有许多外部函数或变量的程序,推断可能过于保守。为了增加PLANALYZER可以分析的实验范围,用户可以为PLANALYZER提供指定标签的全局和本地配置文件。
随机性(兰德).PLANOUT可以与现有的实验系统一起使用;这意味着可能已经存在用户所熟悉的随机性来源。此外,PLANOUT被设计为可扩展的,用户可以自由添加新的随机操作符。
基数(卡).变量域(基数)的大小影响实验的有效性。简单的伪随机分配需要高基数的随机化单元,以适当平衡分配到条件中的单元。
时间差异(电视).对于一个特定实验的持续时间,一个给定的变量可以是常数,也可以是时变的。显然,有些变量总是常数或者总是时变的。例如,从出生到死亡是恒定的,而days-since-last-login是时变的。然而,有许多变量不能被全局归类为常数或时变。的电视标签允许实验者指定他们期望的变量在给定的实验过程中是恒定的还是时变的。
因为(C)ATE假设受试者在实验期间只接受一个治疗值,PLANALYZER不能使用它们来估计治疗的因果效应或条件反射集变量具有电视标签。PLANOUT程序可以包含随机分配的其他有效对比,独立于时变对比;PLANALYZER仍将识别这些治疗方法及其条件作用集,以通过(C)ATE进行分析。
协变量和干扰因素(科里).许多实验使用单元的特性来分配处理,这可能会引入混淆。PLANALYZER自动标记外部变量和非随机外部调用的直接结果与结果相关(即,Y).这表明,如果变量用于处理分配,要么必须记录其值,要么必须记录足够的下游数据以恢复其值。
5.3.数据依赖图(DDG)
PLANALYZER构建一个DDG来传播变量标签信息。7因为PLANOUT只有一个全局作用域,它的数据依赖分析是直接的:
随机的、独立的分配意味着潜在原因之间的独立性,只要(可能是空的)条件集已经被识别和记录。PLANALYZER为完整的脚本计算DDG,并使用完整的DDG来确定何时可以对某些变量进行边缘化。
传播变量标签。PLANALYZER将直接由内置随机函数或外部随机函数赋值的变量标记为随机变量。随机标签接受一个标识符元组作为它的参数。此元组表示随机化的单位,用于推理因果估计量。任何具有随机祖先的节点都被标记为随机的(不变化的变量除外),随机化的单位对应于祖先单位的并集。
如果一个随机运算符使用一个低基数的随机化单元,它将被标记为非随机。但是请注意,如果一个随机函数的随机化单位是一个至少有一个高基数变量的元组,那么结果变量将保持随机。
PLANALYZER以与随机标签相同的方式传播时变标签。与随机性不同的是,时变标签与其他标签之间没有相互作用。
将ddg转换为因果图形模型。熟悉图形模型的读者可能想知道DDG是否可以转换为有向图形模型。编程定义的实验有两个特征,根据上下文,使这种转换要么完全不合适,要么很难提取:(1)确定性依赖和(2)条件分支。这两个特性可能导致所谓的“上下文敏感的独立性”,这限制了现有算法的有效性,否则将使图形模型成为吸引人的目标语义。虽然一些工作已经试图补救分支,但更广泛地处理图形模型中上下文敏感的独立性是一个开放的研究问题。14此外,从实践的角度来看,DDG中的版本化变量应该如何统一是不清楚的,而且有些变量根本不属于CGM(例如,用户标识
).
我们分析了来自Facebook的PlanOut脚本的语料库来评估PlanAlyzer。我们还使用了在分析部署的实验脚本时使用的手动指定对比的语料库。脚本不包含任何用户数据,但可能包含已识别的id(例如测试脚本的员工的id)。每个实验都可能有一个快照系统捕获的临时(但语法有效)表示,导致单个实验的多个版本。虽然我们无法对更复杂的实验(如数据库查询)进行自定义分析,R代码等),我们可以通过将语料库划分为三个子语料库来推断预期分析的一些特征。虽然我们分析了这三种,但我们只关注其中一种:
PlanOut-A。该语料库包含使用某种形式的ATE进行分析的脚本,其中变量T1,……Tn在实验期间手动指定并自动记录。用户可以手动指定记录变量的一个子集连续监视成对ATE。无论是记录还是数据分析工具都不了解PLANOUT。这是我们用来评估PLANALYZER的主要语料库,因为PLANALYZER的目标是自动化分析,而Facebook等公司现在必须手动进行这些分析。
请注意,Facebook PlanOut的用户通常要么是被测试假设领域的专家,要么是与领域专家直接合作的分析师。
6.1.描述有代表性的计划计划
我们设计PLANALYZER的分析是基于语法有效的PLANOUT程序的宇宙和我们的实验领域知识。我们构建PLANALYZER的出发点是:(1)PLANOUT是实验者设计和部署实验的主要手段,但(2)他们可以使用其他系统,如果它们存在的话。Facebook使用了许多实验系统,并为PLANALYZER提供的功能提供了各种人工和代码审查方法。因此,我们想知道:人们实际编写和部署的PLANOUT程序的一些特征是什么?
我们发现,Facebook的工程师和数据科学家以各种令人惊讶的方式使用PLANOUT,他们的编码习惯可能表明了作者编程经验的异质性。通过与Facebook工程师的交谈,我们了解到PLANOUT的大多数作者可以沿着图中所示的两个轴来描述表1.
表2列举PLANALYZER在三个语料库中提出的错误。由于PLANOUT有预先存在的机制和特殊用法,每个警告并不一定表示部署或分析期间的错误。
表2。在PlanOut-A语料库上运行PlanAlyzer时发现的代码气味、静态脚本错误和工具故障的计数。PlanAlyzer错误并不一定表明实验运行错误。
PLANOUT-A包含我们最高质量的数据:所有脚本在部署前都由专家审查,其中一些组件使用ATE进行分析。图2提供了一个稍微匿名化的示例程序,PLANALYZER认为它有一个潜在的错误。它的风格和结构很好地代表了现实世界的PLANOUT计划。
图2。一个有代表性的,经过轻微编辑和匿名的实验写在PlanOut上。这个脚本混合了测试代码和实验代码。第5-12行为用户id为AUTHOR_ID的脚本的作者设置值,并记录这些值。实际的实验在第14-26行。它只对由外部谓词定义的填充和被记录的用户(当用户id为0时表示)执行。PlanAlyzer为这个脚本引发一个错误。
我们在PLANOUT-A中发现了以下编码实践:
语义不明确和类型错误。因为PLANALYZER一开始必须执行类型推断,它在PLANOUT- a中发现了87个有类型错误的脚本,这表明向PLANOUT的用户提供类型检查功能可能有一些用处。
我们还从一个实验中找到了三个脚本,它们将模运算符应用于分数;因为PLANOUT使用其封闭环境的语义进行数值计算,所以如果使用具有不同语义的模数语言(例如PHP和JavaScript)运行该脚本,则会返回不同的值。
在实验逻辑中修改部署设置。有些脚本被标记为非实验开始返回假
并且在return语句下面有一个无法到达的完全指定的实验。PLANALYZER会标记PLANOUT程序中的死代码,因为它可能是随机分配的变量导致的下游控制流行为的结果。然而,我们发现的每个死代码示例都有这种形式条件= false;如果(条件)
这些特性只发生在有多个脚本的实验中,而这些脚本没有引起这些错误。在与Facebook的工程师讨论了我们的发现后,我们认为这可能是PLANOUT的作者修改了实验,尽管它是为了控制部署而运行的,而不是像PLANALYZER的观点那样意外地留下死代码。
使用PlanOut进行应用程序配置。我们在PLANOUT- a中发现的最令人惊讶的特征之一是,应用程序配置中普遍使用PLANOUT, à la Akamai的ACMS系统或Facebook的Gatekeeper。20.,21当这些脚本设置了变量,但正确地关闭了数据记录(即,返回false), PLANALYZER将它们标记为非实验。当它们没有关闭日志记录时,它们被标记为没有随机化的记录路径。一些应用程序配置实例涉及将随机分配的变量的支持设置为常数或将权重设置为零。由于实验需要变化来进行比较,如果用户试图从少于两个选项的集合中随机选择,PLANALYZER就会抛出错误。三个脚本包含该表单的表达式uniformChoice (choices = [v], unit=userid)
对于某个常值v.
因此,那些打算使用PLANOUT作为配置系统的工程师不需要PLANALYZER,但是任何编写实验的人都会认为这些脚本有bug。
混合对其他系统的外部调用。几乎20%的脚本(106个)包括对外部实验系统的调用。在少数情况下,PLANOUT专门用于管理这些其他系统,而不调用其内置的随机操作符。
Nonread-only单位。与我们交谈过的另一家使用PLANOUT的公司将随机化单元视为只读的,这与PLANOUT程序中的其他变量不同。Facebook没有这样做。因此,修改随机化单位的程序可能是有效的;例如,前面提到的单元设置为的实例用户标识
* 2。我们还观察到一种情况,其中单元被设置为一个外部调用的结果——在不知道这个外部调用的行为的情况下,它被假定为低基数。在这种情况下,实验进行的是聚类随机分配,这不在ATE的范围内,也不在PLANALYZER的范围内。
6.2.PlanAlyzer性能
所有的分析都在一台搭载1.6 GHz英特尔酷睿i5处理器的MacBook Air上运行,该处理器有四个逻辑核。任何分析的最长运行时间约为3分钟;运行时随着通过程序的“路径”的数量线性扩展,其中路径是根据输入PLANOUT程序的转换内部表示定义的,并与条件集的数量相关。PLANALYZER使用Z3 SMT求解器5为了确保满足条件并进行处理,23,9因此,程序中的变量数量和内部表示中的路径数量都可能在运行时引起爆炸。我们发现运行时随内部路径的数量线性增加,但也可能随变量的数量呈指数增长,如中所描述的图3.
图3。PlanOut语料库的挂钟计时数据。列(a)中的图以对数尺度描述了所有脚本的经验CDF。列(b)和(c)中的图显示了运行时间和PlanOut脚本的特征之间的关系,我们可能期望在两个轴上以对数尺度影响运行时间。列(b)中的图显示了PlanOut脚本输入中的变量数量,以及PlanOut程序转换后的中间表示中的变量数量。列(c)中的图描述了通过PlanOut程序的路径数量和它们的运行时间之间的关系。(b)和(c)中所描述的时间是满足的脚本的平均值x-axis值,点的大小与用于计算该平均值的脚本数量成正比。我们选择这种表示,而不是报告错误条,因为数据不是iid。
PLANALYZER产生有意义的对比,可与人类指定的金标准相比较,自动生成82%的符合条件的金标准对比。PLANALYZER运行时间相当短;可能是因为PLANOUT的程序规模一般较小。
总结。由于PLANOUT-A作者的专家性质,我们并不期望看到任何真正的因果充分性错误。相反,由于PLANALYZER在标记潜在的因果充分性错误方面非常积极,我们预计会看到一些假阳性。我们做出这样的设计选择是因为未记录混杂因素的成本可能非常高。
在Facebook上部署的PLANOUT脚本代表了一系列实验性设计。我们观察了析因设计、条件分配、受试者内部实验、聚类随机分配和强盗实验。
意料之中的是,现实世界的PLANOUT脚本几乎没有错误,因为它们主要是由实验设计方面的专家编写和监督的。因此,为了测试PLANALYZER发现错误的能力,我们从PLANOUT-A中选择了50个脚本的子集,并对它们进行了突变。然后,我们验证了PLANALYZER生成的对比子集与Facebook使用的自动工具监测和比较的手工选择对比语料库。最后,我们报告了PLANALYZER的性能,因为它的有效性需要在合理的时间内准确识别有意义的对比。
7.1.突变的方法
我们首先确定适合此分析的脚本。我们修改了PLANOUT-A脚本,它在适当的时候会引发错误。例如,我们更新了许多错误地引发因果充分性错误的脚本,以便它们不再引发这些错误。例如,我们排除了包含测试代码或配置代码的脚本。这允许我们合理地确定大多数输入脚本是正确的。
我们所有的突变都是在输入PLANOUT程序上操作的,而不是在中间表示上。我们相信这种方法可以更好地对PLANALYZER施加压力。每个脚本执行一个突变。
在决定如何执行突变时,我们考虑了两种方法:
方法1将测试语料库中的突变类平均分割;方法2导致与合格AST节点的频率成比例的频率。我们选择后者,因为我们相信它可以更准确地表示实际的编程错误。
为了选择要评估的脚本子集,我们抽样了50个实验,然后从该实验中随机选择了一个脚本版本。然后我们手动检查突变脚本,并将突变的输出与原始输出进行比较。
发现:突变脚本的故障识别。在分析我们的50个突变脚本样本时,PlanAlyzer只产生了一个假阳性和一个假阴性。准确率和召回率均为92%。一方面,考虑到PLANOUT-A语料库中因果充分性错误(CSE)的假阳性率为8%,以及该样本中CSE突变的比例(28%),这是非常令人惊讶的。然而,我们发现大多数CSE突变导致程序在随机分配之前退出,导致PLANALYZER在没有随机化的记录路径上产生合法错误。其余的是真正的因果充分性错误(即,它们会导致治疗的偏差)。我们观察到的一个假阴性发生在一个脚本中,该脚本为两个用户id重新定义了处理变量,这似乎是测试代码。突变包裹了重新定义的处理,所以在这种情况下,PLANALYZER应该在输入脚本和突变脚本中都引发“无随机化错误”。
7.2.对照人工产生的对比进行验证
我们根据以下三个标准来决定一个实验是否应该在子集中:(1)所有人工生成对比中的变量都出现在原始脚本中;(2) PLANALYZER能够为实验产生至少一种对比;(3) PLANALYZER在所有版本的实验中产生了相同的对比。准则(1)和(2)确保分析不需要PLANALYZER无法获得的知识。标准(3)是必要的,因为监控对比的工具记录的是每个实验,而不是每个版本。如果可能的对比在版本之间发生变化,我们无法确定哪个版本对应的数据。95个独特的实验符合这些标准。
发现:相比一代。PLANALYZER在95个实验中发现了78个相同的对比。在14次实验中,它要么产生部分对比,要么没有对比。在每一种情况下,所需的对比都需要对程序中的一些变量(边缘化)求和,或者比工具当前支持的更复杂的静态分析。由于生成边缘对比的每个可能子集的计算成本很高,我们认为前者是该工具的一个可以接受的缺点。最后,三个实验在人为对比方面存在问题(没有对比,或者数据模糊或无法解析)。
审计实验和生成相关统计分析的技术状态几乎完全是手工过程。这是第一个静态分析现场实验的工作。我们提出了一种新的错误和威胁类别,这是实验的程序化规范所特有的。我们已经实现了一个工具,对于最常见的一类实验,自动识别威胁并生成统计分析。我们将PLANALYZER的输出与真实PLANOUT脚本的人工生成分析进行了比较,发现PLANALYZER产生了类似的结果。
这项研究部分是在艾玛·托什还是Facebook员工时进行的。尽管在马萨诸塞大学阿默斯特分校,艾玛·托什根据第1号合同得到了美国空军的部分支持。fa8750 - 17 - c - 0120。本材料中表达的任何意见、发现和结论或建议均为作者个人观点,并不一定反映Facebook或美国空军的观点。
1.阿霍,a.v.,塞西,R,厄尔曼,J.D.编译器、原则、技术。Addison Wesley,马萨诸塞州波士顿,1986年。
2.Bakshy, E, Eckles, D, Bernstein, M.S.设计和部署在线现场实验。在二十三次会议的会议记录理查德·道金斯万维网国际会议, WWW '14 (New York, NY, USA, 2014), ACM,纽约,283-292。
3.Crook, T., Frasca, B., Kohavi, R., Longbotham, R.在网络上运行受控实验时要避免的七个陷阱。在15国会议记录thACM SIGKDD知识发现和数据挖掘国际会议(纽约,NY, USA, 2009), ACM,纽约,1105-1114。
4.赛卓,费朗特,罗森,B.K,韦格曼,M.N,扎德克,f.k。高效计算静态单赋值形式和控制依赖图。ACM反式。编程语言与系统(TOPLAS, 4(1991), 451-490。
5.De Moura, L., Bjørner, N. Z3:一个高效的SMT求解器。在用于系统构建和分析的工具和算法国际会议(柏林,德国,2008),施普林格,柏林,德国,337-340。
6.安全信息流的格子模型。Commun。ACM 19, 5(1976), 236-243。
7.费兰特,奥滕斯坦,k.j.,沃伦,J.D.程序依赖图及其在优化中的应用。ACM反式。编程语言与系统(TOPLAS, 3(1987), 319-349。
8.福勒,M。重构:改进现有代码的设计。Addison-Wesley Professional,美国马萨诸塞州波士顿,2018年。
9.可满足性模计数:一种分析隐私属性的新方法。在23个国家联席会议的会议记录理查德·道金斯计算机科学逻辑年会(CSL)和29thACM/IEEE计算机科学逻辑学年度研讨会(纽约,NY, USA, 2014), ACM,纽约,42。
10.计算过程的部分求值-编译器-编译器的一种方法。高阶符号计算, 4(1999), 381-391。
11.Gordon, ad, Henzinger, T.A, Nori, a.v., Rajamani, S.K.概率编程。在软件工程的未来(New York, NY, USA, 2014), ACM,纽约,167-181。
12.Kohavi, R., Deng, A., Frasca, B., Walker, T., Xu, Y., Pohlmann, N.大规模在线对照实验。在十九届会议记录thACM SIGKDD知识发现和数据挖掘国际会议(纽约,NY, USA, 2013), ACM, 1168-1176。
13.Kohavi, R. Longbotham, R. Sommerfield, D. Henne, R.M.网络上的受控实验:调查和实用指南。数据挖掘与知识发现, 1(2009), 140-181。
14.明卡,T.,温,J.盖茨。在神经信息处理系统的研究进展(网络,2009),中国农业学报,1073-1080。
15.,穆奇尼克从投资人那里募集到轮高级编译器设计实现。摩根·考夫曼,伯灵顿,麻州,美国,1997年。
16.菲,一个。实际概率编程。曼宁出版公司,美国纽约庇护所岛,2016年。
17.基于语言的信息流安全。选定区域通信1(2003年1月),5-19。
18.Sabry, A., Felleisen, M.用延续传递风格推理程序。Lisp符号计算, 3-4(1993), 289-360。
19.沙迪什,w.r.,库克,t.d.,坎贝尔,D.T.广义因果推理的实验和准实验设计。霍顿米夫林公司,马萨诸塞州波士顿,美国,2002年。
20.A. Sherman, Lisiecki, p.a., Berkheimer, A., Wein, J. Acms: akamai配置管理系统。在2号会议记录nd网络系统设计与实现研讨会第二卷(伯克利,CA, USA, 2005), USENIX协会,USA, 245-258。
21.Tang, C., Kooburat, T., Venkatachalam, P., Chander, A., Wen, Z., Narayanan, A., Dowell, P., Karl, R. facebook的整体配置管理。在二十五次会议的会议记录th操作系统原理研讨会(New York, NY, USA, 2015), ACM,纽约,328-343。
22.Tang, D, Agarwal, A, O'Brien, D, Meyer, M.重叠的实验基础设施:更多,更好,更快的实验。在16届会议记录thACM SIGKDD知识发现和数据挖掘国际会议(New York, NY, USA, 2010), ACM,纽约,17-26。
©2021 0001 - 0782/21/9 ACM
允许为个人或课堂使用部分或全部作品制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。除ACM外,本作品的其他组件的版权必须受到尊重。允许有信用的文摘。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,都需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org传真(212)869-0481。
数字图书馆是由计算机协会出版的。版权所有©2021 ACM, Inc.
没有发现记录