互联网公司的 AB 测试是怎么回事
第 4 课 · 第三问 · 字节上百万次 AB 测试是怎么做的

同时跑五万个实验
怎么不打架

几万个实验能同时跑在同一群用户身上,靠的是分层和正交。同层互斥防打架,不同层正交省流量。平台把统计从人手里拿走了,但「哪些实验会打架」还是人的事。

接着上一课的问题,几万个实验在同一群用户身上同时跑,流量怎么够切,怎么不打架

同一个用户,同时在四个实验里,每层一个 推荐层UI 层广告层推送层 实验 1实验 2实验 3实验 4实验 5 实验 1实验 2实验 3实验 4实验 5 实验 1实验 2实验 3实验 4实验 5 实验 1实验 2实验 3实验 4实验 5 同一行里只进一格,同层互斥每一行各自独立随机,层间正交 示意
同一层里只进一个实验,不同层各自独立随机,所以几万个实验能同时跑在同一群人身上。蓝格是这个用户落进的格子,每层的落点跟别的层无关。

字节的数字

先把字节的数字摆出来,因为这个数字本身就是一个问题。

2021 年 4 月,字节跳动副总裁杨震原在火山引擎的一个活动上第一次对外讲他们的 AB 测试1。他说的数是,到 2021 年 3 月底,字节累计做了 70 多万次 AB 测试。2023 年初,火山引擎的口径变成累计超过 150 万次,同时在跑的超过 3 万个2。2023 年 6 月,《清华管理评论》引的数是,累计超过 240 万次,每天新增 4000 多个,同时在跑的超过 5 万个3

2021·03累计 70 万+杨震原首次对外披露
2023·01累计 150 万+同时在跑 3 万+
2023·06累计 240 万+日新增 4000+
同时在跑 5 万+

字节跳动累计 AB 实验数,全公司口径,据火山引擎 / 清华管理评论123

两年多,累计数从 70 万涨到 240 万。每天新开 4000 个,意思是你读这一课的这十几分钟里,字节大概又开了几十个实验。

顺手澄清一个常见的误传。网上流传一个「抖音一年 8 万次 AB 测试」的说法,这个数出自 2021 年一篇采访4,说的是抖音一个产品一年 6 到 8 万次,不是全公司。全公司的累计数和抖音单产品的年度数经常被混在一起讲。两个口径,别混

流量不够切,实验互相打架

好,数字摆完了,问题来了。

字节的用户是几亿,听起来很多。但 5 万个实验同时在跑,每个实验按第 1 课的讲法切一半一半,或者哪怕每个只切 10%,5 万个 10% 就是 5000 倍的流量。没有任何一个产品有 5000 倍的用户。

而且还有更麻烦的。同一个用户,今天打开抖音,他同时在几百个实验里。推荐算法的实验、首页按钮的实验、弹窗文案的实验、视频加载策略的实验。这些实验互相之间会不会干扰?我在比按钮颜色,结果我实验组里的人碰巧多分到了一个新推荐算法,那我测出来的差到底是按钮的还是算法的?

这两个问题,流量不够切,实验互相打架,是所有大规模实验平台要解决的核心问题。解法不是字节发明的,最早把它说清楚的是 Google 2010 年的一篇论文5,后来 Airbnb、LinkedIn、字节的 Libra 都是在这个框架上做的。

分层,正交

解法的核心就两个词,分层,正交。

你把所有实验按它改的东西分成几层。推荐算法一层,UI 一层,广告策略一层,推送一层。每一层,用户都被重新随机洗一遍牌,独立地分到这一层的某个实验里。

同一层之内,实验是互斥的。一个用户在 UI 层只能进一个实验,要么在按钮颜色实验里,要么在首页布局实验里,不能同时在两个。因为它们改的是同一块地方,放一起就打架了。

不同层之间,实验是正交的。用户在推荐层进了哪个实验,跟他在 UI 层进了哪个实验,完全没关系,各自独立随机。

动手试示意

同一群人,能同时开几个实验

每个实验都要 20% 的用户。左边是不分层,一条流量切五份就用光了。右边是分四层,每层都能用全部的人。按「随机一个用户」,看他在每层落进哪个格。

正交这两个字是关键,我多说两句。回到第 1 课,随机的意思是分组跟用户的任何特征都没关系。现在多了一层意思,分组也跟用户在别的层的分组没关系。这样一来,UI 层的按钮实验里,实验组和对照组各自都均匀地混着推荐层的各种实验。两边都混着,一减就抵消了。按钮实验测出来的差,还是只来自按钮。

这就同时解决了两个问题。流量,每一层都能用全量用户,5 万个实验分在几十上百层里,每层内部再切,够用了。打架,会打架的放同一层互斥,不打架的放不同层正交。

Libra 把这套做成了产品

字节内部这个平台叫 Libra,2016 年正式建起来的,到 2021 年对外变成火山引擎的 DataTester 卖给别的公司1。它做的事就是把上面这套变成一个产品。你要开实验,进去选一层,填流量,选指标,平台自动分流,自动算显著性,自动出报告。第 1 课那把「统计学家的尺子」,平台替你量了,你不需要懂 z 检验。

这里有个细节我觉得挺值得讲的。Libra 有两种实验6

编程实验工程师写代码,改的是算法、策略这种深的东西。
可视化实验在页面上直接拖拽,改按钮、改文案、改图,运营自己就能开,不用找工程师。

这第二种是「几万个」这个数字能成立的原因之一。如果每个实验都要工程师写代码,一天开不了 4000 个。

分层防不住的两件事

说到这,我得提一下这套东西的边界,不然这课听起来像 Libra 的广告。

分层解决了「不打架」,但它有个前提,你得知道哪些实验会打架。两个实验改的是同一个页面的两个按钮,看起来不冲突,放了不同层,结果两个按钮一起变,用户的行为跟单独变任何一个都不一样。这种交互效应分层是防不住的,只能靠人判断。实验越多,这种事越多。

还有,每一层的流量是有限的。热门层,比如抖音推荐层,大家都想在那测,排队。一个实验要 10% 流量跑两周,一层最多同时容纳 10 个,后面的等着。5 万个同时在跑,听着很多,排队的可能更多。

你来判断

两个实验,一个改抖音首页顶部 tab 的顺序,一个改推荐算法里某个权重。它们该放同一层互斥,还是不同层正交?

B。一个改 UI 一个改算法,理论上不打架,正交可以让两个都拿到全量用户。如果换成「改 tab 顺序」和「改 tab 文案」,那就得同一层互斥了,改的是同一块地方。

你来判断

某个实验的报告显示赢了,但有人指出,实验组里恰好有 60% 的用户同时在另一层的某个算法实验里,对照组只有 40%。这个结果还可信吗?

B。正交的前提是各层独立随机,两边应该都是 50% 左右。60 对 40 说明分流出了问题,这个差可能是算法带来的,不是这个实验的。先查分流。

这一课,几万个实验能同时跑,靠的是分层和正交,同层互斥防打架,不同层正交省流量。平台把统计从人手里拿走了,但「哪些实验会打架」和「这个数能不能信」这两件事,还是人的。

这课认识的四个词
分层按实验改的东西分几层,推荐一层、UI 一层、广告一层
每一层都能用全量用户
为什么要它5 万个实验每个切 10%,不分层流量差 5000 倍。
层怎么分是人定的,分错了该互斥的没互斥。
搭配互斥、正交
互斥同一层内,一个用户只进一个实验
改同一块地方的实验放同一层
为什么要它两个实验改同一个位置,放一起就打架。
同层流量有限,热门层排队。
搭配分层
正交不同层之间,用户的分组各自独立随机
UI 层两边都均匀混着推荐层的各种实验,一减抵消
为什么要它这是「随机」在多实验下的延伸,保证每个实验测到的差只来自它自己。
分流不均(60 对 40)正交就破了,先查分流。
搭配第 1 课的随机分流
Libra · DataTester字节内部实验平台,对外叫火山引擎 DataTester
编程实验(工程师写代码)+ 可视化实验(运营拖拽)
为什么提它平台自动分流、算显著性、出报告,是「一天 4000 个」能成立的前提。
平台替你算了,不替你判断哪些实验会打架、这个数能不能信。
搭配第 5 课的万物皆可 AB

这一课的数字从哪来

  1. 2021 年 3 月底累计 70 多万次、Libra 2016 年建立、2021 年对外为 DataTester:杨震原 2021-04-20 火山引擎技术开放日,第一财经36氪
  2. 2023 年初累计超 150 万次、同时运行 3 万+:字节数据平台(cnblogs,2023-03)
  3. 2023 年 6 月累计超 240 万次、日新增 4000+、同时运行 5 万+:《清华管理评论》2023 年 10 月刊,转载于火山引擎开发者社区
  4. 「抖音单产品每年 6–8 万次」:深响 2021-06 采访,转载于百度百科 TA 说,单一来源。
  5. 分层 / 互斥 / 正交的理论源头:Tang 等,KDD 2010,Overlapping Experiment Infrastructure(research.google)
  6. 可视化实验 vs 编程实验:人人都是产品经理字节数据平台(cnblogs)
  7. 「5000 倍流量」「一层最多容纳 10 个」「几十上百层」和动手块里的 20% / 四层是讲原理的算术示意,不是字节公布的配置。「交互效应分层防不住」「热门层排队」是从机制推出来的一般判断。

下一课回到人。平台能一天开 4000 个实验,那是谁在开?他们拿实验干什么?我们从一个你肯定听过的故事讲起,抖音这个名字,是 AB 测试出来的,但它当时是第二名。

抖音这个名字,是第二名。