假设我有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. /usr/bin/ld: crti.o: No such file: No such file or directory

    Problem : You are running a 64-bit linux system and trying to compile a 32-bit application and you g ...

  2. set /p= 详解

    在批处理中回显信息有两个命令,echo和set /p=<nul,它们的共同点在于都是对程序执行信息的屏幕输出,区别在于echo是换行输出,而set /p=<nul是不换行追回输出,这样说大 ...

  3. [BZOJ1996] chorus合唱队

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT 区间$dp$,首先每个点被放入队伍时队 ...

  4. 什么是浮动IP

    源地址:https://www.1and1.com/digitalguide/server/know-how/what-is-a-floating-ip/ What is a floating IP? ...

  5. Linux 下部署Django项目

    Linux 下部署Django项目   说明:本文所使用的环境为CentOS 6+Python2.7+Django1.11 安装Django.Nginx和uWSGI 1.确定已经安装了2.7版本的Py ...

  6. AVL树 - 学习笔记

    2017-08-29 14:35:55 writer:pprp AVL树就是带有平衡条件的二叉查找树.每个节点的左子树和右子树高度相差最多为1的二叉查找树 空树的高度定为-1 对树的修正称为旋转 对内 ...

  7. Codeforces Round #365 (Div. 2) B - Mishka and trip

    http://codeforces.com/contest/703/problem/B 题意: 每个点都有一个值,每条边的权值为这两个点相乘.1~n成环.现在有k个城市,城市与其他所有点都相连,计算出 ...

  8. Mysql uploader File

    前几天和哥们做一次渗透测试,内网情况.防护相当严格. 内网不允许访问DMZ,DMZ不允许访问内网,除了服务端口,比如80,3306. 经过长时间的分析,就发现本机连接了内网的一个MYQL,发现WEB开 ...

  9. 理解多线程管理类 CWorkQueue

    有些人会觉得多线程无非是,有多少任务就启动多少线程,CreadThread,执行完了自己结束就释放资源了,其实不然.多线程是需要管理的,线程的启动.执行.等待和结束都需要管理,线程间如何通信,如何共享 ...

  10. Spring的注解配置与XML配置之间的比较

    注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作. 如:使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...