今天我们要来总结技术书籍 Trustworthy Online Controlled Experiments: A Practical Guide to A/B Testing 。这本书的三位作者在业界享有盛誉,他们在在线可控实验、实验平台的搭建和运维以及如何构建数据驱动化的公司企业文化有着丰富的经验。全书是数据科学家、机器学习工程师、产品经理以及一切对在线可控实验有兴趣的研发人员的必读参考书,是技术书籍领域的经典。
本书有三位作者,都是来自互联网公司从事在线实验运行、管理和研究工作多年的专业人员。
第一作者 Ron Kohavi 在成书时担任Airbnb的副总裁和技术院士(Technical Fellow)。之前Ron长期担任Microsoft的集团副总裁和技术院士,负责在线实验平台的工作。在加入Microsoft之前,Ron担任Amazon数据挖掘和个性化方面的总监。Ron于斯坦福大学获得计算机博士学位,他有非常丰富的学术论文发表经历,有很多关于在线可控实验方面的经典之作以及帮助扩大这方面研究影响力的课程和演讲。
第二作者 Diane Tang 在成书时是Google的技术院士(Technical Fellow),专注于大规模数据分析以及基础设施、在线可控实验和广告系统的研发。她于斯坦福大学获得博士学位。下文要提到的“并发实验”的架构就是Diane(和其他合作者)于2010年的KDD上首次提出。
第三作者 Ya Xu 在成书时是负责LinkedIn的数据科学和实验平台系统的资深总监,之前在Microsoft任职。Ya于斯坦福大学获得统计博士学位,其发表过诸多关于在线可控实验的论文并且经常在诸多顶级学术与工业界的会议中发表演讲。
全书大体上可以分为以下五部分内容。
整本书可以说是包含了丰富的经验之谈和理论论述。
我们接下来就针对书中的一些重点内容为大家进行剖析。
在线A/B实验已经成为了今日互联网和软件工业中必不可少的数据驱动工具。很多公司把是否应用在线实验当做一个公司是否数据驱动的一个试金石。本书用了“爬”(Crawl)、“走”(Walk)、“跑”(Run)以及“飞”(Fly)四个阶段来对公司如何利用在线实验来达到数据驱动的成熟程度进行了分类(第4章)。
书中强调团队不管在哪个阶段,领导在多个层面的支持(Buy in)是团队能够成功的重要因素。同时,在建立真正的数据驱动团队的过程中,领导的意见(也就是所谓的Highest Paid Person’s Opinion)和完全依靠直觉的产品开发都是需要逐渐被大规模实验和数据驱动所替代的。因此,在这个过程中,领导需要建立起机制来帮助团队慢慢过渡到“飞”这个阶段。除了领导的支持,书中强调了机制和“机构记忆”的重要作用。也就是说,平台和分析本身只是有效的数据驱动团队的重要组成部分,但团队说到底还是人与人协作的平台。因此,书中(第四章)提到了很多有效的机制来帮助团队拥抱实验文化,例如在团队内部开发关于实验平台和实验分析的课程让更多的人能够接触到这样的知识和技能;再例如在实验平台发展的早期举行例行的会议来针对实验的假设、不同“指标”之间的取舍等进行讨论从而加强这部分企业文化的建设。
作者们也给出了作为企业如果希望利用在线实验来达到数据驱动的三个重要的条件(第1章)。
A/B在线实验的思想非常直观,但这并不代表实验平台的搭建和演化是一件容易的事情。实验平台有诸多方面需要很细致的关注,而一些微小的决策错误往往可能带来完全不可信的实验数据。可以说是细节决定成败。
书中谈到的一个可以说是非常有意思的有关实验平台的“陷阱”(第3章)那就是利用“页面跳转”(Page Redirect)来实现针对“控制组”和“对照组”之间的分流。如果“控制组”不经过“页面跳转”而“对照组”经过“页面跳转”,这样的设计往往会带来两部分流量之间产生细微的但可以被检测出来的差别。从这个例子可以看出实验平台实现细节的重要性。
早期的实验平台都只支持“单层”(Single Layer)架构,意思就是100%的流量被分配到几个“流量桶”(Bucket)中。这些“流量桶”互相独立互不干涉。这样每个“流量桶”对应一个“对照组”(Treatment)。我们可以针对一系列“对照组”同时进行实验。然而,我们很容易发现,在这样的设置下单位时间内可以测试的“对照组”数目是有限的。因而,我们可能需要面临“流量”不够的情况。书中(第4章)介绍了“并发实验”(Concurrent Experiments)的概念,也就是“多层”(Multiple Layer)架构,可以允许多个实验同时在某一块流量上运行。当然,这虽然带来了理论上可以有无限流量的好处,但也为实验的分析提出了更高的要求。一般来说,我们需要能够分析两两实验之间的“交互”(Interaction)效果。成熟的实验平台需要能够支持“并发”实验以及能够检测实验之间的“交互”效果。
实验平台另外一个需要注意的技术点,那就是如何选取“随机单元”(Randomization Unit)的问题(第15章)。什么是“随机单元”呢?简单来说,“随机单元”就是实验平台选取的达到随机化的最小“单元”。一个通常的网站,我们可以选择“页面级别”、“会话级别”以及“用户级别”的“随机单元”。例如,如果我们选择“页面级别”的“随机单元”,实验平台就可以针对某一个页面,用户每一次打开页面的时候来决定把用户导向某个“对照组”。这几种选择自然意味着不同的取舍,并没有一定的优劣之分。第一,我们需要考虑的是“随机单元”和“分析单元”(Analysis Unit)之间的关系。最简单的情况那就是“随机单元”和“分析单元”一直。比如,一个经常采用的策略就是“随机单元”和“分析单元”都采用“用户级别”。两种单元之间的不一致性往往使得实验分析更加复杂。
最后,书中提及了“实验发布“(Ramp)是一个往往容易忽视但又非常重要的步骤。从比较小的流量慢慢发布到相对比较大的流量知道最后全站发布,整个过程需要的是自动化和风险控制的结合。通常情况下,实验平台在“实验发布”之后还可以预留一些流量来衡量实验的长期效果。另外一个可以降低错误的步骤则是重复“发布”某个实验,看实验的结果是否能够保持。
架设好实验平台并且能够平稳运行实验之后,我们需要选择什么指标来进行检测,从而来帮助我们进行数据驱动决策。
选取实验指标的第一要素,就是选择“综合评测指标”OEC。书中在第1章、第2章和第7章都对OEC有详细的讲述。简单说来,我们希望能够用OEC,这一个唯一的衡量指标,来指导我们如何对实验结果进行取舍。在现实场景中,我们往往希望检测多种指标。这对于我们了解实验对于系统所带来的改变固然有好处,使得我们可以关注不同方面的变化,然而实验的最终的目的是进行决策,面对多个指标的决策往往是困难的。因此,作者们认为,与其对于每一个实验对要面对不同指标的决策,还不如直接把所有的权衡都包含在唯一的指标OEC里面,这样可以把决策的困难前移到定义阶段,而在后面的实验阶段可以根据OEC来进行快速的判断。第7章专门了讨论了如何构建OEC的一些细节经验。
书中第6章则对指标进行了一些更加深入的讨论。虽然针对一款产品或者一个团队来说,可能会有很多指标的选择,然而不同的指标有着不同的作用。第一类指标是“目标指标”(Goal Metrics)。这一类指标是产品和团队发展的最终发展方向。通常来说,“目标指标”是一个或者非常少数的指标。这一类指标的设立往往需要产品或者团队的领导层来进行决策。有了“目标指标”之后,在现实的操作中,这些指标往往难以在短期内被改变。这里的短期通常指的是在线实验的几周时间。也就是说,虽然我们希望能够直接优化“目标指标”,但经常并不具备可操作性。因此,我们需要更有可操作性的第二类指标“驱动指标”(Driver Metrics)。这一类的指标和“目标指标”应该是有相关性(Correlation)甚至是有因果相关(Causality)的,但同时又要比“目标指标”更容易检测变化以及进行操作。第三类指标是“护栏指标”(Guardrail Metrics)。这类指标的作用是确保产品或者团队的一些最基本的运行平稳。一般来说,“护栏指标”有一个范围来保护产品的运行底线,这样即便“目标指标”或者“驱动指标”有所增长也需要不大幅度影响“护栏指标”。
书中在第6章和第7章中有不少对于在线产品指标选择的意见和建议,还包括了针对“指标”的博弈的讨论。
有了实验平台和我们需要检测的指标之后,实验结果的分析就成为了一件重要而且有挑战的工作。产生一组数据往往比较容易,但能够从数据中分析得出对实验的“洞察”(Insight),则并不简单。
A/B在线实验数据分析的基础来自于统计的假设检验。基于 “双样本”(Two-Sample)的t检测(t-Test) 是来进行假设检验的重要工具。同时,我们也需要理解 p值(p-value) 以及置信区间的含义。这些概念在现实应用中常常被误解。在书中第17章有比较详细的简介。然而对于实验数据分析,仅仅知道t检测和p值是远远不够的。书中介绍了不少相对不经常被讨论到,但又很普遍的一些问题。
第一个重要主题就是 “多次测试”(Multiple Testing) 。简单来说,传统的假设检验的设置是对需要检测的“假设”(Hypothesis)进行唯一的测试,然后计算p值。在这样的情况下,我们有5%的概率观测到某一个并没有实际变化的“指标”显得有统计意义上的显著变化。然而在现实中,对于同一个实验,我们常常通过实验平台反复观测结果,或者反复针对同一个想法进行迭代。更加严重的是,我们针对同一个实验, 常常同时观测几十个有时候上百个“指标”。这些行为都会导致“多次测试”的问题,也就是大大增加观测到并不该显得有变化的“指标”有统计意义变化的概率。书中第17章讲了一些处理“多次测试”问题的实用判断方法。在现实运作中,“多次测试”问题会在长期运行平台和有实验数据分析后让很多结果有“水分”。
第二个问题就是针对“方差”的计算。t检测中我们需要对数据的方法进行计算。书中的第18章指出,有时候我们的“方差”计算是有问题的,例如前文提到的“随机单元”和“分析单元”不一致的情况下,尤其是我们需要计算一些比率如点击率。一个经常遇到的场景就是,我们的“随机单元”是“用户级别”,然而我们希望计算一些页面级别的点击率,看是否在“控制组”和“对照组”之间有差别。这时候,就存在“随机单元”和“分析单元”不一致的问题,传统的计算点击率的“方差”公式有可能是错误的。那么,第18章针对这样的问题进行了分析。
书中还提到的一个重要的数据分析手段是看“样本比率偏差”(Sample Ratio Mismatch)。在理想状态下,“控制组”和“对照组”的流量是五五开的,也就是50%的用户会到“控制组”另外50%的用户会到“对照组”。那么,如果在现实中,是50.43%的用户到了“控制组”另外49.57%的用户到了“对照组”,这样的情况还是正常的吗?我们还能信任这样的实验结果吗?书中第21章讲解了如何针对这样的情况进行排查和分析。简单来讲,我们需要把这样的分流结果当做是假设检验,看这样的结果是否异常。
类似的看似简单实际需要认真对待的还有针对A/A实验的结果。在第19章里专门讲了A/A实验的一些经验和数据处理。A/A实验往往作为检测平台稳定性和实验设置是否正确的重要手段。
除了这些非常实用的场景外,书中还在第22章介绍了更加高阶的话题,那就是如果“控制组”和“对照组”之间有“干涉”(Interference)怎么办。也就是说,传统的实验我们的一个重要的假设就是“控制组”和“对照组”的完全隔绝。然而在现实中的一些设置中,完全的隔绝是不可能的。例如,在社交网络中,因为朋友与朋友的关系,于是如果我们按照传统的随机划分流量的方法,则有可能一个用户在“控制组”,而其朋友在“对照组”,这样就使得这个用户可以接触到“对照组”的一些信息,从而违反了假设检验的一系列基本假设。在这一章,作者们给出了一些参考的解决方案。
除了针对衡量“指标”在实验内的数据分析之外,作者们还在第23章讨论了一个非常重要的话题,那就是如何衡量“指标”的长期效果。一个经常发现的现象就是,有一些“指标”的效果在A/B实验之后,可能会出现一些“恶化”,也就是说,效果可能没有之前那么明显了,甚至会出现效果完全消失。作者们在这一章详细分析了“指标”长期效果出现变化的一些可能性,以及如何去做一些针对性的分析来看“指标”是否有长期效果不佳的问题。这一部分算是高阶内容,建议感兴趣的读者阅读。
在有不少的情况下,我们无法对需要研究的问题进行实验。这一方面有可能是实验是现实中不可操作的,另一方面也可能是做实验会有伦理、道德等挑战,因此“观察研究”和“因果推论”(Causal Inference)就成为了在这种情况下我们依然希望进行数据驱动决策的唯一选择。本书的作者们在第11章简要介绍了“观察研究”的一些基本技术。不过,对于“观察研究”的可靠度,作者们持有谨慎的态度。原因是一般的基于“观察研究”的“因果推论”方法因为有很强的假设有不小的局限性。作者们甚至指出了一些研究的结果因为后期发现的一些问题而导致结论发生很大的变化而不可信。尽管如此,我们还是建议读者们对第11章的内容进行普遍的了解。
这本书可以说是作为数据科学家、机器学习工程师、产品经理以及一切对于在线可控实验有兴趣的研发人员“宝典”级别的参考书。全书包含了丰富的理论基础、实践指导以及案例分析,是一本难能可贵的集科普与进阶为一体的技术书籍。三位作者,特别是第一作者Ron在微软多年从事在线可控实验研发和领导工作的经历,使得这本书从某种意义上成为了他对这些年工作的一种总结之作。本书高阶部分的内容可以直接连接到当前研究和实践的热点内容,可以使程度较高的读者也能有比较享受的阅读体验。总体而言,本书可以作为可以反复阅读的业界经典之作。