更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群

本文将针对日常开设 A/B 实验过程中一个不太合理的使用方法——AABB 实验进行详细的解释,告诉大家为什么不建议开 AABB 实验。

在开始之前,先来回顾一下“什么是 A/B 实验”,A/B 实验是针对想调研的问题,提供两种不同的备选解决方案,然后让一部分用户使用方案 A,另一部分用户使用方案 B,最终通过实验数据对比来确定最优方案。

一:什么是 AABB 实验

众所周知,AB 实验就是我们在总流量中分流出两组用户,一组使用原策略 A,一组使用新策略 B,比较两个策略的效果。

那么 AABB 实验是什么呢?

简单来说,在做实验的时候,会从总流量中分流出 2 个原策略组(A1、A2)和 2 个新策略组(B1、B2)。两个原策略组的实验配置一模一样,两个新策略组的配置也是一模一样的。实验者会综合比较 A1、A2、B1、B2 各组之间的指标差异(但其实多数实验者分析的方法并没有理论依据,文章后面会作出解释),这样的实验被称为 AABB 实验。

当然,也有实验者会分流出更多策略组(AAABBB、AAAABBBB 等),或者引入多个不同的新策略(AABBCCDD 实验等)。这些实验与 AABB 实验存在的问题趋同,本文中姑且先以 AABB 实验为主要分析对象。

二:为啥总有人想开 AABB 实验

在进行了部分用户调研后,火山引擎 DataTester 团队发现,开设 AABB 实验的实验者通常想解决以下问题:

  • 验证用户分流是否“均匀”

部分实验者担心火山引擎 DataTester 平台的用户分流不科学,因此开设 AABB 实验,通过比较 A1 与 A2、B1 与 B2 之间的实验指标差异,来检验用户分流是否合理。

理想状态下,如果用户分流是随机的,那么相同的策略组(A1 和 A2 之间),在实验中检测出的指标差异应该很小 。这是用户对于实验结果指标的预期。这时候,假如实验结果中,A1、A2 的指标出现很大的差异,甚至于呈现“显著”,实验者就会认为,是火山引擎 DataTester 后台的分流机制有问题。然而,这个判断是不科学的。为什么呢?请阅读下文中的错误 No.1。

  • 比较“AA 组内差异”和“AB 组间差异”

有的实验者认为:开设 AABB 实验,假如 AA 之间的实验结果差异很小,AB 之间的实验结果差异较大,那么在这种情况下,我的 B 策略应该就是有用的。这种想法本身没有问题,但是火山引擎 DataTester 的大部分指标提供了置信度功能,此时这种做法就显得有些画蛇添足了。详细的原因参考下文中错误 No.2 和错误 No.4。

三:AABB 实验到底错在哪儿

  • No.1 AA 组内指标差异显著/置信并不代表分流不科学

A1、A2 组之间的实验指标差异大,甚至出现显著,就能说明分流不科学吗?其实并不能。实际上,在对比 AA 组间指标差异时,以下的几种情况都是完全可能发生的:

1.AA 组内的指标必然存在差异:虽然 A1、A2 两组所采用的策略完全一样,但进入 A1、A2 组的用户是完全随机的,这是随机抽取的两份样本,必然存在抽样误差,因此指标值不可能完全一样。

2.AA 组内的指标差异可能还不小:如果样本中的用户量太少,或样本用户中存在极端个例(比如抽 20 个人算中国人的平均收入,抽样的时候抽到了农夫山泉董事长钟睒睒和月薪 5000 元的某人),那么在观察常见的均值等类型指标时,AA 组内指标差异很可能还“不小”。

3.AA 差异可能“显著”:在检验假设的过程中,我们容易犯的一类错误是:策略原本无用,但实验结果显示该策略有用。A1、A2 组指标差异显著,正是对应了这类错误——其实两个策略是一样的,但是实验结果显示 A2 有用。在 A/B 实验中,这类错误出现的概率是 5%。也就是说,假如你开 100 次 AA 实验,出现 5 次显著是合理的。如果 AA 实验指标差异呈现统计显著,也不过是一个概率问题,并不代表分流不科学。

综上,我们再来回顾一下什么是“统计显著”。顾名思义,这是一个统计术语,并不等同于指标在实际业务中发生了“显著变化”。更不能以此推论出“因为 AA 有差异,且 AA 的策略相同,所以分流结果有问题,AB 的结论也不可信”。

  • No.2 AABB 实验中,统计指标更容易犯错

先来明确一点,目前火山引擎 DataTester 的统计学原理是双样本假设检验。也就是说,目前火山引擎 DataTester 的假设检验都是按照一个对照组(旧策略组 A)和一个实验组(新策略组 B)来设计的。在 1 次比较中,我们犯第一类错误的可能是 5%。AABB 实验中,实际上有 6 组对比(排列组合一下:A1A2,A1B1,A1B2,A2B1,A2B2,B1B2)。组合增多,那么我们犯错的概率必然会增大。

如果实验者将实验组增多(AAABBB),或者参与实验的策略增多(ABCDE,AABBCCDD 等多个新策略),那么排列组合就会更多了,犯错的概率就会越来越大。再加上在实验中,我们可能会观察多个指标,这样我们犯错的概率就更大了。

  • No.3 AABB 实验一定程度上会影响实验的灵敏度

实验调用的样本量越多,实验结果就越灵敏。相较于 A/B 实验(只设置一个 A 组和一个 B 组)来说,AABB 实验将实验组的数量增加到了 4 个。此时实验者不得不面临几个选择:

1.实验总流量不变,各实验组的流量减少一半,这会造成实验灵敏度下降;

2.单实验组的流量不变,将分流进实验的总体流量增加一倍,这意味着实验者可能会承担更大的风险(如果新策略造成负向影响,会有更多的用户受到影响);

3.也有一些聪明的实验者选择延长实验时长,让更多用户进入实验之中,但这会产生更多的时间成本。

既然如此,我们为什么不干脆把 AABB 实验合并为 A/B 实验呢?这样反而可以使得实验更灵敏、风险更小、结果更可靠。

  • No.4 p-value 已经帮助我们比较了“AB 差异”与“AA 差异”

经过一些用户访谈,我们了解到大多数用户开设 AABB 实验的动机是:判断“ AB 差异”是否高于“ AA 差异”,并以此辅助自己进行决策。事实上,仔细理解显著性水平的原理,我们就会发现,p-value 已经从更科学的角度帮助我们完成了这个任务:p-value 小于 0.05,就是在保证了“ AB 差异”一定大于 95%以上的“ AA 差异”。

既然 p-value 已经帮我们比较了“ AB 差异”与“ AA 差异”,我们为什么还要自己开设 AABB 实验进行比较呢?从某种程度上说,利用一次 AABB 实验来观察“ AB 差异”是否大于“ AA 差异”,仅仅是在浪费实验资源而已。

四:核心:让风险“可量化”且“可控”

总体来说,A/B 方法论的核心是要让风险“可量化”且“可控”,火山引擎 DataTester 团队围绕这个目的使用假设检验范式设计了一整套系统。AABB 的实验设计作为一种客观存在,并没有什么绝对的对错,只是根据火山引擎的观察,对于绝大多数实验者和绝大多数业务场景,它的 ROI 是远远不足以让你选择的。

点击跳转 A/B测试 DataTester 了解更多

A/B 实验避坑指南:为什么不建议开 AABB 实验的更多相关文章

  1. electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3

    electron 编译 sqlite3避坑指南(尾部链接有已经编译成功的sqlite3) sqlite很好用,不需要安装,使用electron开发桌面程序,sqlite自然是存储数据的不二之选,奈何编 ...

  2. CEF避坑指南(一)——下载并编译第一个示例

    CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司,如网易.腾讯都开始使用CEF进行前端开 ...

  3. Canal v1.1.4版本避坑指南

    前提 在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的): 这是一个令人悲伤的故事,这条情感爆发的沸点好像被屏蔽了,另外小水渠(Canal意为水道.管道)上线一段时间,不出坑的时候风平浪静 ...

  4. Linux下Python3.6的安装及避坑指南

    Python3的安装 1.安装依赖环境 Python3在安装的过程中可能会用到各种依赖库,所以在正式安装Python3之前,需要将这些依赖库先行安装好. yum -y install zlib-dev ...

  5. Hive改表结构的两个坑|避坑指南

    Hive在大数据中可能是数据工程师使用的最多的组件,常见的数据仓库一般都是基于Hive搭建的,在使用Hive时候,遇到了两个奇怪的现象,今天给大家聊一下,以后遇到此类问题知道如何避坑! 坑一:改变字段 ...

  6. Harmony OS 开发避坑指南——源码下载和编译

    Harmony OS 开发避坑指南--源码下载和编译 本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(Hi3516,Hi3518和Hi3861)的编译环境,以及如何将源码编译为三个 ...

  7. 今天 1024,为了不 996,Lombok 用起来以及避坑指南

    Lombok简介.使用.工作原理.优缺点 Lombok 项目是一个 Java 库,它会自动插入编辑器和构建工具中,Lombok 提供了一组有用的注解,用来消除 Java 类中的大量样板代码. 目录 L ...

  8. Android连接远程数据库的避坑指南

    Android连接远程数据库的避坑指南 今天用Android Studio连接数据库时候,写了个测试连接的按钮,然后连接的时候报错了,报错信息: 2021-09-07 22:45:20.433 705 ...

  9. .NET AsyncLocal 避坑指南

    目录 AsyncLocal 用法简介 AsyncLocal 实现原理 AsyncLocal 的坑 AsyncLocal 的避坑指南 HttpContextAccessor 的实现原理 AsyncLoc ...

  10. Windows环境下Anaconda安装TensorFlow的避坑指南

    最近群里聊天时经常会提到DL的东西,也有群友在学习mxnet,但听说坑比较多.为了赶上潮流顺便避坑,我果断选择了TensorFlow,然而谁知一上来就掉坑里了…… 我根据网上的安装教程,默认安装了最新 ...

随机推荐

  1. 图片调整大小,图片改变像素,用win10自带的工具就够了

    A:大哥大哥,你会PS吗? 内心:好家伙,什么大项目,都用上ps了,还好大学的时候学过一点点. 我:嗯嗯,会一点,怎么了 A:你看,帮我调整一下图片呗 内心:哈哈,又能看到某人的照片了.... 我:害 ...

  2. 题解 AGC054D

    前言 因为本人尚菜,所以本篇文章没有什么数学符号,请大家放心食用. 题目分析 先吐槽一嘴,这个 o 表示 (),这个 x 表示 )(,十分形象. 好,我们先观察原序列,容易得出第一条性质: ox 的加 ...

  3. matlab实现频谱感知-认知无线电

    1.前言 \(\quad\) 频谱感知的方法有很多,比如匹配滤波探测,能量检测,静态循环特征探测等方法,然后最近因为在用硬件做能量检测,所以本文主要是说了如何用matlab实现能量检测,它的大概流程就 ...

  4. pnpm 管理依赖包是如何节省磁盘空间的?

    npm 存在的问题 我们经常使用 npm 来管理 node 项目中的包,从 package.json 中读取配置将依赖下载到本地,以保障项目的正常运行. 当项目数量多时,这样的包管理方式会非常的占用电 ...

  5. 一文彻底看懂Python切片

    1.什么是切片 切片是Python中一种用于操作序列类型(如列表.字符串和元组)的方法.它通过指定起始索引和结束索引来截取出序列的一部分,形成一个新的序列.切片是访问特定范围内的元素,就是一个Area ...

  6. Google Colab 现已支持直接使用 🤗 transformers 库

    Google Colab,全称 Colaboratory,是 Google Research 团队开发的一款产品.在 Colab 中,任何人都可以通过浏览器编写和执行任意 Python 代码.它尤其适 ...

  7. Codeforces Round 903 (Div. 3)

    Codeforces Round 903 (Div. 3) A. Don't Try to Count 大概题意给你两个字符串a,b.a串可进行的操作为将整个a串复制到之前的a串后面(直接用a+a即可 ...

  8. 基于DotNetty实现一个接口自动发布工具 - 通信实现

    基于 DotNetty 实现通信 DotNetty : 是微软的 Azure 团队,使用 C#实现的 Netty 的版本发布.是.NET 平台的优秀网络库. 项目介绍 OpenDeploy.Commu ...

  9. 吉特日化MES-业务架构第一版图

  10. [Clickhouse] Clickhouse 报SQLException : Read timed out

    1 问题描述 在使用Clickhouse(21.3.4.25)进行大数据量地数据查询,高频报出 SQLException : Read timed out 错误 2 问题分析 2.1 单次查询:耗时约 ...