提交 926db5d5 编写于 作者: W wizardforcel

2020-09-06 20:36:59

上级 73066efe
......@@ -109,7 +109,7 @@ ReLu,或直线激活,简单定义为:
进行梯度下降的另一种可能方法是一次使用一个数据点,并随着我们的更新网络权重。 此方法可能有助于加快网络可能停止收敛的鞍点附近的收敛速度。 当然,仅单个点的误差估计可能无法很好地近似于整个数据集的误差。
解决此问题的最佳解决方案是使用小型批处理梯度下降,其中我们将采用称为小型批处理的数据的随机子集来计算误差并更新网络权重。 这几乎总是最好的选择。 它还有一个额外的好处,即可以将非常大的数据集自然地拆分为多个块,这些块可以更容易地在计算机的内存中甚至跨计算机的内存中进行管理。
解决此问题的最佳解决方案是使用小型批量梯度下降,其中我们将采用称为小型批量的数据的随机子集来计算误差并更新网络权重。 这几乎总是最好的选择。 它还有一个额外的好处,即可以将非常大的数据集自然地拆分为多个块,这些块可以更容易地在计算机的内存中甚至跨计算机的内存中进行管理。
这是对神经网络最重要部分之一的极高层次的描述,我们认为这与本书的实际性质相符。 实际上,大多数现代框架都为我们处理了这些步骤。 但是,至少在理论上,它们无疑是值得了解的。 我们鼓励读者在时间允许的情况下更深入地进行向前和向后传播。
......@@ -411,7 +411,7 @@ val 和测试数据来自同一数据集非常重要。 火车数据集匹配 va
* **高方差**:具有低偏差误差的网络很好地拟合了训练数据; 但是,如果验证误差大于测试误差,则网络已开始过度拟合训练数据。 减少差异的两种最佳方法是添加数据并向网络添加正则化。
添加数据很简单,但并非总是可能的。 在整本书中,我们将介绍适用的正则化技术。 我们将讨论的最常见的正则化技术是 L2 正则化,辍学和批处理归一化。
添加数据很简单,但并非总是可能的。 在整本书中,我们将介绍适用的正则化技术。 我们将讨论的最常见的正则化技术是 L2 正则化,辍学和批归一化。
# K 折交叉验证
......
......@@ -102,7 +102,7 @@ def create_callbacks():
您可能已经注意到,我正在将 MLP 网络的 TensorBoard 回调的日志写入`~/ch_3_tb_log/mlp`,这将在我们为 TensorBoard 指定的目录下创建一个新的 Director `mlp`。 这是故意的。 我们将配置在第 2 章,“使用深度学习解决回归问题”训练的深度神经网络模型,以登录到单独的目录`~/ch_3_tb_log/dnn`。 这样做将使我们能够比较两个模型的运行。
* `histogram_freq`:这指定我们将多长时间计算一次激活和权重的直方图(以时期为单位)。 它的默认值为 0,这会使日志更小,但不会生成直方图。 我们将介绍为什么以及何时您会对直方图感兴趣。
* `batch_size`:这是用于计算直方图的批处理大小。 默认为 32。
* `batch_size`:这是用于计算直方图的批大小。 默认为 32。
* `write_graph`:此函数为布尔值。 这将告诉 TensorBoard 可视化网络图。 这可能非常方便,但也会使日志变得很大。
* `write_grads`:此函数也是布尔值。 这将告诉 TensorBoard 也计算梯度的直方图。
......@@ -148,7 +148,7 @@ tensorboard_callback = TensorBoard(log_dir='./ch3_tb_log/dnn',
TensorBoard 可以容纳许多运行,并且您可以通过正则表达式过滤它们(例如`^dnn`将显示所有以`dnn`开头的运行)。 这意味着,如果您通过许多实验或运行(例如超参数优化)来搜索*最佳*模型,则可以在明确并一致地命名运行并包含有意义的超参数和体系结构信息的情况下快速浏览它们 以这个名字吧!
这些图上的默认 **X** 比例尺是**历元****Y** 值是我们选择的**损失函数**,即 **MAE**。 您可以单击图形以浏览它们并拖动以缩放。
这些图上的默认 **X** 比例尺是**周期****Y** 值是我们选择的**损失函数**,即 **MAE**。 您可以单击图形以浏览它们并拖动以缩放。
看到这样的图,我们真的可以看到每个网络的相对偏差和方差。 虽然模型之间在火车损失方面有很好的分离,但深度神经网络在验证集上只得到了一点点改善,这表明我们已经进入了过度拟合的领域。
......
......@@ -167,7 +167,7 @@ Hyperband 是一项超参数优化技术,由 Lisha Li,Kevin Jamieson,Guili
想象一下,就像我们在`RandomSearchCV`中所做的那样,随机采样许多潜在的超参数集。 完成`RandomSearchCV`后,它将选择一个单一的超参数配置作为其采样的*最优值*。 Hyperband 利用这样的思想,即即使经过少量迭代,最佳的超参数配置也可能会胜过其他配置。 Hyperband 中的乐队来自土匪,指的是基于多臂土匪技术(用于优化竞争选择之间的资源分配以优化性能为目标的技术)的勘探与开发。
使用 Hyperband,我们可以尝试一些可能的配置集(`n`),仅训练一次迭代。 作者将迭代一词留作多种可能的用途。 但是,我将时代作为迭代。 一旦完成第一个培训循环,就将根据性能对结果进行配置。 然后,对该列表的上半部分进行大量迭代的训练。 然后重复进行减半和剔除的过程,我们得到了一些非常小的配置集,我们将针对在搜索中定义的完整迭代次数进行训练。 与在每种可能的配置中搜索最大历元相比,此过程使我们在更短的时间内获得了*最佳*超参数集。
使用 Hyperband,我们可以尝试一些可能的配置集(`n`),仅训练一次迭代。 作者将迭代一词留作多种可能的用途。 但是,我将时代作为迭代。 一旦完成第一个培训循环,就将根据性能对结果进行配置。 然后,对该列表的上半部分进行大量迭代的训练。 然后重复进行减半和剔除的过程,我们得到了一些非常小的配置集,我们将针对在搜索中定义的完整迭代次数进行训练。 与在每种可能的配置中搜索最大周期相比,此过程使我们在更短的时间内获得了*最佳*超参数集。
在本章的 GitHub 存储库中,我在`hyperband.py`中包括了`hyperband`算法的实现。 此实现主要源自 FastML 的实现,您可以在[这个页面](http://fastml.com/tuning-hyperparams-fast-with-hyperband/)中找到。 要使用它,您需要首先实例化一个`hyperband`对象,如以下代码所示:
......
......@@ -90,11 +90,11 @@ pool1 = MaxPooling2D(pool_size=(2, 2), name="pool_1")
# 批量标准化
处理规范化有助于我们的网络整体表现更好,学习速度更快。 批处理规范化在应用程序中也很容易理解。 但是,为什么它起作用,仍然受到研究人员的争议。
量规范化有助于我们的网络整体表现更好,学习速度更快。 批量规范化在应用程序中也很容易理解。 但是,为什么它起作用,仍然受到研究人员的争议。
使用批量归一化时,对于每个小批量,我们可以在每个非线性之后(或之前)对那个批量进行归一化,使其平均值为 0,单位方差。 这使每一层都可以从中学习标准化输入,从而使该层的学习效率更高。
批归一化层很容易在 Keras 中实现,本章的示例将在每个卷积层之后使用它们。 以下代码用于批处理规范化:
批归一化层很容易在 Keras 中实现,本章的示例将在每个卷积层之后使用它们。 以下代码用于批规范化:
```py
from keras.layers import BatchNormalization
......@@ -130,7 +130,7 @@ output = Dense(10, activation="softmax", name="softmax")(d2)
# 卷积层
如果您开始怀疑此实现中是否会有任何不同之处,那就是这里。 我将使用两个卷积层,分别进行批处理规范化和最大池化。 这将要求我们做出很多选择,当然我们以后可以选择作为超参数进行搜索。 不过,最好先让某些东西开始工作。 正如 Donald Knuth 所说,过早的优化是万恶之源。 我们将使用以下代码片段定义两个卷积块:
如果您开始怀疑此实现中是否会有任何不同之处,那就是这里。 我将使用两个卷积层,分别进行批规范化和最大池化。 这将要求我们做出很多选择,当然我们以后可以选择作为超参数进行搜索。 不过,最好先让某些东西开始工作。 正如 Donald Knuth 所说,过早的优化是万恶之源。 我们将使用以下代码片段定义两个卷积块:
```py
# convolutional block 1
......@@ -144,9 +144,9 @@ batch2 = BatchNormalization(name="batch_norm_2")(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2), name="pool_2")(batch2)
```
因此,很明显,我们在这里有两个卷积块,它们由一个卷积层,一个批处理规范化层和一个池化层组成。
因此,很明显,我们在这里有两个卷积块,它们由一个卷积层,一个批规范化层和一个池化层组成。
在第一块中,我使用具有`relu`激活功能的 64 个`3 x 3`过滤器。 我使用的是有效(无)填充,跨度为 1。批处理规范化不需要任何参数,并且实际上不是可训练的。 池化层使用`2 x 2`池化窗口,有效填充和跨度为 2(窗口尺寸)。
在第一块中,我使用具有`relu`激活功能的 64 个`3 x 3`过滤器。 我使用的是有效(无)填充,跨度为 1。批规范化不需要任何参数,并且实际上不是可训练的。 池化层使用`2 x 2`池化窗口,有效填充和跨度为 2(窗口尺寸)。
第二个块几乎相同。 但是,我将过滤器数量减半为 32。
......@@ -313,6 +313,6 @@ model.fit_generator(data_generator.flow(data["train_X"], data["train_y"], batch_
# 摘要
在本章中,我们快速介绍了许多基础知识。 我们讨论了卷积层及其如何用于神经网络。 我们还介绍了批处理规范化,池化层和数据扩充。 最后,我们使用 Keras 从零开始训练卷积神经网络,然后使用数据增强对该网络进行改进。
在本章中,我们快速介绍了许多基础知识。 我们讨论了卷积层及其如何用于神经网络。 我们还介绍了批规范化,池化层和数据扩充。 最后,我们使用 Keras 从零开始训练卷积神经网络,然后使用数据增强对该网络进行改进。
我们还讨论了如何基于数据的渴望计算机视觉的深度神经网络问题。 在下一章中,我将向您展示**迁移学习**,这是我最喜欢的技术之一。 这将帮助您快速解决计算机视觉问题,并获得惊人的结果并且数据量更少。
\ No newline at end of file
......@@ -186,7 +186,7 @@ scores = model.evaluate_generator(val_generator, steps=val_generator.n // batch_
print("Step 1 Scores: Loss: " + str(scores[0]) + " Accuracy: " + str(scores[1]))
```
在前面的示例中,我们使用`ImageDataGenerator``n`属性来了解可用于生成器的图像总数,并将每个时期的步骤定义为该数目除以批处理大小。
在前面的示例中,我们使用`ImageDataGenerator``n`属性来了解可用于生成器的图像总数,并将每个时期的步骤定义为该数目除以批大小。
此代码的其余部分应该很熟悉。
......
......@@ -39,7 +39,7 @@ NLP 领域广阔而复杂。 从技术上讲,人类语言与计算机科学之
**文档分类**与情感分析密切相关。 在这两种情况下,我们都使用文本将文档分类。 实际上,这只是改变的原因。 文档分类就是根据文档的类型对文档进行分类。 世界上最明显,最常见的文档分类系统是垃圾邮件过滤器,但它还有许多其他用途。
我最喜欢的文档分类用途之一是解决*联邦主义者论文*的原始作者的辩论。 亚历山大·汉密尔顿(Alexander Hamilton),詹姆斯·麦迪逊(James Madison)和约翰·杰伊(John Jay)在 1787 年和 1788 年以化名 Publius 出版了 85 篇文章,支持批准美国宪法。 后来,汉密尔顿提供了一份清单,详细列出了每篇论文的作者在 1804 年与亚伦·伯尔(Aaron Burr)进行致命的对决之前。麦迪逊(Madison)在 1818 年提供了自己的清单,这在作者身份上引起了争执,此后学者一直在努力解决。 虽然大多数人都同意有争议的作品是麦迪逊的作品,但是关于两者之间的合作仍存在一些理论。 将这 12 个有争议的文档归类为 Madison 还是 Hamilton,已经成为许多数据科学博客的不二之选。 正式而言,Glenn Fung 的论文[《有争议的联邦主义者论文:通过凹面最小化进行 SVM 特征选择》](http://pages.cs.wisc.edu/~gfung/federalist.pdf) 涵盖了相当严格的主题。
我最喜欢的文档分类用途之一是解决“联邦主义者论文”的原始作者的辩论。 亚历山大·汉密尔顿(Alexander Hamilton),詹姆斯·麦迪逊(James Madison)和约翰·杰伊(John Jay)在 1787 年和 1788 年以化名 Publius 出版了 85 篇文章,支持批准美国宪法。 后来,汉密尔顿提供了一份清单,详细列出了每篇论文的作者在 1804 年与亚伦·伯尔(Aaron Burr)进行致命的对决之前。麦迪逊(Madison)在 1818 年提供了自己的清单,这在作者身份上引起了争执,此后学者一直在努力解决。 虽然大多数人都同意有争议的作品是麦迪逊的作品,但是关于两者之间的合作仍存在一些理论。 将这 12 个有争议的文档归类为 Madison 还是 Hamilton,已经成为许多数据科学博客的不二之选。 正式而言,Glenn Fung 的论文[《有争议的联邦主义者论文:通过凹面最小化进行 SVM 特征选择》](http://pages.cs.wisc.edu/~gfung/federalist.pdf) 涵盖了相当严格的主题。
文档分类的最后一个示例可能是围绕了解文档的内容并规定操作。 想象一下一个分类器,它可能会读取有关法律案件的一些信息,例如请愿/投诉和传票,然后向被告提出建议。 然后,我们的假想系统可能会说:*鉴于我在其他类似情况下的经验,您可能想解决*
......@@ -389,7 +389,7 @@ model.fit(x=data["X_train"], y=data["y_train"],
像这样将我所有的训练参数和数据保存在一个字典中,实际上只是一个样式问题,而与功能无关。 您可能希望单独处理所有事情。 我喜欢对所有内容使用字典,因为它使我无法来回传递大量参数。
由于我们使用的是无状态 LSTM,因此我们将在每个批次中重置单元存储器。 我的信念是,我们可以在不损失任何罚款的情况下重置文档之间的单元状态,因此批处理大小实际上与性能有关。 我在这里使用了 32 个观察批,但是只要 GPU 内存允许,128 个观察批会产生相似的结果,并且性能会有所提高。
由于我们使用的是无状态 LSTM,因此我们将在每个批次中重置单元存储器。 我的信念是,我们可以在不损失任何罚款的情况下重置文档之间的单元状态,因此批大小实际上与性能有关。 我在这里使用了 32 个观察批,但是只要 GPU 内存允许,128 个观察批会产生相似的结果,并且性能会有所提高。
# 性能
......
......@@ -30,7 +30,7 @@
![](img/e39144a7-9a97-4e55-8500-6f6a64fc8537.png)
动作会在原始状态*的*和下一个状态![](img/09ae8c4e-fc27-4814-a227-503b89567814.png)的代理之间进行转换,代理会在其中获得一些奖励 *r* 。 代理选择动作的方式称为**代理策略**,通常称为![](img/65b50102-86c9-4dab-9a73-246711c1ceee.png)
动作会在原始状态`s`和下一个状态`s'`的代理之间进行转换,代理会在其中获得一些奖励`r`。 代理选择动作的方式称为**代理策略**,通常称为`pi`
强化学习的目的是找到一系列动作,使行动者从一个州到另一个州,并获得尽可能多的报酬。
......@@ -38,10 +38,10 @@
我们构筑的这个世界恰好是**马尔可夫决策过程****MDP**),它具有以下属性:
* 它具有一组有限的状态, *S*
* 它具有一组有限的动作 *A*
* ![](img/02b74074-e384-4fa3-bccd-c0262c867f5b.png)是采取行动 *A* 将在状态 s 和状态![](img/eb953b39-cb00-4772-bc93-a344af6f04fd.png)之间转换的概率
* ![](img/4535c471-eb4b-493a-8248-21870b941877.png) s 和![](img/00a202fe-1100-4d7e-b183-32efc3c0dd7a.png)之间过渡的直接奖励。
* 它具有一组有限的状态,`S`
* 它具有一组有限的动作 `A`
* ![](img/02b74074-e384-4fa3-bccd-c0262c867f5b.png)是采取行动`A`将在状态`s`和状态![](img/eb953b39-cb00-4772-bc93-a344af6f04fd.png)之间转换的概率
* ![](img/4535c471-eb4b-493a-8248-21870b941877.png)`s`和![](img/00a202fe-1100-4d7e-b183-32efc3c0dd7a.png)之间过渡的直接奖励。
* ![](img/5c9c163f-374e-4d8f-a5f4-c434ce13a568.png)是折扣因子,这是我们相对于当前奖励对未来奖励的折扣程度(稍后会详细介绍)
一旦我们有了确定每个状态要采取的操作的策略功能![](img/2c3faff6-8c08-4086-9d0e-9ef3b6bf448e.png),MDP 就解决了,成为了马尔可夫链。
......@@ -50,31 +50,31 @@
# Q 学习
想象一下,我们有一些功能 *Q,*可以估算出采取行动的回报:
想象一下,我们有一些功能`Q`可以估算出采取行动的回报:
![](img/c0927993-35eb-4977-a4bc-ccd338f9fc95.png)
对于某些状态*的*以及动作*和*,它会根据状态为该动作生成奖励。 如果我们知道环境带来的所有回报,那么我们就可以遍历 *Q* 并选择能够为我们带来最大回报的行动。 但是,正如我们在上一节中提到的那样,我们的代理人不知道所有的奖励状态和状态概率。 因此,我们的 *Q* 函数需要尝试近似奖励。
对于某些状态`s`以及动作`a`,它会根据状态为该动作生成奖励。 如果我们知道环境带来的所有回报,那么我们就可以遍历`Q`并选择能够为我们带来最大回报的行动。 但是,正如我们在上一节中提到的那样,我们的代理人不知道所有的奖励状态和状态概率。 因此,我们的`Q`函数需要尝试近似奖励。
我们可以使用称为 **Bellman 公式**的递归定义的 *Q* 函数来近似此理想的 *Q* 函数:
我们可以使用称为 **Bellman 公式**的递归定义的`Q`函数来近似此理想的`Q`函数:
![](img/92cb692e-ef61-427e-bd69-0e698f08f007.png)
在这种情况下, *r* <sub>0</sub> 是下一个动作的奖励,然后在下一个动作上(递归地)递归使用 *Q* 函数 确定该行动的未来奖励。 为此,我们将伽马![](img/1a9812ab-15b6-46c8-84c2-e3c380e69973.png)作为相对于当前奖励的未来奖励的折扣。 只要伽玛小于 1,它就不会使我们的奖励序列变得无限大。 更明显地,与当前状态下的相同奖励相比,未来状态下的奖励的价值要低。 具体来说,如果有人今天给您 100 美元,明天给您 100 美元,您应该立即拿走这笔钱,因为明天不确定。
在这种情况下, `r[0]`是下一个动作的奖励,然后在下一个动作上(递归地)递归使用`Q`函数 确定该行动的未来奖励。 为此,我们将`γ`作为相对于当前奖励的未来奖励的折扣。 只要伽玛小于 1,它就不会使我们的奖励序列变得无限大。 更明显地,与当前状态下的相同奖励相比,未来状态下的奖励的价值要低。 具体来说,如果有人今天给您 100 美元,明天给您 100 美元,您应该立即拿走这笔钱,因为明天不确定。
如果我们尽最大的努力让我们的代理经历每种可能的状态转换,并使用此函数来估计我们的报酬,我们将得出我们试图近似的理想 *Q* 函数。
如果我们尽最大的努力让我们的代理经历每种可能的状态转换,并使用此函数来估计我们的报酬,我们将得出我们试图近似的理想`Q`函数。
# 无限状态空间
*Q* 功能的讨论使我们陷入了传统强化学习的重要局限。 您可能还记得,它假设状态空间是有限且离散的。 不幸的是,这不是我们生活的世界,也不是我们的代理商在很多时候会发现自己的环境。 考虑一个可以打乒乓球的经纪人。 状态空间的重要组成部分是乒乓球的速度,它当然不是离散的。 像我们不久将要看到的那样,可以看到的特工会看到一个图像,该图像是一个很大的连续空间。
`Q`功能的讨论使我们陷入了传统强化学习的重要局限。 您可能还记得,它假设状态空间是有限且离散的。 不幸的是,这不是我们生活的世界,也不是我们的代理商在很多时候会发现自己的环境。 考虑一个可以打乒乓球的经纪人。 状态空间的重要组成部分是乒乓球的速度,它当然不是离散的。 像我们不久将要看到的那样,可以看到的特工会看到一个图像,该图像是一个很大的连续空间。
我们讨论的 Bellman 方程将要求我们在州与州之间转移时保持经验奖励的大矩阵。 但是,当面对连续的状态空间时,这是不可能的。 可能的状态本质上是无限的,我们不能创建无限大小的矩阵。
幸运的是,我们可以使用深度神经网络来近似 *Q* 函数。 这可能不会让您感到惊讶,因为您正在阅读一本深度学习书,因此您可能猜测深度学习必须在某个地方出现。 就是那个地方
幸运的是,我们可以使用深度神经网络来近似`Q`函数。 这可能不会让您感到惊讶,因为您正在阅读一本深度学习书,因此您可能猜测深度学习必须在某个地方出现。 就是那个地方
# 深度 Q 网络
**深层 Q 网络****DQN**)是近似 *Q* 函数的神经网络。 他们将状态映射到动作,并学会估计每个动作的 *Q* 值,如下图所示:
**深层 Q 网络****DQN**)是近似`Q`函数的神经网络。 他们将状态映射到动作,并学会估计每个动作的`Q`值,如下图所示:
![](img/33ff32cb-b608-417d-afd0-60e35ff0f6d4.png)
......@@ -99,13 +99,13 @@
# 开发与探索
通常,我们希望代理遵循*贪婪*策略,这意味着我们希望代理采取具有最大 *Q* 值的操作。 在学习网络的同时,我们不希望它总是贪婪地表现。 如果这样做,它将永远不会探索新的选择,也不会学习新的东西。 因此,我们需要我们的代理偶尔执行不符合规定的政策。
通常,我们希望代理遵循*贪婪*策略,这意味着我们希望代理采取具有最大`Q`值的操作。 在学习网络的同时,我们不希望它总是贪婪地表现。 如果这样做,它将永远不会探索新的选择,也不会学习新的东西。 因此,我们需要我们的代理偶尔执行不符合规定的政策。
平衡这种探索的最佳方法是一个持续不断的研究主题,并且已经使用了很长时间。 但是,我们将使用的方法非常简单。 代理每次执行操作时,我们都会生成一个随机数。 如果该数字等于或小于某个阈值![](img/36beb758-d104-411f-8912-4fedf4502d67.png),则代理将采取随机措施。 这称为**∈-贪婪策略**
平衡这种探索的最佳方法是一个持续不断的研究主题,并且已经使用了很长时间。 但是,我们将使用的方法非常简单。 代理每次执行操作时,我们都会生成一个随机数。 如果该数字等于或小于某个阈值`ε`,则代理将采取随机措施。 这称为 **ε 贪婪策略**
代理第一次启动时,对世界了解不多,应该探索更多。 随着代理变得越来越聪明,它可能应该减少探索并更多地使用其对环境的了解。 为此,我们只需要在训练时逐渐降低![](img/0bf64549-9cd7-4e9e-9941-71b0a980e034.png)。 在我们的示例中,我们将每转降低ε的衰减率,以使它随每个动作线性减小。
代理第一次启动时,对世界了解不多,应该探索更多。 随着代理变得越来越聪明,它可能应该减少探索并更多地使用其对环境的了解。 为此,我们只需要在训练时逐渐降低`ε`。 在我们的示例中,我们将每转降低`ε`的衰减率,以使它随每个动作线性减小。
综上所述,我们有一个**线性退火ε-贪心 Q 策略**,说起来既简单又有趣。
综上所述,我们有一个**线性退火 ε - 贪心 Q 策略**,说起来既简单又有趣。
# 深心
......@@ -164,8 +164,8 @@ next_state, reward, done, info = env.step(action)
好消息,我们终于可以开始编码了。 在本部分中,我将演示两种名为 **CartPole****Lunar Lander** 的 Keras-RL 代理。 我选择这些示例是因为它们不会消耗您的 GPU 和云预算来运行。 它们可以很容易地扩展到 Atari 问题,我在本书的 Git 存储库中也包括了其中之一。 您可以照常在`Chapter12`文件夹中找到所有这些代码。 让我们快速讨论一下这两种环境:
* **CartPole** :CartPole 环境由平衡在推车上的杆组成。 代理商必须学习如何在立柱下方的推车移动时垂直平衡立柱。 给智能体指定了推车的位置,推车的速度,杆的角度和杆的旋转速度作为输入。 代理可以在推车的任一侧施加力。 如果电线杆与垂直线的夹角下降超过 15 度,我们的经纪人就此告吹。
* **Lunar Lander** :Lunar Lander 的环境更具挑战性。 特工必须将月球着陆器降落在着陆垫上。 月亮的表面会发生变化,着陆器的方位也会在每个情节发生变化。 该代理将获得一个八维数组,用于描述每个步骤中的世界状态,并且可以在该步骤中执行四个操作之一。 代理可以选择不执行任何操作,启动其主引擎,启动其左向引擎或启动其右向引擎。
* **CartPole**:CartPole 环境由平衡在推车上的杆组成。 代理商必须学习如何在立柱下方的推车移动时垂直平衡立柱。 给智能体指定了推车的位置,推车的速度,杆的角度和杆的旋转速度作为输入。 代理可以在推车的任一侧施加力。 如果电线杆与垂直线的夹角下降超过 15 度,我们的经纪人就此告吹。
* **Lunar Lander**:Lunar Lander 的环境更具挑战性。 特工必须将月球着陆器降落在着陆垫上。 月亮的表面会发生变化,着陆器的方位也会在每个情节发生变化。 该代理将获得一个八维数组,用于描述每个步骤中的世界状态,并且可以在该步骤中执行四个操作之一。 代理可以选择不执行任何操作,启动其主引擎,启动其左向引擎或启动其右向引擎。
# 购物车杆
......@@ -188,7 +188,7 @@ def build_model(state_size, num_actions):
return model
```
输入将是一个 1 x 状态空间向量,每个可能的动作都有一个输出神经元,它将预测每个步骤该动作的 Q 值。 通过获取输出的`argmax`,我们可以选择 *Q* 值最高的动作,但是我们不必自己做,因为 Keras-RL 会为我们做。
输入将是一个 1 x 状态空间向量,每个可能的动作都有一个输出神经元,它将预测每个步骤该动作的`Q`值。 通过获取输出的`argmax`,我们可以选择`Q`值最高的动作,但是我们不必自己做,因为 Keras-RL 会为我们做。
# 记忆
......@@ -223,7 +223,7 @@ dqn.compile(Adam(lr=1e-3), metrics=['mae'])
此时,其中两个参数`target_model_update``nb_steps_warmup`可能还不熟悉:
* `nb_steps_warmup`:确定我们开始进行体验重播之前需要等待的时间,如果您还记得的话,这是我们实际上开始培训网络的时间。 这使我们积累了足够的经验来构建适当的小批量生产。 如果您为此参数选择的值小于批处理大小,则 Keras RL 将抽样替换。
* `nb_steps_warmup`:确定我们开始进行体验重播之前需要等待的时间,如果您还记得的话,这是我们实际上开始培训网络的时间。 这使我们积累了足够的经验来构建适当的小批量生产。 如果您为此参数选择的值小于批大小,则 Keras RL 将抽样替换。
* `target_model_update`:Q 函数是递归的,当代理更新它的网络以获取 Q(s,a)时,更新也影响其对 Q(s',a)所​​做的预测。 这会导致网络非常不稳定。 大多数深度 Q 网络实现解决此限制的方法是使用目标网络,该目标网络是未经训练的深度 Q 网络的副本,而经常被新副本替换。 `target_model_update`参数控制这种情况发生的频率。
# 训练
......@@ -321,7 +321,7 @@ dqn.fit(env, nb_steps=1000000,
callbacks=callbacks)
```
您可以通过调整参数 gamma(默认值为 0.99)来进一步改进此示例。 如果您从 *Q* 函数中调用,此参数会减少或增加 *Q* 函数中将来奖励的影响。
您可以通过调整参数 gamma(默认值为 0.99)来进一步改进此示例。 如果您从`Q`函数中调用,此参数会减少或增加`Q`函数中将来奖励的影响。
# 结果
......@@ -329,7 +329,7 @@ dqn.fit(env, nb_steps=1000000,
![](img/a22a91ff-1c32-4a61-90bb-3b52d6555309.png)
希望这个例子可以说明,尽管深层 Q 网络并不是*火箭科学,但*仍可用于控制火箭。
希望这个例子可以说明,尽管深层 Q 网络并不是*火箭科学*,但仍可用于控制火箭。
# 摘要
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册