【Python强化学习】强化学习基本概念与冰湖问题实战(图文解释 附源码)

简介: 【Python强化学习】强化学习基本概念与冰湖问题实战(图文解释 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~

强化学习

强化学习(Reinforcement Learning, RL)是学习主体(Agent)以“尝试”的方式探索世界、获取知识的学习机制。强化学习起源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为。

与前述的聚类、回归、分类和标注任务不同,强化学习面向的是所谓的序列决策(Sequential Decision Making)任务:主体根据环境的状态和反馈连续选择行为,力图收获最大收益。

仿真工具

强化学习需要不断地尝试,因此研究强化学习,离不开仿真。OpenAI的gym 仿真工具提供了对强化学习问题求解仿真的支持。gym采用Python语言,可以和本书使用的编程环境无缝衔接。

可通过 “conda install gym=0.18.0”命令安装本书使用的gym仿真环境。

在gym中仿真强化学习问题,先要在gym中构建相应的仿真环境(具体构建方法可参考相应网站和书籍)。gym内部预先集成了很多已经构建好的强化学习问题仿真环境供初学者使用,如冰湖问题仿真环境。

冰湖问题

v0版的冰湖问题(FrozenLake-v0) 的情景是agent要自主穿过有窟窿的冰面拿到飞盘。冰面由4×4的方格表示,标记为S的方格为agent的出发点,标记为G的方格为飞盘所在的位置,即agent要到达的终点。空白方格表示可以行动的安全区域,灰色方格表示有窟窿的冰面,是会掉入水中的危险区域。

为了简化表示,在gym的FrozenLake-v0环境中,用由S、F、H、G四个字母组成的表格来表示冰面。

强化学习要解决的问题是如何控制agent从S点出发顺利到达G点。

称agent为强化学习中的主体。主体要依据某个策略(policy)来决定下一步的动作(action)。主体通过不断地尝试来优化策略。

在冰湖问题中,动作有4个,分别是向左、向下、向右和向上,用0、1、2、3来标记。动作的所有可能取值的集合称为动作空间,记为A={0,1,2,3}。

import gym # loading the Gym library
env = gym.make("FrozenLake-v0")
# 看一下动作空间
print("Action space: ", env.action_space)
>>>Action space: Discrete(4)
# 看一下观察空间,以及它的取值大小
print("Observation space: ", env.observation_space)
>>>Observation space: Discrete(16)

状态空间

在冰湖问题中,主体在冰面上的不同位置称为环境(environment)的不同状态。总共有4×4=16个位置,因此,环境有16个状态,编号为0,1,…,15。

状态的所有可能取值组成状态空间,记为S={0,1,…,15}。

策略示例

主体的策略是从状态到动作的映射,也就是说,对一个具体的状态,策略要给出明确的动作指示来确定主体的下一步行动。在冰湖问题中,可以用如下的列表来表示一个策略:[1, 3, 2, 2, 0, 0, 0, 1, 3, 0, 1, 2, 0, 3, 2, 3]

列表最左侧的1表示在0号状态时执行编号为1的动作,即在起始点S执行向下的动作。左侧第2个位置上的3表示在1号状态时执行编号为3的动作,即在位置1执行向上的动作。以此类推。

rand_pi = []
for _ in range(16):
rand_pi.append(env.action_space.sample()) 
print("随机策略:", rand_pi)
>>>随机策略: [1, 3, 2, 2, 0, 0, 0, 1, 3, 0, 1, 2, 0, 3, 2, 3]

环境模型

在冰湖问题中,规定当前位置为S和F时,施加动作的影响是使主体向动作的方向以及该动作两侧的方向等概率前进一格。用深色背景表示主体当前所在的位置,当前状态为状态4,如果执行向右的动作,则会以1/3的概率进入状态0、状态5和状态8。

如果碰到边界,则不前进。如果到达H和G,则本次尝试结束,默认回到状态0(下次尝试出发点)。强化学习中,环境状态因为动作而改变的规律称为环境模型,一般用概率来描述。

回报

在仿真实验中,主体的每进入到下一状态都有一个回报(reward)。

如果当前动作使主体到达了终点G,则能得到一个回报值1,否则回报值为0。

def episode(env, pi, gamma = 1.0, render = False):
    s = env.reset() # 初始状态
    sum_reward = 0
    n = 0 # 折扣的幂
    while True:
        if render:
            env.render()
        s, reward, done , _ = env.step( int(pi[s]) )
        sum_reward += ( gamma**n * reward ) # 累积折扣回报函数
        n += 1
        if done:
            env.render()
            break
    #print(sum_reward)
    return sum_reward
episode(env, rand_pi, 1.0, True)

# 多次尝试取累积折扣回报函数的均值
def test_policy(env, pi, gamma = 1.0, n_episodes = 10000):
    scores = [ episode(env, pi, gamma, False) for _ in range(n_episodes) ]
    return np.mean(scores)
import numpy as np
gamma = 1.0 # 折扣系数
n_episodes = 10000 # 尝试次数
print(n_episodes, "次尝试的平均得分:", test_policy(env, rand_pi, gamma, n_episodes))
>>>10000 次尝试的平均得分: 0.0778

强化学习中,主体(策略)、动作、环境、状态和回报之间的关系:

主体依据策略来决定下一步动作,主体的动作又会改变环境,主体能够观察到环境状态的变化,并得到环境的立即回报。然后,主体根据新的状态并依据策略来决定新的动作。可见,强化学习是一个持续决策的过程。

策略、动作、状态和回报分别记为π、a、s和r。 在任一时刻t,主体依据策略π和环境的状态s_t,作出动作a_t。 环境对动作a_t的新反馈s_t+1和新回报r_t+1在下一时刻t+1传递到主体,此时,主体再作出新的动作a_t+1。 如此持续循环,直至本次尝试结束。 在每一个循环中,可分为两个阶段:(1)主体决策并作出动作阶段;(2)环境接受动作并反馈状态和回报阶段。

在阶段(1),主体的策略可表示为: a_t=π(s_t│θ) 其中, θ是π的参数。

策略可以是各种形式的,如决策函数、概率分布和神经网络等等。策略本质上反映了从主体接收的环境状态s_t到发出的动作a_t之间的映射关系。策略是强化学习算法要求解的最终目标。 策略可以分为确定性策略和随机性策略。确定性策略的决策过程是确定的,即一个状态明确对应一个动作,如均匀随机策略。随机性策略的决策过程是依据一定的概率对可选动作进行随机选择,即一个状态对应多个动作,并依事先确定的概率来随机选择其中一个动作。因此,随机性策略要用概率分布函数来描述。

在阶段(2),环境接受主体的动作并反馈的状态可表示为: s_t+1=O(s_t,a_t )

该式反映的是环境从当前状态因外部动作刺激而转换到另外状态的映射关系,即环境模型。在gym中,环境模型在env.step()函数中仿真实现。

回报r反映的是价值目标,它是人们主观确定的东西。比如,在冰湖实验中,人们认为主体到达目标点捡起飞盘是“好”的,因此,把此时的回报定为1,否则为0。 因此,强化学习的过程可以看作是在回报这个主观价值目标的指引下,使决策努力适应环境模型的过程。

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
7月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
892 7
|
7月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
7月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
612 1
|
7月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
577 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
7月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
7月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
1520 1
Python API接口实战指南:从入门到精通
|
7月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
221 12
|
7月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
601 1
|
7月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
1304 1
|
7月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
708 0

推荐镜像

更多