共计 3563 个字符,预计需要花费 9 分钟才能阅读完成。
Pytorch 的一个强化的学习教程(Train a Mario-playing RL Agent)应用超级玛丽游戏来学习双 Q 网络(强化学习的一种类型),官网的文章只有代码,所以本文将配合官网网站的教程具体介绍它是如何工作的,以及如何将它们利用到这个例子中。
强化学习是如何起作用的
机器学习能够分为三类: 监督学习、非监督学习和强化学习。
在监督学习中,模型被赋予一个训练数据集,该数据集蕴含输出和输入(标签)。它从这些数据中学习,理解如何从输出中取得输入。训练实现后应用测试数据集(蕴含模型从未见过的输出),模型必须尝试预测每个数据点应该被赋予的标签。
在无监督学习中,模型被赋予一个数据集,但数据点都没有标签。它被提供数据点和一些簇来将它们分组。随着簇数量的变动,算法的输入也随之变动。这种类型的学习用于发现给定数据中的模式。
强化学习与其余两种训练方法不同:
上图 t 示意被解决的步骤(或工夫)。在一个步骤中,环境为代理的行为以及以后状态提供响应(处分或惩办)。有了这些信息,代理就能够确定要采取的口头。
它的训练是不受监督的,但它不是试图将数据点分组,而是试图通过在环境中执行无利的行为来取得处分,同时试图防止犯惩办它的谬误(R_t)。
当波及到强化学习时,了解以下术语很重要:
Agent: Agent 是一种神经网络,它通过与环境的相互作用进行学习,并理解哪些行为会导致好的后果和坏的后果,咱们将它称为代理,也有叫他为智能体的,然而我感觉代理更加适合,因为它相当于是咱们玩游戏的代理人。
Environment: 环境是代理在其中进行交互和学习的世界
Action: 动作是指行为主体在特定的环境 (状态) 下决定要做的事件
State: 状态是对给定时刻环境中的内容的捕捉
Response: 响应是当一个代理做了对其下一个状态无益或无害的事件时给予它的货色
深度 Q 学习与双深度 Q 网络(DDQNs)
深度 Q 学习是一种应用深度神经网络的强化学习。它应用 Q 值(状态的品质),确定其行为对环境状态是无益的还是无害的,来进行学习
深度 Q 网络 (DQN) 是一种多层神经网络,对于给定的状态,它依据网络的权重和偏差输入一个动作值向量。对于 n 维状态空间和蕴含 m 个动作的动作空间,神经网络是一个从 R^n 到 R^m 的函数。
Q 学习(Q-learning)算法在某些条件下会高估动作值,这可能会影响它们的性能。而双深度 Q 学习是对 DQN 算法的一种非凡扭转,它不仅缩小了算法的过高估计,还进步了算法的性能。双 Q 学习的思维是通过将指标中的最大操作合成为口头的抉择和口头的评估来缩小过高估计。
深刻了解深度 Q 学习和双深度 Q 网络 (DDQNs) 波及简单的数学。咱们这里不具体介绍,如果有趣味想具体理解请看这篇论文(https://arxiv.org/pdf/1509.06…)
MarioNet
上面咱们进入正题“Train A Mario-Playing RL Agent”的教程详解,非常感谢 Yuanson Feng, Suraj Subramanian, Howard Wang 和 Steven Guo 制作了这个教程。
背景常识
在训练玩马里奥的背景下:
- 咱们的代理是马里奥。
- 游戏环境就是马里奥的世界——它蕴含敌人、阻碍和道具,如管子、蘑菇等。
- 口头就是马里奥执行的动作
- 动作空间是马里奥能够执行的所有可能的动作: 向右跑,向右跳,向左跑,向左跳。在这种状况下,我将马里奥限度在右侧挪动,以便进行更快的训练。
- 状态包含以下几项内容: 马里奥的地位、阻碍、降级道具和敌人的地位、马里奥的以后分数(不重要)以及所有物体的前进方向。
- 状态空间是环境中所有可能状态的汇合。
- 处分是环境对代理的反馈,这将推动马里奥学习并扭转本人将来的口头。
- 回报是通过屡次游戏或章节的累积处分。
- 状态中行为的品质是给定状态和行为的预期回报。
环境预处理
在咱们开始训练神经网络之前,咱们能够优化环境,这样训练的计算量就不会那么大。
灰度化: 环境的大小是一个 3x240x256 的窗口,其中 3 示意 RGB 通道,240×256 示意窗口的尺寸。状态中每个对象的色彩并不会真正影响代理的最终口头,例如马里奥穿红色衣服或砖块是棕色并不会扭转代理的口头。所以咱们能够将整个图像转换为灰度图,而不是解决一个计算量很大的 3x240x256 窗口,这样咱们能够应用 1x240x256 的灰度图。
调整大小: 对于计算机来说,以每秒 15 帧的速度解决一个 240 × 256 像素的窗口可能不是最简略的(稍后会具体介绍)。所以咱们能够调整代理接管的图像的大小,比方放大到到 84 像素乘 84 像素。
跳帧: 咱们的代理解决每一帧并不会减少多少价值,因为通过查看间断的帧,代理不会取得太多信息,因为间断的帧蕴含十分类似的状态。所以咱们能够跳过给定数量的两头帧而不会失落太多信息。
叠加帧: 帧叠加用于将间断的帧合并为一个对立的学习模型输出。应用这种办法,能够通过查看给定的帧,更容易地辨认之前产生的动作。
所以咱们重叠四个间断的,灰度化的,调整大小的帧,这样失去了一个 4x84x84 的大小的输出。
定义代理
马里奥 (咱们的代理) 须要可能口头、记忆和学习。
动作: 代理的行为基于环境的以后状态和最优的行为策略。在每个状态下,马里奥要么执行一个动作 (摸索),要么应用他的神经网络(MarioNet) 为他提供的一个最佳执行动作(利用)。马里奥依据本人的摸索速度决定是否进行摸索或利用。
在训练开始时,摸索率被设置为 1,这意味着马里奥必定会做一个随机的动作。而后,随着每个重叠帧的流逝,摸索速率会随着一个叫做摸索速率衰减的数字而缩小,这将疏导马里奥应用神经网络而不是随机口头进行摸索。
记忆(缓存和回顾): 马里奥依据以后状态、处分和下一个状态来记住本人以前的动作。对于每个动作,马里奥都会缓存他的教训(将它们存储在内存中)。而后,他从记忆缓存中回顾(随机抽取一批体验),并应用它来学习如何更好地玩游戏。
学习: 随着工夫的推移,马里奥须要可能应用本人的教训去欠缺本人的口头 (或口头策略)。为了实现这项工作,咱们应用 DDQN 算法。在这种状况下,DDQN 应用两个近似最优动作值函数的卷积神经网络。采纳工夫差分法(TD) 计算 TD_estimate 和 TD_target,并计算损失来优化神经网络参数。
运行 MarioNet
我查看官网教程的代码,理解它是如何工作的。代码正文得十分好。它能够让咱们理解双 Q 学习中的所有数学概念是如何转化为代码的。
运行网络并察看网络是如何工作的十分乏味。咱们这里不对这个模型进行残缺的训练步骤,因为这须要 4 万轮次。我花了大概 9 分钟在笔记本电脑上看完 100 轮。依照这个速度,须要 60-70 个小时才可能训练万 4 万的轮次。
上面列出了一些在整个训练过程中生成的输入图表和日志。通过观察这张图,我能够察看到神经网络是如何逐渐学习的。留神在前几轮中,马里奥的口头是齐全随机的。直到第 40 轮 (图表中的第 8 轮) 左右,马里奥才开始利用他的神经网络。
x 轴上的值乘以 5 是论次数。y 轴是这 5 轮的均匀处分。
每五轮训练的均匀时常。y 轴示意每一轮的工夫。
上图是 5 轮的操作数,摸索率,均匀处分,长度,损失和 Q 值,花在这 5 轮上的工夫,以及实现这 5 轮的工夫。
看看训练一轮是什么样子的:
注意事项
加载和保留模型
在对该程序进行试验时,每次运行该应用程序时都是从头开始的,并没有保留神经网络的最初一个训练状态。因而须要找到一种通过屡次运行来训练网络的办法,这样我就不用让计算机的 CPU 超负荷 60 个小时。在 PyTorch 中有多种办法能够保留和加载模型。尽管在代码中正确地实现了保留,但我发现在程序开始时并没有真正加载之前保留的神经网络状态。
这导致咱们每次训练都是从头开始的。所以咱们须要批改代码:
在程序完结时,保留神经网络的状态、epsilon(摸索率)值和轮次。在程序开始时,加载先前保留的神经网络状态、epsilon 值和轮次,这样训练就能够从以前的点复原训练。
cpu 和 gpu
应用 CPU 的训练很慢,但我尝试应用 GPU 训练时,它就会耗尽内存(因为笔记本显卡的显存不大)。GPU 内存耗尽的起因是,它始终在填充缓存,直到缓存满了,但在训练过程中从未清空任何数据。这是一个须要钻研的问题。
总结
非常感谢 Yuanson Feng, Suraj Subramanian, Howard Wang 和 Steven Guo,他们制作了这个简略的教程,通过这个教程能够学习很多多对于强化学习的常识,包含应用 PyTorch 和 OpenAI Gym(提供了这些很棒的环境来训练我的神经网络)这是一个学习并创立本人的强化学习应用程序十分好的开始。
官网教程在这里,有趣味的能够自行查看:
https://avoid.overfit.cn/post/a625743c337e48a6839ffe2121f90369
作者:Sohum Padhye