带你读《强化学习:原理与Python实现》之一:初识强化学习

简介: 本书理论完备,涵盖主流经典强化学习算法和深度强化学习算法,实战性强。基于Python、Gym、TensorFlow 2、AlphaZero等构建,是一本配套TensorFlow 2代码的强化学习教程书,全书完整地介绍了主流的强化学习理论,读者可以了解强化学习基础知识,通过实例感受强化学习的魅力,并了解强化学习前沿进展。

智能系统与技术丛书
点击查看第二章
点击查看第三章
强化学习:原理与Python实现

image.png

肖智清 著

第1章

初识强化学习
强化学习(Reinforcement Learning,简称RL,又译为“增强学习”)这一名词来源于行为心理学,表示生物为了趋利避害而更频繁实施对自己有利的策略。例如,我每天工作中会根据策略决定做出各种动作。如果我的某种决定使我升职加薪,或者使我免遭处罚,那么我在以后的工作中会更多采用这样的策略。据此,心理学家Ivan Pavlov在1927年发表的专著中用“强化”(reinforcement)这一名词来描述特定刺激使生物更趋向于采用某些策略的现象。强化行为的刺激可以称为“强化物”(reinforcer)。因为强化物导致策略的改变称为“强化学习”。
心理学家Jack Michael于1975年发表文章《Positive and negative reinforcement, a distinction that is no longer necessary》,说明了强化包括正强化(positive reinforcement)和负强化(negative reinforcement),其中正强化使得生物趋向于获得更多利益,负强化使得生物趋向于避免损害。在前面例子中,升职加薪就是正强化,免遭处罚就是负强化。正强化和负强化都能够起到强化的效果。
人工智能(Artificial Intelligence,AI)领域中有许多类似的趋利避害的问题。例如,著名的围棋AI程序AlphaGo可以根据不同的围棋局势下不同的棋。如果它下得好,它就会赢;如果下得不好,它就会输。它根据下棋的经验不断改进自己的棋艺,这就和行为心理学中的情况如出一辙。所以,人工智能借用了行为心理学的这一概念,把与环境交互中趋利避害的学习过程称为强化学习。
本章介绍人工智能领域中强化学习的基础知识,阐述强化学习的学习方法,并给出强化学习中智能体和环境交互的编程实例。

1.1 强化学习及其关键元素

在人工智能领域中,强化学习是一类特定的机器学习问题。在一个强化学习系统中,决策者可以观察环境,并根据观测做出行动。在行动之后,能够获得奖励。强化学习通过与环境的交互来学习如何最大化奖励。例如,一个走迷宫的机器人在迷宫里游荡(见图1-1)。机器人观察周围的环境,并且根据观测来决定如何移动。错误的移动会让机器人浪费宝贵的时间和能量,正确的移动会让机器人成功走出迷宫。在这个例子中,机器人的移动就是它根据观测而采取的行动,浪费的时间能量和走出迷宫的成功就是给机器人的奖励(时间能量的浪费可以看作负奖励)。

image.png

强化学习的最大特点是在学习过程中没有正确答案,而是通过奖励信号来学习。在机器人走迷宫的例子中,机器人不会知道每次移动是否正确,只能通过花费的时间能量以及是否走出迷宫来判断移动的合理性。
一个强化学习系统中有两个关键元素:奖励和策略。
image.png奖励(reward):奖励是强化学习系统的学习目标。学习者在行动后会接收到环境发来的奖励,而强化学习的目标就是要最大化在长时间里的总奖励。在机器人走迷宫的例子中,机器人花费的时间和能量就是负奖励,机器人走出迷宫就可以得到正奖励。
image.png策略(policy):决策者会根据不同的观测决定采用不同的动作,这种从观测到动作的关系称为策略。强化学习的学习对象就是策略。强化学习通过改进策略以期最大化总奖励。策略可以是确定性的,也可以不是确定性的。在机器人走迷宫的例子中,机器人根据当前的策略来决定如何移动。
强化学习试图修改策略以最大化奖励。例如,机器人在学习过程中不断改进策略,使得以后能更快更省事地走出迷宫。
强化学习与监督学习和非监督学习有着本质的区别。

  • 强化学习与监督学习的区别在于:对于监督学习,学习者知道每个动作的正确答案是什么,可以通过逐步比对来学习;对于强化学习,学习者不知道每个动作的正确答案,只能通过奖励信号来学习。强化学习要最大化一段时间内的奖励,需要关注更加长远的性能。与此同时,监督学习希望能将学习的结果运用到未知的数据,要求结果可推广、可泛化;强化学习的结果却可以用在训练的环境中。所以,监督学习一般运用于判断、预测等任务,如判断图片的内容、预测股票价格等;而强化学习不适用于这样的任务。
  • 强化学习与非监督学习的区别在于:非监督学习旨在发现数据之间隐含的结构;而强化学习有着明确的数值目标,即奖励。它们的研究目的不同。所以,非监督学习一般用于聚类等任务,而强化学习不适用于这样的任务。

1.2 强化学习的应用

基于强化学习的人工智能已经有了许多成功的应用。本节将介绍强化学习的一些成功案例,让你更直观地理解强化学习,感受强化学习的强大。

  • 电动游戏:电动游戏,主要指玩家需要根据屏幕画面的内容进行操作的游戏,包括主机游戏吃豆人(PacMan,见图1-2)、PC游戏星际争霸(StarCraft)、手机游戏Flappy Bird等。很多游戏需要得到尽可能高的分数,或是要在多方对抗中获得胜利。同时,对于这些游戏,很难获得在每一步应该如何操作的标准答案。从这个角度看,这些游戏的游戏AI需要使用强化学习。基于强化学习,研发人员已经开发出了许多强大的游戏AI,能够超越人类能够得到的最佳结果。例如,在主机Atari 2600的数十个经典游戏中,基于强化学习的游戏AI已经在将近一半的游戏中超过人类的历史最佳结果。

    image.png

  • 棋盘游戏:棋盘游戏是围棋(见图1-3)、黑白翻转棋、五子棋等桌上游戏的统称。通过强化学习可以实现各种棋盘运动的AI。棋盘AI有着明确的目标—提高胜率,但是每一步往往没有绝对正确的答案,这正是强化学习所针对的场景。Deepmind公司使用强化学习研发出围棋AI AlphaGo,于2016年3月战胜围棋顶尖选手李世石,于2017年5月战胜排名世界第一的围棋选手柯洁,引起了全社会的关注。截至目前,最强的棋盘游戏AI是DeepMind在2018年12月发表的AlphaZero,它可以在围棋、日本将棋、国际象棋等多个棋盘游戏上达到最高水平,并远远超出人类的最高水平。

image.png

  • 自动驾驶:自动驾驶问题通过控制方向盘、油门、刹车等设备完成各种运输目标(见图1-4)。自动驾驶问题既可以在虚拟环境中仿真(比如在电脑里仿真),也可能在现实世界中出现。有些任务往往有着明确的目标(比如从一个指定地点到达另外一个指定地点),但是每一个具体的动作却没有正确答案作为参考。这正是强化学习所针对的任务。基于强化学习的控制策略可以帮助开发自动驾驶的算法。

image.png

1.3 智能体/环境接口

强化学习问题常用智能体/环境接口(Agent-Environment Interface)来研究(见图1-5)。
智能体/环境接口将系统划分为智能体和环境两个部分。

  • 智能体(agent)是强化学习系统中的决策者和学习者,它可以做出决策和接受奖励信号。一个强化学习系统里可以有一个或多个智能体。我们并不需要对智能体本身进行建模,只需要了解它在不同环境下可以做出的动作,并接受奖励信号。
  • 环境(environment)是强化系统中除智能体以外的所有事物,它是智能体交互的对象。环境本身可以是确定性的,也可以是不确定性的。环境可能是已知的,也可能是未知的。我们可以对环境建模,也可以不对环境建模。

智能体/环境接口的核心思想在于分隔主观可以控制的部分和客观不能改变的部分。例如,在工作的时候,我是决策者和学习者。我可以决定自己要做什么,并且能感知到获得的奖励。我的决策部分和学习部分就是智能体。同时,我的健康状况、困倦程度、饥饿状况则是我不能控制的部分,这部分则应当视作环境。我可以根据我的健康状况、困倦程度和饥饿状况来进行决策。
注意:强化学习问题不一定要借助智能体/环境接口来研究。
在智能体/环境接口中,智能体和环境的交互主要有以下三个环节:
智能体观测环境,可以获得环境的观测(observation),记为;
智能体根据观测做出决策,决定要对环境施加的动作(action),记为;
环境受智能体动作的影响,改变自己的状态(state),记为,并给出奖励(reward),记为。
在这三个环节中,观测、动作和奖励R是智能体可以直接观测到的。
注意:状态、观测、动作不一定是数量(例如标量或矢量),也可以是“感觉到饿”、“吃饭”这样一般的量。在本书中用无衬线字体表示这样的量。奖励总是数量(而且往往是数量中的标量),本书中用衬线字体表示数量(包括标量或矢量)。
绝大多数的强化学习问题是按时间顺序或因果顺序发生的问题。这类问题的特点是具有先后顺序,并且先前的状态和动作会影响后续的状态等。例如,在玩电脑游戏时,游戏随着时间不断进行,之前玩家的每个动作都可能会影响后续的局势。对于这样的问题,我们可以引入时间指标,记时刻的状态为,观测为,动作为,奖励为Rt。
注意:用智能体/环境接口建模的问题并不一定要建模成和时间有关的问题。有些问题一共只需要和环境交互一次,就没有必要引入时间指标。例如,以不同的方式投掷一个给定的骰子并以点数作为奖励,就没有必要引入时间指标。
在很多任务中,智能体和环境是在离散的时间步骤上交互的,这样的问题可以将时间指标离散化,建模为离散时间智能体/环境接口。具体而言,假设交互的时间为。在时刻,依次发生以下事情:

  • 智能体观察环境得到观测;
  • 智能体根据观测决定做出动作;
  • 环境根据智能体的动作,给予智能体奖励并进入下一步的状态。

注意:智能体/环境接口问题不一定能时间上离散化。有些问题在时间上是连续的,需要使用偏微分方程来建模环境。连续时间的问题也可以近似为离散时间的问题。
在智能体/环境接口的基础上,研究人员常常将强化学习进一步建模为Markov决策过程。本书第2章会介绍Markov决策过程。

1.4 强化学习的分类

强化学习的任务和算法多种多样,本节介绍一些常见的分类(见图1-6)。

image.png

1.4.1 按任务分类

根据强化学习的任务和环境,可以将强化学习任务作以下分类。

  • 单智能体任务(single agent task)和多智能体任务(multi-agent task):顾名思义,根据系统中的智能体数量,可以将任务划分为单智能体任务和多智能体任务。单智能体任务中只有一个决策者,它能得到所有可以观察到的观测,并能感知全局的奖励值;多智能体任务中有多个决策者,它们只能知道自己的观测,感受到环境给它的奖励。当然,在有需要的情况下,多个智能体间可以交换信息。在多智能体任务中,不同智能体奖励函数的不同会导致它们有不同的学习目标(甚至是互相对抗的)。在本书没有特别说明的情况下,一般都是指单智能体任务。
  • 回合制任务(episodic task)和连续性任务(sequential task):对于回合制任务,可以有明确的开始状态和结束状态。例如在下围棋的时候,刚开始棋盘空空如也,最后棋盘都摆满了,一局棋就可以看作是一个回合。下一个回合开始时,一切重新开始。也有一些问题没有明确的开始和结束,比如机房的资源调度。机房从启用起就要不间断地处理各种信息,没有明确的结束又重新开始的时间点。
  • 离散时间环境(discrete time environment)和连续时间环境(continuous time environment):如果智能体和环境的交互是分步进行的,那么就是离散时间环境。如果智能体和环境的交互是在连续的时间中进行的,那么就是连续时间环境。
  • 离散动作空间(discrete action space)和连续动作空间(continuous action space):这是根据决策者可以做出的动作数量来划分的。如果决策得到的动作数量是有限的,则为离散动作空间,否则为连续动作空间。例如,走迷宫机器人如果只有东南西北这4种移动方式,则其为离散动作空间;如果机器人向360°中的任意角度都可以移动,则为连续动作空间。
  • 确定性环境任务(deterministic environment)和非确定性环境(stochastic environ-ment):按照环境是否具有随机性,可以将强化学习的环境分为确定性环境和非确定性环境。例如,对于机器人走固定的某个迷宫的问题,只要机器人确定了移动方案,那么结果就总是一成不变的。这样的环境就是确定性的。但是,如果迷宫会时刻随机变化,那么机器人面对的环境就是非确定性的。
  • 完全可观测环境(fully observable environment)和非完全可观测环境(partially observable environment):如果智能体可以观测到环境的全部知识,则环境是完全可观测的;如果智能体只能观测到环境的部分知识,则环境是非完全可观测的。例如,围棋问题就可以看作是一个完全可观测的环境,因为我们可以看到棋盘的所有内容,并且假设对手总是用最优方法执行;扑克则不是完全可观测的,因为我们不知道对手手里有哪些牌。

1.4.2 按算法分类

从算法角度,可以对强化学习算法作以下分类。

  • 同策学习(on policy)和异策学习(off policy):同策学习是边决策边学习,学习者同时也是决策者。异策学习则是通过之前的历史(可以是自己的历史也可以是别人的历史)进行学习,学习者和决策者不需要相同。在异策学习的过程中,学习者并不一定要知道当时的决策。例如,围棋AI可以边对弈边学习,这就算同策学习;围棋AI也可以通过阅读人类的对弈历史来学习,这就算异策学习。
  • 有模型学习(model-based)和无模型学习(model free):在学习的过程中,如果用到了环境的数学模型,则是有模型学习;如果没有用到环境的数学模型,则是无模型学习。对于有模型学习,可能在学习前环境的模型就已经明确,也可能环境的模型也是通过学习来获得。例如,对于某个围棋AI,它在下棋的时候可以在完全了解游戏规则的基础上虚拟出另外一个棋盘并在虚拟棋盘上试下,通过试下来学习。这就是有模型学习。与之相对,无模型学习不需要关于环境的信息,不需要搭建假的环境模型,所有经验都是通过与真实环境交互得到。
  • 回合更新(Monte Carlo update)和时序差分更新(temporal difference update):回合制更新是在回合结束后利用整个回合的信息进行更新学习;而时序差分更新不需要等回合结束,可以综合利用现有的信息和现有的估计进行更新学习。
  • 基于价值(value based)和基于策略(policy based):基于价值的强化学习定义了状态或动作的价值函数,来表示到达某种状态或执行某种动作后可以得到的回报。基于价值的强化学习倾向于选择价值最大的状态或动作;基于策略的强化学习算法不需要定义价值函数,它可以为动作分配概率分布,按照概率分布来执行动作。
  • 深度强化学习(Deep Reinforcement Learning,DRL)算法和非深度强化学习算法。如果强化学习算法用到了深度学习,则这种强化学习可以称为深度强化学习算法。

值得一提的是,强化学习和深度学习是两个独立的概念。一个学习算法是不是强化学习和它是不是深度学习算法是相互独立的(见图1-7)。如果一个算法解决了强化学习的问题,这个算法就是强化学习的算法;如果一个算法用到了深度神经网络,这个算法就是深度学习算法。一个强化学习算法可以是深度学习算法,也可以不是深度学习算法;一个深度学习算法可以是强化学习算法,也可以不是强化学习算法。对于强化学习算法而言,在问题规模比较小时,能够获得精确解;当问题规模比较大时,常常使用近似的方法。深度学习则利用神经网络来近似复杂的输入/输出关系。对于规模比较大的强化学习问题,可以考虑利用深度学习来实现近似。如果一个算法既是强化学习算法,又是深度学习算法,则可以称它是深度强化学习算法。例如,很多电动游戏AI需要读取屏幕显示并据此做出决策。对屏幕数据的解读可以采用卷积神经网络这一深度学习算法。这时,这个AI就用到了深度强化学习算法。

image.png

1.5 如何学习强化学习

本节介绍强化学习需要的预备知识,以及如何学习强化学习,本节中还提供了一些参考资料。

1.5.1 学习路线

在正式学习强化学习前,需要了解一些预备的知识。在理论知识方面,你需要会概率论,了解概率、条件概率、期望等概念。要学习强化学习的最新进展,特别是AlphaGo等明星算法,你需要学习微积分和深度学习。在学习过程中往往需要编程实现来加深对强化学习的理解。这时你需要掌握一门程序设计语言。本书将使用Python 3作为编程语言。对于第6章到第9章的深度学习算法,配套的实现将基于深度学习库TensorFlow。本书不介绍这些预备知识。
要学习强化学习理论,需要理解强化学习的概念,并了解强化学习的建模方法。目前绝大多数的研究将强化学习问题建模为Markov决策过程。Markov决策过程有几种固定的求解模式。规模不大的问题可以求得精确解,规模太大的问题往往只能求得近似解。对于近似算法,可以和深度学习结合,得到深度强化学习算法。最近引起广泛关注的明星算法,如AlphaGo使用的算法,都是深度强化学习算法。本书第2章介绍Markov决策过程,第3章到第9章介绍Markov决策问题的求解,其中也涵盖了大多经典的深度强化学习算法。
在强化学习的学习和实际应用中,难免需要通过编程来实现强化学习算法。强化学习算法需要运行在环境中。Python扩展库Gym是最广泛使用的强化学习实验环境。本书1.6节将介绍强化学习实验环境Gym库的安装。强化学习算法需要和环境交互。本书各章节在介绍理论知识的同时,都会涉及强化学习算法的实现。本书第10章到第12章通过一些比较大型的例子来演示强化学习的综合应用。

1.5.2 学习资源

本书作为一套完整的强化学习教程,将引领读者实现从入门到精通。同时,如果还希望阅读英文教程对照参考,推荐Richard Sutton等在2018年出版的《Reinforcement Learning: An Introduction(第2版)》。该书和本书使用相同的数学符号和技术术语,和本书完全兼容。

1.6 案例:基于Gym库的智能体/环境交互

强化学习算法需要在难易适中的合适环境里才能发挥出其强大的功能。在本节中,我们将安装和应用影响力巨大的强化学习环境库—Gym库。
Gym库(https://gym.openai.com/ )是OpenAI推出的强化学习实验环境库。它用Python语言实现了离散时间智能体/环境接口中的环境部分。除了依赖少量商业库外,整个项目是开源免费的。
Gym库内置上百种实验环境,包括以下几类。

  • 算法环境:包括一些字符串处理等传统计算机算法的实验环境。
  • 简单文本环境:包括几个用文本表示的简单游戏。
  • 经典控制环境:包括一些简单几何体的运动,常用于经典强化学习算法的研究。
  • Atari游戏环境:包括数十个Atari 2600游戏,具有像素化的图形界面,希望玩家尽可能争夺高分。
  • 二维方块(Box2D)环境:包括一些连续性控制的任务。
  • MuJoCo环境:利用收费的MuJoCo运动引擎进行连续性控制任务。
  • 机械控制环境:关于机械臂的抓取和控制等。

Gym环境列表可参见网址https://gym.openai.com/envs/
本节我们将安装并使用Gym库,通过一个完整的实例来演示智能体与环境的交互。

1.6.1 安装Gym库

Gym库在Windows系统、Linux系统和macOS系统上都可以安装。本节与你一起在Anaconda 3环境里安装Gym库。
请在安装Gym前升级Python和pip。升级pip的命令是:

pip install --upgrade pip

安装Gym可以选择最小安装和完整安装。最小安装的方法是在安装环境(如Anaconda 3的管理员模式)里输入下列命令:

pip install gym

但是,这样安装的Gym库只包括少量的内置环境,如算法环境、简单文字游戏环境和经典控制环境。在此可以先使用这些环境。Gym库完整安装的方法见第10章。
注意:本书后续章节的实战环节将反复使用Gym库,请务必安装。前几章配套的案例只需要用到Gym的最小安装,而最后的综合案例需要依赖最小安装以外的完整安装。本书各章节配套实例需要使用的Gym库范围见表1-1。

image.png

1.6.2 使用Gym库

本节介绍Gym库的使用。
要使用Gym库,当然首先要导入Gym库。导入Gym库的方法显然是:

import gym

在导入Gym库后,可以通过make() 函数来得到环境对象。每一个环境都有一个ID,它是形如“Xxxxx-vd”的Python字符串,如'CartPole-v0'、'Taxi-v2'等。环境名称最后的部分表示版本号,不同版本的环境可能有不同的行为。使用取出环境'CartPole-v0'的代码为:

env = gym.make('CartPole-v0')

想要查看当前Gym库已经注册了哪些环境,可以使用以下代码:

image.png

每个环境都定义了自己的观测空间和动作空间。环境env的观测空间用env.observa-tion_space表示,动作空间用env.action_space表示。观测空间和动作空间既可以是离散空间(即取值是有限个离散的值),也可以是连续空间(即取值是连续的)。在Gym库中,离散空间一般用gym.spaces.Discrete类表示,连续空间用gym.spaces.Box类表示。例如,环境'MountainCar-v0'的观测空间是Box(2,),表示观测可以用2个float值表示;环境'MountainCar-v0'的动作空间是Dicrete(3),表示动作取值自。对于离散空间,gym.spaces.Discrete类实例的成员n表示有几个可能的取值;对于连续空间,Box类实例的成员low和high表示每个浮点数的取值范围。
接下来使用环境对象env。首先,初始化环境对象env,代码为:

env.reset()

该调用能返回智能体的初始观测,是np.array对象。
环境初始化后就可以使用了。使用环境的核心是使用环境对象的step()方法。step()方法接收智能体的动作作为参数,并返回以下4个参数。

  • 观测(observation):np.array对象,表示观测,和env.reset()返回值的意义相同。
  • 奖励(reward):float类型的值。
  • 本回合结束指示(done):bool类型的数值。Gym库里的实验环境大多都是回合制的。这个返回值可以指示在当前动作后游戏是否结束。如果游戏结束了,可以通过“env.reset()”开始下一回合。
  • 其他信息(info):dict类型的值,含有一些调试信息。不一定要使用这个参数。

env.step() 的参数需要取自动作空间。可以使用以下语句从动作空间中随机选取一个动作:

action = env.action_space.sample()

每次调用env.step() 只会让环境前进一步。所以,env.step()往往放在循环结构里,通过循环调用来完成整个回合。
在env.reset()或env.step()后,可以用以下语句以图形化的方法显示当前环境。

env.render()

使用完环境后,可以使用下列语句关闭环境:

env.close()

注意:如果绘制了实验的图形界面窗口,那么关闭该窗口的最佳方式是调用env.close()。试图直接关闭图形界面窗口可能会导致内存不能释放,甚至会导致死机。
测试智能体在Gym库中某个任务的性能时,学术界一般最关心100个回合的平均回合奖励。至于为什么是100个回合而不是其他回合数(比如128个回合),完全是习惯使然,没有什么特别的原因。对于有些环境,还会指定一个参考的回合奖励值,当连续100个回合的奖励大于指定的值时,就认为这个任务被解决了。但是,并不是所有的任务都指定了这样的值。对于没有指定值的任务,就无所谓任务被解决了或者没有被解决。

1.6.3 小车上山

本节通过一个完整的例子来学习如何与Gym库中的环境交互。本节选用的例子是经典的控制任务:小车上山(MountainCar-v0)。本节主要关心交互的Python代码,而不详细介绍这个控制任务及其求解。任务的具体描述和求解方式会在第6章中介绍。
首先我们来看看这个任务的观测空间和动作空间,可以通过执行代码清单1-1实现。

image.png

这段代码的运行结果为:
观测空间 = Box(2,)
动作空间 = Discrete(3)
观测范围 = [-1.2 -0.07] ~ [0.6 0.07]
动作数 = 3
运行结果告诉我们,观测空间是形状为(2,)的浮点型np.array,而动作空间是取的int型数值。
接下来考虑智能体。智能体往往是我们自己实现的。代码清单1-2给出了一个智能体类—BespokeAgent类。智能体的decide()方法实现了决策功能,而learn()方法实现了学习功能。代码清单1-2给出的BespokeAgent类是一个比较简单的类,它只能根据给定的数学表达式进行决策,并且不能有效学习。所以它并不是一个真正意义上的强化学习智能体类。但是,用于演示智能体和环境的交互已经足够了。

image.png

接下来我们试图让智能体与环境交互。代码清单1-3中的play_once() 函数可以让智能体和环境交互一个回合。这个函数有4个参数。

  • 参数env是环境类。
  • 参数agent是智能体类。
  • 参数render是bool类型变量,指示在运行过程中是否要图形化显示。如果函数参数render为True,那么在交互过程中会调用env.render()以显示图形化界面,而这个界面可以通过调用env.close()关闭。
  • 参数train是bool类型的变量,指示在运行过程中是否训练智能体。在训练过程中应当设置为True,以调用agent.learn()函数;在测试过程中应当设置为False,使得智能体不变。

这个函数有一个返回值episode_reward,是float类型的数值,表示智能体与环境交互一个回合的回合总奖励。

image.png
image.png

借助于代码清单1-1给出的环境、代码清单1-2给出的智能体和代码清单1-3给出的交互函数,我们可以用下列代码让智能体和环境交互一个回合,并在交互过程中图形化显示。交互完毕后,可用env.close()语句关闭图形化界面。

image.png

为了系统评估智能体的性能,下列代码求出了连续交互100回合的平均回合奖励。小车上山环境有一个参考的回合奖励值,如果当连续100个回合的平均回合奖励大于,则认为这个任务被解决了。BespokeAgent类对应的策略的平均回合奖励大概就在左右。

image.png

1.7 本章小结

本章介绍了强化学习的概念和应用,学习了强化学习的分类,讲解了强化学习的学习路线和学习资源。我们还学习了强化学习环境库Gym的使用。后续几个章节将介绍强化学习的理论,并且利用Gym库实践相关理论。
本章要点
image.png强化学习是根据奖励信号以改进策略的机器学习方法。策略和奖励是强化学习的核心元素。强化学习试图找到最大化总奖励的策略。
image.png强化学习不是监督学习,因为强化学习的学习过程中没有参考答案;强化学习也不是非监督学习,因为强化学习需要利用奖励信号来学习。
image.png强化学习的应用包括棋牌运动、自动控制、电动游戏。
image.png强化学习任务常用智能体/环境接口建模。学习和决策的部分称为智能体,其他部分称为环境。智能体向环境执行动作,从环境得到奖励和反馈。
image.png按智能体的数量分,强化学习任务可以分为单智能体任务和多智能体任务。按环境是否有明确的终止状态分,强化学习任务可以分为回合制任务和连续性任务。按照时间是否可以离散可以分为离散时间和连续时间。动作空间可以划分为离散动作空间和连续动作空间。环境可以划分为确定性环境和非确定性环境。按照环境是否完全可以观测分,可以分为完全可观测环境和非完全可观测环境。
image.png强化学习算法可以按照学习的策略和决策的行为策略是否相同分为同策学习和异策学习。按照是否需要环境模型,分为有模型学习和无模型学习。按照策略更新时机可以分为回合更新和时序差分更新。更新价值函数的学习方法称为基于价值的学习,直接更新策略的概率分布的学习方法称为基于策略的学习。如果一个强化学习算法用到了深度学习,则它是深度强化学习算法。
image.pngPython扩展库Gym是OpenAI推出的免费强化学习实验环境。Gym库的使用方法是:使用env = gym.make(环境名)取出环境,使用env.reset()初始化环境,使用env.step(动作)执行一步环境,使用env.render()显示环境,使用env.close()关闭环境。

相关文章
|
4月前
|
安全 API 数据安全/隐私保护
深入浅出python代码混淆:原理与实践
代码混淆就像是给你的代码穿上了一件隐形衣。它可以让你的代码变得难以理解,但并不能完全保证代码的安全。在实际应用中,我们应该将代码混淆作为整个安全策略中的一环,而不是唯一的防线。
|
4月前
|
机器学习/深度学习 算法 机器人
使用 Python TorchRL 进行多代理强化学习
本文详细介绍了如何使用TorchRL库解决多代理强化学习(MARL)问题,重点讨论了在多代理环境中应用近端策略优化(PPO)。通过使用VMAS模拟器,该文展示了如何在GPU上并行训练多机器人系统,使其在避免碰撞的同时到达目标。文章涵盖了依赖项安装、PPO原理、策略与评论家网络设计、数据收集及训练循环,并强调了TorchRL在简化开发流程、提升计算效率方面的优势。无论是集中式还是分布式评论家配置,TorchRL均能有效支持复杂的MARL研究与实践。
61 5
使用 Python TorchRL 进行多代理强化学习
|
4月前
|
机器学习/深度学习 存储 算法
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
本文详细介绍了回声状态网络(Echo State Networks, ESN)的基本概念、优点、缺点、储层计算范式,并提供了ESN的Python代码实现,包括不考虑和考虑超参数的两种ESN实现方式,以及使用ESN进行时间序列预测的示例。
177 4
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
|
18天前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
31 1
|
3月前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器使用与原理解析
【9月更文挑战第20天】本文深入探讨Python中一个强大而神秘的功能——装饰器。通过浅显易懂的语言和生动的比喻,我们将一步步揭开装饰器的面纱,理解其背后的原理,并通过实际代码示例掌握如何运用装饰器来增强我们的函数功能。无论你是初学者还是有一定基础的开发者,这篇文章都将带给你新的启发和思考。
48 7
|
3月前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
在Python异步编程领域,协程与异步函数成为处理并发任务的关键工具。协程(微线程)比操作系统线程更轻量级,通过`async def`定义并在遇到`await`表达式时暂停执行。异步函数利用`await`实现任务间的切换。事件循环作为异步编程的核心,负责调度任务;`asyncio`库提供了事件循环的管理。Future对象则优雅地处理异步结果。掌握这些概念,可使代码更高效、简洁且易于维护。
26 1
|
3月前
|
API 开发者 Python
Python中的魔法方法:从原理到实践
【9月更文挑战第24天】本文将深入探讨Python的魔法方法,这些特殊的方法允许对象定制其行为。文章首先揭示魔法方法的本质和重要性,然后通过代码示例展示如何利用它们来增强类的功能性。最后,我们将讨论在实际应用中应注意的事项,以确保正确和高效地使用这些方法。
|
3月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
41 4
|
3月前
|
缓存 Python
探索Python中的装饰器:原理与应用
本文深入探讨了Python中装饰器的概念,从基本定义到实际应用进行了系统性的阐述。通过实例展示了如何利用装饰器来增强函数功能,同时详细解释了其背后的运行机制和实现原理。此外,文章还讨论了装饰器在软件开发中的实际应用场景,为读者提供了实用的编程技巧和最佳实践。
30 3
|
2月前
|
数据采集 调度 Python
Python编程异步爬虫——协程的基本原理(一)
Python编程异步爬虫——协程的基本原理(一)
下一篇
无影云桌面