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

news2024/11/20 2:27:26

目录

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/699417.html

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

相关文章

内部类之成员内部类

我们在阅读源码的过程中&#xff0c;会遇到很多内部类&#xff0c;让我们阅读难度增加。这篇文章主要介绍成员内部类的作用 1.成员内部类可以访问外部类的所有方法和成员变量&#xff08;不论是静态的还是非静态的&#xff09; package com.high.concurrency.inner;/*** auth…

如何让chatgpt给我们实现一个桌面便签?

我&#xff1a; 用Java开发一款桌面便签软件。功能需求&#xff1a;1、便签可以钉在桌面任意角落&#xff1b;2、便签内容实时保存到本地&#xff1b;3、有新增按钮&#xff0c;点击新增时清除当前面板上的内容&#xff0c;新建一条新的便签内容&#xff0c;并保存到本地&#…

通往AGI之路:揭秘英伟达A100、A800、H800、V100在高性能计算与大模型训练中的霸主地位

AGI | NLP | A100 | H100 | Nvidia | Aurora GPT| LLM | A800 | V100 | Intel | ChatGPT 日前&#xff0c;随着深度学习、高性能计算、大模型训练等技术的保驾护航&#xff0c;通用人工智能时代即将到来。各个厂商也都在紧锣密鼓的布局&#xff0c;如英伟达前段时间发布GH 200…

C3.ai:一个即将“破灭”的人工智能泡沫

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 C3.ai仅适用于能承受高风险波动的投资者 猛兽财经曾在之前分析过C3.ai&#xff08;AI&#xff09;这家公司&#xff0c;认为C3.ai可能在借助人工智能热潮炒作自己。截止撰写本文时&#xff0c;C3.ai的股价已跌到了到2…

使用ganymed-ssh2连接linux报错 Cannot negotiate, proposals do not match

ganymed-ssh2连接linux报错 背景报错信息解决方案&#xff1a;运行成功 背景 最近有个项目&#xff0c;需要在Linux下的服务器内写了一部分Python脚本&#xff0c;业务处理却是在Java内&#xff0c;那么就想能不能在Java里面&#xff0c;来远程执行Linux下的Python脚本&#x…

chatgpt赋能python:使用Python连接网络摄像头

使用Python连接网络摄像头 网络摄像头是现代生活中不可或缺的设备之一&#xff0c;其允许用户在远程位置查看实时视频流。Python语言提供了强大的工具来连接和控制网络摄像头。本文将向您展示如何使用Python连接网络摄像头以及如何将视频流数据流式传输到本地计算机。 环境设…

【AUTOSAR】BMS开发实际项目讲解(十九)----电池管理系统系统设计电池单体过放后再充电保护

电池单体过放后再充电保护 关联的系统需求 TSR-BMS-2101、TSR-BMS-2102、TSR-BMS-2103、TSR-BMS-2104、TSR-BMS-2105、TSR-BMS-2106、TSR-BMS-2107、TSR-BMS-2108、TSR-BMS-2109、TSR-BMS-2110、TSR-BMS-2111、TSR-BMS-2112、TSR-BMS-2113、TSR-BMS-2114、TSR-BMS-2115、TSR-B…

七年老Android推荐 : 日常开发中好用的工具 (一)

1. 前言 作为一名拥有七年经验的Android开发工程师&#xff0c;在日常开发中&#xff0c;总希望能提升自己的开发效率&#xff0c;对此也积累了一些工具&#xff0c;本文对此总结了一些好用的工具。 2. 视频转GIF工具 我们在写博客的时候&#xff0c;常常要录屏&#xff0c;…

leetcode:2000. 反转单词前缀(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i &#xff0c;反转 word 中从下标 0 开始、直到下标 i 结束&#xff08;含下标 i &#xff09;的那段字符。如果 word 中不存在字符 ch &#xff0c;则无需进行任何操作。…

智云通CRM:在谈判中如何避免被客户利用的陷阱?

智云通CRM系统是一款专业的客户关系管理系统&#xff0c;帮助企业实现客户管理的数字化转型。在日常销售工作中&#xff0c;销售人员经常会面临各种问题和质疑&#xff0c;良好的应对技巧和回答方法对于维护好客户关系、促成交易非常重要。下面将介绍一些经常会被客户问到的问题…

从源码全面解析 dubbo 服务端服务调用的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

echatrs-地图,根据数据进行点状显示和指向

echarts地址&#xff1a;https://www.makeapie.cn/echarts var data2 [{ name: 海门, value: 9 },{ name: 鄂尔多斯, value: 12 },{ name: 招远, value: 12 },{ name: 舟山, value: 12 },{ name: 齐齐哈尔, value: 14 },{ name: 盐城, value: 15 },{ name: 赤峰, value: 16 },…

JMeter 后置处理器之JSON提取器

目录 前言&#xff1a; 测试环境 插件介绍 插件参数 插件使用示例 JSON-PATH表达式介绍 操作符 函数 过滤器操作符 JSON PATH示例 前言&#xff1a; JMeter是一个功能强大的性能测试工具&#xff0c;它提供了许多后置处理器来处理和提取测试结果。其中一个常用的后…

【强化学习】常用算法之一 “PPO”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

Android 操作系统日历完成提醒功能 附带开关闹钟 适配高版本安卓

Android 操作系统日历完成提醒功能 附带开关闹钟 如果想要一个稳定且不用担心生命周期的提醒方式&#xff0c;可以试试利用系统日历去完成任务的提醒或某个活动的预约。 项目仓库地址在文末 环境 Java 11 Android sdk 30 Gredle 7.1 minSdkVersion 23 targetSdkVersion 30测…

js 纯前端实现 重新部署 通知用户刷新网页

需求&#xff1a;有时候上完线&#xff0c;用户还停留在老的页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时候有时候js连接hash变了导致报错跳不过去&#xff0c;并且用户体验不到新功能&#xff0c;需要进行优化&#xff0c;每当打包发版后客户进入系统就…

F#奇妙游(1):F#浅尝

F#奇妙游&#xff08;1&#xff09;&#xff1a;F#浅尝 是什么 F#是.NET平台的OCaml。 这句话很欠打&#xff0c;.NET和OCaml前者知道的人有一些&#xff0c;后者就很少了。.NET平台是一个开源的软件平台&#xff0c;早期由微软主导&#xff0c;目前已经开源&#xff0c;由.…

如何使用CSS Grid 居中 div

本文翻译自 How to Center a Div Using CSS Grid&#xff0c;作者&#xff1a;Fimber Elemuwa, Ralph Mason。 略有删改 在本文中&#xff0c;我们将介绍使用CSS Grid在水平和垂直方向上居中div的五种方法&#xff0c;当然这些技术可用于任何类型的元素。 初始化 我们首先创建…

ASP.Net Core Web API项目发布到IIS(二)

目录 一.启动并配置IIS环境 1.启用或关闭window功能 2.设置万维网服务 3.点击确定等待配置更改 二.创建新的Web网站并进行设置 1.打开IIS管理 2.配置默认的网站 3.创建新的网站 4.测试 三.可能出现的问题 1.404错误 前一篇已经记录了如何创建项目并发布到文件夹&#x…

配置管理数据库(CMDB)

什么是CMDB 配置管理数据库(Configuration Management Database&#xff0c;简称CMDB)是组织IT基础结构中配置项(Configuration Item)及其关系的数据库。CI指示了任何需要管理的、以确保成功交付服务的项目。CI可以是一个具体的实体&#xff0c;如服务器、交换机&#xff0c;也…