这是我学习Reinforcement Learning的一篇记录总结,参考了这本介绍RL比较经典的Reinforcement Learning: An Introduction (Drfit) 。这本书的正文部分对理论的分析与解释做的非常详细,并且也给出了对结论详尽的解析,但是把问题的解决和实现都留到到了课后题,所以本篇文章主要侧重与对Multi-Armed Bandit问题解决算法的实现以及对实现中可能遇到的问题进行一个总结与记录。此外,如果困于书中对于理论解释的冗长,可以参考下面这两篇文章(推荐阅读顺序为:书 → 下面这两篇 → 本篇):

从Multi-arm Bandits问题分析 - RL进阶

《Reinforcement Learning》 读书笔记 2:多臂Bandit(Multi-armed Bandits)

问题分析

Multi-Armed Bandit问题是一个十分经典的强化学习(RL)问题,翻译过来为“多臂抽奖问题”。对于这个问题,我们可以将其简化为一个最优选择问题。

假设有K个选择,每个选择都会随机带来一定的收益,对每个个收益所服从的概率分布,我们可以认为是Banit一开始就设定好的。举个例子,对三臂Bandit来说,每玩一次,可以选择三个臂杆中的任意一个,那么动作集合Actions = [1, 2, 3],这里的1、2、3分别表示一号臂杆,二号臂杆和三号臂杆。掰动一号号臂杆时,获得的收益服从均匀分布U(-1, 1),也就是说收益为从-1到1的一个随机数,且收益的均值为0。那么二号臂杆和三号臂杆也同样有自己收益的概率分布,分别为正态分布N(1, 1)和均匀分布U(-2, 1)。这里所需要解决关键问题就是,如何选择动作来确保实验者能获得的收益最高。

我们可以从收益的概率分布上发现二号臂杆的收益均值最高,所以每次实验拉动二号即可,最优选择即为二号。但是对于实验者来说收益概率分布是个黑箱,并不能做出直接判断,所以我们使用RL来估计出那个最优的选择。

算法实现

这里以Sample Average Epsilon-greedy算法为例,给出RL解决Multi-Armed Bandit问题的大致框架:

1. 随机生成收益均值序列,这里我们假设所有选择对应的收益概率分布均为方差相同的正态分布,只不过各个分布的均值不一,这里使用Matlab代码来进行解释

% 10-Armed Bandit
K = 10;
AverReward = randn([1 K]); % Reward for each Action per experiment
% Reward(Action) = normrnd(AverReward(Action), 1);

  

2. 依据epsilon-greedy判断当前应当选择的动作。在每次实验开始时,随机一个大于0小于1的值,如果该值小于epsilon,则随机选择动作;如果大于,选择当前平均收益最高的那个动作。

N = 1000 % 1000 experiments

for n = 1:N
[max i] = max(Q);
if(max~=0 & rand(1) < 1 - epsilon)
Action = i;
else
Action = unidrnd(K);
end % Q is a set of records of current average reward.
% Action is in {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
% Q(1) represents current average reward for action = 1.
end

3. 使用增量形式实现更新当前平均收益Q值

N = 1000 % 1000 experiments

for n = 1:N
[max i] = max(Q);
if(max~=0 & rand(1) < 1 - epsilon)
Action = i;
else
Action = unidrnd(K);
end % Q is a set of records of current average reward.
% Action is in {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
% Q(1) represents current average reward for action = 1.
  
Reward(Action) = normrnd(AverReward(Action), 1);
N(Action) = N(Action) + 1;
Q(Action) = (Reward(Action) - Q(Action))*(1/N(Action)) + Q(Action);
end

   

评价指标

依据 Reinforcement Learning: An Introduction (Drfit)  中关于这一部分的结论分析,主要的两个评价指标是Average Reward和Optimal Action Rate。这两个指标都是用来评价不同算法的优劣程度的。这里的Average Reward和先前提到的当前收益均值是有所不同的。参照上一部分算法实现中给的例子,每次学习过程需要进行1000次实验,每次学习完成后则会得到一个最优估计值,将最优估计值Q记录下来并进行下一次学习,当进行n次学习后,评价收益均值即为这n个Q值的均值,给出Average Reward的计算方法:

需要注意的是,在计算Average Reward(AR)时,各动作的收益概率分布需要保持不变。不同的算法得到的AR值也不同,通常来说一个算法的AR值越高表明依据该算法获得的最优估计值与实际的最优值间的差距越小,简单来说就是该算法的可靠性越高。

Optimal Action Rate(OAR) 表示最佳动作选择率,当进行多次学习时,计算最优估计值与实际最优值速对应的动作相符的频率,将其近似为一个算法的OAR。通常来说,一个算法的OAR越高,说明该算法估计的成功率越高,稳定性越好。

这里给出不同epsilon值所对应不同的epsilon-greedy算法的AR与OAR的对比。下面先给出实验的具体参数设置:

  • 10-Armed Bandit,也就是说K = 10
  • Epsilon = [0 0.01 0.1 1]
  • 收益服从正态分布N(Reward(Action), 1)
  • 每次学习实验次数为500次
  • 学习次数为500次

下图给出了随着实验次数的增加,Average Reward的变化图像:

后续请关注:https://blog.csdn.net/baidu_37355300/article/details/80869577

【RL系列】Multi-Armed Bandit问题笔记的更多相关文章

  1. 【RL系列】Multi-Armed Bandit笔记——UCB策略与Gradient策略

    本篇主要是为了记录UCB策略与Gradient策略在解决Multi-Armed Bandit问题时的实现方法,涉及理论部分较少,所以请先阅读Reinforcement Learning: An Int ...

  2. 【RL系列】Multi-Armed Bandit笔记补充(一)

    在此之前,请先阅读上一篇文章:[RL系列]Multi-Armed Bandit笔记 本篇的主题就如标题所示,只是上一篇文章的补充,主要关注两道来自于Reinforcement Learning: An ...

  3. 【RL系列】Multi-Armed Bandit笔记补充(二)

    本篇的主题是对Upper Conference Bound(UCB)策略进行一个理论上的解释补充,主要探讨UCB方法的由来与相关公式的推导. UCB是一种动作选择策略,主要用来解决epsilon-gr ...

  4. 【RL系列】马尔可夫决策过程——状态价值评价与动作价值评价

    请先阅读上两篇文章: [RL系列]马尔可夫决策过程中状态价值函数的一般形式 [RL系列]马尔可夫决策过程与动态编程 状态价值函数,顾名思义,就是用于状态价值评价(SVE)的.典型的问题有“格子世界(G ...

  5. 【RL系列】从蒙特卡罗方法步入真正的强化学习

    蒙特卡罗方法给我的感觉是和Reinforcement Learning: An Introduction的第二章中Bandit问题的解法比较相似,两者皆是通过大量的实验然后估计每个状态动作的平均收益. ...

  6. 【RL系列】马尔可夫决策过程中状态价值函数的一般形式

    请先阅读上一篇文章:[RL系列]马尔可夫决策过程与动态编程 在上一篇文章里,主要讨论了马尔可夫决策过程模型的来源和基本思想,并以MAB问题为例简单的介绍了动态编程的基本方法.虽然上一篇文章中的马尔可夫 ...

  7. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  8. 人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GAN

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]本文衔接上一个随笔:人工智能中小样本问题相关的系列模型演变及学习 ...

  9. 【RL系列】MDP与DP问题

    推荐阅读顺序: Reinforcement Learning: An Introduction (Drfit)  有限马尔可夫决策过程 动态编程笔记 Dynamic programming in Py ...

随机推荐

  1. ZooKeeper学习之路 (九)利用ZooKeeper搭建Hadoop的HA集群

    Hadoop HA 原理概述 为什么会有 hadoop HA 机制呢? HA:High Available,高可用 在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SP ...

  2. Day8 Servlet

    HttpServletRequest 说明 公共接口类HttpServletRequest继承自ServletRequest.客户端浏览器发出的请求被封装成为一个HttpServletRequest对 ...

  3. 造成MySQL全表扫描的原因

    全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止.通常在数据库中,对无索引的表进行查询一般称为全表扫描:然而有时候我们即便添加了索引,但当我们的SQL语句写的不合理的时候也 ...

  4. 多线程之ThreadLocal(转)

    相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资源时的 ...

  5. c++——默认参数、函数占位参数

    2 默认参数 /*1 C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 */ void myPrint(int x = 3) { printf ...

  6. tp5简要

    1.实例化模型 namespace app\web\controller; use think\Controller; use app\web\model\Member; use think\Load ...

  7. (未解决)记录一次登录&jmeter,留下的一地鸡毛

    一般的登录校验过程是这样的:客户端发起请求,拿到服务器给的“令牌”,再次发起请求,服务器验证“令牌”是否正确,从而返回给客户端是登录成功还是登录失败.然后我按照这个流程,用jmeter去模拟了登录过程 ...

  8. C++ - 模板(template)中typename的使用方法

    声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...

  9. 【数据结构与算法】001—栈与队列(Python)

    栈与队列 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出 ...

  10. Python中sys模块sys.argv取值并判断

    #!usr/bin/env python # -*- coding: utf-8 -*- # Author:Sun Xiaolin import sys judgement = sys.argv[1] ...