Pytorch深度强化学习1-2:详解K摇臂赌博机模型和ϵ-贪心算法

news2024/11/8 18:30:59

目录

0 专栏介绍

本专栏重点介绍强化学习技术的数学原理,并且采用Pytorch框架对常见的强化学习算法、案例进行实现,帮助读者理解并快速上手开发。同时,辅以各种机器学习、数据处理技术,扩充人工智能的底层知识。

🚀详情:《Pytorch深度强化学习》


1 K-摇臂赌博机

单步强化学习是最简单的强化学习模型,其以贪心策略为核心最大化单步奖赏

如图所示,单步强化学习的理论模型是 K K K-摇臂赌博机( K K K-armed bandit),描述如下: K K K-摇臂赌博机有 K K K个摇臂,赌徒在投入一个硬币后可选择按下其中一个摇臂,每个摇臂以一定的概率吐出硬币(硬币数量来自一个赌徒未知的概率分布),因此仅通过一次试验并不能确切地了解摇臂的奖赏期望,赌徒的目标是通过一定的策略最大化自己的奖赏,即获得最多的硬币。 K K K-摇臂赌博机问题抽象为强化学习任务后,摇臂即为某个状态下对应的 K K K个动作;硬币即为该状态下执行某动作后的奖赏值


在这里插入图片描述

针对 K K K-摇臂赌博机问题有两种思路:

  • 仅探索法(exploration-only):将所有的尝试机会平均分配给每个摇臂,即轮流按下每个摇臂若干次,最后以每个摇臂各自的平均吐币数作为奖赏期望的近似估计;
  • 仅利用法 (exploitation-only):按下目前最优的——到目前为止平均奖赏最大的摇臂,若有多个摇臂同为最优,则从中随机选取一个

以上两种思路相互矛盾,构成强化学习所面临的探索-利用窘境(Exploration-Exploitation dilemma):仅探索法能很好地估计每个摇臂的性能,却会失去很多选择最优摇臂的机会;仅利用法局部性能较好,但因为过于贪心无法衡量各个摇臂,因此很可能选不到最优摇臂。这两种思路都难以使最终的累积奖赏最大化,欲使累积奖赏最大,则必须在探索与利用之间达成较好的折中。

在这里插入图片描述

K K K-摇臂赌博机应用在离散状态空间、动作空间上一般强化学习任务的方式是:将每个状态上动作的选择看作一个 K K K-摇臂赌博机问题,对每个状态分别记录各动作的尝试次数、当前平均累积奖赏等信息,训练一定次数后,即可基于赌博机算法进行动作决策。但是这种做法没有考虑强化学习任务马尔科夫决策过程的结构,具有局限性

2 ϵ \epsilon ϵ-贪心算法

ϵ \epsilon ϵ-贪心算法基于一个概率 ϵ \epsilon ϵ来对探索和利用进行折中:每次尝试时以 ϵ \epsilon ϵ的概率进行探索,此时以均匀概率随机选取一个动作;以 1 − ϵ 1-\epsilon 1ϵ的概率进行利用,此时选择当前平均奖赏最高的动作(若有多个,则随机选取一个)。若动作奖赏的不确定性较大则需更多的探索,此时需要较大的 ϵ \epsilon ϵ值;反之若动作奖赏的不确定性较小,则少量的尝试就能很好地近似真实奖赏,此时需要较小的 ϵ \epsilon ϵ值即可。通常可令 ϵ \epsilon ϵ随尝试次数的增加而逐渐减小,例如令

ϵ = 1 / t \epsilon ={{1}/{\sqrt{t}}} ϵ=1/t

在这里插入图片描述

3 softmax算法

Softmax算法基于当前已知的动作平均奖赏来对探索和利用进行折中:若各动作的平均奖赏相当,则选取各动作的概率也相当;若某些动作的平均奖赏明显高于其他动作,则它们被选取的概率也明显更高。其中温度 τ > 0 \tau >0 τ>0趋于0算法趋于仅利用;趋于无穷大算法趋于仅探索。

在这里插入图片描述

4 Python实现与分析

首先我们先模拟一个 K K K-摇臂赌博机

class Bandit:
    def __init__(self) -> None:
        self.k = 0
        self.handler = []
    
    # @breif:添加摇臂
    def addHandler(self, pList, vList):
        h = BanditHandler(pList, vList)
        self.handler.append(h)
        self.k = self.k + 1
    
    # @breif:删除摇臂
    def delHandler(self, i):
        if i > self.k - 1:
            print("handler index i is invalid! i should be less than k!")
        else:          
            self.handler.pop(i)
            self.k = self.k - 1  

    # @breif: 选择摇臂i并弹出奖赏
    def getReward(self, i):
        if i > self.k - 1:
            print("handler index i is invalid! i should be less than k!")
        else:          
            return self.handler[i].pull()

接着实现上述的四种算法

  • 仅探索法

    def explorationOnly(self, T):
        # 累计奖赏
        r = 0
        rList = []
        # 完全随机选取摇臂
        for i in range(T):
            hIndex = random.randint(0, self.kBandit.k - 1)
            r = r + self.kBandit.handler[hIndex].pull()
            rList.append(r / (i + 1))
        return rList
    
  • 仅利用法

    def exploitationOnly(self, T):
        # 累计奖赏
        r = 0
        rList = []
        # 各摇臂平均奖赏初始化
        g = [0 for i in range(self.kBandit.k)]
        # 各摇臂选中次数初始化
        count = [0 for i in range(self.kBandit.k)]
        for i in range(T):
            hIndex = g.index(max(g))
            v = self.kBandit.handler[hIndex].pull()
            r = r + v
            g[hIndex] = (g[hIndex] * count[hIndex] + v) / (count[hIndex] + 1)
            count[hIndex] = count[hIndex] + 1
            rList.append(r / (i + 1))
        return rList
    
  • ϵ \epsilon ϵ-贪心算法

    def eGredy(self, T, e):
        # 累计奖赏
        r = 0
        rList = []
        # 各摇臂平均奖赏初始化
        g = [0 for i in range(self.kBandit.k)]
        # 各摇臂选中次数初始化
        count = [0 for i in range(self.kBandit.k)]
        for i in range(T):
            if random.random() < e:
                hIndex = random.randint(0, self.kBandit.k - 1)
            else:
                hIndex = g.index(max(g))
            v = self.kBandit.handler[hIndex].pull()
            r = r + v
            g[hIndex] = (g[hIndex] * count[hIndex] + v) / (count[hIndex] + 1)
            count[hIndex] = count[hIndex] + 1
            rList.append(r / (i + 1))
        return rList
    

在本案例中,各个算法计算迭代若干次后的平均奖励曲线如图所示

在这里插入图片描述

本文完整工程代码请通过下方名片联系博主获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式之行为型-观察者模式(UML类图+案例分析)

目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二 案例三 五、总结 一、基本概念 观察者先订阅被观察者对象&#xff0c;当被观察者的状态发生变化时&#xff0c;观察者可以及时收到消息&#xff0c;在这种模式当中&#xff0c;被观察者维护了…

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于麻雀算法优化深度置信网络(SSA-DB…

【Java】顺序表ArrayList

文章目录 一、顺序表二、ArrayList 的简介三、ArrayList 的使用3.1 构造方法3.2 常见操作3.3 遍历方法3.4 扩容机制 四、ArrayList 的模拟实现五、ArrayList 的使用案例5.1 扑克牌案例5.2 杨辉三角案例 六、ArrayList 存在的问题 一、顺序表 顺序表&#xff08;Sequential Lis…

JS中的字典和散列表

前言 除了集合&#xff0c;我们还可以用字典和散列表来存储唯一值。 集合学习请见&#xff1a; 自定义集合和ES6集合http://t.csdn.cn/RcznA 在集合中&#xff0c;我们关注的是每个值本身。并将它作为主要元素。 而字典和散列表都是以[键:值]的形式来存储数据。 不同的…

Linux中vim的预备代码(prepare-code)设置

1、进入以下目录&#xff1a; /home/yys/.vim/plugged/prepare-code/snippet注意&#xff1a;yys是我个人的账号名称&#xff0c;每个人的都不一样&#xff01; 2、修改相应的预备代码&#xff0c;比如snippet.c 修改完之后保存&#xff0c;之后再创建c文件则会自动初始化有…

Python如何免费获取付费文档的数据, 保存word文档

目录标题 前言开发环境:模块使用:代码实现步骤:代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 开发环境: python 3.8 pycharm 模块使用: requests --> pip install requests re json time base64 docx --> pip install python-docx 第三方模…

【C++初阶】string类常见题目详解(二) —— 把字符串转换成整数、反转字符串、反转字符串 II、反转字符串中的单词 III、字符串相乘

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;C初阶】s…

ElasticSearch学习02——Kibana安装

ElasticSearch学习02——Windows下Kibana安装 Kibana是界面化的查询数据的工具&#xff0c;下载时尽量下载与ElasicSearch一致的版本。 1、下载对应版本的Kibana ​ 有了ElasticSearch安装的经验&#xff0c;我们发现了ES和JDK有着版本对应的关系&#xff0c;Kibana和ES共同为…

【Linux基础命令】nmtui命令使用实战

前言 linux常用命令专栏已进入尾声&#xff0c;大约90个命令是日常工作中常用的&#xff0c;在拓展一些不常用的&#xff0c;也就100左右。 是不是总结下来后&#xff0c;就感觉要学的内容没有那么多了。 当然有些专属的基础命令不在本专栏内&#xff0c;比如LVM管理命令&am…

微信读书:从Paxos到Zookeeper:分布式一致性原理与实践(阅读摘录)

微信读书&#xff1a;从Paxos到Zookeeper&#xff1a;分布式一致性原理与实践&#xff08;阅读摘录&#xff09; 阅读地址 CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足一致性(C&#xff1a;Consistency)、可用性(A&#xff1a;Availability)和分区容错…

Andriod 开发 SearchView默认弹出软键盘

SearchView默认弹出软键盘&#xff0c;遮挡了主界面 这很明显是SearchView是默认自动获取了焦点&#xff0c;所以上网搜了一下如何清除焦点&#xff1a; SearchView searchView getActivity().findViewById(R.id.searchViewSearchbar); searchView.clearFocus(); 然而没用&…

零拷贝原理

在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上&#xff0c;那么它必 须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区&#xff0c;CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中&#xff0c; 接着在应用程序中…

Arrays类概述,Lambda表达式

数组操作工具类&#xff0c;专门用于操作数组元素 2&#xff1a;常用API Lambda概述 Lambda表达式是JDK开始后的一种新语法形式作用&#xff1a;简化匿名内部类的代码写法 格式&#xff1a; 注意&#xff1a;Lambda表达式只能简化函数式接口的匿名内部类的写法形式。 什么是…

JAVA-编程基础-07-面向对象思想

Lison <dreamlison163.com>, v1.0.0, 2023.03.26 JAVA-编程基础-07-面向对象思想 文章目录 JAVA-编程基础-07-面向对象思想一、三大特性封装继承多态 二、类图泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (A…

使用vim编辑器,进行保存时报错:E382: Cannot write, ‘buftype‘ option is set

目录 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option is set 1.2 产生原因 二、解决 2.1 解决办法 2.2 还原 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option i…

【UnityDOTS 二】Entity的理解

Entity的理解 Entity作为一种对CPU的Cache友好的编码方式&#xff0c;是DOTS中重要的编码流程与思想。需要程序员由OOP的思想转为DOD的思想&#xff0c;即&#xff1a;面向数据的编码方式。 Unity的ECS&#xff1a; Entity&#xff1a;只是一个代表&#xff0c;用于快速查找数…

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13310 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- leftTitle:左边标题 name&…

哈工大计算机网络课程网络层协议详解之:路由算法概述与链路状态路由算法

哈工大计算机网络课程网络层协议详解之&#xff1a;路由算法概述与链路状态路由算法 在前面的小节中&#xff0c;我们介绍了网络中路由器的路由与转发等功能。我们说作为网络层&#xff0c;从功能上来说&#xff0c;核心功能就是要实现路由和转发。 对于转发来说&#xff0c;实…

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

我们在深度学习中可以发现有很多不同格式的模型文件&#xff0c;比如不同的框架就有各自的文件格式&#xff1a;.model、.h5、.pb、.pkl、.pt、.pth等等&#xff0c;各自有标准就带来互通的不便&#xff0c;所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neura…

Redis - 优惠券秒杀、库存超卖、分布式锁、Redisson

文章目录 一、优惠券秒杀1.1 全局唯一ID概述1.2 Redis实现全局唯一ID1.3 添加优惠券1.3.1 entity1.3.2 Controller1.3.3 Service层1.3.4 测试 1.4 优惠券秒杀下单1.4.1 entity1.4.2 Controller1.4.3 Service1.4.3 测试 1.5 库存超卖问题1.5.1 库存超卖原因1.5.2 介绍乐观锁1.5.…