强化学习系列文章
第一章 强化学习入门
第二章 翻译OpenAI用户手册(一)
第三章 翻译OpenAI用户手册(二)
第四章 翻译OpenAI用户手册(三)
目录
用户手册
1.简介
1.1 这是什么
1.2 我们为什么建立这个
1.3 这个怎么服务于我们的任务
1.4 代码设计哲学
1.5 长期支持和支持历史
2 安装
2.1 安装Python
2.2 安装OpenMPI
Ubuntu
Mac OS X
Installing Spinning Up
2.3 确认你的安装正确
2.4 安装MuJoCo (可选)
3 算法
3.1 包含什么算法
3.2 为什么是这些算法?
3.3 在线策略算法
3.4 离线策略算法
3.5 编程规范
3.6 算法函数:PyTorch版本
3.7 算法函数:Tensorflow版本
3.8 核心文件
欢迎来到玩转Deep RL!这是一个OpenAI提供的教育资源,使得学习深度强化学习(deep RL)更加容易。
对于不熟悉者:强化学习(RL)是一种机器学习方法,用来教智能体怎么通过试验和错误完成任务。Deep RL指的是结合RL和深度学习。
这个部分包含各种有用的资源,包括:
一个我们经常听到的问题是:
如果我想为AI安全贡献自身的力量,我们该怎么开始?
在OpenAI,我们相信深度学习将会普遍的,特别是深度强化学习,在未来的强大的AI技术发展中扮演核心的角色。为了确保AI是安全的,我们必须提出安全策略,且算法和这个策略是兼容的。作为结果,我们鼓励每个提出这个问题的人都能研究这些领域。
然而,虽然有非常多的资源来帮助人们快速提升深度学习能力,但深度强化学习仍然很难去切入。为了开始深度强化学习的研究,一个深度强化学习的学生需要一些数学,编程和常规深度学习的背景知识。除此之外,他们同时需要这个领域的一个较高的视野和那些主题被研究的认识,为什么这些重要,和什么已经被完成了,和关于怎么联系算法理论和算法代码的仔细指导。
一个较高的视野是很难得到的,因为这个领域很新。现在还没有一个标准的深度强化学习书籍,所以大多数知识是被锁定在论文或者系列演讲中,这些需要很长的时间来理解和消化。且学着实现深度强化学习算法是非常痛苦的,因为要么
虽然非常棒的仓库如garage,Baselines和rllib使得已经在这个领域的研究者更容易进步,但他们在框架中构建算法,这涉及很多不明显的选择和权衡,使得研究者很难从中学习。结果,深度强化学习领域有一个很高的进入障碍,不仅新的研究者,对于已经入门的人和业余爱好者也很难。
所以我们这里的任务是设计来为被深度强化学习所惊艳、和想要学习怎么使用它或者怎么贡献自己的力量,但是对研究什么或者怎么将算法转化为代码没有一个清晰的认识的人们服务的,用来补充缺少的中间步骤。我们试图使它尽可能成为一个有用的启动点。
也就是说,入门者不是唯一的能从这些材料中获益的人群。解决AI安全需要人们具有大量的专业知识和远见,且许多相关的职业与工程和计算机科学等没有联系。但是,每个相关的人都会需要充分学习这个技术来作出明智的决定,和几个需要的玩转地址。
OpenAI的任务是确保AGI的安全发展,和来自AI(通用人工智能)的广泛利益分布更加普遍。
类似“玩转”的教学工具帮助我们在这两个目标上取得进展。
首先,每当我们帮助人们理解什么是人工智能以及它是如何工作的时候,我们都在向广泛的利益分配靠拢。随着人工智能在我们生活中变得越来越复杂和重要,这使得人们能够批判性地思考我们预期将出现的许多问题
另外,至关重要的是,我们需要有人帮助我们确保AGI(通用人工智能)是安全的。这需要一套目前短缺的技能,因为这一领域非常的新。我们知道很多人都有兴趣帮助我们,但却不知道如何帮助我们——以下就是你应该学习的内容!如果你能成为这方面的专家,你就能在AI安全方面有所作为。
在“玩转”仓库中实现的算法被设计为:
它们几乎是完全自洽的,且实际上几乎没有共享的公共代码(除了日志记录、保存、加载和MPI实用程序),因此感兴趣的人可以单独研究每种算法,而不必挖掘无穷无尽的依赖链来查看某些操作是如何完成的。代码实现是模式化的,因此它们尽可能接近伪代码,以最小化理论和代码之间的差距。
重要的是,它们的结构都是类似的,所以如果你清楚地理解了其中一个,进入下一个是毫无痛苦的。
我们试图最小化每个算法实现中使用的技巧数量,并最小化其他相似算法之间的差异。为了给出一些被删除的技巧的例子:我们省略了原来的Soft-Actor Critic code中出现的正则化术语,以及来自所有算法的观察规范化。举例来说,我们已经消除了算法之间的差异:我们的DDPG、TD3和SAC的实现都遵循一种惯例,即在固定的环境交互间隔之后运行梯度下降更新(相比之下,这些算法的其他公共实现通常采用略微不同的方法,这使得比较它们有些困难)。
所有算法都是“相当好”的,因为它们大致达到了预期的性能,但不一定与文献中报告的每个任务的最佳结果相匹配。因此,在使用这些实现进行科学的基准比较时要小心。关于每个实现的特定性能级别的详细信息可以在我们的基准测试页面中找到。
“玩转”目前处于维护模式。如果有任何破坏bug,我们将修复它们,以确保“玩转”能够继续帮助人们深入研究RL。
目前为止的支持历史:
此外,正如在博客文章中所讨论的,“玩转”已经被整合到我们的学者和研究员项目的课程中。
“玩转”需要 Python3, OpenAI Gym, 和OpenMPI安装环境。
目前只支持Linux和OSX。它可以安装在Windows上,不过还没有经过广泛的测试。
你应该知道的:
“玩转”中的许多示例和基准测试都引用了使用MuJo物理引擎的强化学习环境。MuJoCo是一种需要许可的专有软件,它对试用和学生都是免费的,但除此之外就不是免费的了。因此,安装它是可选的,但是由于它对研究社区的重要性——它是对连续控制中的深度RL算法进行基准测试的事实标准——它是首选的。
不过,如果您决定不安装MuJoCo,也不用担心。你完全可以通过在Gym的经典控制和Box2d环境中运行RL算法来开始学习RL,这些都是完全免费的。
看起来至少有一个人找到了在Windows上运行的解决方案。如果你尝试另一种方法并且成功了,请告诉我们你是怎么做到的!
我们建议通过Anaconda安装Python。Anaconda是一个库,它包括Python和许多有用的Python包,以及一个名为conda的环境管理器,它使包管理变得简单。
按照这里的Anaconda的安装说明操作。下载并安装Anaconda3(撰写本文时,Anaconda3-5.3.0)。然后创建一个conda Python 3.6 env用于组织“玩转”使用的包:
conda create -n spinningup python=3.6
要使用Python从您刚刚创建的环境,激活环境:
conda activate spinningup
你应该知道的:
如果您是python环境和包管理的新手,那么这些内容很快就会让您感到困惑或不堪重负,在此过程中您可能会遇到一些障碍。(特别是,你应该期望等问题,“我刚刚安装这个东西,但是它说它不是发现当我试着使用它!”)你可能想要阅读一些干净的解释关于包管理是什么,为什么这是一个好主意,你通常需要执行什么命令来正确地使用它。
FreeCodeCamp有一个很好的解释值得一读。有一个简短的描述朝着数据科学,这也是有帮助和信息。最后,如果您是一个非常有耐心的人,您可能需要阅读来自Conda的文档页面(枯燥但内容丰富)。
sudo apt-get update && sudo apt-get install libopenmpi-dev
在Mac上安装系统包需要Homebrew。安装了Homebrew后,运行以下程序:
brew install openmpi
git clone https://github.com/openai/spinningup.git
cd spinningup
pip install -e .
你应该知道的:
“玩转”默认安装在Gym中的所有东西,除了MuJoCo环境。如果你在安装Gym时遇到任何麻烦,请查看Gym github页面寻求帮助。如果您需要MuJoCo环境,请参阅下面的可选安装部分。
要查看是否成功安装了“玩转”,请尝试在lunarlan -v2环境中运行PPO:
python -m spinup.run ppo --hid "[32,32]" --env LunarLander-v2 --exp_name installtest --gamma 0.999
它可能会运行大约10分钟,您可以让它在后台运行,同时继续阅读文档。这不会训练代理完成,但是会运行它足够长的时间,当有结果时,您可以看到一些学习进展。
在它完成训练后,用如下语句观看训练策略的视频:
python -m spinup.run test_policy data/installtest/installtest_s0
并用如下语句绘制结果:
python -m spinup.run plot data/installtest/installtest_s0
首先,访问mujoco-py github页面。遵循README中的安装说明,其中描述了如何安装MuJoCo物理引擎和MuJoCo -py包(它允许使用Python中的MuJoCo)。
你应该知道的:
为了使用MuJoCo模拟器,您需要获得MuJoCo许可。任何人都可以获得免费的30天许可证,全日制学生可以获得免费的1年许可。
安装完MuJoCo后,安装相应的健身房环境
pip install gym[mujoco,robotics]
然后通过在Walker2d-v2环境中运行PPO来检查工作是否正常
python -m spinup.run ppo --hid "[32,32]" --env Walker2d-v2 --exp_name mujocotest
“玩转”包中实现了以下算法:
它们都是通过MLP(非周期性)actor-critics实现的,这使得它们适合于完全观察的、非基于图像的RL环境,例如Gym的Mujoco环境。
“玩转”对于每个算法都有两个实现(TRPO除外):一个使用PyTorch作为神经网络库,另一个使用Tensorflow v1作为神经网络库。(TRPO目前只在Tensorflow中可用。)
我们选择了核心的深度强化学习算法,以反映该领域近期历史中有用的思想进展,尤其是在两个算法PPO和 SAC,它们在可靠性和样本效率方面接近策略学习算法的最新水平。它们还揭示了在深度RL中设计和使用算法时需要做出的一些权衡。
Vanilla Policy Gradient 是深度强化学习领域中最基本的入门级算法,因为它完全早于深度强化学习的出现。VPG的核心元素可以追溯到80年代末/ 90年代初。它开始了一系列的研究,最终产生了更强大的算法,如TRPO和不久后的PPO。
这里工作的一个关键特征是,所有这些算法都是on-policy:也就是说,它们不使用旧数据,这使得它们的样本效率较低。但这是有原因的:这些算法直接优化您关心的目标——策略性能——并且从数学上计算出您需要有关策略的数据来计算更新。因此,这类算法牺牲了采样效率,而追求了稳定性——但你可以看到技术的进步(从VPG到TRPO到PPO)正在努力弥补采样效率的不足。
DDPG是一种与VPG类似的基础算法,尽管要年轻得多——导致DDPG的确定性策略梯度理论直到2014年才发表。DDPG与Q-learning算法紧密相连,它同时学习q函数和策略,并互相更新以改进。
像DDPG和Q-Learning这样的算法是不靠策略的,所以它们能够非常有效地重用旧数据。他们通过利用Bellman的最优性方程来获得这种好处,Q-function可以被训练来满足使用任何环境交互数据(只要有足够的经验从环境中的高回报领域)。
但有问题的是,不能保证在满足Bellman方程方面做得好,就能获得良好的策略表现。根据经验,一个人可以获得很好的性能——当它发生时,样本效率是非常好的——但缺乏保证使得这类算法潜在地脆弱和不稳定。TD3和SAC是DDPG的后代,它们利用各种洞察力来缓解这些问题。
“玩转”的所有实现都遵循一个标准模板。它们被分成两个文件:一个算法文件,其中包含算法的核心逻辑;另一个核心文件,其中包含运行算法所需的各种实用程序。
算法文件总是从试验缓冲区对象的类定义开始,该对象用于存储来自智能体-环境交互的信息。接下来,有一个运行该算法的单一函数。算法函数遵循的模板在PyTorch和Tensorflow版本中大致相同,但我们将在下面分别对其进行分解。最后,每个算法文件都支持从命令行在Gym环境中直接运行算法(尽管这不是运行算法的推荐方式——我们将描述如何执行)
PyTorch实现的算法函数(大致)按照如下顺序执行:
日志启动
随机种子设置
环境实例化
通过作为参数传递给算法函数的actor_critics函数构造actor_critics的PyTorch模块
实例化试验缓冲区
设置还提供特定算法的诊断的可调用损失函数
使能PyTorch优化器
通过日志程序建立模型保存
运行算法主循环:
Tensorflow实现的算法函数(大致)按照如下顺序执行:
日志启动
随机种子设置
环境实例化
为计算图创建placeholders
通过作为参数传递给算法函数的actor_critics函数构造actor_critics的PyTorch模块
实例化试验缓冲区
为特定算法的损失函数和诊断构建计算图
使能训练ops
使能TF的任务和初始化参数
通过日志程序建立模型保存
定义运行算法主循环所需的函数(例如,根据算法,核心更新函数、get action函数和test agent函数)
运行算法主循环:
核心文件不像算法文件那样紧密地遵循一个模板,但确实有一些近似的结构:
仅用于Tensorflow:与创建和管理placeholders相关的函数
用于构建与特定算法的actor_critic
方法相关的计算图部分的函数
其他有用的函数
实现与算法兼容的MLP actor_critic
,其中策略和值函数都由简单的MLPs表示