5.2 正交分层模式
为了解决单层随机分流模式下流量不够用的问题,要将实验扩展到单层方法所能实现的范围之外,需要转移至某种并发实验系统。在这种并发系统中,每个用户可以同时进行多个实验。实现方法是拥有多个实验层,其中每一层的行为类似于单层方法。为了确保层间实验的正交性,在把用户分配到桶时,会添加层id,也称为盐值。层与层之间的正交性就是靠散列函数加层id的方式来保证。这就是业界通用的正交分层模式,即通过散列函数和加盐值的方法实现实验流量的复用。本节介绍正交分层模式中的两个关键点:1)正交性是如何保证的;2)如何确定分多少层且如何使用。
5.2.1 正交性问题
简单来讲,如果第一层所有用户都均匀随机地分布到了其他层的实验里,则可以认为第一层实验是符合正交性的,其他层的实验可以依次类推。各层之间类似平行关系,不相交、不影响,这样各层之间的影响就通过正交随机打散的方式被抵消了,每一层看到的仍然是该层中这个特征的实验效果。
在多层正交正常的情况下,实验期如果实验组A应用了新策略,实验组A相对于对照组B的指标数据有变化,则这个变化一定是A的新策略导致的。虽然A组中的用户也可能会参与其他层的实验,但是这些实验对于A、B的影响是一样的。
下面来简单推导一下正交性是如何实现的,如图5-1所示。
图5-1 层与层之间的正交性
实验层1中有实验组A、实验组B,分别占用流量比例为N(A)、N(B)。
实验层2中有实验组C、实验组D,分别占用流量比例为N(A)、N(B)。
如果实验层1和实验层2符合正交性,就有如下等式成立,N(AC)表示同时命中实验组A和实验组C的用户数量。
假设实验的观察指标是点击率,当实验组A、B、C、D都不应用任何策略时,R(A)=R(B)=R(C)=R(D)=p,R代表点击率。
假设实验层2的实验组C应用了新策略,点击率相对提升为α,那么此时R(C)=(1+α)×p。
实验组C对实验组A的影响分两部分,一部分是被C策略影响的用户N(AC),效果为(1+α)×p,一部分是没有被C策略影响的用户1-N(AC),效果仍然为p,此时原来A策略作用人群总效果,以R'表示,计算公式如下。
因为正交性N(AC)=N(A)×N(C),上面等式可以变为
实验组A观察指标变化为
这个变化说明实验C对于实验A的影响和N(A)没有关系,同样的实验C对于实验B的影响也和N(B)没有关系。
实验层2中的实验组C对于实验层1中实验组A、B的影响是完全一样的,在对比A、B两组实验效果的时候,实验组C的效果就完全被抵消了,从而实现了层与层之间实验效果相对独立。如图5-2所示,两个正交层,实验层1中10%的用户命中实验组A,实验层2中30%的用户命中实验组C,从用户视角来看,应该有3%的用户同时命中实验组A和实验组C。分层的同层之间的实验比例N(A)︰N(B)=1︰2,从用户视角看保持不变,即N(AC)︰N(BC)=1︰2。有如下等式:
图5-2 层与层之间正交后对效果影响的计算
5.2.2 分层问题
通过正交分层解决流量的复用问题后,接下来要考虑分多少层的问题。一种极端的情况是,将每个实验都单独作为一层,这也被称为全析因实验设计,每一种可能的因素组合都作为变量进行实验。如果我们将其扩展到一个平台,那么用户可能同时参与所有实验。对于每个运行的实验,用户都会被分配一个变量(对照组或任意实验组)。由于每个实验都与唯一的层id相关联,因此所有实验彼此正交。相同实验的迭代通常共享相同的散列id,以确保用户获得一致的体验。这种简单的并行实验结构允许以分散的方式轻松地扩展实验数量。
这种平台设计的主要缺点是不能避免潜在碰撞,如果两个不同实验中的某些实验参数同时发生变化,用户的体验会很差。例如,有两个实验,在实验1中测试蓝色文本,在实验2中测试蓝色背景。对于碰巧同时接受这两个实验的用户来说,这将是一次可怕的体验,显示屏是一片蓝色,完全看不清字体。用统计学的术语来说,这两个实验是“互动”的。在没有考虑两个实验之间产生交互的情况下,每个实验单独测量出的结果也可能是不正确的。需要注意的是,并不是所有的相互作用都是对抗性的,有时两种策略方法都有帮助,只是不是简单叠加。直观来讲,分的层数越多,碰撞的概率就越大。
为了避免糟糕的用户体验,可以使用有限层的划分方式,将系统参数划分为多个层,不同层运行不同类的实验,组合在一起可能会产生较差用户体验的实验必须在同一层中,并防止设计为向同一用户运行。例如,可能有一层实验用于通用UI元素实验(例如页面的标题和标题中的所有信息),第二层用于内容实验,第三层用于后端系统实验,第四层用于算法实验等。有限层有以下两个关键点。
●同类业务互斥且进入同一层。同类业务的含义是改变同一类参数的实验都属于同类,进入同一层是指这一类实验只能放在同一个实验层进行。核心目的还是避免参数碰撞、互动的发生。这里同类的定义不是绝对的,而是相对的,例如,在实验量不是很大的情况下,可以采用较粗粒度,比如UI层算作同类。如果实验量很大,一个层放不下UI实验,就需要继续拆分,比如UI层还可以拆分为文字字体、文字颜色、文字大小等不同的实验参数,放入不同的实验层。还能继续往下拆分为按钮颜色、字体颜色吗?建议最好不要拆到特别细的类目中,这样容易出现冲突和碰撞,带来不好的用户体验。在推荐算法的分层里面,召回、粗排、精排等都可以独立成为一层。
●不同类业务可以拆分到不同层,并行进行,保证实验流量足够,通过正交实现层间效果相互影响的隔离。
仅约束层数有时候不能完全满足实验需求。例如,把字体、大小和颜色都拆分为不同的层,如何做一个同时改变字体、大小和颜色的联合实验呢?为了解决这种层细分后无法进行联合实验的情况,可在层的基础上进行打通,形成贯穿域。在贯穿域中,可以进行各种跨层的联合实验。
在实际工程中,为满足复杂的需求,将层和域演变为各种复杂的组合,这些不同层和域的构造组合,使用的是一种嵌套平台设计。具体选择什么样的组合,取决于业务的实际情况和复杂度。Google、LinkedIn、Microsoft和Facebook的实验架构都使用了这种设计的不同变体。无论选择什么样的构造,在实现层和域的架构时,最好具备灵活组合的能力,否则后期一旦需求变得复杂,就无法满足了。如图5-3所示是一些经典的层域架构。
图5-3 常用层域嵌套框架
图5-3中,a图是包含三层的正交层基本框架,b图是包含穿透域、正交层的框架,c图是包含穿透域、正交层、发布域的框架,d图是一个层域嵌套的复杂框架。简单来说,没有被分为多个层的流量称为域。层和域不是绝对关系,可以在层中分域,在域中分层。以图5-3b中的架构为例,一个实验要么在穿透域实验中,要么在分层实验中。在分层实验中,一个实验参与单元最多可以同时命中3个实验(UI、搜索、广告),但是绝对不会同时命中穿透域实验和分层实验。也就是说,域和域之间的实验是不会重复的,同一个用户只会被分到一个域的实验中。