【RL】强化学习入门:从基础到应用

news2024/9/17 8:51:27

        本篇文章是博主强化学习RL领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章强化学习:

       强化学习(1)---《【RL】强化学习入门:从基础到应用》

【RL】强化学习入门:从基础到应用

目录

1. 引言

2. 强化学习的基本概念

采用猫抓老鼠来简单介绍一下

2.1 代理(Agent)与环境(Environment)

2.2 状态(State)、动作(Action)与奖励(Reward)

3. 强化学习的目标

4. 马尔可夫决策过程(MDP)

4.1 MDP定义

4.2 状态转移与奖励函数

5. 值函数与策略

5.1 值函数(Value Function)

5.2 策略(Policy)

5.3 Q值(Q-value)

6. 强化学习算法

6.1 动态规划

6.2 蒙特卡罗方法

6.3 时序差分学习

[Python] Q-learning实现

[Results] 运行结果

[Notice]  注意事项


1. 引言

        强化学习(Reinforcement Learning, RL)是机器学习的一个重要分支,它使得智能体通过与环境的互动来学习如何选择最优动作,以最大化累积奖励。近年来,随着深度学习技术的发展,强化学习取得了显著的进展,尤其在复杂任务中的表现令人瞩目。

2. 强化学习的基本概念

采用猫抓老鼠来简单介绍一下

        想象一下,有一只猫在一个房间里追逐老鼠。猫可以在房间内移动(例如,上、下、左、右),并试图捕捉到老鼠。每当猫靠近老鼠时,它会得到正反馈(奖励),而如果猫远离老鼠,则会受到负反馈(惩罚)。猫通过这种方式不断调整自己的策略,以便更有效地捕捉老鼠。

2.1 代理(Agent)与环境(Environment)

        在强化学习中,代理是执行动作的实体,而环境则是代理所处的外部系统。代理通过观察环境的状态并采取行动,与环境进行交互。

2.2 状态(State)、动作(Action)与奖励(Reward)

  • 状态(S):环境在某一时刻的描述。
  • 动作(A):代理在当前状态下可以采取的行为。
  • 奖励(R):代理执行动作后,环境返回给代理的反馈,用于衡量动作的好坏。

3. 强化学习的目标

        强化学习的目标是学习一个策略,使得代理在长期内获得的累积奖励最大化。

强化学习流程图如下:

4. 马尔可夫决策过程(MDP)

4.1 MDP定义

马尔可夫决策过程是正式描述强化学习问题的工具。它由五个元素组成:

  • 状态集 ( S )
  • 动作集 ( A )
  • 状态转移概率 ( P(s'|s,a) )
  • 奖励函数 ( R(s,a) )
  • 折扣因子 ( \gamma )

4.2 状态转移与奖励函数

        ( V(s) )状态转移概率描述了在状态 ( s ) 下执行动作 ( a ) 后转移到新状态 ( s' ) 的概率。而奖励函数则返回执行该动作后获得的即时奖励。

5. 值函数与策略

5.1 值函数(Value Function)

        值函数用于评估状态或状态-动作对的“好坏”。我们定义一个状态值函数 ( V(s) ) 和一个动作值函数 ( Q(s, a) )。

[ V(s) = \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R_t | S_0 = s \right] ]

[ Q(s, a) = \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R_t | S_0 = s, A_0 = a \right] ]

5.2 策略(Policy)

        策略是从状态到动作的映射,可以是确定性的(每个状态对应一个动作)或随机性的(每个状态对应一个动作概率分布)。

5.3 Q值(Q-value)

        Q值表示在状态 ( s ) 下执行动作 ( a ) 后,未来可能获得的累积奖励。通过优化Q值,我们可以找到最优策略,使得在每个状态下选择的动作能最大化预期奖励。

[ Q(s, a) = R(s, a) + \gamma \sum_{s'} P(s'|s,a) V(s') ]

其中:

  • ( R(s, a) ) 是在状态 ( s ) 下执行动作 ( a ) 得到的即时奖励。
  • ( \gamma ) 是折扣因子,用于权衡当前奖励与未来奖励的重要性。
  • ( P(s'|s,a) ) 是从状态 ( s ) 执行动作 ( a ) 转移到状态 ( s' ) 的概率。

6. 强化学习算法

        强化学习有多种算法,这里我们介绍几种主要的方法:

6.1 动态规划

        动态规划方法依赖于环境模型,适用于已知状态转移和奖励函数的情况。动态规划的基本思想是利用已知的状态值估计来更新其他状态值,常用的方法包括价值迭代和策略迭代。

价值迭代

        价值迭代通过反复更新所有状态的值,直到收敛:

[ V_{k+1}(s) = \max_a \left( R(s,a) + \gamma \sum_{s'} P(s'|s,a)V_k(s') \right) ]

策略迭代

        策略迭代则交替进行策略评估和策略改进,直到策略不再改变。

6.2 蒙特卡罗方法

        蒙特卡罗方法基于实际经验进行学习,不需要环境模型。它通过多次模拟来估计状态值或动作值,利用历史数据计算平均奖励。

[ V(s) = \frac{1}{N} \sum_{i=1}^{N} G_i ]

其中 ( G_i ) 是从状态 ( s ) 开始的回报,( N ) 是经历过的样本数。

6.3 时序差分学习

        时序差分学习结合了动态规划和蒙特卡罗方法,在每一步更新中利用当前估计来调整值函数。主要的两种方法是Q学习和SARSA。

6.3.1 Q学习

        Q学习是一种无模型的离线学习算法,通过不断更新Q值表来学习最优策略。其更新公式为:

[ Q(s, a) \leftarrow Q(s, a) + \alpha \left( R + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) ]

其中 ( \alpha ) 是学习率。

6.3.2 SARSA

SARSA(State-Action-Reward-State-Action)是一种在线学习方法,更新过程考虑了代理所采取的具体动作。其更新公式为:

[ Q(s, a) \leftarrow Q(s, a) + \alpha \left( R + \gamma Q(s', a') - Q(s, a) \right) ]


[Python] Q-learning实现

""" Q-learning实现
    时间:2024.07.27
    环境:gym-taxi
    作者:不去幼儿园
"""
import numpy as np  # 导入NumPy库,用于数值计算
import random  # 导入random库,用于随机数生成
import gym  # 导入OpenAI Gym库

# 创建Taxi环境并指定渲染模式为人类可视化
env = gym.make("Taxi-v3", render_mode="human")

# 超参数设置
num_episodes = 1000  # 训练的总轮数
learning_rate = 0.1  # Q学习的学习率
discount_factor = 0.99  # 折扣因子,用于未来奖励计算
exploration_prob = 1.0  # 初始探索概率
exploration_decay = 0.995  # 探索概率衰减率
min_exploration_prob = 0.01  # 最小探索概率

# 初始化Q表,行表示状态,列表示动作,初始值为0
q_table = np.zeros([env.observation_space.n, env.action_space.n])

# 开始Q-learning算法的主循环
for episode in range(num_episodes):
	state, _ = env.reset()  # 重置环境并获取初始状态
	done = False  # 设置done标志,表示当前回合未结束

	while not done:  # 当回合未结束时循环
		# 根据探索策略选择动作
		if random.uniform(0, 1) < exploration_prob:
			action = env.action_space.sample()  # 随机选择一个动作(探索)
		else:
			action = np.argmax(q_table[state])  # 选择Q值最大的动作(利用)

		# 执行动作并获取反馈
		next_state, reward, done, truncated, info = env.step(action)  # 解包五个返回值

		# 更新Q值
		q_table[state][action] += learning_rate * (
				reward + discount_factor * np.max(q_table[next_state]) - q_table[state][action]
		)

		# 打印当前获得的奖励
		print(f'Episode {episode}, Step Reward: {reward}')

		# 更新当前状态
		state = next_state

	# 衰减探索概率
	exploration_prob = max(min_exploration_prob, exploration_prob * exploration_decay)

# 测试学习效果
total_reward = 0  # 总奖励初始化为0
state, _ = env.reset()  # 重置环境以开始测试
done = False  # 设置done标志,表示测试回合未结束

while not done:  # 当测试回合未结束时循环
	action = np.argmax(q_table[state])  # 选择Q值最大的动作
	next_state, reward, done, truncated, info = env.step(action)  # 执行动作并解包返回值

	total_reward += reward  # 累加总奖励

	# 渲染当前状态以进行可视化
	env.render()

	# 打印每一步获得的奖励
	print(f'Step Reward: {reward}')

# 输出测试的总奖励
print(f'Total reward: {total_reward}')
env.close()  # 关闭环境

[Results] 运行结果


[Notice]  注意事项

        在Gym 0.26.2版本中,env.reset()env.step(action)的返回值都发生了变化。具体来说:

  • env.reset()现在返回一个包含状态和额外信息的元组。
  • env.step(action)函数只返回四个值:next_state, reward, done, info
  • 在其他版本可能step()方法返回的内容是一个包含五个元素的元组:(next_state, reward, done, info)


    出现错误:AssertionError: Something went wrong with pygame. This should never happen.
  • 表明在调用 render 方法时出现了问题,主要是因为需要指定渲染模式。Gym 在某些版本中要求在创建环境时明确指定渲染模式,以便正确地显示图形。

解决办法:

  • 1.指定渲染模式:当您创建环境时,使用 render_mode 参数来确定所需的渲染方式。例如:
env = gym.make("Taxi-v3", render_mode="human")  # 使用人类可视化的方式

 常见的 render_mode 选项包括:

  "human":以用户友好的方式显示环境。如果运行在没有图形界面的服务器上,可能会失败。"rgb_array":返回一个 RGB 数组,可以用于绘图或其他处理

  • 2.确保 Pygame 安装正常:由于 Taxi 环境使用 Pygame 进行渲染,请确保您的系统上已正确安装 Pygame。在 Anaconda 环境中安装 Pygame 的命令为:
  • pip install pygame
    

        文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。

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

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

相关文章

ECRS标准工时分析软件:中小企业数字化转型的工时管理利器

在当今全球化竞争日益激烈的背景下&#xff0c;中小企业面临着前所未有的挑战与机遇。为了在市场中脱颖而出&#xff0c;实现可持续发展&#xff0c;数字化转型已成为不可逆转的趋势。然而&#xff0c;对于资源相对有限的中小企业而言&#xff0c;如何高效、精准地管理工时&…

昇思25天学习打卡营第9天|RNN实现情感分类

第十天的不小心把第九天的覆盖了。现在重新补上。 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。输入一句话&#xff0c;然后去语义理解这句话是褒义贬义还是中性的。不同的情感语境下理解的大基调是不同的。 RRN情感分类也是一个分类模型&#xff0c;是…

【提问募集】向世界级软件开发大师“Bob 大叔”Robert C. Martin 提出你的疑虑!

函数式编程作为一种编程范式&#xff0c;其根源可以追溯到 20 世纪 30 年代&#xff0c;当时数学家们正在探索计算理论的基础。1936 年&#xff0c;阿隆佐丘奇提出了 λ 演算&#xff08;Lambda Calculus&#xff09;&#xff0c;这是一种形式系统&#xff0c;用于表达函数抽象…

【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

重要信息 会议官网&#xff1a;www.icbase.org&#xff08;查看详情&#xff09; 中文主页&#xff1a;【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09;_艾思科蓝_学术一站式服务平台 会议时间&#xff1a;2024年9月2…

【优秀python案例】基于Python的京东商城口红商品的爬虫与可视化的设计与实现

摘要&#xff1a;随着互联网的普及&#xff0c;网络购物已经成为了人们购物的首选&#xff0c;用户只需要在电商平台上进行自己喜欢的商品进行搜素&#xff0c;就可以得到成千上万条商品信息。而在购买商品时&#xff0c;商品价格就成为了用户的主要关注对象&#xff0c;而在一…

深入理解 go context

打个广告&#xff1a;欢迎关注我的微信公众号&#xff0c;在这里您将获取更全面、更新颖的文章&#xff01; 原文链接&#xff1a;深入理解 go context 欢迎点赞关注 context 介绍 context 是 Go 语言中用于处理并发操作的一个重要概念。context也被称作上下文&#xff0c;主要…

vue基础知识总结(2)--- axios的使用

一.下载Vue3&#xff1a; 选择自己想要下载的项目文件夹&#xff0c;cmd回车打开命令栏&#xff0c;执行 &#xff1a; cnpm init vuelatest 然后等待一会就可以创建一个项目&#xff0c;并更改项目名&#xff1a; √ 请输入项目名称&#xff1a; ... vue-project 之后按照…

python做简单爬虫的一些常用组件

文章目录 前言requestjsonbs4 前言 最近一直在做零散的一次性的爬虫工作&#xff0c;基本都是用python开发的&#xff0c;整理一下python做小规模爬虫开发常用的一些工具类 request python最简单的发http请求的包&#xff0c;request.get和request.post就可以搞定绝大部分的…

ECMA6Script学习笔记(五)

【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要: 本文介绍了ES6中的对象创建和拷贝方法。对象创建方面&#xff0c;ES6通过class关键字支持了面向对象的语法糖&#xff0c;包括属性设置、getter和setter方法、构造器、静态方法以及私有属性的定义。同时&#xff0c;展…

Linux系统root账号密码破解(重置)

如果想不起root账号密码应该怎么做&#xff1f; 先关机再重新启动&#xff08;重启虚拟机&#xff09;做相关操作&#xff0c;开机时不能让服务器完全启动&#xff0c;需要把开机引导系统&#xff08;GRUB&#xff09;调出来 注&#xff1a;在实际生产环境中使用的Linux没有图…

四,系统规划

一&#xff0c;企业系统规划法BSP&#xff08;2009、2010、2018&#xff0c;步骤以及优缺点、用到的工具&#xff09; 企业系统规划法&#xff08;Business Systems Planning&#xff0c;BSP&#xff09;是IBM公司20世纪70年代提出的一种结构化的信息系统规划方法。该方法通过…

Spring Cloud微服务项目公共类抽取

在微服务架构中&#xff0c;代码的重用性和维护性是非常重要的。Spring Cloud 提供了丰富的工具和框架来帮助我们构建和管理微服务应用&#xff0c;但随着项目规模的扩大&#xff0c;我们会遇到大量的重复代码和相似的逻辑。在这种情况下&#xff0c;抽取公共类成为提高代码质量…

回归测试:保障软件质量的利器

目录 前言1. 回归测试的概念1.1 定义1.2 目标 2. 回归测试的主要作用2.1 确保系统稳定性2.2 提高软件质量2.3 节省维护成本 3. 回归测试在整个测试中的地位3.1 单元测试阶段3.2 集成测试阶段3.3 系统测试阶段3.4 验收测试阶段 4. 回归测试的主要工具4.1 Selenium4.2 JUnit4.3 J…

《Redis设计与实现》读书笔记-数据结构(SDS)

目录 SDS定义 SDS结构 SDS与C字符串结构差异 SDS优点 SDS扩容策略 SDS惰性空间回收 SDS定义 SDS&#xff08;简单动态字符串&#xff09;&#xff0c;用于代替C语言自身的字符串&#xff08;字符容量与字符数组强相关&#xff09;。 SDS结构 sdshdr{int free //sds 中…

预警系统最小例程构建

预警系统最小例程构建 引言 为了更直观, 我们使用最小例程来实现这个预警流程, 环境温湿度读取,然后判断阈值, 超标则触发小灯警报。 最小例程工程备份链接: https://ww0.lanzoul.com/iz4wd261k21i 仿真文件工程备份链接: https://ww0.lanzoul.com/i8vTn261syyb 文章目录…

Jeecgboot仪表盘设计器使用https时访问报错

问题 仪表盘设计器设计好后&#xff0c;Nginx配置域名发送https请求时&#xff0c;/drag/page/queryById、/drag/page/addVisitsNumber仍发送http请求。导致发送下面错误&#xff1a; 原因 仪表盘设计器里设计的页面是由后端生成返回给前端的&#xff0c;后端是根据后端服…

docker安装elasticsearch(es)最新版本

docker安装elasticsearch&#xff08;es&#xff09; docker官网 https://hub.docker.com/ https://www.cnblogs.com/balloon72/p/13177872.html 1、拉取最新项目elasticsearch docker pull elasticsearch:8.14.3lscpu 查看架构 2、构建环境 mkdir -p /data/elasticsear…

【TOOLS】Project 2 Maven Central

发布自己的项目到maven中央仓库 Maven Central Account 访问&#xff1a;https://central.sonatype.com/&#xff0c;点击右上角&#xff0c;根据提示注册账号 构建User token &#xff0c;用于访问中央仓库的API&#xff1a; 点击右上角&#xff0c;查看账户点击Generate Us…

医院体检信息管理系统,C#体检系统源码,健康体检系统PEIS

体检服务全流程 检前 检前注意事项提醒-体检预约-套餐选择-体检签到-费用缴纳 检中 科室队列提醒-增项检中支付 检后 报告查询-体检百科-报告解读-问卷调查 体检管理系统模块介绍 一、登记管理模块 登记体检者基本信息&#xff0c;包括唯一的体检编号&#xff0c;姓名、…

Windows 10+Visual Studio2019 Opencv-C++安装配置

前往官网下载需要的版本Releases - OpenCVhttps://opencv.org/releases/ 1.下载并解压OpenCV 我选择4.6.0&#xff0c;点击windows版本&#xff0c;进行下载 2.配置项目属性 打开你的Visual Studio 2019项目 -> 右击项目名&#xff0c;选择“属性” 注&#xff1a;整个配…