4.2 实验参与单元的SUTVA问题
实验参与单元满足SUTVA是实验分析的前提,如果实验单元不符合SUTVA,得到的实验结论大概率是无效的。究竟什么是SUTVA,为什么需要让SUTVA成立,哪些情况会导致SUTVA不成立,以及如何解决SUTVA不成立的问题,都是我们在进行AB实验时需要掌握和关注的。
4.2.1 什么是SUTVA
SUTVA(Stable Unit Treatment Value Assumption,个体处理稳定性假设)是指在AB实验分析中,假设实验中每个实验参与单元的行为是相互独立的。对于以用户为实验参与单元的情况来说,独立的意思就是一个用户的行为不受其他用户影响。在大多数应用中,这是一个合理的假设,比如使用带有折扣券的新结账流程的用户更有可能完成购买,并且该行为独立于其他用户;领取了红包的用户更愿意回到App进行消费,并且这个行为独立于其他用户。如果A组用户相互干扰和沟通,或者不同组之间的用户相互干扰,比如A组用户与B组用户沟通,B组用户发现自己没有红包,通过一些方法也去领了红包,这个时候SUTVA就不成立了。如果SUTVA不成立,实验结果分析将导致结论不正确。我们将违反SUTVA的情况称为干扰了个体处理稳定性假设,也称为实验参与单元之间的溢出或泄漏。
4.2.2 为什么需要让SUTVA成立
AB实验因果分析主要基于鲁宾因果模型(Rubin Causal Model,RCM)进行,这是AB实验分析的一个标准框架。鲁宾因果模型的分析框架有3个基本要素。
●潜在结果
●SUTVA
●分配机制
潜在结果的意思是,给定一个实验单元和一系列动作,把一个“实验单元-动作”确定为一个潜在结果。“潜在”这个词表达的意思是并不总能在现实中观察到这个结果,但理论上可能发生。对于任何一个实验单元,“处理动作”与“不处理动作”这两个潜在结果之间的差别就是处理的因果效用或者处理效果。处理效果定义为E=Y(处理动作)-Y(不处理动作),表达式中括弧内的是干预动作,Y表示这个动作的效果。以头疼吃药为例,要评估头疼吃药是不是有作用,存在4种可能性的组合。
●Y(吃药)=不头疼;Y(没吃药)=头疼
●Y(吃药)=头疼;Y(没吃药)=头疼
●Y(吃药)=不头疼;Y(没吃药)=不头疼
●Y(吃药)=头疼;Y(没吃药)=不头疼
对应的实验效果E如下。
●吃药使头疼消失了(即有效,证明因果关系陈述成立)。
●吃药没有效果。
●吃药有没有效果未知。
●吃药阻止头疼消失(反效果、负效果,虽然不常见,但理论上存在这种可能)。
因果推断的基础问题是,对于同一个实验单元,最多只有一个潜在结果被实现,从而只有一个潜在结果能被观测到,总有一个观测不到,即缺失值。因为因果效应是指在同一时间,对同一单元的处理和不处理的对比,处理效果的计算依赖于所有的潜在结果,而不只依赖于实际观测到的结果,所以就无法直接结算因果效应。而且,实际上参与实验效果评估的往往不止一个实验单元,当考虑多于一个实验单元时,事情会变得更复杂。
举一个例子,假设Andy和Cathy在同一个办公室,并且都在为同一门课准备教案。两个人可能同时头疼,并且两个人都可以选择吃药或不吃药。现在每个人都有A、B、C、D共4种潜在结果,针对4种潜在结果的两两组合,一共有6种组合(=6)。
为什么两个人的行为要一起考察呢?这是因为两者的行为可能存在相互影响。影响因素可能是,Cathy说:“对不起,我头疼做不了教案了。”那么Andy要做更多的工作,因此也头疼了。当只有1个人时,只需进行两个潜在结果(吃药或不吃药)的比较,并可以观测到1个数据点(1个人的1个实现);当变成2个人后,就需要进行4个潜在结果的6种比较,而实际上只能观测到2个数据点(2个人的各1个实现),情况就变成了2个数据点的6种比较,这样观测到的数据就更少了。当有更多的实验单元时,添加了更多的潜在比较,用于比较的潜在结果数据就越发不够了。这样,我们将永远无法获得足够的数据去估计想要的东西。
想要解决相互影响导致的更多结果不可观测的问题,可以假设Cathy不影响Andy,Andy也不影响Cathy,每个人吃或不吃药与另一个人做什么互不影响,会使问题变得简单一些。把这个想法扩展到多个单元,可以做出定义:任何单元的潜在结果不会因分配给其他单元的处理而变化,并且对于每个单元,不同的处理对应唯一不同的结果。这就是SUTVA。
SUTVA可以解决这种相互影响导致更多潜在结果无法获得,从而无法进行因果效应估计的问题。即使在SUTVA的基础上进行因果效应的估计,还需要分配机制满足一定的要求。如果分配机制不合理,得到的实验结果也是有偏差的。因为一些个体参与实验,另一些个体没有参与实验,本质上无法观测到同一批用户的两个结果,所以需要从可以观测的结果出发,通过分配机制,估计未观测的结果,从而得到因果效应。如果没有合理的分配机制,会出现什么情况?还是以头疼吃药为例,可以先找一群吃了头疼药的人记录结果后取平均,再找一群没有吃头疼药的人记录结果后取平均,两者之差如下。用T=1表示实验组吃药的人,T=0表示对照组不吃药的人。
上式中,由于需要实际观测数据,实验组只能观测到吃药的效果,对照组只能观测到不吃药的效果,因此上面的等式等价为
上式中,E[Yi(1)|Ti=1]是实验组吃药的效果,E[Yi(0)|Ti=0]是对照组不吃药的效果。为方便比较,引入一项无法观测的数据,实验组不吃药的效果为E[Yi(0)|Ti=1],等式变为
其中,E[Yi(1)|Ti=1]-E[Yi(0)|Ti=1]是实验效果,E[Yi(0)|Ti=1]-E[Yi(0)|Ti=0]是选择偏差。选择偏差代表在实验组和对照组都不接受处理时存在的系统偏差。如果选择偏差非常大,处理效果甚至会相反。
选择偏差是很常见的,比如去医院的都是病人,他们的身体状况通常很差,吃头疼药的都是头疼的人等。分配机制就是要小心翼翼地保证实验组和对照组的人事先并不存在这种系统性的偏差。
由于鲁宾因果模型在3个基本要素的共同作用下才能进行因果效应的估计,因此实验参与单元需要满足SUTVA。
4.2.3 导致SUTVA不成立的原因
干扰个体处理稳定性的方式主要有两种——直接连接和间接连接。直接连接比较好理解,比如发生互动等直接的关系。间接连接是由于某些潜在变量或共享资源存在而产生的关系,例如共享相同广告活动预算的对照组与实验组。两种连接的相似之处在于,都有一种媒介连接实验组和对照组,并允许它们相互作用。连接介质可以是物化的社交网络上的友谊连接,也可以是实验组和对照组用户共享一个广告预算池。了解干扰的作用机制非常重要,因为解决问题的最佳方案可能会因机制不同而有所不同。为了使问题更具体,本节通过一些例子进行讨论。
1.直接干扰
如果两个实验单元是社交网络上的朋友,或者他们同时访问相同的物理空间,则两个单元可以直接连接。由于两个直接相连的单元可以分成实验组和对照组,因此在两个组之间会造成干扰。比如,对照组中的用户会受到实验组中用户所采取动作的影响。对照组只是一个名义上的对照组,不再反映实验组不存在时将会观察到什么结果。如果忽略网络互动,就会得到对实验组效果的有偏见估计。而这些网络交互是正在进行AB实验的产品和场景不可避免的。目前还没有一种单一的方法可以减轻网络相互作用对估计实验效果准确性的影响。下面是一些常见的直接干扰例子。
在Facebook、LinkedIn、微博、抖音等社交网络以及拼多多等电商购物中,用户行为可能会受到其社交社区行为的影响。用户发现一项新的社交参与功能更有价值,可能是因为有很多的朋友使用它,所以自己更有可能使用。从用户的角度看:
●如果我的朋友使用Facebook,我更有可能在Facebook上使用视频聊天;
●如果我的朋友在微博上给我发消息,我更有可能在微博上给他们发消息;
●如果我的朋友邀请我在拼多多注册,我更有可能在拼多多购物。
在AB实验中,这意味着如果实验对使用者有重大影响,这种影响可能会蔓延到他们的社交圈,无论是在实验组中还是在对照组中。例如,LinkedIn上“你可能认识的人”算法中有一种更好的推荐算法,它鼓励用户发送更多的邀请链接。然而收到这些邀请的用户可能就是对照组成员,当他们接受邀请访问LinkedIn时,可能会发现有更多的人可以联系。如果感兴趣的主要度量指标是发送邀请的总数,则实验组和对照组邀请都可能会增加,实际增量会被抵消一部分,从而不能完全捕获新算法的好处。如果实验组鼓励用户发送更多消息,对照组也会看到随着用户回复而发送的消息增加了。
作为沟通工具,QQ、微信上的每一次沟通都至少涉及两方。显然,如果用户决定用微信给朋友打语音电话,朋友最终会更多地使用微信,至少是为了接听这个语音电话。这位朋友很可能还会使用微信给他的朋友打语音电话。在AB实验中,假设微信改善了实验组的呼叫质量,增加了来自实验组的呼叫,这些呼叫可以拨打给处于实验组或对照组的用户。结果是由于对照组中的用户也增加了使用微信进行通话的次数,因此实验组和对照组之间的差值被低估了。
2.间接干扰
通过某些潜在变量或共享资源,两个实验单元可以有间接连接。与直接连接一样,这些间接连接也可能对实验效果造成干扰。间接干扰的情况更为普遍。下面是一些间接干扰的例子。
假设Airbnb改善了实验组用户的转换流程,促成了更多的预订,自然会导致对照组用户的库存减少,这意味着对照组产生的收入比没有实验组时要少。比较实验组和对照组会导致高估实验效果。
假设滴滴要测试一种新的涨价算法,让实验组的乘客更有可能选择搭车,从而导致路上可用的司机少了,因为实验组的价格上涨了,导致对照组可用的司机减少,所以比较实验组和对照组的增量被高估了。
在向用户显示相同广告不同排名的实验中,如果鼓励更多的广告点击,就会更快地耗尽广告预算。因为同一个给定活动的预算在实验组和对照组之间共享,所以对照组最终的预算少了。实验和对照之间的差值被高估了。
无论是直接干扰还是间接干扰,最终都会使得实验组和对照组之间的差异被错误估计,所以我们需要想办法尽量降低这种干扰对于实验结果评估带来的偏差。
4.2.4 如何解决SUTVA不成立的问题
虽然4.2.3节列举的干扰是由不同原因造成的,但它们都可能导致有偏差的结果。有几类实用的方法来解决AB实验中的干扰问题,了解干扰的机理是找出好的解决方案的关键。
1.建立监控和报警
虽然不是每个实验都能获得精确的测量,但重要的是要有一个强大的监测和警报系统来检测这些极端干扰问题。比如,实验期间所有的广告收入都来自预算受限的广告商或不受预算约束的广告商,那么实验结果在推出后就不能推广了。再比如,一次实验消耗所有CPU。
2.隔离法
干预连接实验组和对照组的介质发生作用,可以通过识别连接介质并隔离用户来消除潜在干扰。要创建隔离,必须考虑其他实验设计,以确保实验单元和对照单元被很好地分开,以下是一些实用的隔离方法。
(1)共享资源隔离
如果共享资源造成干扰,那么将其在实验组和对照组之间分开显然是首选。例如,可以根据用户量分配来分割广告预算,只允许20%的流量消耗20%的预算。在应用此方法时需要注意两件事。
●干扰资源是否可以完全按照用户的流量分配进行划分,虽然预算数据很容易实现这一点,但这通常是不可能的,例如,在共享机器的情况下,单个机器之间存在异构性,服务于实验组和对照组的机器不同可能引入难以识别的混杂因素。
●流量分配(资源分割大小)是否存在偏差,对于训练数据,模型的性能随着训练数据的增加而提高。如果实验模型只获得5%的数据来训练,而对照模型获得95%的数据,这就引入了对照模型的偏差。这也是建议流量分配为50∶50的原因之一。
类似的市场效应也会影响在线广告实验。在线广告实验中增加了实验组对广告预算的消耗,从而增加了广告收入,由于实验组和对照组共享预算池,实验组其实是在窃取对照组的预算,因此当实验发布给所有用户时,总收入不会增加。防止预算窃取的一种方式是按照暴露于实验组和对照组的用户流量百分比来分割所有广告预算。虽然这样解决了预算窃取的问题,但并不能帮助我们了解实验是否会导致收入增加。合理地选择实验观测指标也是至关重要的,比如这个问题中,对比预算使用率是更好的实验观测指标。
(2)地理位置隔离
在双边市场中,由于需求和供给曲线,因此不同用户的行为是相互关联的。以乘车服务为例,当一名司机与一名乘客匹配时,乘客附近其他司机匹配的可能性就会降低。将乘客或司机简单随机分成实验组和对照组会导致市场状况的变化,从而使估计的实验效果产生偏差。为了减少用户之间的网络交互,Lyft通过在不同大小的空间区域或时间间隔之间进行随机抽样来进行整群抽样,以确保不同变量之间的市场状况相似。实验单位越粗糙,持续存在的干扰偏差就越少,尽管这会增加估计方差。优步已经尝试将这种方法引入一组随机的市场,并用一种合成控制来预测反事实。
两个单元的地理位置接近,出现干扰的例子很多,例如两间酒店争夺同一名旅客,或两辆出租车争夺同一名乘客。可以合理地假设来自不同地区的单元是彼此隔绝的,这使得实验可以在区域水平上进行随机化,以隔离实验组和对照组之间的干扰。需要注意的是,在地理水平上的随机化可以通过地理位置的大小来限制样本大小。但这种隔离也会导致AB实验的方差较大,功效较小。
(3)网络族群隔离
与基于地理的随机化类似,在社交网络上,可以根据节点干扰的可能性构建彼此接近的节点的簇,然后将簇作为“巨型”单元独立、随机分为实验组或对照组。这种方法有两个局限性。
●在实践中很少有完全孤立的情况,对于大多数社交网络而言,连接图通常过于密集,无法分割成完全隔离的簇。例如,当试图在整个LinkedIn网络创建10000个相互隔离、平衡的集群时,集群之间仍有超过80%的连接。
●与其他大单元随机化方法一样,有效样本量(聚类数)通常较小,这导致在构建聚类时需要权衡方差和偏差。虽然簇的数量越多,方差越小,但也给我们带来了更大的偏差和更少的孤立性。
在LinkedIn和Facebook的许多产品中,用户会彼此影响。这些影响有助于设计更好的AB实验。LinkedIn使用egoClusters方法,创建大约20万个ego簇,其中包括“自我”(指标被测量的个人)和“改变者”(接受实验,但对其指标不感兴趣)。在所有簇中,“自我”都得到了处理。在实验组簇中,所有“改变者”都会得到处理。在对照组簇中,所有“改变者”都不做处理。对于简单的双样本t检验,在实验簇的“自我”和对照簇的“自我”之间,给出了所有连接都得到处理与不处理的近似一阶效应。Facebook和Google采用了类似的基于簇的随机化技术。关于基于网络关系划分簇,然后以簇为单位做AB实验,感兴趣的读者可以阅读相关领域的论文。
3.边缘度分析
一些泄漏发生在两个用户之间明确定义的交互中,这些相互作用很容易识别,因为交互一般是从一个用户到另外一个用户,所以可以看作数学上的一条有方向的边。可以对用户进行随机化,然后根据用户的实验分配将边标记为4种类型之一:从实验组到实验组的边、从实验组到对照组的边、从对照组到对照组的边和从对照组到实验组的边。
对比发生在不同边的交互(例如消息、点赞)的量,能够了解这些网络互动效果的影响程度。例如,使用实验组到实验组和对照组到对照组之间的对比度来估计无偏增量,或识别实验中的单元是否更喜欢向其他处理单元发送消息,以评估实验策略的互动效果,以及由实验组创建的新操作是否获得更高的应答率。LinkedIn在分析一对一消息传递实验时,明确计算消息数,包括留在实验组内的消息、留在对照组内的消息和2个组相互交叉的消息,将这些类别的消息总数通过实验进行对比,以衡量网络交互的影响。
在Skype上,将一些与呼叫质量相关的实验在呼叫级别进行随机化,每个呼叫被处理或控制的概率相等,然后观察实验组的各项呼叫指标是否有明显改善,其中也包括这4种类型的呼叫边的数量。在实验过程中,单个用户可能会进行多个呼叫,这种以呼叫为随机单元的方法不考虑来自实验用户的内效应。
4.生态经验法
并不是所有的用户操作都会在不同组间相互干扰。可以确定可能会溢出的操作,并且只有这些操作在实验中受到实质性影响时才会担心干扰。这表示我们不仅需要关心一阶动作,还需要关心一阶动作的潜在反应。
例如,考虑在社交网络上进行实验的指标,包括发送的消息总数和响应的消息总数、创建的帖子总数、帖子收到的点赞总数和评论总数以及这些点赞和评论的创建者总数。这些指标可以在一定程度上反映一阶动作的下游影响。通过测量,可以估计一阶动作对潜在生态系统影响的深度和广度。对一阶动作有积极影响而对下游指标没有影响的实验,不太可能产生可测量的溢出效应。一旦确定了能反映下游影响的指标,就可以建立关于每个行动如何转化为整个生态系统的价值或参与的普适指导,例如,来自用户A的消息翻译成来自A及其邻居的访问会话的数量是多少。建立这一经验法则可以使用被证明具有下游影响的历史实验,并使用工具变量法将这种影响外推到其他行动的下游影响。
这种经验法则相对容易实现,只需要建立生态系统价值,可以将其应用于任何实验。然而,这种方法确实有局限性。从本质上讲,经验法则只是一个近似值,并不一定适用于所有场景。例如,由某种实验产生的额外消息可能会对生态系统产生比平均水平更大的影响。
5.双边随机化
在很多产品中,用户角色之间存在明显的生产者、消费者区别。例如,在抖音、快手等视频内容App中,有内容生产者,也有内容消费者。在这种场景下,进行内容相关的实验时通常使用双边随机化。例如,测试给内容贴上不同类型的标签是否能增加消费,这里有两个正交实验同时进行,一个控制生产体验,另一个控制消费体验。
生产实验允许实验中的用户将标签添加到他们的帖子中,消费实验允许实验中的用户在他们的提要上看到标签。如果我们做一个简单的AB实验,把这两个功能放在一起,那么实验就会出错:生产者效应被低估了,因为一般实验流量控制在10%以下,即潜在的消费者不到全体用户的10%。就这个例子而言,如果生产实验中实验组的用户可以发布标签,但并不是每个人都能看到它们,那么该用户很可能会减少参与。消费者效应也被低估了,因为潜在的生产者太少了。能够看到标签可能会让用户更投入,但如果使用它们的人太少(即只接受实验的人可以看到),就不会有这种效果。使用双边随机化的优点是,当95%的消费者可以看到生产的内容时,生产者的效果(比如50%的灰度)更准确;当95%的生产者“启用”时,消费者测试(比如50%的灰度)更准确。
这种方法可以不考虑生产商之间的竞争影响,在这种情况下,如果有足够的功率,比起50%的灰度,95%的灰度更常用。此外,有的情况下可能无法在功能中将消费者从生产者中分离出来。例如,如果用户提到另一个使用“@提及”功能的用户,则必须通知该功能的使用者被提及。这样的情况下,可以考虑采用一些其他的度量手段,比如将其视为一种互动进行评估。