在多臂老虎机(multi-armed bandit,MAB)问题(见图 2-1)中,有一个拥有 根拉杆的老虎机,拉动每一根拉杆都对应一个关于奖励的概率分布 。我们每次拉动其中一根拉杆,就可以从该拉杆对应的奖励概率分布中获得一个奖励 。我们在各根拉杆的奖励概率分布未知的情况下,从头开始尝试,目标是在操作 次拉杆后获得尽可能高的累积奖励。由于奖励的概率分布是未知的,因此我们需要在“探索拉杆的获奖概率”和“根据经验选择获奖最多的拉杆”中进行权衡。“采用怎样的操作策略才能使获得的累积奖励最高”便是多臂老虎机问题。如果是你,会怎么做呢?

图2-1 多臂老虎机
2.2.2 形式化描述
多臂老虎机问题可以表示为一个元组 ,其中:

为动作集合,其中一个动作表示拉动一个拉杆。若多臂老虎机一共有根拉杆,那动作空间就是集合,我们用 表示任意一个动作;
为奖励概率分布,拉动每一根拉杆的动作都对应一个奖励概率分布,不同拉杆的奖励分布通常是不同的。
假设每个时间步只能拉动一个拉杆,多臂老虎机的目标为最大化一段时间步内累积的奖励: 。其中表示在第时间步拉动某一拉杆的动作,表示动作获得的奖励。

2.2.3 累积懊悔
对于每一个动作,我们定义其期望奖励为。于是,至少存在一根拉杆,它的期望奖励不小于拉动其他任意一根拉杆,我们将该最优期望奖励表示为 。为了更加直观、方便地观察拉动一根拉杆的期望奖励离最优拉杆期望奖励的差距,我们引入懊悔(regret)概念。懊悔定义为拉动当前拉杆的动作与最优拉杆的期望奖励差,即 。累积懊悔(cumulative regret)即操作 次拉杆后累积的懊悔总量,对于一次完整的步决策,累积懊悔为 。MAB 问题的目标为最大化累积奖励,等价于最小化累积懊悔。

2.2.4 估计期望奖励
为了知道拉动哪一根拉杆能获得更高的奖励,我们需要估计拉动这根拉杆的期望奖励。由于只拉动一次拉杆获得的奖励存在随机性,所以需要多次拉动一根拉杆,然后计算得到的多次奖励的期望,其算法流程如下所示。

对于,初始化计数器 和期望奖励估值
for do
选取某根拉杆,该动作记为
得到奖励
更新计数器:
更新期望奖励估值:
end for
以上 for 循环中的第四步如此更新估值,是因为这样可以进行增量式的期望更新,公式如下。

如果将所有数求和再除以次数,其缺点是每次更新的时间复杂度和空间复杂度均为 。而采用增量式更新,时间复杂度和空间复杂度均为 。

下面我们编写代码来实现一个拉杆数为 10 的多臂老虎机。其中拉动每根拉杆的奖励服从伯努利分布(Bernoulli distribution),即每次拉下拉杆有的概率获得的奖励为 1,有的概率获得的奖励为 0。奖励为 1 代表获奖,奖励为 0 代表没有获奖。

导入需要使用的库,其中numpy是支持数组和矩阵运算的科学计算库,而matplotlib是绘图库

import numpy as np
import matplotlib.pyplot as plt

class BernoulliBandit:
“”" 伯努利多臂老虎机,输入K表示拉杆个数 “”"
def init(self, K):
self.probs = np.random.uniform(size=K) # 随机生成K个0~1的数,作为拉动每根拉杆的获奖
# 概率
self.best_idx = np.argmax(self.probs) # 获奖概率最大的拉杆
self.best_prob = self.probs[self.best_idx] # 最大的获奖概率
self.K = K

def step(self, k):# 当玩家选择了k号拉杆后,根据拉动该老虎机的k号拉杆获得奖励的概率返回1(获奖)或0(未# 获奖)if np.random.rand() < self.probs[k]:return 1else:return 0

np.random.seed(1) # 设定随机种子,使实验具有可重复性
K = 10
bandit_10_arm = BernoulliBandit(K)
print(“随机生成了一个%d臂伯努利老虎机” % K)
print(“获奖概率最大的拉杆为%d号,其获奖概率为%.4f” %
(bandit_10_arm.best_idx, bandit_10_arm.best_prob))
随机生成了一个10臂伯努利老虎机
获奖概率最大的拉杆为1号,其获奖概率为0.7203
接下来我们用一个 Solver 基础类来实现上述的多臂老虎机的求解方案。根据前文的算法流程,我们需要实现下列函数功能:根据策略选择动作、根据动作获取奖励、更新期望奖励估值、更新累积懊悔和计数。在下面的 MAB 算法基本框架中,我们将根据策略选择动作、根据动作获取奖励和更新期望奖励估值放在 run_one_step() 函数中,由每个继承 Solver 类的策略具体实现。而更新累积懊悔和计数则直接放在主循环 run() 中。

class Solver:
“”" 多臂老虎机算法基本框架 “”"
def init(self, bandit):
self.bandit = bandit
self.counts = np.zeros(self.bandit.K) # 每根拉杆的尝试次数
self.regret = 0. # 当前步的累积懊悔
self.actions = [] # 维护一个列表,记录每一步的动作
self.regrets = [] # 维护一个列表,记录每一步的累积懊悔

def update_regret(self, k):# 计算累积懊悔并保存,k为本次动作选择的拉杆的编号self.regret += self.bandit.best_prob - self.bandit.probs[k]self.regrets.append(self.regret)def run_one_step(self):# 返回当前动作选择哪一根拉杆,由每个具体的策略实现raise NotImplementedErrordef run(self, num_steps):# 运行一定次数,num_steps为总运行次数for _ in range(num_steps):k = self.run_one_step()self.counts[k] += 1self.actions.append(k)self.update_regret(k)

2.3 探索与利用的平衡
在 2.2 节的算法框架中,还没有一个策略告诉我们应该采取哪个动作,即拉动哪根拉杆,所以接下来我们将学习如何设计一个策略。例如,一个最简单的策略就是一直采取第一个动作,但这就非常依赖运气的好坏。如果运气绝佳,可能拉动的刚好是能获得最大期望奖励的拉杆,即最优拉杆;但如果运气很糟糕,获得的就有可能是最小的期望奖励。在多臂老虎机问题中,一个经典的问题就是探索与利用的平衡问题。探索(exploration)是指尝试拉动更多可能的拉杆,这根拉杆不一定会获得最大的奖励,但这种方案能够摸清楚所有拉杆的获奖情况。例如,对于一个 10 臂老虎机,我们要把所有的拉杆都拉动一下才知道哪根拉杆可能获得最大的奖励。利用(exploitation)是指拉动已知期望奖励最大的那根拉杆,由于已知的信息仅仅来自有限次的交互观测,所以当前的最优拉杆不一定是全局最优的。例如,对于一个 10 臂老虎机,我们只拉动过其中 3 根拉杆,接下来就一直拉动这 3 根拉杆中期望奖励最大的那根拉杆,但很有可能期望奖励最大的拉杆在剩下的 7 根当中,即使我们对 10 根拉杆各自都尝试了 20 次,发现 5 号拉杆的经验期望奖励是最高的,但仍然存在着微小的概率—另一根 6 号拉杆的真实期望奖励是比 5 号拉杆更高的。

于是在多臂老虎机问题中,设计策略时就需要平衡探索和利用的次数,使得累积奖励最大化。一个比较常用的思路是在开始时做比较多的探索,在对每根拉杆都有比较准确的估计后,再进行利用。目前已有一些比较经典的算法来解决这个问题,例如-贪婪算法、上置信界算法和汤普森采样算法等,我们接下来将分别介绍这几种算法。

强化学习——day12 多臂老虎机问题MAB相关推荐

  1. ML之RL:基于MovieLens电影评分数据集利用强化学习算法(多臂老虎机+EpsilonGreedy策略)实现对用户进行Top电影推荐案例

    ML之RL:基于MovieLens电影评分数据集利用强化学习算法(多臂老虎机+EpsilonGreedy策略)实现对用户进行Top电影推荐案例 目录 基于MovieLens电影评分数据集利用强化学习算 ...

  2. 强化学习——day31 多臂老虎机MAB的代码实现(Python)

    多臂老虎机MAB的代码实现 2.3 算法基本框架搭建 2.4 epsilon贪心算法 2.4.1 参数为0.01的绘图 2.4.2 不同的参数 2.4.3 值随时间衰减的 epsilon-贪婪算法 2 ...

  3. 【科普】强化学习之多臂老虎机问题(bandit算法:softmax,random,UCB)

    本博客上的文章分为两类:一类是科普性文章,以通俗易懂的语言风格介绍专业性的概念及其应用场景(公式极少或没有),适合入门阶段.另一类是专业性文章,在科普阶段上做出详细的专业性数学推导,深刻理解其概念的内 ...

  4. 求助-强化学习基础-K-摇臂老虎机Python

    按照周志华西瓜书第16章K-摇臂赌博机的伪码编的程序: # -*- coding: utf-8 -*- """ e贪心和Softmax 2-摇臂赌博机 摇臂1:0.4概率 ...

  5. 【强化学习】多臂老虎机——E_greedy、UCB、Gradient Bandit 算法 代码实现

    多臂老虎机 import numpy as np import matplotlib.pyplot as pltclass E_greedy:def __init__(self,arm_num=10, ...

  6. 强化学习之多臂老虎机(Multi-Armed-Bandit)问题

    一.问题背景 假设有一个老虎机有 nnn 个握把,每个握把 i" role="presentation" style="position: relative;& ...

  7. 【强化学习与机器人控制论文 1】基于深度强化学习的机械臂避障

    基于深度强化学习的机械臂避障 1. 引言 2. 论文解读 2.1 背景 2.2 将NAF算法用在机器人避障中 3. 总结 1. 引言 本文介绍一篇2018年发表在 European Control C ...

  8. 利用深度强化学习训练机械臂环境

    训练环境 使用Movan写的机械臂环境:https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master ...

  9. 强化学习UR机械臂仿真环境搭建(一) - 为UR3机械臂添加robotiq ft300力传感器

    为UR3机械臂添加robotiq ft300力传感器 ```建议参考这篇```,[ur机械臂 + robotiq gripper + robotiq ft sensor + gazebo + 连接真实 ...

最新文章

  1. js php 实现日历签到_PHP 可能在未来十年内消失?
  2. vaniglia 源码学习 (六)
  3. 一些oj的返回结果:通过结果找错误,debug。
  4. 异常检测时间序列_时间序列的无监督异常检测
  5. Jmeter 生成HTML性能测试报告
  6. VIOS 的一些常用命令
  7. python re 模块
  8. 【Flask】flask不能访问静态文件问题
  9. HDU 1527 取石子游戏
  10. DataSet自定义添加table并添加数据
  11. Java货币金额转换为大写形式
  12. Ubuntu联网图标消失
  13. python跳一跳编程构造_Python玩“跳一跳” iOS+Win 硬件实现
  14. CSS width中的max-content,min-content,fit-content的区别
  15. opencv需要安装mysql吗_OpenCV2.4.3的新特征以及安装方法
  16. 根据身份证号和社会保险号码查询不出您的医保信息 请核实后重新填写
  17. KDD 2020(五) | 基于多源异构信息整合的视频标题生成模型(作者带你读论文)...
  18. PhotoSwipe简介-专为移动触摸设备设计的相册/画廊.兼容所有iPhone、iPad、黑莓6+,以及桌面浏览器.底层实现基于HTML/CSS/JavaScript,是一款免费开源的相册产品
  19. silk 编解码器下载
  20. 《王总大气-Java web项目通用分页标签》

热门文章

  1. 人工智能的发展,主要经历哪几个阶段?
  2. ITSM软件与工单系统的区别是什么?
  3. uWSGI学习笔记3——使用uWSGI部署Flask应用
  4. php怎么设置段落之间的距离,css如何设置段落间距?margin 属性设置段落间距(代码实例)...
  5. LabVIEW以编程方式启用IEPE激励
  6. 企业微信可以取消实名认证吗?如何操作?
  7. 714. 买卖股票的最佳时机含手续费(CPP)
  8. 前端学习-品优购实践
  9. 步进电机stepmotor
  10. 自动驾驶地图数据传输协议ADASISv3介绍