【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。 因此,强化学习的过程可以看作是在回报这个主观价值目标的指引下,使决策努力适应环境模型的过程。

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

相关文章
|
3天前
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
|
2天前
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
|
4天前
|
运维 Devops 测试技术
一个人活成一个团队:python的django项目devops实战
DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。
16 3
|
7天前
|
存储 JSON 数据可视化
python实战|1000位小姐姐照制作照片墙,刷新你三观的颜值!
python实战|1000位小姐姐照制作照片墙,刷新你三观的颜值!
18 2
|
7天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
|
5天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
|
2天前
|
数据采集 存储 人工智能
掌握Python编程:从基础到进阶的实用指南
【8月更文挑战第17天】 本文旨在通过浅显易懂的语言和实际案例,为初学者和有一定基础的开发者提供一条清晰的Python学习路径。我们将从Python的基本语法入手,逐步深入到面向对象编程、数据科学应用及网络爬虫开发等高级主题。每个部分都配备了代码示例和实操建议,确保读者能够将理论知识转化为实际能力。无论你是编程新手,还是希望提升Python技能的开发者,这篇文章都将为你打开一扇通往高效编程世界的大门。
7 2
|
7天前
|
Python
python Process 多进程编程
python Process 多进程编程
17 1
|
11天前
|
存储 数据挖掘 程序员
揭秘Python:掌握这些基本语法和数据类型,你将拥有编程世界的钥匙!
【8月更文挑战第8天】Python是一种高级、解释型语言,以简洁的语法和强大的功能广受好评。本文从基本语法入手,强调Python独特的缩进规则,展示清晰的代码结构。接着介绍了Python的主要数据类型,包括数值、字符串、列表、元组、集合和字典,并提供了示例代码。通过这些基础知识的学习,你将为深入探索Python及其在文本处理、数据分析等领域的应用打下坚实的基础。
25 3
|
13天前
|
Python
揭秘!Python系统编程里那些让代码自由穿梭的神奇代码行
【8月更文挑战第6天】在Python编程中,一些简洁有力的代码构造让程序更加灵动高效。列表推导式能一行生成列表,如`squares = [x**2 for x in range(10)]`。`with`语句确保资源自动释放,例`with open('example.txt', 'r') as file:`。`lambda`函数便于快速定义小函数,`map(lambda x: x + 1, numbers)`即可完成列表映射。
28 4