文章[2] 策略的改变,不是由我们随便“拍脑袋”得出,而是一种建立在数据基础上的思维方式,数据反馈会告诉我们做的好不好,哪里有问题,以及衡量可以带来多少确定性的增长。
为了验证一个新策略的效果,准备原策略A和新策略B两种方案。
随后在总体用户中取出一小部分,将这部分用户完全随机地分在两个组中,使两组用户在统计角度无差别。 将原策略A和新策略B分别展示给不同的用户组,一段时间后,结合统计方法分析数据,得到两种策略生效后指标的变化结果,并以此判断新策略B是否符合预期。
上述过程即A/B实验,亦被称为“对照实验”或“小流量随机实验”。 最常见的一种A/B Test方式(可见文章[7]):
其应用场景包含:
文章[2]提及,如何更好地筛选样本 首先看如何解决第一个问题:
避免因流量分配不平衡,A/B组本身差异过大造成对实验结果的误判。
为解决该问题,我们引入了AA分组:
基于实验者圈定的流量,通过AA分组将该流量分为无显著性差异的实验组和对照组。
我们这样定义无显著性差异这一约束:
首先,实验者选取的用于刻画实验流量的指标,在实验组和对照组之间无统计上的显著性(即上节所描述的基于均值的假设检验);
其次,在所分出的实验组和对照组之间,这些指标的差值最小,即一个寻找最优解的过程。
从实验者的实验流程看,在实验前,圈定进入该实验的流量,然后确定用于刻画实验流量的指标,最后调用AA分组,为其将流量分成合理的实验组和对照组。
文章[4]有提及:
混杂因素就是研究对象的个体差异,它们不是你试图进行比较的因素,但却最终导致分析结果的敏感度变差,比如不同城市的人,不同年龄段的人,性别……,进行实验的时候要尽量避免混杂因素对结果的影响
根据实验种类分类
根据流量类别分类
这种分类主要了为了用户体验,使平台在操作上更加的简单、易用:
互斥组,也称互斥层、实验层。“实验层”技术是为了让多个实验能够并行不相互干扰,且都获得足够的流量而研发的流量分层技术。
举个例子,假如我现在有4个实验要进行,每一个实验要取用30%的流量才能够得出可信的实验结果。此时为了同时运行这4个实验就需要4*30%=120%的流量,这意味着100%的流量不够同时分配给这4个实验。那么此时我们只能选择给实验排序,让几个实验先后完成。但这会造成实验效率低下。实验层技术就可以完美解决这个问题。
我们把总体流量“复制”无数遍,形成无数个流量层,让总体流量可以被无数次复用,从而提高实验效率。各层之间的流量是正交的,你可以简单理解为:在流量层选择正确的前提下,流量经过科学的分配,可以保证各实验的结果不会受到其他层实验的干扰。
互斥实验:互斥组中的所有实验都不会共享用户,如果一个用户/设备命中了实验A,就不会命中该互斥组中的其他实验。
举例,你要同时按钮颜色和按钮形状的实验,就需要将两个实验加入到一个互斥组列表。
可见文章[11],本篇火山引擎的文档,描述的蛮清晰。
互斥组=互斥层=实验层
每个独立实验为一层,一份流量穿越每层实验时,都会随机打散再重组,保证每层流量数量相同。
举个例子。假设我现在有2个实验。
如果把A1组的流量分成2半,一份放进B1组,一份放进B2组; 再把A2组的流量也分成2半,一份放进B1组,一份放进B2组。
那么两个实验对于流量的调用就会如下图所示。
此时实验A和实验B之间,就形成了流量“正交”。
流量正交有什么意义呢?
我们可以发现,因为A1组的一半流量在B1中,另一半流量在B2中,因此即使A1的策略会对实验B产生影响,那么这种影响也均匀的分布在了实验B的两个组之中;
在这种情况下,如果B1组的指标上涨了,那么就可以排除B1是受A1影响才形成上涨。这就是流量正交存在的意义。
对与分层实验有个很重要的点就是每一层用完的流量进入下一层时,一定均匀的重新分配。
整个流量有一个分散,合并,再分散的过程,保证第二层中的每个实验分配的流量雨露均沾,这就是所谓的流量正交。
文章[8]中的另外一个例子,来表达流量正交:
同一层存在多个互斥实验,层与层之间,流量是正交的
也就是说流量在穿越每一层实验时候,都会被再次随机打散,经过上层实验一的流量可能会经过下层的任何一个实 验,可能是实验一,也可能是实验二。如图:
是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。(百度百科)
灰度实现思路:
当某个实验效果非常好时,可以动态调整该实验的流量占比,从而迅速得到收益,并且在大流量上验证该实验的有效性。一旦确认该实验效果非常良好,便可以在全流量上线。
灰度发布的应用场景:
比如开发完成一个新功能,但线上用户量很大,不确定全量发布后功能效果或者反馈如何,担心会存在潜在的问题。
此时,您可以使用灰度发布,逐步发布1%、5%、30%、50%、100%流量,在增量发布的过程中根据用户反馈来进行实时调整流量大小,或者回滚。
比如已通过A/B实验决策出优胜版本,可以直接将优胜版本全量固化至Feature,即通过Feature的方式立即实现全量发布。
比如您想在十一假期期间针对线上用户做一个活动,需要提前完成准备工作,那么您可以设置定时发布,如每天发布10%流量,共发布7天。
实验报告中的留存率指的是“按进组时间拆分的留存率”,是根据【用户首次进实验组的时间】作为起始,用户回到App作为回访,计算用户n日留存。 统计方式如下:
举个例子说明:
第一天实验组A的用户数为:10000,第一天base_user为10000。
第二天实验组A的用户数为:10400,其中9200用户是第一天便已经在A中的用户,1200用户为当天新进组用户;第二天base_user为1200,第一天的次日留存为9200/10000=92%。
第三天实验组A的用户数为:10200,其中8000用户为第一天便已经在A中的用户,1100用户为第二天进入A中的用户,1100为第三天进入A的用户;第三天的base_user为1100, 第一天的2日留存为8000/10000=80%, 第二天的次日留存为1100/1200=91.67%。
然后分别把每个进入实验日期的指标用base_user进行加权平均,得到次日留存率、第2天留存率等。
当日"已进组用户" 表示当日曝光进组的总用户数,包括之前已进组的老用户和初次到访的"新进组用户"。
文章[11] 涉及统计假设检验的一些解释:
第一类错误&显著性水平(α) 第一类错误,指原假设正确(真),但是我们假设检验的结论却显示原假设错误。这一过程中我们拒绝了正确的原假设,所以第一类错误是“弃真”。 第一类错误在实际操作中表现为:实验结论显示我的新策略有用,但实际上我的新策略没有用。 在统计学中,我们用显著性水平(α)来描述实验者犯第一类错误的概率。 当某个实验组的指标是显著的,说明这个实验结果大概率是可信的。 这个概率是95%,也就是说,系统有95%的信心确认这个实验结果是准确的。
显著性水平存在的意义是什么?
一个按钮从蓝色改成红色,一个窗口从左边移到右边,到底用户体验会变好还是变差呢?
我们并不确定,因此我们试图使用A/B实验的办法,帮助我们转化这种“不确定”——观察小流量实验中新旧策略的表现,从而确定新旧策略的优劣。
但是,这样就能完全消除不确定性了吗?答案是不能,因为存在抽样误差。
举个例子,假设瑞士人均收入为中国的十倍,那么随机抽三个瑞士人和三个中国人,能保证样本里这三个瑞士人的平均收入是三个中国人的十倍吗?万一这三个中国人是马云,王健林和一个小学生呢?
反过来想,假设在1%的流量下,组A(按钮呈红色)比组B(按钮呈现蓝色)购买率高,将流量扩大至100%,能保证策略A的表现仍旧比策略B出色吗?显然,我们还是不确定。
抽样误差带来的不确定性,使得我们在做小流量实验时,永远没法保证结论是完全正确的。
幸运的是,对于抽样的不确定性,在统计学中,我们有一套方法来量化这种不确定性到底有多大,这便是显著性水平(α)存在的意义。
置信水平/置信度/置信系数
置信水平(也称置信度、置信系数、统计显著性),指实验组与对照组之间存在真正性能差异的概率,实验组和对照组之间衡量目标(即配置的指标)的差异不是因为随机而引起的概率。
置信水平使我们能够理解结果什么时候是正确的,对于大多数企业而言,一般来说,置信水平高于95%都可以理解为实验结果是正确的。因此,默认情况下,「A/B 测试」产品将置信水平参数值设置为95%。
在A/B实验中,由于我们只能抽取流量做小样本实验。样本流量的分布与总体流量不会完全一致,这就导致没有一个实验结果可以100%准确——即使数据涨了,也可能仅仅由抽样误差造成,跟我们采取的策略无关。在统计学中,置信度的存在就是为了描述实验结果的可信度。
第二类错误( β )&统计功效(statistics power):
在统计学中,统计功效 = 1 - 第二类错误的概率,统计功效在现实中表现为:我的新策略是有效的,我有多大概率在实验中检测出来。
中心极限定理
显著性水平的理论依据便是中心极限定理。我们可以量化抽样误差的根基在于中心极限定理的存在。
什么是中心极限定理?
由于存在抽样误差,我们每次实验所得到的指标结果,都可能与我们期望得到的真正结果有误差。假设我们从总体中抽取样本,计算其指标的均值,每一次计算,样本均值都会受抽样误差影响。
假如我们做无数多次实验,那么理论上,这无数多个样本均值中,总应该有一个是“真的”,不受抽样误差影响的,这个值在统计学里被称为“真值”。
中心极限定理定告诉我们,如果我们从总体流量里不断抽取样本,做无数次小流量实验,这无数次抽样所观测到的均值,近似呈现正态分布(就是下图这样的分布)。
这个分布以真值为中心,均值越接近真值,出现的概率就越大;反之均值越偏离真值,出现的概率就越小。
即概率,反映某一事件发生的可能性大小,主要在 abest 中说明实验的提升的显著性,并且往往与假设检验相挂钩。
统计学根据显著性检验方法所得到的 P 值,一般以 P < 0.05 为有统计学差异, P<0.01 为有显著统计学差异,P<0.001 为有极其显著的统计学差异。
其含义是样本间的差异由抽样误差所致的概率小于 0.05 、0.01 、0.001 。
实际上,P 值不能赋予数据任何重要性,只能说明某事件发生的几率。在实践中建议,运行 A / A 测试,并同时也关注相关指标及 p-value 。
A / A 测试中度量的 P-value 分布应该是统一的,进行 1,000 次 A / A 测试,并检查分布是否均匀,当我们得到异常信息时,则需要纠正一些事情。
参考文章[4]
参考文章[9] 利用灰度发布形成一套结合AB测试的开发上线流程:需求评审-建立试验方案-新功能开发-灰度发布-小流量AB测试-发布成功的功能,关闭失败的。
参考文章[10] 工作中进行完整的AB测试流程包括以下几个步骤:
根据试验结果,确定是否推广到全量或者是调整之后继续实验。
理论上,样本量越多越好:
从直观上看,当样本数量很少的时候,实验容易被新的样本点带偏,造成了实验结果不稳定,难以得出确信的结论。 相反的,样本数量变多,实验则有了更多的“证据”,实验的“可靠性”也就越强。 在现实操作中,样本量应该越少越好,这是因为:
文章[14]提到一个问题:满足样本量就可以停止实验了吗 答案是否定的,原因有三: 新奇效应,在统计学上指的是对于概率事件的结果,随着试验次数的增加,结果往往趋近于均值。在AB测试中,试验早期用户因为新奇会关注新改动,但是往往前期显著的提升在之后几天或者几周的测试中会逐渐消失。
周内效应,一个实验至少需要一周,避免指标的周期性效应,比如工作日与周末之间的差异较大而导致误判。
以偏概全,实验周期不够,不能满足指标测算或随机分组的目的。与时间限制有关的实验应该考虑长期转化情况。如「限时优惠」一类的与时间相关的设定。如果实验时间跑的太短,没有让高频用户和低频用户都包含在实验里,那么实验结果就只考虑了高频用户的行为。
在文章[10]中,实验的有效天数的确定需要考虑两个因素:
(1)试验进行多少天能达到流量的最小样本量
(2)同时还要考虑到用户的行为周期和适应期
用户的行为周期
部分行业用行为存在周期性,例如电商用户购买行为,周末与工作日有显著差异。故实验有效天数应覆盖一个完整的用户行为周期。
用户适应期
如果进行的样式改版一类的实验,新版本上线用户会因为新奇效应而存在一定得适应期。故应考虑适应期在实验有效天数内,然后再分析实验结果。适应期的长短通常以足量用户流量参与试验后的2到3天为宜。
在文章[13]也有一些描述:
试验的周期一般是7天,覆盖周末和周中的用户行为。 对于复杂一些的测试,可以跑2周甚至1个月。
还有一个办法,就是看试验结果的置信区间的收敛速度,如果置信区间达到3%-5%已经可以决策了,就可以停止试验了。
正常情况下,我们需要大流量试验来验证大型新功能,比如新推荐算法,新学习模型,新聊天功能。
然后我们可以同时用流量分层的方法做很多很多小试验,比如改UI改文案,看看有什么改变能带来用户转化的提升。
同时跑10个以上的试验很正常,这种并行决策实际上大幅度提高了产品优化效率,而不会延缓迭代。
文章[14][17]都提到,Uber 和 Netflix 采用的成组序贯检验方法(GST)实现实验早停。
GST表现最好且最具实用价值。它通常被广泛的应用到临床实验中,样本随着时间逐渐积累增多,这非常适用于我们的案例。
它的思路大致是这样的:
在测试开始之前,我们先确定所需的最短运行时间和中期分析的次数。
然后,GST将所有可容许的I类错误总数(例如0.05)分配到所有中期分析中,以使I类错误加和起来为I类错误总数。这样,每个中期测试都比定期的peeking更为保守。
一旦统计学上足够显著,我们就可以立即停止实验。当观察到效果明显大于预期时,通常就是这种情况。
假设我们要监控特定实验的关键业务指标:
图6.序贯检验方法表明,在图B中确定了我们的处理组与对照组之间的显著差异。
相反,在图A中未发现显着差异。
随着时间增加,我们会累积更多的样本,并且置信区间会变窄。在图B中,从给定日期(在本例中为11月21日)开始,置信区间始终从零开始偏离。可以检测到指标下降在特定日期后在统计上和实际上都具有重要意义。相比之下,图A的置信区间会缩小,但始终包含0。
因此,对于图A我们没有检测到任何差异。
红线图A和B表示我们的处理组和对照组之间观察到的累积相对差异。红线带是
累积相对差异的置信区间。
业界在进行实验对象分组的时候,最常用的是随机分组方式。这也是滴滴诸多实验中占比最大的分组方式。随机分组的做法可以实现为对实验对象的某个ID字段进行哈希后对100取模,根据结果值进入不同的桶,多个不同的组分别占有一定比例的桶。
实验对象在哈希取模之后,会得到0 ~ 99的一个数,即为该实验对象落入的桶。这个桶所属的组就是该实验对象的组。
弊端:
进行一次CR,能将一批实验对象分成对应比例的组。但是由于完全随机的不确定性,分完组后,各个组的实验对象在某些指标特性上可能天然就分布不均。
均值,标准差等差异较大。如果分组不均,则将会影响到第四步的实验效果分析的进行,可能遮盖或者夸大实验的效果。
RR是在每次跑CR之后,验证CR的分组结果组间的差异是否小于实验设定的阈值。当各组的观察指标小于阈值或者重新分组次数大于最大允许分组次数后,停止分组。
相比于CR,RR通过牺牲计算时间,能在一定概率上得到符合要求的分组。重分组次数与输入的实验对象样本大小相关。样本量越大,需要进行重分的次数一般较少。
但是RR分组能得到符合要求的分组有一定的概率,且需要花更多的时间。所以,我们希望通过对分组算法的改进,在一次分组过程中分出观察指标均匀的分组结果,如下图所示。
文章[5]中,Apollo实验平台实现了滴滴AI LAB团队设计的Adaptive(自适应)分组算法。
Adaptive分组方法可以在只分组一次的情况下,让选定的观测指标在分组后每组分布基本一致,可以极大的缩小相对误差
参考文章[1],58招聘介绍了他们的AB实验框架,目前,推荐策略配置及AB实验框架支撑着我们每天80多个推荐位,线上20多个AB实验的日常迭代。
推荐的整体步骤清晰,层次分明,为了快速高效验证离线分析成果,策略算法同学经常会在不同层级并行迭代实验。
因此要求实验不互相干扰,每层的实验流量正交,评估效果准确有效,框架需要支持分层实验的功能。
纵向来看,流量域分为独立实验区和分层实验区。独立实验区不支持分层实验,针对单一变量进行实验。而分层实验区根据推荐流程分为多层:召回层、补足层,过滤层、排序层、资源控制层。每一层均可配置多组实验,层与层之间互不干扰。
其中召回层我们会整合多个数据源的职位数据,通过实验标识回传我们以简单轻量的方式支持下游服务的AB实验需求。
通过我们的可视化平台配置AB实验参数(推荐位,实验号等)即可实时监控各个常用核心数据指标的实验效果。
下图中可以清晰得看到一个实验从开始到AA验证的整体数据变化情况。
在实验配置模块,用户可以基于实验前提出的假设、定义的成功指标快速创建实验,并基于特定的分流策略完成分流配置;
分流以及埋点上报模块,提供JAR包接入的形式,异步获取实验配置进行本地分流计算和埋点上报;
在线分析模块,依据用户在实验配置管理模块选取的用于说明实验效果的指标、分流埋点上报模块记录的日志,自动地产生各实验的实验报告,供实验观察者使用,然后根据实验效果帮助他们作出正确的决策。
具体流程如下图所示:
传统A/B实验的分流方式,无法保证分出的两个群组实验组和对照组的流量都是无差别的,无法避免因流量分配不平衡而导致的A/B群组差异过大问题,很容易造成对实验结果的误判。
为满足不同业务场景的诉求,我们的A/B平台建设采取了多种分流策略,如下图所示:
针对策略之间的相互影响、请求不独立场景下的A/B实验,我们采取限流准入的分流方式,针对不同的实验,选取不同的分流因子。
在实验前,我们通过AA分组,找出无差别的实验组和对照组,作为我们实验分流配置的依据,这种分流方式要求我们要有一套完整刻画流量因子的指标体系,只要刻画流量因子的指标间无统计显著性,我们就认为分出的实验组和对照组无差别。
AB实验平台架构与实现:
ab平台架构主要包括web层、api层、数据层、存储层,核心分流服务构成。
将流量的实验分组信息与用户行为日志做关联,分析实验的指标数据。实验效果分析包括实时数据分析和离线数据分析:
字节的火山引擎已经开放了比较完整的a/b 测试平台,可参考: https://www.volcengine.cn/docs/6287/66993
可以体验15天的demo实验:
整理分为实验管理、指标管理、feature管理、系统管理。
实验管理模块
指标管理模块
核心指标,用来决策实验功能是否符合预期的「直接效果指标」 也叫「成功指标」。只可以设置一个指标为某个实验的核心指标,可在实验报告里面查看实验数据。
一般常见的核心指标,如下:
①转化率、uv/au类,如留存率;
②人均次数类,如pv/au、pv/uv、sum/au、sum/uv;
③平均值类,如sum/pv;
feature管理模块
Feature列表为您呈现所有Feature的列表页,展现Feature各个版本的公共信息。如下图:
系统管理模块
平台整体架构示意图:
1、平台接入方(即实验代码实现的位置),我们提供服务端和客户端两种接入渠道。
2、平台内部实现,分为「分流」和「管理」两个部分。分流模块主要是供在线业务调用,通过分流模型,得出分流结果。管理模块则是实验元数据、实验效果数据等信息的管理后台,提供可视化的操作界面。
3、周边数据配套设施,包括实验分流数据的上报、采集,指标数据的聚合计算。涉及指标库以及数据处理等系统。
一条实验流量从进入系统到最终分配方案需要经历三个阶段:流量过滤、同层实验分配、实验内部方案分配。这些阶段应当在平台内部分流模块中闭环实现。
1 58招聘推荐系统介绍——AB实验框架 2 美团配送A/B评估体系建设与实践 3 推荐系统衡量:ABtest 框架 4 如何做一次完美的 ABTest? 5 AB实验在滴滴数据驱动中的应用 6 干货 | 携程是如何做AB实验分流的 7 美团点评效果广告实验配置平台的设计与实现 8 AB-TEST 9 AB实验平台在贝壳找房的设计与实践 10 统计学(4)|AB测试—实验流程 11 火山引擎:A/B 名词解释 12 从 0 到 1 搭建技术中台之 A / B Testing 平台实践 13 灰度发布和AB test 14 数据分析36计(14):A/B测试中的10个陷阱,一不注意就白做 15 数据分析36计(15):这个序贯检验方法让 A/B 实验节约一半样本量 16 数据分析36计(23):长期转化率 A/B 实验的问题,用边际结构模型纠正后结论反转 17 数据分析36计(17):Uber的 A/B 实验平台搭建