提交 73bc35af 编写于 作者: W wizardforcel

2021-01-03 16:55:13

上级 f3733705
......@@ -4,7 +4,7 @@
自 2014 年引入**生成对抗网络****GAN**)以来,其流行度迅速提高。 GAN 已被证明是有用的生成模型,可以合成看起来真实的新数据。 深度学习中的许多研究论文都遵循提出的措施来解决原始 GAN 的困难和局限性。
正如我们在前几章中讨论的那样,众所周知,GAN 很难训练,并且易于崩溃。 模式损耗是一种情况,即使损失函数已经被优化,但发生器仍会产生看起来相同的输出。 在 MNIST 数字的情况下,模式折叠时,生成器可能只产生数字 4 和 9,因为看起来很相似。 **Wasserstein GAN****WGAN**)[2]解决了这些问题,认为只需替换基于**的 GAN 损失功能就可以避免稳定的训练和模式崩溃 Wasserstein 1** ,也称为**,称为**地球移动者距离**(**EMD**)。**
正如我们在前几章中讨论的那样,众所周知,GAN 很难训练,并且易于崩溃。 模式损耗是一种情况,即使损失函数已经被优化,但发生器仍会产生看起来相同的输出。 在 MNIST 数字的情况下,模式折叠时,生成器可能只产生数字 4 和 9,因为看起来很相似。 **Wasserstein GAN****WGAN**)[2]解决了这些问题,认为只需替换基于 **Wasserstein** 的 GAN 损失函数就可以稳定的训练和避免模式崩溃,也称为**陆地移动距离****EMD**)。
但是,稳定性问题并不是 GAN 的唯一问题。 也越来越需要来提高所生成图像的感知质量。 **最小二乘 GAN****LSGAN**)[3]建议同时解决这两个问题。 基本前提是,在训练过程中,S 形交叉熵损失会导致梯度消失。 这导致较差的图像质量。 最小二乘损失不会导致梯度消失。 与香草 GAN 生成的图像相比,生成的生成图像具有更高的感知质量。
......@@ -38,7 +38,7 @@ WGAN 认为 GAN 固有的不稳定性是由于它的损失函数引起的,该
**JS**`D[JS]`是基于`D[KL]`的差异。 但是,与`D[KL]`不同,`D[JS]`是对称的并且是有限的。 在本节中,我们将演示优化 GAN 损失函数等同于优化`D[JS]`
<colgroup><col> <col></colgroup>
| **发散** | **表达式** |
| **散度** | **表达式** |
| Kullback-Leibler(KL)“公式 5.1.1” |
![](img/B14853_05_003.png)
......@@ -51,7 +51,7 @@ WGAN 认为 GAN 固有的不稳定性是由于它的损失函数引起的,该
![](img/B14853_05_005.png)
|
| 测地距离(EMD)或 Wasserstein 1 “公式 5.1.3” |
| 陆地移动距离(EMD)或 Wasserstein 1 “公式 5.1.3” |
![](img/B14853_05_006.png)
......@@ -657,7 +657,7 @@ python3 lsgan-mnist-5.2.1.py --generator=lsgan_mnist.h5
# 3\. Auxiliary Classifier GAN (ACGAN)
ACGAN 在原理上类似于我们在上一章中讨论的**条件 GAN****CGAN**)。 我们将比较 CGAN 和 ACGAN。 对于 CGAN 和 ACGAN,发生器输入均为噪声及其标签。 输出是属于输入类标签的伪图像。 对于 CGAN,判别器的输入是图像(假的或真实的)及其标签。 输出是图像真实的概率。 对于 ACGAN,判别器的输入是一幅图像,而输出是该图像是真实的且其类别是标签的概率。
ACGAN 在原理上类似于我们在上一章中讨论的**条件 GAN****CGAN**)。 我们将比较 CGAN 和 ACGAN。 对于 CGAN 和 ACGAN,发生器输入均为噪声及其标签。 输出是属于输入类标签的伪图像。 对于 CGAN,判别器的输入是图像(假的或真实的)及其标签。 输出是图像真实的概率。 对于 ACGAN,判别器的输入是一幅图像,而输出是该图像是真实的且其类别是标签的概率。
“图 5.3.1”突出显示了生成器训练期间 CGAN 和 ACGAN 之间的区别:
......
......@@ -75,7 +75,7 @@ InfoGAN 的关键思想是强制 GAN 不要忽略潜在代码`c`。 这是通过
![](img/B14853_06_009.png) (Equation 6.1.4)
其中`H`(c)是潜码的熵,`c`,![](img/B14853_06_010.png)是观察发生器的输出后`c`的条件熵, ![](img/B14853_06_011.png)。 熵是对随机变量或事件的不确定性的度量。 例如,在东方升起的**之类的信息**具有较低的熵,而在彩票中赢得大奖的**具有较高的熵。 可以在“第 13 章”,“使用互信息的无监督学习”中找到有关互信息的更详细讨论。**
其中`H`(c)是潜码的熵,`c`,![](img/B14853_06_010.png)是观察发生器的输出后`c`的条件熵, ![](img/B14853_06_011.png)。 熵是对随机变量或事件的不确定性的度量。 例如,**在东方升起**之类的信息具有较低的熵,而**在彩票中赢得大奖**具有较高的熵。 可以在“第 13 章”,“使用互信息的无监督学习”中找到有关互信息的更详细讨论。
在“公式 6.1.4”中,最大化互信息意味着在观察生成的输出时,将![](img/B14853_06_012.png)最小化或减小潜码中的不确定性。 这是有道理的,因为例如在 MNIST 数据集中,如果 GAN 看到生成器 8 看到了数字 8,则生成器对合成数字 8 变得更有信心。
......
......@@ -644,7 +644,7 @@ python3 cvae-cnn-mnist-8.2.1.py –bce --weights=cvae_cnn_mnist.tf --digit=0
VAE 的这种变化称为![](img/B14853_08_122.png) -VAE [5]。 ![](img/B14853_08_122.png)的隐含效果是更严格的标准偏差。 换句话说,![](img/B14853_08_124.png)强制后验分布中的潜码![](img/B14853_08_125.png)独立。
实现![](img/B14853_08_126.png) -VAE 很简单。 例如,对于上一个示例中的 CVAE,所需的修改是`kl_loss`中的额外 **beta** 因子:
实现![](img/B14853_08_126.png) -VAE 很简单。 例如,对于上一个示例中的 CVAE,所需的修改是`kl_loss`中的额外`beta`因子:
```py
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
......
......@@ -96,7 +96,7 @@ Q 学习是一种*脱离策略* RL 算法。 它学习了如何通过不直接
为了说明 Q 学习算法,我们需要考虑一个简单的确定性环境,如图“图 9.3.1”所示。 环境具有六个状态。
显示允许的过渡的奖励。 在两种情况下,奖励是非零的。 转换为**目标**`G`)状态可获得+100 的奖励,同时移至 **Hole**`H`)状态具有- 100 奖励。 这两个状态是终端状态,从**开始**状态构成一个情节的结尾:
显示允许的过渡的奖励。 在两种情况下,奖励是非零的。 转换为**目标**`G`)状态可获得 +100 的奖励,同时移至**洞**`H`)状态具有 -100 奖励。 这两个状态是终端状态,从**开始**状态构成一个情节的结尾:
![](img/B14853_09_02.png)
......@@ -130,7 +130,7 @@ Q 学习是一种*脱离策略* RL 算法。 它学习了如何通过不直接
图 9.3.5:假设代理选择的动作是向右移动,则显示状态(1、1)的 Q 值的更新
它遇到了,`H`状态,并获得了-100 奖励。 这次,更新不为零。 向右移动时,状态(1、1)的新 Q 值为-100。 注意,由于这是终端状态,因此没有下一个状态。 一集刚刚结束,**代理**返回到**开始**状态。
它遇到了,`H`状态,并获得了-100 奖励。 这次,更新不为零。 向右移动时,状态(1、1)的新 Q 值为-100。 注意,由于这是终端状态,因此没有下一个状态。 一集刚刚结束,**智能体**返回到**开始**状态。
假设**代理**仍处于探索模式,如图“图 9.3.6”所示:
......@@ -382,7 +382,7 @@ class QWorld:
self.epsilon *= self.epsilon_decay
```
感知动作学习循环在“列表 9.3.2”中进行了说明。 在每个情节中,环境都会重置为 **Start** 状态。 选择要执行的动作并将其应用于环境。 观察**奖励****下一个**状态,并将其用于更新 Q 表。 达到**目标****Hole** 状态后,情节完成(`done = True`)。
感知动作学习循环在“列表 9.3.2”中进行了说明。 在每个情节中,环境都会重置为**开始**状态。 选择要执行的动作并将其应用于环境。 观察**奖励****下一个**状态,并将其用于更新 Q 表。 达到**目标****洞**状态后,情节完成(`done = True`)。
对于此示例,Q 学习运行 100 集或 10 获胜,以先到者为准。 由于在每个情节中变量的值均降低,因此代理开始倾向于利用 Q 表来确定在给定状态下要执行的动作。 要查看 Q 学习模拟,我们只需要运行以下命令:
......@@ -757,7 +757,7 @@ python3 q-frozenlake-9.5.1.py -d -t=1
在前面有关 Q 学习和![](img/14853_09_066.png)的讨论中,所有术语都很熟悉。 术语![](img/14853_09_067.png) ![](img/14853_09_068.png)。 换句话说,使用 Q 网络,在给定下一个状态的情况下预测每个动作的 Q 值,并从其中获得最大值。 注意,在终端状态下,![](img/14853_09_069.png),![](img/14853_09_070.png)
但是,事实证明训练 Q 网络是不稳定的。 导致不稳定的问题有两个:1)样本之间的相关性高; 2)非平稳目标。 高度相关性是由于采样经验的顺序性质。 DQN 通过创建经验缓冲解决了问题。 训练数据是从该缓冲区中随机采样的。 此过程称为**体验重播**
但是,事实证明训练 Q 网络是不稳定的。 导致不稳定的问题有两个:1)样本之间的相关性高; 2)非平稳目标。 高度相关性是由于采样经验的顺序性质。 DQN 通过创建经验缓冲解决了问题。 训练数据是从该缓冲区中随机采样的。 此过程称为**经验回放**
非固定目标的问题是由于目标网络![](img/14853_09_071.png)在每小批训练后都会被修改。 目标网络的微小变化会导致策略,数据分布以及当前 Q 值和目标 Q 值之间的相关性发生重大变化。 这可以通过冻结![](img/14853_09_072.png)训练步骤的目标网络的权重来解决。 换句话说,创建了两个相同的 Q 网络。 在每个![](img/14853_09_073.png)训练步骤中,从训练中的 Q 网络复制目标 Q 网络参数。
......@@ -780,7 +780,7 @@ python3 q-frozenlake-9.5.1.py -d -t=1
5. 执行动作![](img/14853_09_051.png),观察奖励`r`,以及下一个状态![](img/14853_09_084.png)
6. 将转换![](img/14853_09_085.png)存储在![](img/14853_09_086.png)
7. 更新状态![](img/14853_09_087.png)
8. //体验重播
8. //经验回放
9. 从![](img/14853_09_074.png)中抽样一小部分发作经历![](img/14853_09_088.png)
10. ![](img/14853_09_090.png)
11. 在![](img/14853_09_091.png) w.r.t.上执行梯度下降步骤。 参数![](img/14853_09_092.png)
......@@ -814,7 +814,7 @@ python3 q-frozenlake-9.5.1.py -d -t=1
* “算法 9.6.1”中的 Q 网络或 Q
* “算法 9.6.1”中的目标 Q 网络或`Q_target`
两个网络都是 MLP,每个都有 256 个单元的 3 个隐藏层。 这两个网络都是通过`build_model()`方法创建的。 在**体验重播**`replay()`期间训练 Q 网络。 以`update_weights()`的固定间隔 C = 10 个训练步骤,将 Q 网络参数复制到目标 Q 网络。 在“算法 9.6.1”中,这实现了第 13 行,`Q_target = Q`。 每次发作后,`update_epsilon()`都会降低勘探开发的比例,以利用已学习的策略。
两个网络都是 MLP,每个都有 256 个单元的 3 个隐藏层。 这两个网络都是通过`build_model()`方法创建的。 在**经验回放**`replay()`期间训练 Q 网络。 以`update_weights()`的固定间隔 C = 10 个训练步骤,将 Q 网络参数复制到目标 Q 网络。 在“算法 9.6.1”中,这实现了第 13 行,`Q_target = Q`。 每次发作后,`update_epsilon()`都会降低勘探开发的比例,以利用已学习的策略。
“列表 9.6.1”:`dqn-cartpole-9.6.1.py`
......@@ -1046,7 +1046,7 @@ class DQNAgent:
self.epsilon *= self.epsilon_decay
```
为了在“算法 9.6.1”**体验重放**`replay()`中实现第 10 行,对于每个体验单元(`s[j]``a[j]``r[j + 1]``s[j + 1]`)将动作`a[j]`的 Q 值设置为`Q_max`。 所有其他动作的 Q 值保持不变。
为了在“算法 9.6.1”**经验回放**`replay()`中实现第 10 行,对于每个体验单元(`s[j]``a[j]``r[j + 1]``s[j + 1]`)将动作`a[j]`的 Q 值设置为`Q_max`。 所有其他动作的 Q 值保持不变。
这是通过 DQNAgent `replay()`函数中的以下行实现的:
......@@ -1057,7 +1057,7 @@ q_value = self.get_target_q_value(next_state)
# correction on the Q value for the action used q_values[0][action] = reward if done else q_value
```
如“算法 9.6.1”的第 11 行所示,只有动作`a[j]`具有等于![](img/14853_09_096.png)的非零损耗。 请注意,假设缓冲区中有足够的数据,换句话说,在每个情节结束后,“列表 9.6.2”中的感知动作学习循环会调用体验重播。 缓冲区的大小大于或等于批量大小)。 在体验重播期间,会随机采样一批体验单元,并将其用于训练 Q 网络。
如“算法 9.6.1”的第 11 行所示,只有动作`a[j]`具有等于![](img/14853_09_096.png)的非零损耗。 请注意,假设缓冲区中有足够的数据,换句话说,在每个情节结束后,“列表 9.6.2”中的感知动作学习循环会调用经验回放。 缓冲区的大小大于或等于批量大小)。 在经验回放期间,会随机采样一批体验单元,并将其用于训练 Q 网络。
与 Q 表类似,`act()`实现了![](img/14853_09_103.png)-贪婪策略,“公式 9.6.1”。
......@@ -1116,7 +1116,7 @@ q_value = self.get_target_q_value(next_state)
在平均 10 次运行的中,DQN 在 822 集内解决了。 我们需要注意的是,每次训练运行的结果可能会有所不同。
自从引入 DQN 以来,连续的论文都提出了对“算法 9.6.1”的改进。 一个很好的例子是 **Double DQN(DDQN)**,下面将对其进行讨论。
自从引入 DQN 以来,连续的论文都提出了对“算法 9.6.1”的改进。 一个很好的例子是**双 DQN(DDQN)**,下面将对其进行讨论。
## 双重 Q 学习(DDQN)
......@@ -1205,7 +1205,7 @@ DQN 和 DDQN 均表明,借助 DL,Q 学习能够扩展并解决具有连续
在本章中,我们已经介绍了 DRL,DRL 是一种强大的技术,许多研究人员认为它是 AI 的最有希望的领先者。 我们已经超越了 RL 的原则。 RL 能够解决许多玩具问题,但是 Q 表无法扩展到更复杂的现实问题。 解决方案是使用深度神经网络学习 Q 表。 但是,由于样本相关性和目标 Q 网络的非平稳性,在 RL 上训练深度神经网络非常不稳定。
DQN 提出了一种使用经验重播并将目标网络与受训 Q 网络分离的解决方案。 DDQN 建议通过将动作选择与动作评估分开来最大程度地降低 Q 值,从而进一步改进算法。 DQN 还提出了其他改进建议。 优先体验重放[6]认为,不应对体验缓冲区进行统一采样。
DQN 提出了一种使用经验重播并将目标网络与受训 Q 网络分离的解决方案。 DDQN 建议通过将动作选择与动作评估分开来最大程度地降低 Q 值,从而进一步改进算法。 DQN 还提出了其他改进建议。 优先经验回放[6]认为,不应对体验缓冲区进行统一采样。
取而代之的是,应更频繁地采样基于 TD 错误的更重要的经验,以完成更有效的培训。 文献[7]提出了一种对决网络架构来估计状态值函数和优势函数。 这两个函数均用于估计 Q 值,以加快学习速度。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册