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

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

相关文章
|
25天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
25天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
45 10
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
60 8
|
2月前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
2月前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
110 4
|
2月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
2月前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
26天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
13天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
145 59