提交 a765d7fc 编写于 作者: W wizardforcel

2021-01-18 16:56:45

上级 29ba9255
......@@ -6,7 +6,7 @@ RL 是**人工智能**(**AI**)的领域,与我们在前面各章中介绍
在本章中,我们将介绍以下食谱:
* OpenAI 健身房简介– CartPole
* OpenAI 体育馆简介– CartPole
* 引入 DQN
* 实施 DQN 类
* 训练 DQN
......@@ -28,13 +28,13 @@ RL 解决方案涉及将反复试验的结果存储在查找表中,当环境
深度学习是 RL 最近取得突破的背后。 它们展现了代表性的功能,效率,灵活性,并为眼前的问题提供了简化的解决方案。
# OpenAI 健身房简介– CartPole
# OpenAI 体育馆简介– CartPole
在本食谱中,我们将实现两种不同的 RL 算法。 我们将需要一个环境来运行我们的算法,以便我们创建的模型将获得最大的回报。
我们将使用 OpenAI 的健身房库,该库是我们可以用来训练模型的环境的集合。 我们将专注于称为`Cartpole-v1`的特定环境。
我们将使用 OpenAI 的体育馆库,该库是我们可以用来训练模型的环境的集合。 我们将专注于称为`Cartpole-v1`的特定环境。
pole 是一个倒立的摆锤,其重心高于其枢轴点。 为了控制倒立摆的不稳定位置,我们必须将枢轴点移动到质心下方。 目的是施加适当的力,以使柱杆在枢轴点上保持平衡。
杆子是一个倒立的摆锤,其重心高于其枢轴点。 为了控制倒立摆的不稳定位置,我们必须将枢轴点移动到质心下方。 目的是施加适当的力,以使柱杆在枢轴点上保持平衡。
下图显示了 OpenAI 体育馆的 Cartpole:
......@@ -42,7 +42,7 @@ pole 是一个倒立的摆锤,其重心高于其枢轴点。 为了控制倒
图 1:OpenAI 体育馆– Cartpole
撑杆通过未激活的接头连接到推车,该接头在水平轨道上自由移动。 摆锤垂直于水平轨道开始。 目的是通过施加力+1 和-1 来防止跌落。
撑杆通过未激活的接头连接到推车,该接头在水平轨道上自由移动。 摆锤垂直于水平轨道开始。 目的是通过施加力 +1 和 -1 来防止跌落。
当杆与垂直位置的夹角超过 15 度时,或者手推车从中心移出的单位超过 2.4 个单位时,则认为手推车未能达到目标。
......@@ -139,17 +139,17 @@ pip install gym
在进入下一个食谱之前,让我们快速看一下 DQN。
DQN 是一种 RL 技术,旨在为给定的观察选择最佳的动作。 有一个 q 值,它是与每个可能观察到的每个可能动作相关联的给定移动的质量。 在传统的 RL 算法中,此 q 值来自 q 表,该表是一个查找表,其中是包含 q 值的表。 通过反复玩游戏并使用奖励更新表来迭代更新此查找表。 q 学习算法学习要在此表中填充的最佳值。 我们可以简单地查看给定状态的表并选择具有最大 q 值的动作,以最大程度地赢得游戏。
DQN 是一种 RL 技术,旨在为给定的观察选择最佳的动作。 有一个 Q 值,它是与每个可能观察到的每个可能动作相关联的给定移动的质量。 在传统的 RL 算法中,此 Q 值来自 Q 表,该表是一个查找表,其中是包含 Q 值的表。 通过反复玩游戏并使用奖励更新表来迭代更新此查找表。 q 学习算法学习要在此表中填充的最佳值。 我们可以简单地查看给定状态的表并选择具有最大 Q 值的动作,以最大程度地赢得游戏。
q 值可以更新如下:
Q 值可以更新如下:
![](img/d2d686eb-44fe-4767-b842-d01fca99d3cf.png)
新的 q 值是两个部分的总和。 第一部分是**(1-学习率)*旧 Q 值**,它是多少旧值将被记住。 学习率为 0 时,不会学习任何新内容,学习率为 1 时,所有旧值都将被忘记。
新的 Q 值是两个部分的总和。 第一部分是`(1 - 学习率) * 旧 Q 值`,它是多少旧值将被记住。 学习率为 0 时,不会学习任何新内容,学习率为 1 时,所有旧值都将被忘记。
第二部分是**学习率*(即时行动奖励+最优未来价值的折算估算)**,其中学习值是即时奖励加上最优未来价值的折算估算。 未来奖励的重要性由折扣系数决定。
通过深度 Q 学习,我们可以使用深度神经网络来预测动作的 Q 值,并使用深度神经网络来选择动作,而不是使用 Q 表查找给定状态下具有最大可能 q 值的动作。 给定动作的最大 q 值。
通过深度 Q 学习,我们可以使用深度神经网络来预测动作的 Q 值,并使用深度神经网络来选择动作,而不是使用 Q 表查找给定状态下具有最大可能 Q 值的动作。 给定动作的最大 Q 值。
# 怎么做...
......@@ -175,15 +175,15 @@ def cartpole_model(observation_space, action_space):
)
```
此函数返回 the 模型。
此函数返回模型。
# 这个怎么运作...
在此配方中,我们定义了一个名为`cartpole_model`的函数,该函数接受`observation_ space``action_space`参数,并返回一个神经网络模型。 在这里,我们使用了`torch.nn``nn.Linear``nn.ReLU`中的`Sequential`模块来完成模型。 给定一个观察值,我们使用该模型来训练和预测每个动作的 q 值。
在此配方中,我们定义了一个名为`cartpole_model`的函数,该函数接受`observation_ space``action_space`参数,并返回一个神经网络模型。 在这里,我们使用了`torch.nn``nn.Linear``nn.ReLU`中的`Sequential`模块来完成模型。 给定一个观察值,我们使用该模型来训练和预测每个动作的 Q 值。
# 还有更多...
我们还可以训练将状态作为图像并学习从图像预测 q 值的模型。 完成此操作后,我们将使用`nn.Conv2d()`来使用卷积神经网络。
我们还可以训练将状态作为图像并学习从图像预测 Q 值的模型。 完成此操作后,我们将使用`nn.Conv2d()`来使用卷积神经网络。
# 也可以看看
......@@ -279,7 +279,7 @@ self.explore_limit = False
batch = random.sample(self.memory, BATCH_SIZE)
```
0. 现在,让我们使用批量更新 q 值:
0. 现在,让我们使用批量更新 Q 值:
```py
for state, action, reward, next_state, terminal in batch:
......@@ -316,9 +316,9 @@ if not self.explore_limit:
在本食谱中,我们完成了 DQN 类,并添加了所有必需的功能来训练 DQN。 在构造函数中,我们初始化了探索的初始状态,观察空间和动作空间,然后定义了一个存储单元来保存 DQN 的经验。 我们创建了称为`policy_net``target_net`的软骨模型的两个实例。 我们需要两个网络,因为在训练的每个步骤中,Q 网络的值都会移动,并且如果我们使用不断变化的目标值来调整我们的网络,则该网络可能会由于陷入此变化的目标与估计的 Q 值之间的反馈回路而变得不稳定。 网络值。 如果发生这种情况,价值估算将失去控制。 因此,我们使用了两个网络并将`target_net`保持在`eval`模式。 然后,我们使用`MSELoss()`作为损失函数以及`Adam`优化器来更新权重。
`load_memory()`方法中,我们从环境中存储了状态,操作,奖励,下一个状态和终端,以用于训练网络。 我们使用的下一个方法是`predict_action`。 在此方法中,我们使用`np.random.rand()`选择了`random_number`,这为我们提供了`[0,1)`的值。 如果此`random_number`小于当前的`exploration_rate`,则我们选择一个随机动作,该动作由`exploration_rate`控制。 这就是我们合并探索的方式。 但是,如果`random_number`大于`exploration_rate`,则`target_net`会预测`q_values`并选择具有最大 q 值的动作。
`load_memory()`方法中,我们从环境中存储了状态,操作,奖励,下一个状态和终端,以用于训练网络。 我们使用的下一个方法是`predict_action`。 在此方法中,我们使用`np.random.rand()`选择了`random_number`,这为我们提供了`[0,1)`的值。 如果此`random_number`小于当前的`exploration_rate`,则我们选择一个随机动作,该动作由`exploration_rate`控制。 这就是我们合并探索的方式。 但是,如果`random_number`大于`exploration_rate`,则`target_net`会预测`q_values`并选择具有最大 Q 值的动作。
最后,我们实现了`experience_replay`方法。 在这里,我们等待数据点的数量至少为`BATCH_SIZE`,然后从内存中随机抽样一批。 这使它可以从一系列不同的观察中学习,而不是从一系列紧密相关的观察中学习。 遍历批量时,我们使用`target_net`根据 q 值更新公式更新了 q 值。 然后,我们根据新 q 值与`policy_net`预测的 q 值之间的误差训练了`policy_net`。 之后,通过将其乘以探索衰减量逐渐降低探索速率,直到获得最低探索速率。 我们这样做是因为,在训练的初始阶段,我们希望代理人进行更多探索; 但是,随着训练的进行,我们希望算法能够收敛。 至此,我们已经完成了 DQN 类的所有功能。
最后,我们实现了`experience_replay`方法。 在这里,我们等待数据点的数量至少为`BATCH_SIZE`,然后从内存中随机抽样一批。 这使它可以从一系列不同的观察中学习,而不是从一系列紧密相关的观察中学习。 遍历批量时,我们使用`target_net`根据 Q 值更新公式更新了 Q 值。 然后,我们根据新 Q 值与`policy_net`预测的 Q 值之间的误差训练了`policy_net`。 之后,通过将其乘以探索衰减量逐渐降低探索速率,直到获得最低探索速率。 我们这样做是因为,在训练的初始阶段,我们希望代理人进行更多探索; 但是,随着训练的进行,我们希望算法能够收敛。 至此,我们已经完成了 DQN 类的所有功能。
# 还有更多...
......@@ -330,7 +330,7 @@ if not self.explore_limit:
# 训练 DQN
在此配方中,我们将完成训练 DQN 增强算法的过程,并在训练模型后可视化我们的 cart。 我们将使用 DQN 类来预测操作并将该操作应用于环境以获得奖励。 此食谱的目的是使奖励最大化。 我们将使用经验重播来训练我们的模型以预测 q 值。
在此配方中,我们将完成训练 DQN 增强算法的过程,并在训练模型后可视化我们的小车。 我们将使用 DQN 类来预测操作并将该操作应用于环境以获得奖励。 此食谱的目的是使奖励最大化。 我们将使用经验重播来训练我们的模型以预测 Q 值。
# 怎么做...
......@@ -437,7 +437,7 @@ if steps%UPDATE_FREQ == 0:
.
```
0. 现在,我们将定义一个函数,该函数将可视化 cart 的性能:
0. 现在,我们将定义一个函数,该函数将可视化小车的性能:
```py
>>def play_agent(dqn, env):
......@@ -481,9 +481,9 @@ Rewards: 160.0
# 这个怎么运作...
在本食谱中,我们首先使用超参数导入并初始化环境。 然后,我们创建了`DQN`类的实例,并开始训练循环,重置环境,并对状态数组进行整形,以便可以将其作为浮点张量输入到模型中。 然后,我们开始了一个无限循环,当`env.step()`方法的返回值将`terminal`设置为`True`时终止。 `predict_action()`方法预测在给定环境当前状态下要采取的措施。 然后,我们使用环境的`step()`方法应用了此操作。 我们采用 step 方法返回的下一个状态,并将其从`numpy`转换为`torch.FloatTensor`,并保存了环境参数。 我们一次又一次地将此新状态传递给模型。 我们还每隔几步就将权重从我们的策略网复制到目标网。
在本食谱中,我们首先使用超参数导入并初始化环境。 然后,我们创建了`DQN`类的实例,并开始训练循环,重置环境,并对状态数组进行整形,以便可以将其作为浮点张量输入到模型中。 然后,我们开始了一个无限循环,当`env.step()`方法的返回值将`terminal`设置为`True`时终止。 `predict_action()`方法预测在给定环境当前状态下要采取的措施。 然后,我们使用环境的`step()`方法应用了此操作。 我们采用`step`方法返回的下一个状态,并将其从`numpy`转换为`torch.FloatTensor`,并保存了环境参数。 我们一次又一次地将此新状态传递给模型。 我们还每隔几步就将权重从我们的策略网复制到目标网。
最后,我们编写了一个简单的`play_agent`函数来可视化 the 平衡并在重置环境后运行循环。 我们要求目标网络预测每个可能动作的 q 值,选择具有最高 q 值的动作,并使用`step()`将其导入环境。 之后,我们不断增加奖励。 此函数返回柱状体直立的时间步数和柱状体执行平衡动作的视频。
最后,我们编写了一个简单的`play_agent`函数来可视化平衡并在重置环境后运行循环。 我们要求目标网络预测每个可能动作的 Q 值,选择具有最高 Q 值的动作,并使用`step()`将其导入环境。 之后,我们不断增加奖励。 此函数返回柱状体直立的时间步数和柱状体执行平衡动作的视频。
# 还有更多...
......@@ -503,7 +503,7 @@ Rewards: 160.0
# 怎么做...
在本食谱中,我们将完成网络模型定义。 您需要安装 OpenAI 的健身房库。 按着这些次序:
在本食谱中,我们将完成网络模型定义。 您需要安装 OpenAI 的体育馆库。 按着这些次序:
1. 我们将从进口开始:
......
......@@ -20,7 +20,7 @@
这个元素使问题变得更加复杂,因为我们必须权衡两个因素:探索与利用。 探索将意味着做出随机决策并对其进行测试,而剥削则意味着做出代理商已经知道的决策将给其带来积极的结果,因此代理商现在需要找到一种方法来平衡这两个因素以获得最大的累积结果。 。 这是强化学习中非常重要的概念。 这个概念催生了各种算法来平衡这两个因素,并且是一个广泛的研究领域。
在本章中,我们将使用 OpenAI 名为 Gym 的库。 这是一个开放源代码库,为强化学习算法的训练和基准测试设定了标准。 健身房提供了许多研究人员用来训练强化学习算法的环境。 它包括许多 Atari 游戏,用于拾取物品的机器人仿真,用于步行和跑步的各种机器人仿真以及驾驶仿真。 该库提供了代理程序和环境之间相互交互所必需的参数。
在本章中,我们将使用 OpenAI 名为 Gym 的库。 这是一个开放源代码库,为强化学习算法的训练和基准测试设定了标准。 体育馆提供了许多研究人员用来训练强化学习算法的环境。 它包括许多 Atari 游戏,用于拾取物品的机器人仿真,用于步行和跑步的各种机器人仿真以及驾驶仿真。 该库提供了代理程序和环境之间相互交互所必需的参数。
## 问题
......
......@@ -16,7 +16,7 @@
* Python 和 TensorFlow
* 线性代数是神经网络的前提
* 安装包:Python,TensorFlow 和 OpenAI 健身房(在第 1 章,“深度学习–架构和框架”和第 2 章中显示) 使用 OpenAI Gym* 的特工
* 安装包:Python,TensorFlow 和 OpenAI 体育馆(在第 1 章,“深度学习–架构和框架”和第 2 章中显示) 使用 OpenAI Gym* 的特工
# 下载示例代码文件
......
......@@ -106,7 +106,7 @@ HFFG
* `H`:块有孔
* `G`:目标块
在较新版本的“健身房”中,不能直接修改环境功能。 这可以通过以下方式解开环境参数来完成:
在较新版本的“体育馆”中,不能直接修改环境功能。 这可以通过以下方式解开环境参数来完成:
```py
env = env.unwrapped
......
......@@ -592,6 +592,6 @@ After learning completion printing the utilities for each states below from stat
在本章中,我们介绍了网格世界类型的环境的详细信息,并了解了马尔可夫决策过程的基础,即状态,动作,奖励,过渡模型和策略。 此外,我们利用这些信息通过价值迭代和策略迭代方法来计算效用和最优策略。
除此之外,我们对部分可观察的马尔可夫决策过程是什么样子以及解决它们的挑战有了基本的了解。 最后,我们从 OpenAI 健身房获取了我们最喜欢的 gridworld 环境,即 FrozenLake-v0,并实现了一种值迭代方法,以使我们的代理学会在该环境中导航。
除此之外,我们对部分可观察的马尔可夫决策过程是什么样子以及解决它们的挑战有了基本的了解。 最后,我们从 OpenAI 体育馆获取了我们最喜欢的 gridworld 环境,即 FrozenLake-v0,并实现了一种值迭代方法,以使我们的代理学会在该环境中导航。
在下一章中,我们将从策略梯度开始,然后从 **FrozenLake** 过渡到其他一些引人入胜的复杂环境。
\ No newline at end of file
......@@ -348,7 +348,7 @@ end for
# 使用策略梯度的 Agent 学习 Pong
在本节中,我们将创建一个策略网络,该策略网络将使用来自 pong 环境的原始像素(来自 OpenAI 健身房**pong-v0**)作为输入。 策略网络是一个单独的隐藏层神经网络,它全连接到输入层上 pong 的原始像素,还全连接到包含单个节点的输出层,该单个节点返回了桨上升的可能性。 我要感谢 Andrej Karpathy 提出了一种使代理使用策略梯度进行学习的解决方案。 我们将尝试实现类似的方法。
在本节中,我们将创建一个策略网络,该策略网络将使用来自 pong 环境的原始像素(来自 OpenAI 体育馆**pong-v0**)作为输入。 策略网络是一个单独的隐藏层神经网络,它全连接到输入层上 pong 的原始像素,还全连接到包含单个节点的输出层,该单个节点返回了桨上升的可能性。 我要感谢 Andrej Karpathy 提出了一种使代理使用策略梯度进行学习的解决方案。 我们将尝试实现类似的方法。
灰度大小为`80 * 80`的像素图像(我们将不使用 RGB,即`80 * 80 * 3`)。 因此,我们有一个`80 * 80`的二进制网格,它告诉我们桨和球的位置,并将其作为输入输入到神经网络。 因此,神经网络将包含以下内容:
......
......@@ -688,9 +688,9 @@ Episode 10 with Reward : 38.7923903502 at epsilon 0.9002 in steps 126
![](img/c662d7ff-84d0-4610-b63d-daec721d3143.png)
接下来,在以下主题中,我们尝试实现一个深度 Q 网络来解决 OpenAI 健身房中的 Cartpole 问题。
接下来,在以下主题中,我们尝试实现一个深度 Q 网络来解决 OpenAI 体育馆中的 Cartpole 问题。
# 适用于 OpenAI 健身房的 Cartpole 问题的深度 Q 网络
# 适用于 OpenAI 体育馆的 Cartpole 问题的深度 Q 网络
**Cartpole** 是 MDP 环境中最简单的问题之一,如以下屏幕快照所示。 它由一个在水平轴上移动的推车组成,该推车的中心处固定有一根可旋转的杆。 目的是采取行动,使电杆保持接近垂直且不会向下旋转。
......
......@@ -22,7 +22,7 @@
* 异步一步式 SARSA
* 异步 n 步 Q 学习
* 异步优势演员评论家
* OpenAI 健身房中用于摆锤 v0 的 A3C
* OpenAI 体育馆中用于摆锤 v0 的 A3C
# 为什么使用异步方法?
......@@ -267,7 +267,7 @@ repeat until :
# OpenAI 体育馆中 Pong-v0 的 A3C
在第 4 章和“策略梯度”中,我们已经讨论过乒乓环境。 我们将使用以下代码在 OpenAI 健身房中为 Pong-v0 创建 A3C:
在第 4 章和“策略梯度”中,我们已经讨论过乒乓环境。 我们将使用以下代码在 OpenAI 体育馆中为 Pong-v0 创建 A3C:
```py
import multiprocessing
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册