作者:友盟+数据科学家 杨玉莲、陆子骏

AB测试:从埋点到弃疗

AB测试弃疗第一步:

不管是使用频率学派还是贝叶斯学派的方法,我们需要决策还是要走AB测试的一整个流程,但是很多时候使用AB测试来做所有决策的机会成本太高,人力成本太高(数据科学家太贵),较差的版本带来的损失等等原因让使用AB测试做数据驱动沦为了一句口号。

AB测试弃疗第二步:

即使一个开发者下定决心走上了利用AB测试做数据驱动的道路,想要搭建一个自有的AB测试平台成本太高,而使用第三方的AB测试服务又缺少灵活的数据分析能力。

如果某个事件没有埋点的话,想要做AB测试就只能SDK重新发版了,在SDK还没有达到一定覆盖率时还是没有办法做AB测试,于是使用AB测试做产品迭代向后延期直到被忘记。AB测试弃疗。

AB测试弃疗第三步:

即使一个开发者用上了友盟+的统计SDK,科学的做了自定义埋点,科学的做了用户的分流,预估了样本数,正确的收集到了数据,正确的做了AB测试,然后发现两个版本并没有区别。或者有时甚至发现新的版本还更差(cue一下被用烂的Facebook的例子)。

作为一个运营你怎么给老板汇报你的负面结果,你作为一个技术团队的大佬怎么抉择改版的问题。AB测试弃疗。我曾经也去问过一个大佬,为什么AB测试这么成熟而有用的方法在中国还不那么普及呢?大佬的说:每一次改版/运营活动后大家都等着去邀功了,谁还想着看数据分析结果呢?

在很多次做AB测试的过程中,还有大佬问有没有迭代更快的AB测试算法呢?有没有不那么严格的AB测试呢?在运营场景的时候被问的最多的问题就是:这个活动就搞3天,你们做AB测试需要多久?你们能不能在运营活动前做AB测试?这类直击灵魂的问题。经过深入的沟通,对于这类问题的AB测试需求其实是希望能够在减少风险的情况下更快的,自动的优化方案。

AB测试疗法

对于这些问题我们有没有什么好的方法去解决呢?当然是有解法的。对于第一和第二步AB测试弃疗的原因的解法只能是进行科学化的埋点首先满足主要的统计需求,因为AB测试是建立在统计模块基础上的。对于AB测试弃疗第三步的解法就是多臂赌博机(Multi-armed bandits)。

多臂赌博机 Multi-armed bandits

那么这种可以自动优化找到最佳方案的算法到底是怎么回事呢?这种算法是如何实现更快的,自动的优化方案的选择呢?

张三在拉斯维加斯

下面我们讲一个张三去拉斯维加斯赌博的故事(毕竟统计学就是起源于赌博)。话说有一天赌徒张三带着自己的积蓄来到拉斯维加斯,想要凭借着自己黑科技眼镜和最近研究的bandits算法赢光拉斯维加斯的赌场成为赌圣。

根据他的多年赌博经验,赌场的每个老虎机的赢率是不同的,但是每个老虎机的赢率是不会变化的,根据江湖传闻这家赌场存在一个老虎机赢率大于50%,他的策略就是找到那个赢率最大的老虎机。

那么张三该如何找到那个赢面最大的老虎机呢?一个最简单的策略就是将赌场里每个老虎机都尝试一遍,然后把每个老虎机的赢率都算一遍,然后选取那个赢率最大的老虎机。这个方法类似于AB测试都是将流量平均的分给了很多个方案。

这个方法的一个明显缺点就是试错成本很高,而且最后才能发现赢率最大的老虎机。如果我们能够在尝试的过程中发现一些方案可能不是最佳,那么我们就不在那些次佳的方案上面浪费时间和精力,那么我们是不是就可以更快的,花更少的钱找到最佳方案呢?那么问题来了,我们应该如何定义哪个算法在寻找最佳方案的时候更优呢?


这里计算的就是如果知道最佳方案的赢钱数减去bandits算法在探索最佳方案的赢钱数的差。

张三的bandits算法

张三作为一个赌徒自然是知道一些bandits的算法的,那么他打算使用怎么样的策略呢?他从师傅那里学到的是Epsilon-greedy和Upper bound confidence(UCB)的方法。

Epsilon-greedy的算法就是Epsilon比例的次数选择非最佳的方案,1-Epsilon比例的次数选择当前最佳的方案。Epsilon就是需要人工选择的比例,比如10%的时候都是选择非当前最佳的方案,而90%的时候选择当前最佳的方案。

但是这个方法有一个明显的问题,师傅临行前告诉他使用这个bandits的方法可能会陷入局部的最优解很久都没有办法找到全局最优解,就是不一定能够找到那个赢率最高的老虎机。师傅千叮咛万嘱咐让他小心使用这个bandits 的方法。

于是张三就决定使用UCB这个算法来赌,UCB的算法是怎么实现的呢?

这个是每个老虎机的得分,前面一项就是这个老虎机的平均赢率,第二项是和尝试次数有关的bonus项,其中t是目前实验的次数,而T_{ij}则是这个老虎机被尝试的次数。第二项bonus前还可以有一个系数来调节bonus项的影响大小。

每次实验完成后重新计算每个老虎机的得分然后选择得分最高的那个老虎机进行下一个实验。UCB的bandits算法在足够长的时间是一定可以找到最佳方案的。一般来说UCB的算法在regret的定义下是优于Epsilon-greedy的。

李四的bandits算法

话说那边张三还有一个师兄唤做李四,早年曾经在贝老爷子(贝叶斯)门下修习过贝叶斯大法。贝叶斯大法有一个巨大的优势就是它和吸星大法一般可以利用别人修习的成果,这就是贝叶斯里面的先验分布(priors)。

李四在暗中观察着张三在老虎机上的实验并且记录下来每个老虎机的赢率。但是李四也不能等待过久,等到张三发现赢率最大的老虎机的时候他就没法靠那个老虎机赢钱了。于是李四在觉得自己积累够一定数据后下场了,他使用的是基于贝叶斯的Thompson sampling的方法。

在张三尝试的基础上,李四给了每个老虎机了一个基于Beta分布的先验概率,然后自己也开始寻找赢率最大的老虎机,他的每次实验都是基于Beta分布取到一个随机数,然后选择随机数最大的老虎机进行实验。当老虎机积累了更多的数据,Beta分布的方差也越小,每次选取的随机数也更接近于均值,而当老虎机积累了较少的数据时,Beta分布的方差也越大,每次选取的随机数也会忽大忽小。

张三师傅王五的bandit算法

张三的师傅其实也早早来到了拉斯维加斯。他通过内部情报知道其实每个老虎机的赢率是会随着很多因素变化的,比如是否是周末,这个人是男是女等等。

而张三和李四的算法都是没有考虑一些其他的外部因素的,这类考虑其他外部因素的bandits算法叫做contextual bandits。张三师傅使用的是基于UCB算法+ridge regression的LinUCB算法。

欲知张三,李四,王五到底谁最快找到了那个传说中的老虎机,还请继续往下看。

bandits和AB测试应该什么时候使用呢?

图来自于VWO的网站

bandits算法主要解决的问题是如何更快的和以更小损失的找到最佳方案。上图就是bandits在寻找最佳方案中的流量分配的优化。bandits能够实现以最小的损失寻找最佳方案。

为什么还要做AB测试呢?

首先,AB测试主要用于指导重要的商业决策/产品的版本迭代,而这个决策可能是有很多个指标共同影响的,bandits现在只能是基于单一指标的优化。当然也可以把多个指标叠加成为一个复合指标,但是bandits的优化目标就是单一的一个指标。

其次,AB测试主要适用于获得各个版本的优劣的统计置信(statistical significance)。这么说比较抽象,就是你花了时间开发出来了一个新的版本,你需要确信的知道这个版本到底有没有之前的版本好,到底好在哪里?到底是留存提升了还是用户的使用时长提升了。

这些提升和降低的知识获得是可以使用在产品之后的迭代中的,而bandits是无法帮你分析得到这些知识的。

那么什么时候应该用bandits算法呢?

  1. 当你关心的问题和张三一样只是转化率,留存率等等的单一指标时并且你不在乎数据结果的解释和分析的时候。

  2. 当你的运营活动只有短短的几天或者一天时,你没有时间等到AB测试达到统计置信(statistical significance)的时候,这就是一些大佬们和App开发者提到的更加快的AB测试吧。

  3. 还有就是如果你有一些长期需要优化的指标,而这些指标经常发生变化,那么这个也是bandits的一个重要的应用场景。

‍图来自于vwo的blog

总而言之,AB测试适合测试一些变化周期较长的变化,获得的知识应该具有泛化能力。而bandits算法适合一些变化快周期短的优化场景,获得的知识不一定具有泛化能力。

笔者的bandits使用背景

在友盟+的U-Push产品里覆盖了大量的外部用户,而大量的开发者的Push策略都是非常简单的定时广播,而个性的定制化的发送策略几乎没有(除了头条系)。即使开发者想要基于已有的工具对发送时间和发送内容进行优化,现有的标签和用户行为数据积累也不会很充分。

国内的友商们暂时还没有这个功能也是因为他们的数据量远远没有友盟+的数据覆盖度大。而美国的很多针对开发者服务的平台如Recombee,airship,Leanplum等等不仅仅实现了发送时间上的优化,并且实现了基于用户生命周期和其他标签的全链路闭环的用户促活和防流失的产品。

我们未来的工作是为了实现这个非常user-friendly的产品,而我们的起点是对发送时间的优化即LeanPlum的功能。如果我们能够在用户使用App的时候或者是接受Push消息意愿比较强的时候去发送这个消息,那么消息触达用户以后用户也更加愿意打开。这样实现了提高了用户的使用体验和更高的Push点击率的双赢局面。

友盟+的时间优化方案就是基于Thompson sampling的方法,使用Beta分布来给用户+App+时段粒度的打分。

我们发现使用Collaborative filtering能够提高那些数据里没有点击的用户的点击,而Thompson sampling则能够更好的确定那些有点击用户的最佳发送时间。

那么怎么样能够把Collaborative filtering和Thompson sampling结合在一起提高用户的Push体验和点击率将是未来探索的方向。

故事的结局

故事的最后张三,李四,王五都把积蓄都输完了,然后离开了拉斯维加斯,因为他们不知道gambler‘s ruin这个统计原理,这个故事告诉我们还是要远离赌博,小赌不怡情,大赌更伤身。

原文请戳:https://at.umtrack.com/Wnyuqm

【干货】在拉斯维加斯,程序员如何靠bandits算法干掉老虎机相关推荐

  1. 纯干货:优秀程序员和普通程序员的差距就在这7个关键点

    最近好几个读者问:如何成为牛逼的程序员?编码能力如何成长.回答完后,有些心得也给大家分享下. 其实程序员最关键的技能远不止编码能力,架构思维.底层知识的深度等等,同样很重要. 程序员这个行业,是一个区 ...

  2. 人工智能时代,程序员要不要精通算法?

    1.如何入门算法?需要学习哪些基础知识,请分享你的经验与建议. 入门算法其实很简单,拿生活中的很多现实问题来解决就可以了.比如商场打折问题(是打折划算还是满减划算),百钱买百鸡.猴子分桃.鸡兔同笼等有 ...

  3. 程序员是否必须会算法

    本章的标题既然是"程序员与算法",就必然要涉及一个基本问题,那就是"程序员是否必须会算法".这是一个充满争议的问题,虽然并不像"生存还是毁灭" ...

  4. php学数据结构,PHP 程序员学数据结构与算法之《栈》

    介绍 "要成高手,必练此功". 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实 ...

  5. 第 14 章 程序员常用 10 种算法

    第 14 章 程序员常用 10 种算法 1.二分查找算法 1.1.二分查找算法介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中 ...

  6. 程序员为什么要学算法?

    "程序员必须会算法 ?" 程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点. 很多人觉得像人工智能.数据搜索与挖掘这样高薪的工作才用得上算 ...

  7. 外包3年,吃透这三份Java程序员必刷的算法宝典后,已从13K涨到25K

    懂点算法,很有必要 "不学数据结构和算法,一辈子都是码畜".不管你是 Java 程序员.算法工程师.数据分析师,还是技术管理者.架构师...... 我们都有一个共同的目标,就是在技 ...

  8. 专访张俊林:十年程序员的感悟与算法之路

    专访张俊林:十年程序员的感悟与算法之路 发表于2015-10-29 02:23| 3654次阅读| 来源CSDN| 2 条评论| 作者钱曙光 社区之星专访张俊林算法机器学习 width="2 ...

  9. 程序员编程艺术(算法卷):第一章、左旋转字符串

    第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...

  10. 「干货总结」程序员必知必会的十大排序算法

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...

最新文章

  1. 2021年春季学期-信号与系统-第十一次作业参考答案-第五小题
  2. python删除排序数组中的重复项
  3. [BZOJ1419] Red is good(期望DP)
  4. leetcode93. 复原 IP 地址
  5. 记录 Annotation processing is not supported for module cycles.
  6. asp.net + ajax + sqlserver 自动补全功能,asp.net+ajax+sqlserver自动补全功能实现解析
  7. erp采购总监个人总结_《用友 ERP 培训教程:财务核算/供应链管理/物料需求计划》ERP概述 : ERP基础知识...
  8. 专题开发十二:JEECG微云快速开发平台-基础用户权限
  9. 计算机多媒体软件应用,论计算机实验多媒体软件应用
  10. 《创新者的窘境》读书笔记
  11. tarjan算法 java_Tarjan算法 割点和桥
  12. 单独计算机械台班费套什么定额,机械台班费用定额
  13. 微信公众平台开发网页开发
  14. java中控指纹仪_java 中控URU4500指纹仪开发
  15. Qt之QTreeWidget增删节点
  16. OCR文字识别工具准确获取图片文字
  17. 2020牛客暑期多校训练营(第九场)F.Groundhog Looking Dowdy
  18. 联想服务器AR系列,联想正式发布AR一体机:晨星AR
  19. 进入docker容器的方法
  20. java 微信 jssdk 分享朋友圈_JSSDK微信自定义分享朋友圈

热门文章

  1. 嵌入式系统开发必读经典书目
  2. [常用工具] 搜索引擎的常用技巧总结
  3. PTA 发布关于巴基斯坦境内允许的频段和输出功率限制新规
  4. pikachu靶场打靶分析
  5. ROS 学习踩坑笔记1-如何解决Roboware : Path is not ROS Workspace (Robo ware 无法打开workspace)
  6. 华为手机序列号前三位_华为手机SN码里隐藏的秘密,选购手机必备冷知识!
  7. mflac格式解密_mflac格式是什么意思
  8. 百度暑期前端实训DAY1心得
  9. 什么是自媒体、自媒体平台???
  10. 常见网站挂马方式 网站挂马可利用漏洞 网站加密挂马