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

news/2024/11/16 13:36:56/

目录

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 = 0self.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 = 0rList = []# 完全随机选取摇臂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 = 0rList = []# 各摇臂平均奖赏初始化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 + vg[hIndex] = (g[hIndex] * count[hIndex] + v) / (count[hIndex] + 1)count[hIndex] = count[hIndex] + 1rList.append(r / (i + 1))return rList
    
  • ϵ \epsilon ϵ-贪心算法

    def eGredy(self, T, e):# 累计奖赏r = 0rList = []# 各摇臂平均奖赏初始化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 + vg[hIndex] = (g[hIndex] * count[hIndex] + v) / (count[hIndex] + 1)count[hIndex] = count[hIndex] + 1rList.append(r / (i + 1))return rList
    

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

在这里插入图片描述

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


🔥 更多精彩专栏

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

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

http://www.ppmy.cn/news/687243.html

相关文章

8B10B编码

这个功能虽然一直在用&#xff0c;但是具体没有研究过具体编码过程&#xff1a; 参考Intel的文档&#xff1a; agx_52004.pdf 数据输入 datain 表示它的具体bit位出来&#xff1a; datain[7:0] ------------------------ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ---------------…

女子捡到一部手机没有锁屏密码, 用支付宝疯狂买买买

现在支付宝清扫码支付真的很方便我们的生活&#xff0c;不再需要外出带很多现金&#xff0c;只需用手机支付。有些人通常很麻烦&#xff0c;但也喜欢把支付宝设置为一个小秘密免费支付&#xff0c;但一旦手机丢失&#xff0c;这是很悲惨的&#xff0c;尤其是有些人甚至不费心设…

根据经纬度实现附近搜索Java实现

现在很多手机软件都用附近搜索功能&#xff0c;但具体是怎么实现的呢》 在网上查了很多资料&#xff0c;mysql空间数据库、矩形算法、geohash我都用过了&#xff0c;当数据上了百万之后mysql空间数据库方法是最强最精确的&#xff08;查询前100条数据只需5秒左右&#xff09;。…

地图采集商家,附近商家,最新企业信息采集软件的使用教程

地图采集商家&#xff0c;附近商家&#xff0c;最新企业信息采集软件的使用教程 对全图数据、全网数据、运营商大数据进行有效整合&#xff0c;通过精准搜索实现高效获客 一款能够帮助您快速挖掘并宣传出售您自己产品的拓客软件&#xff0c;我们利用互联网公开合法数据&#xf…

大学城附近的打印店总是人很多怎么办?

打印资料文件&#xff0c;很多人都会想到大学城附近的打印店&#xff0c;一般在校园周围会汇聚很多打印店&#xff0c;学校附近的打印店打印价格都比较低&#xff0c;价格低成为吸引人流的重要因素&#xff0c;可是遇到学生考试的旺季&#xff0c;去大学城附近的打印店打印东西…

手机筛选效果 html5,html5仿美团ios手机端信息筛选条件代码

特效描述&#xff1a;html5仿美团 ios手机端 信息筛选条件。html5仿美团ios手机版信息筛选 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 美食附近排序筛选 全部分类 1225> 美食 1225> 电影 1225> 酒店 1225> 休闲娱乐 1225> KTV 1225> 丽人 1225> 外卖 12…

Javaweb获取用户附近商家

开始 项目上需要在用户端展示周围的商家&#xff0c;比如用户周围5km内的商家&#xff0c;思路是先获取用户的经纬度&#xff0c;然后与商家的经纬度计算出距离是否符合。 环境框架 后端使用关系型数据库&#xff0c;前端使用js、jq。 步骤 1. 获取用户经纬度。 因为是手…

shodan搜索附近摄像头_深夜,摄像头前惊现一团白光!不明光源,村民心慌

最近,有一组词语火了,“心里有火、眼里有光”。哈尔滨市阿城区的一村民也发现了光,不过,她看到的,是一道不寻常的白光。 这就是李晓军所说的那团白光,时间显示为5月6日零时24分,一个白色的光圈从视频右下角出现,不断向左上方缓慢移动,同时光圈也由大变小,在屏幕中停留…