假设我有5枚硬币,都是正反面不均匀的。我们玩一个游戏,每次你可以选择其中一枚硬币掷出,如果掷出正面,你将得到一百块奖励。掷硬币的次数有限(比如10000次),显然,如果要拿到最多的利益,你要做的就是尽快找出“正面概率最大”的硬币,然后就拿它赚钱了。

这个问题看起来很数学化,其实它在我们的生活中经常遇见。比如我们现在有很多在线场景,遇到一个相同的问题:一个平台这么多信息,该展示什么给用户,才能有最好的收益(比如点击率)?

Google作为最大的搜索广告公司,在用户搜索时该展示什么广告;Facebook作为社交平台,当用户好友过载的时候,该怎么组织好友的说说(把你最感兴趣的放前面);Taobao有海量的商品池子,该如何捞取用户最容易剁手的商品展示出来?

一切通过数据收集而得到的概率预估任务,都能通过Bandit系列算法来进行在线优化。这里的“在线”,指的不是互联网意义上的线上,而是只算法模型参数根据观察数据不断演变。

Bandit算法的创造其实来源于人类的经验,这个算法框架包含两个部分,一是探索未知(explore),二是利用已知(exploit)。一部分精力做探索(不考虑曾经的经验),一部分精力做采集(利用已知的最好策略)。

How Bandit

首先来看看Bandit的概率原理,我们希望知道每一个硬币“正面”的概率 pi" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">pipi 。事实上我们能观察到的,只是这个硬币正面的频率

μi=正面次数全部尝试次数" role="presentation" style="display: inline; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">μi=正面次数全部尝试次数μi=正面次数全部尝试次数

怎么利用起观察到的频率,来最好地预估真实的概率呢?下面介绍4种策略,分别是随机(Random)、简单观察(Naive)、ε-贪心法(ε-Greedy)、置信上限法(UCB)。

Random

每次随机选择一枚硬币进行投掷。如果不能胜过这个策略,就不必玩了。

Naive

先给每个硬币一定次数的尝试,比如每个硬币掷10次,根据每个硬币正面朝上的次数,选择正面频率最高的那个硬币,作为最佳策略。这也是大多人能想到的方法。

但是这个策略有几个明显问题:

  1. 10次尝试真的靠谱吗?最差的硬币也有可能在这10次内有高于最好硬币的正面次数。
  2. 假设你选到的这个硬币在投掷次数多了后发生了问题(比如掉屑),改变了其属性,导致其正面的概率大大降低,如果你还死守着它,那不是吃大亏了?(这是对变量的考虑)
  3. 就算你给一个硬币10次机会,如果硬币真的很多,比如K>100" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">K>100K>100,给每个硬币10次机会是不是也太浪费了呢?等所有硬币都尝试过,再回来“赚钱”,花儿都谢了!

ε-Greedy

有了前两个垫背,可以开始让Bandit登场了。ε-Greedy就是一种很机智的Bandit算法:它让每次机会以ε的概率去“探索”,1-ε的概率来“开发”。也即,如果一次机会落入ε中,则随机选择一个硬币来投掷,否则就选择先前探索到正面概率最大的硬币。这个策略有两个好处:

  1. 它能够应对变化,如果硬币“变质”了,它也能及时改变策略。
  2. ε-Greedy机制让玩的过程更有趣,有时“探索”,有时“赚钱”。

在此基础上,又能引申出很多值得研究的问题,比如ε应该如何设定呢?它应不应该随着时间而变?因为随着探索次数的增多,好的选择自然浮现得比较明显了。ε大则使得模型有更大的灵活性(能更快的探索到未知,适应变化),ε小则会有更好的稳定性(有更多机会去“开发”)。

UCB

在统计学中,对于一个未知量的估计,总能找到一种量化其置信度的方法。最普遍的分布正态分布(或曰高斯分布)N(μ,δ)" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">N(μ,δ)N(μ,δ),其中的E就是估计量的期望,而δ" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">δδ则表示其不确定性(δ" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">δδ越大则表示越不可信)。比如你掷一个标准的6面色子,它的平均值是3.5,而如果你只掷一次,比如说到2,那你对平均值的估计只能是2,但是这个置信度应该很低,我们可以知道,这个色子的预估平均值是2,而以95%的置信区间在[1.4,5.2]。

UCB(Upper Confidence Bound - 置信上限)就是以均值的置信上限为来代表它的预估值:

μi^=μi^+21ni" role="presentation" style="display: inline; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">μiˆ=μiˆ+21ni−−−√μi^=μi^+21ni

上面是一个例子,其中μi" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">μiμi是对期望的预估,ni" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">nini是尝试次数,可以看到对i" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">ii的尝试越多,其预估值与置信上限的差值就越小。也就是越有置信度。

这个策略的好处是,能让没有机会尝试的硬币得到更多尝试的机会,是骡子是马拉出来溜溜!将整个探索+开发的过程融合到一个公式里面,很完美!

模拟结果

将这几个策略做一下模拟,取K=5个硬币,每次10000轮投掷机会,跑100次取平均。得到结果如下:

  1. 随机:每次随机取一枚硬币投掷
  2. 简单观察:先给每个硬币100次机会,然后以正面概率最大的硬币为策略。
  3. ε-Greedy:取ϵ=0.01" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">ϵ=0.01ϵ=0.01进行探索,1−ε" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">1−ε1−ε进行开发。
  4. UCB1:以(1−1/t)" role="presentation" style="display: inline; line-height: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">(1−1/t)(1−1/t)的上限进行探索
  5. UCB-95%:取95%的置信区间进行探索

上图以累积后悔(Cumulative Expected Regret)来作为评估指标,横坐标是投掷次序,纵坐标是累积后悔(取对数)。后悔最小的算法最好。Regret定义如下:

RT=∑_i=1T(w_opt−wB(i))" role="presentation" style="display: inline; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">RT=∑_i=1T(w_opt−wB(i))RT=∑_i=1T(w_opt−wB(i))

可以看出,随机的效果最烂,Naive算法在前K*100轮跟随机效果一样烂(因为在收集数据,没有开始利用)。ε-Greedy的收敛效果好,但因为有那ε的浪费,到最后还是跟Naive一样浪费了很多机会。UCB的表现最好,收敛快、花费小!

这里只是模拟了固定概率下这些算法的表现,如果预估量(正面概率)是一个会变的量,这些算法的表现会重新洗牌吗?后续可以探索下!

Bandit application

说了这么多掷硬币,这个算法在真实世界有什么大展身手的地方呢?小列一些:

  • 在线排序(Online Ranking)
    • CTR预估
  • Stock Option
    • 选择最好的股票进行投资
  • A/B test
    • 快速选择好的AB版本,快速淘汰差的

附1:参考链接

Bandit:一种简单而强大的在线学习算法的更多相关文章

  1. 让AI简单且强大:深度学习引擎OneFlow技术实践

    本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...

  2. 各大公司广泛使用的在线学习算法FTRL详解

    各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...

  3. 各大公司广泛使用的在线学习算法FTRL详解 - EE_NovRain

    转载请注明本文链接:http://www.cnblogs.com/EE-NovRain/p/3810737.html 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression ...

  4. Alink漫谈(十二) :在线学习算法FTRL 之 整体设计

    Alink漫谈(十二) :在线学习算法FTRL 之 整体设计 目录 Alink漫谈(十二) :在线学习算法FTRL 之 整体设计 0x00 摘要 0x01概念 1.1 逻辑回归 1.1.1 推导过程 ...

  5. Alink漫谈(十三) :在线学习算法FTRL 之 具体实现

    Alink漫谈(十三) :在线学习算法FTRL 之 具体实现 目录 Alink漫谈(十三) :在线学习算法FTRL 之 具体实现 0x00 摘要 0x01 回顾 0x02 在线训练 2.1 预置模型 ...

  6. 广告点击率预测(CTR) —— 在线学习算法FTRL的应用

    FTRL由google工程师提出,在13的paper中给出了伪代码和实现细节,paper地址:http://www.eecs.tufts.edu/~dsculley/papers/ad-click-p ...

  7. 在线学习和在线凸优化(online learning and online convex optimization)—在线分类问题2

    紧接上文,我们讲述在线分类问题 令,为0-1损失,我们做出如下的简化假设: 学习者的目标是相对于hypotheses set: H具有low regret,其中H中的每个函数是从到{0,1}的映射,并 ...

  8. 在线优化算法 FTRL 的原理与实现

    在线学习想要解决的问题 在线学习 ( \(\it{Online \;Learning}\) ) 代表了一系列机器学习算法,特点是每来一个样本就能训练,能够根据线上反馈数据,实时快速地进行模型调整,使得 ...

  9. 在线学习和在线凸优化(online learning and online convex optimization)—在线凸优化框架3

    近年来,许多有效的在线学习算法的设计受到凸优化工具的影响. 此外,据观察,大多数先前提出的有效算法可以基于以下优雅模型联合分析: 凸集的定义: 一个向量 的Regret定义为: 如前所述,算法相对于竞 ...

随机推荐

  1. RocEDU.阅读.写作《乌合之众》(一)

    序言 作者在序言里主要论述了时代演变的内在原因,表明对群体进行研究的重要性,阐述了研究群体行为特征时的研究方法,并概述了群体的发展过程. 造成文明变革的唯一重要变化,是影响到思想.观念和信仰的变化.目 ...

  2. 4.9版本的linux内核中实时时钟芯片pt7c4338的驱动源码在哪里

    答:drivers/rtc/rtc-ds1307.c,内核配置项为CONFIG_RTC_DRV_DS1307 Location: -> Device Drivers -> Real Tim ...

  3. CSS样式 vertical-align:middle 垂直居中生效情况

    vertical-align:middle  是依赖div内子元素最高的行高来实现对某元素居中的 -------不存在浮动时可以直接生效垂直居中 HTML .box1{ display: table- ...

  4. springboot部署在云服务器上

    1.window云服务器上 在本地的SpringBoot的根目录下 mvn clean package 打包jar 在云服务上安装jdk 将jar拷贝到云服务器上 在jar包所在的相应的位置,执行ja ...

  5. Redis之基本数据类型

    Redis 基本数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). redis类型 含义 S ...

  6. 爬虫之动态HTML处理(Selenium与PhantomJS )网站模拟登录

    #coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport tim ...

  7. 4.scala中的类

    版权申明:转载请注明出处.文章来源:http://bigdataer.net/?p=269 排版乱?请移步原文获得更好的阅读体验 1.针对不同字段生成的方法 字段生成的方法备注 var/val nam ...

  8. codeforce 35C fire again

    2017-08-25 17:04:07 writer:pprp 题目描述: • Codeforces 35C Fire Again• N*M的格子,最开始有K个点 (坐标给定) 开始着火• 每一秒着火 ...

  9. vjudge-A-这是测试你会不会语言的模拟

    2017-07-14 18:13:35 writer:pprp 介绍:最基本用代码展示思想的一道题 题意如下; 他细细观察了自己的工作环境,发现整个工作室是一个N行M列的矩形布局,或者是因为屌丝的本性 ...

  10. jmeter-负载

    主: remote_hosts=10.0.70.35:1099,10.0.70.47:1099 server.rmi.localport=1099 从:  remote_hosts=10.0.70.3 ...