Dong Guo's Blog

数据驱动的核心:Controlled Experiments

| Comments

越来越多人和公司认同data-drivern决策的必要性,不仅是滴滴、Google、Microsoft、Linkedin、Amazon这些科技公司,也包括传统意义上的非技术公司。Data-drivern的核心是Controlled experiment(即大家常说的A/B Testing),按照字面理解就是将其它影响因素都control住,保持一致,实验结果只由预设的不同方案影响。

在滴滴算法团队,很多时间和精力都在做各种策略和算法实验,比如我们比较不同的订单分配策略哪个可以让接驾时间更短,比如评估新的动态定价策略对乘客的留存和活跃度有什么样的影响。基于近期在做实验方面遇到的一些挑战思考,以及上个周末看的几篇文章写一个小结在这里。先介绍几个controlled experiment相关的基础而重要的点,总结做controlled experiment中的一些遇到的难点和挑战,最后是一些实验方案和架构的构想。

1. 几个基础&重要的知识点

1.1. A/A Testing

A/A测试是一个比较有效的实践去检测你的实验设置中是不是有bias。AA测试一般有两种实现方法,一种就是仅在实验前做离线数据分析(AA测试并不都需要去线上做实验),另一种就是在线上setup A/B/A的实验。

1.2. Hypothesis Testing

A/B测试基本都需要通过假设检验计算猜想的置信度,你想证明的东西称为alternative hypothesis(“备择假设”,比如“我的新算法比老算法能提高CTR”),反面称为null hypothesis(即“零假设”,即“我的新算法和老算法没啥差别”)。通过收集A/B实验的数据,计算B的均值X_b和A的均值X_a,计算二者的diff X_d = X_b – X_a,如果零假设成立,X_d应该较小。在假设策略A和B无明显差别的前提下,可以得到X_d服从的分布X_D,比较X_d和分布X_D,利用小概率事情一次是不会发生的思想(实际是设定置信度阈值,比如0.05),判断是接受还是拒绝零假设。(具体公式后续补充)

1.3. Sociation or Causality

相关性 != 因果性,非常重要的sense。一个经典的例子是“大量样本表明,口袋里有打火机的人得肺癌的概率显著高于口袋里没有打火机的人”

2. 做Controlled experiment容易犯的错误和挑战

通过AB测试产出正确的决策通常是一件非常不容易的事情,我可以很容易列举10条常见的导致产出错误结论的原因。错误的结论包括false postive(新方案无效或者有负向效果,但通过实验得出有效的结论)和false negtative(新方案有效果,但是通过实验判定无效),其中false postive相比false negative对公司伤害可能更大。常见的观点是在科技公司的算法和策略优化中,80%~90%的idea被验证是无效或者有负向效果的(见Microsoft这篇文章【3】的5.1小节)

2.1. 几条典型的产出错误结论的原因

  1. AB流量划分不随机:比如用用户ID最后一位数字做分流,事后才发现该ID并不随机。可通过对数据源深入了解分析和AA测试来减少这方面的错误
  2. AB流量划分随机,但是control或treatement会影响对方的流量,导致对比结果的不可信
  3. 错误的指标选取:比如有时业务指标(KPI)很难量化,选择的“近似”可量化的指标实际相比业务指标差很远
  4. 实验结果未达到足够的置信度就宣布结论:看p-value,多break down指标看细节
  5. 线下线上分流没有对齐:实验设计、代码开发、指标选取都没有问题,但是由于离线用日志评估结果时未使用和线上一致的分流方案(典型的原因是没有将分流标志写入日志,离线只能按照口头约定的逻辑重新实现分流逻辑,常发生在开发和指标统计不是一个团队时),必然导致统计结果有偏差
  6. 实验期间外部因素干扰了实验结果,比如天气或特殊事件
  7. 任何一个环节的bug
  8. 实验本身很完美,但是你的(或者老板给你定的)KPI错了

2.2. 挑战1:设计合适的AB流量划分方案

常见的流量划分方法有这么几种:按照某种ID进行随机划分(比如用户ID、session ID、cookie ID),按照时间片进行划分(比如每半个小时进行算法的轮换)、按照地理区域划分(比如将城市划分成网格,交错apply不同的算法)。

AB流量划分的第一点是保证划分的随机性,通过做AA测试分析基本可以保证。第二点是保证control/treatment不影响对方的流量,对于某些实验上面几种典型的流量划分方案就不可行了。假设滴滴要评估一个新的定价策略是否可以提高GMV,我们看下这几种流量划分方案:

  1. 按照乘客或者订单ID随机划分:订单分配算法是全局的,所以运力/司机是2个定价策略共享的
  2. 按照时间片进行划分轮换:在当前时间片apply某个定价策略,可能会占用下个时间片的运力,特别是时间片较短时(比如不足一小时)影响显著,但是时间片越大时间本身引入的外界因素干扰就越大(比如不同时段的需求、运力、天气等因素的差异)
  3. 按照地理区域划分:同样有运力共享的问题

对于这个case,如果你有好的流量划分idea非常欢迎和我交流

2.3. 挑战2:确定正确的业务目标和实验指标

想清楚业务优化的目标是一切的基础,比较容易犯的错误是优化了一个短期的目标,而该短期目标和长期目标常常是冲突的。错误的KPI往往有两个来源,一个是所谓的“目标分解,阶段性目标”,另一个是不了解各种指标之间存在千丝万缕联系的老大直接拍板了一个KPI(如果能在不伤害其他指标的情况下做到优化KPI当然是好的,但是老大只提了要优化KPI,没有说其他指标不能受到影响)。

Google在这篇文章【1】中提到了广告的投放不能仅看当下的收入,应该看长期的收益(年的粒度)。如果给用户展示了过多的广告,用户会自然地学习到对广告的blindness,之后的广告CTR会显著下降。为了度量不同的广告策略对用户长期的影响,作者设计AA –> AB –> AA实验:

  1. 第一阶段(AA):挑选两拨有相同广告体验的用户,且整体CTR差异不大
  2. 第二阶段(AB):给其中一拨人B使用新的广告投放策略(即更多的广告展示),持续一段时间(文中提到是90天)
  3. 第三阶段(AA):给用户群B恢复和A一致的广告体验,对比两拨人的广告CTR (这个阶段采用BB也可行)

这里涉及到一个问题,用户对广告的blindness程度是受新策略作用时长影响的,这种影响可能需要数个月才能收敛,作者想去量化这种收敛后的长期影响,文中提出了2个方法,一个是用指数函数去fit CTR衰减曲线,另一个是用机器学习模型去预测(使用短期的CTR变化),作者提到google在过去几年累积了上百个广告blindness相关的样本,可以用作有监督学习。

我们在滴滴也犯过优化与长期目标矛盾的短期目标的错误,这里就不细讲了。

3. 统一的一站式实验平台

公司内部需要有一套统一的一站式实验平台,按照做实验的顺序包括:较完整指标库、实验管理、新建实验、流量管理与冲突检测、实验上线、实时监控报警、查看实验结果等。几个要点如下:

  1. 正确/权威/完整/统一的指标库:每个实验都有自己的一级二级指标,全局统一且正确的指标非常关键,每次创建实验只需要从指标库中勾选需要观察的指标即可
  2. 全局流量管理:流量划分收敛到平台(避免由于未经协调不同的小组创建了同一份流量上创建了冲突的实验),且可以设计更高效的流量划分方案,比如Google的支持多层正交实验的平台【2】
  3. 实验管理/检查/分享:所有的实验及配置都可在平台上清晰地查看,有很多好处:比如每个人都有机会了解正在执行的实验,查看实验结果和结论,专业的同学可以帮忙检查实验的配置
  4. 创建实验无需开发,产品和运营同学也可以操作上线实验
  5. 实时监控及时发现问题:实验创建过程中可以配置任意metric的预期range,一旦在线上超过range自动发报警

Google这篇文章【2】提出了支持不同实验在同一个domain的不同layer上overlapping的实验平台架构,值得一看。

4. 实验的评审和分享

创建一个公正的实验并产出可靠的结论是非常不容易的事情,在目标设定、指标选取、分流方案、外部因素考虑、置信度等任意一个方面出错都可能导致产出误导的结论。所以有一个实验review或者评审的环节就很有帮助了(文章【2】中也提到google有这样的实验委员会)。

除了把控实验的指标,分享&讨论有趣的实验有助于stand on each others‘ shoulders,这个可以通过wiki、邮件、或者在实验平台的相关页面分享给大家。

Reference

  1. Focusing on the Long-term: It’s Good for Users and Business KDD2015
  2. Overlapping Experiment Infrastructure: More, Better, Faster Experimentation KDD2010
  3. Online Experimentation at Microsoft 2009

Comments