9月15日FMI-2018人工智能与大数据高峰论坛圆满落幕,猎聘网首席数据科学家单艺就A/B实验的基本概念、A/B实验的成本问题、开源的A/B实验工具Macaw以及基于强化学习的A/B实验自动化四个方面的内容进行了深入的分享。
猎聘网首席数据科学家单艺
首先感谢FMI的邀请,今天很荣幸有这样一个机会,跟大家交流我们最近开源的工具,Macaw,专门支持大规模在线A/B实验。我主要会讲一下它的原理和基本使用。先做一个简单的个人介绍,我自己主要做机器学习和数据挖掘,现在在负责猎聘的AI和大数据技术研发。今天我的报告分五个部分,第一部分主要讲一下A/B实验的基本概念,然后讲一下A/B实验在现实中遇到哪些问题,第三,介绍一下开源的工具Macaw,后面讲一下A/B实验中基于强化学习的原理和使用,最后是总结。
这两个页面是我们在猎聘做的很重要的A/B实验。这个A/B实验看上去很简单,是我们的用户注册页面。我们在互联网网站上和搜索引擎上购买各种各样的广告,吸引用户注册。因为用户是我们最核心的资产,我们在上面投入非常大的资源,包括资金去购买这些流量,这些流量来了以后要通过这么一个页面。这个页面非常重要。这是我们做过的两个版本,这两个版本看着挺像的,右边是注册,左边是不同的在我们企业上的招聘的情况,证明猎聘上有很多很好的职位,值得你试一试。这两个页面看着没有太大的区别,但是注册转化率有明显的区别。
我们通过优化这个页面使得我们注册成本明显下降。而这里面的方法是不断做A/B实验。台下的朋友中有了解A/B实验的请举手。看来A/B实验没有得到大规模普及,但是它是非常有价值的。
我介绍一下A/B实验的基本概念,A/B实验的来源是统计学里做因果关系的研究。世界上有很多东西是有关联的,但不是有因果关系的,我们要确定因果关系,最常用的方法就是A/B实验,上面这个用户是A版本,是老的版本,我们把一部分用户继续使用现有的版本,这部分叫Control,对照组,没有什么变化的,我们把另一半的用户试用B版本,这个叫实验组,这两个版本的用户是随机挑选出来的,保证这两个用户群是可比同质的。我们衡量的效果是转化率,下面的新版本要好,上面的旧版本只有30%,上面有60%。转化率在不同应用场景里目标不一样,他有一个通用的名称叫OEC(Overall Evaluation Criterion),OEC是要跟业务方达成一致的目标,我们最主要的目标是什么,最核心的目标是什么,在注册页是注册转化率,这是比较浅层的,如果看长期的需要看一下注册用户带来的价值是多少,比如带来多少订单,LTV是多少,这些是需要跟业务方达成一致。
这个听起来很简单,但是要达成一致是不容易的,因为业务方常常有多个目标,不同的业务团队有不同的目标。拿猎聘来讲,有时候业务方说就刚才那个页面你多注册,注册的人越多越好,转化率越高越好,但是企业产品团队里要的是我想要的人,比如我招一个工程师,你来了一堆产品经理,用这个页面注册,对于我们的招聘网价值是有限的,甚至没有用。所以需要跟各个业务方达成一致,确认最终衡量页面成功的标准是什么。这是在实际工作中需要注意的。
做完了这个之后放两个版本上去,让实验跑起来,三天以后看一下结果,哪个OEC结果好用哪个。但这是一个错误的做法。这个时候就需要有统计背景的分析师或者专门的统计学家过来做基于假设检验的分析。这里面有一张经典的图,用来做A/B测试结果统计分析。这个图里有两部分曲线,左边CRA是A版本假设的转化率,2%,B是新版本的,转化率是2.12%,我们是不是可以说B比A好。不能简单这么说,因为这两个值都是随机变量,你可能今天看到2.0,明天看到2.1,这边是2.12,明天是2.0,甚至1.9。怎么样从随机现象里找到真实可靠的结论,这个要靠做统计分析,统计里的假设检验分析。
这里要关注几个重要的值,第一,算它的提升多少,我做了一个新版本,它给我带来多少提升,然后关注P Value。假设原来版本并没有实质改变的前提下,我们观察到2.12的概率可能性多少,如果可能性很小,说明我们之前的假设是错的,这时候应该拒绝新版本跟原来的版本没有本质区别,那就是说我们认为它比原来的版本不同,在这个情况下表现出的结果高,就是我们会认为B版本比A版本要优,要更好一些。另外要注意左边那个Observed Power。超过这个阈值之后,我们才认为,这个B版本是很大可能比A好。我们算出来P Value是0.45,如果是5%的一类错误,这个已经通过了检验,我们认为B版本的确有改进。
没有经验的产品经理会犯错误:上线一两天,他只要看到一个新版本比旧版本好,他做的东西有成绩出来了,很容易就把这个数据发出去了。再过了几天发现这个指标掉下来了,他觉得很恼火:为什么是这样的?因为他没有受过统计学的训练。
还有一个关键的点,我们判断P Value是多少的时候,经常用一个统计量是Z-Score。我要提醒的是为了检测的灵敏度,标准误要小。比较小的标准误则要求样本量要比较大,标准误与样本量的平方根成反比。因为版本不断迭代,优化空间越来越小,优化空间越来越小,他会要求样本量成平方关系的增长。所以这个时候对于很多网站是一个考验,流量没有那么大,怎么有效的做实验。比如一天只有几千个访客,可能达不到这个标准,可能要很长的时间才能达到最小的样本量的要求。
这个时候要想办法充分利用流量,这也是我们自己开发A/B测试系统的主要原因。我在雅虎工作的时候,每天有很多实验在跑,为了检测这么小的差异,我们对于样本量的要求很大,即使一天有几亿访客也不够用,一定要想办法合理的分配流量才能做好这个实验。
为什么A/B实验不是所有人都在用?第一,开发成本,做A/B实验至少两个版本,工程师多开发一个版本,设计多开发一个版本,他们就不乐意了。第二,实验的上下线,这是很麻烦的事情,如果这个实验很差,可能第二天就要下掉,因为有一个注册页面上了一个版本很糟糕,第二天业务完全不干了,不要再做实验了,这个太差了,不用检测了。经常来回的上下线折腾。前面讲到流量是很宝贵的,怎么合理方便的分配流量,可能我想给这个实验多分点流量,可能之前得到的量比较少,这个分配也是需要做工作的。还有一个,风险控制,如果上来一个版本,这个版本有Bug了,或者就是效果不好,我不能让他消耗50%的流量,这个样明显的损失是不行的。最后需要不断的迭代优化,不断地做实验。真正数据驱动的产品需要不断的用数据研究分析产品怎么样做的更好,是不断的优化。所有这些增加了很多工作,的确有比较高的成本。
还有一个,文化上还有一个挑战,很多公司里做决策的领导认为自己是最牛X的,我的想法最重要,我的洞察,我的直觉非常的牛逼,非常的好。你要上A/B实验他还觉得你多此一举,这也是A/B在很多地方没有用起来的原因。这在英文里有一个名字叫HIPPOS,赚钱最多的人那个观念可能压过你的A/B实验。有时候我们要绕着走。
但是我们想不断的提升,就需要不断的做实验做优化,所以需要做一些事情让做实验变的更容易一点。因为猎聘很多关键的数据驱动的产品,比如给求职者推职位,给猎头推简历。这些产品的形态比较稳定,我们做的是不断的优化算法,优化界面。这个时候需要大量做实验,为了提高做实验的效率,减少做实验的错误,我们开发了一个系统,Macaw,它实现了几个关键的点。注意的是它不是一个完整的实验+分析的平台,这个太复杂了,尤其后端做分析,往往把数据取下来由分析师产品经理自己做,也有报表系统的。但是我们这次开源的技术包括四大块:流量随机化,通过算法实现随机化抽样;然后分层分域,怎么充分运用流量;还有配置管理,做实验的时候怎么做实验的上下线,怎么调配它的资源分布;最后,我们有时候不想自己手动调,由算法帮我们调。
前三部分在很多大公司里比较常见,最后一部分,我目前看到Macaw是开源的A/B实验系统里唯一独有自动分配的方法。首先讲一下应用的场景,也是流量分配的基本概念。你可以看到整个用户在上面进来,有不同的层,第一层是UI,接下来是做推荐系统排序的那一层,最底下一层是做基础策略,做召回的一层。系统由不同层组成,不同层没有直接关联关系,每一个层都有不同的方案策略。不同的策略,他们之间必须相互分割,不可能有一个用户在某一层里既通过A策略也通过B策略,这是不行的。这里面有一层一层,我们还会把用户做一些分割,根据某些条件做分割,纵向的分割叫域,比如北上广深一线用户放在一起做实验,还可以指定一些用户,比如特殊用户不让他参加某些实验。
以前如果做这样的工作挺麻烦的,一个公司里有不同的应用,这个应用要自己实现一套逻辑,显然是不划算的。用了我们这个库后连产品经理都可以做。例如,我们把流量分成一千个桶,随机分配的时候,用户的ID进来,他会随机散列到一千个桶中。接下来定义不同的种类,然后定义不同的策略,某一个用户进入这个种类,比如他的积分小于三千的进入这个种类,然后再一层一层的定义,比如第一层做几个实验,占多少流量,占多少份,他的一些参数是什么,第二层是什么样子,这样把这个文件写好了,由A/B测试框架读取,然后就生效了,就这么简单。
如果系统是分布式的,我们可以把配置放在ZooKeeper里面,通过客户端可以不断的得到新的更新。像上面的实验,在中央控制的界面上把配置更新,所有服务器几秒钟之内拿到新的配置。接下来通过这个类把不同的配置,每一层的配置全部放进来,当一个请求进来,一个用户过来我们通过下面简单的调用,先把这个Policy Model调起来,把用户ID一传,知道哪一层,知道当前层的策略,然后把流量分配,分配完了之后根据策略ID,知道相应的代码就可以了。
刚才的Macaw通过配置文件实现了流量的随机化,流量分层分域的分配,配置的管理都可以完成。有时候我们会说这个流量分配要怎么做,比如我同事有几十个实验,以前做广告的时候同时上几十个实验,这个流量怎么调,有时候是比较靠经验的方式,也比较费时间。要定期看一下结果,把好的版本都给他流量,其余版本还不确定,流量的变化也会随着季节变,比如今天是这样的,过了两周就变了,结果不一样了。这种手动的比较麻烦,比如过国庆节的时候我不希望再手动的调流量分配的参数,我们就想办法怎么自动做这件事,我们想到了用强化学习里的算法,多臂老虎机的算法。
强化学习是机器学习中的分支,60年代就有人开始研究,但是它一直不温不火的,直到最近阿尔法Go通过强化学习,还有AI Agent打魔兽的工作得到很大的成功,它又重新热起来了。传统的机器学习中,监督式的学习需要获得带标注的数据。但是强化学习的想法是,我是一个小老鼠,被丢到一个很大的迷宫,这个迷宫里什么都没有,除了一些奶酪,吃到就可以活命,甚至还有一个陷井。在这个残酷的环境中,老鼠要找到这个奶酪首先要探索,要猜这个奶酪在什么地方,他不断的探索学习,他可能零星的碰到一些奶酪,发现奶酪分布有一些规律,往左拐是对的,还是往右拐是对的,这样一个机制告诉他是否有一个方法策略或者思路。通过这个方式学出来一个模型,做我未来最有利的行动,这是强化学习基本的思想。我们在做自动化管理的时候也是这个思路,不知道策略哪一个好,我要试,试完了之后猜哪一个策略对我最优,我要尽可能的利用他,这是基本的自动化管理的思路。
具体来讲,我们做了三种算法,比如我们同时上线了M个策略,就像我去一个赌场,这个赌场有一台老虎机,每个老虎机产生的奖励有一定的概率,有的老虎机得奖概率多一点,另外的少一点。这个老虎机是非平稳的,赌场的人可能在后面调。我希望尽可能的多赢钱,累计到最大的奖励,因为我每次要花成本,我希望失败的次数越少越好,这是一个很经典的,也是比较简单的强化学习的问题。解决这个问题最简单的算法是ϵ-Greedy:我现在还不知道,我先试,一共有100个币,拿出5个去试,我试一下不同的老虎机,看哪个赢钱最多的,接下来把所有的赌注都压在这个上面,就像做实验的时候把5%的做实验,然后找出最优的,把剩下的流量都压在最优上,这是一个非常简单的方法,但是很有效。
因为我们专门做实验,一千个流量用完了,下一个又拿出50个做实验,我发现以前选的不是最优的,可能通过这一轮找到最优的,利用最优的方案帮我挣得最大的利益,这是很简单的思路。
接下来一个方案要深入一些,既然每一个方案的回报是随机变量,那我可以通过历史数据找到它的均值和置信区间,就像这里面ABCD四个方块,纵轴是它的转化率的度量,A的均值是最高的。我们采用一个比较乐观的策略,我要关注最有可能给我带来最大收益的方案,这个时候应该选择C,因为C的方差比较大,不确定性高一些,它的上限比较高。通过搜集历史数据,算它的均值,方差,假设它是一个正态分布的,我可以用它的正态分布的两倍方差算出来最乐观的估计,这个时候算法会选择这个C方案。这是它的一个思路。他不会傻傻的做实验,他会做统计的计算,做出最乐观的选择。
UCB是很好用的方案,但是对系统有要求。如果没有流式计算,或者不能每个小时更新一下统计,可能我只能一天算一次。假如运气不好,B方案的情况不太好,B方案就出不来,老选C方案,而这不是最优的。那怎么表现得更聪明一点,不用等数据的完全更新?有人提出了这个方法,Thompson Sampling,这个算法在30年代就有人提出了,机器学习没有出现之前就有人研究到这个问题。这是Bayes的方法。假设说这边有三台老虎机,开始我的信息比较少,只能做很简单的分布,我用假设的均匀分布随机采样,按照这个分布抛一个随机数出来,即在这个分布假设下你得到的收益是多少。根据这一轮选取最大的做下一轮的实验。比如ABC三个,这一次A分布里采样的值最大,我选A,有可能是B就直接选B。然后我会得到更多的信息,因为我做了实验了。比如A方案出去做实验了,效果怎么样,很快就知道了,拿回来信息更新一下,我们就得到新的分布,这个新的分布因为有新的数据,比原来更加准确的刻画不同实验的效果,接下来大家再来随机的抽一把,看谁在新的分布底下抽的收益最大,再选一个,这样不断迭代下去。
你会看到随着历史数据的收集,原来什么值都有可能,慢慢的像蓝色的收益很高,方差也很小,说明他是一个很稳定的,不断带来高产出的方案,因为每次他的均值大方差小,所以每次抽样的时候他常常是最大的,系统会自然倾向于选择最后这个蓝色的方案。通过这样一个方法,我们不断的更新概率模型,选择新的方案。通过这样一个方式,我们可以让系统自动进行流量的分配。
这些算法不是很复杂,但实现起来还是要写一些代码。我们在系统里直接支持了。我们要根据不同的场景选择不同的强化学习的方法,我们用的最多的还是Thompson Sampling,因为它对系统要求没有那么严格。系统如果能够快速更新,我们的统计是可能几秒钟以后就出现了,我们就上UCB,精确度可能高一些。前几年,大概在2013年2014年的时候,美国做这方面的人曾经有一个大的论战,Bandit算法到底是不是比A/B的好。A/B有比较好的透明度,可以比较好的控制,如果想快速得到一些结论,比如你有两个方案,快速可以统计出哪个方案是好的,然后用好的方案就行了。像基于这个算法来讲,风险小一点,但是要用好,统计分析复杂一些。根据自己的业务需而和算法知识掌握能力选择,两个方案都可以用。
我们在这个系统里通过简单的配置,把域设置好,初始化一些参数这个系统就可以跑起来,我们再更新这个参数,他不断根据新的信息做自动化的调配,这是他的用法,比较简单。
这个系统我们自己用的还是不错的,也做了很多打磨。三个月前把它开源了,这是我们开源的网址,总体来讲,这是一个简单可用的实验管理工具,能够帮助大家更好的优化自己的产品,给用户更好的体验,把大家的工作业绩做的更好,今天的报告就到这里谢谢大家。
| 留言与评论(共有 0 条评论) |