提交 5b099192 编写于 作者: W wizardforcel

2021-01-02 19:13:38

上级 ae7d9049
......@@ -2,7 +2,7 @@
在本章中,我们将解释最有趣的深度学习模型之一,即**生成对抗网络****GAN**)。 我们将首先回顾 GAN 是什么以及它们的用途。 在简要介绍了 GAN 模型的演化路径之后,我们将说明各种 GAN 架构以及图像生成示例。
想象一下,您正在模仿一个最初并不了解的艺术品(例如 Vincent van Gogh 的 *The Starry Night* )。 您可以随意参加多次。 每次您提交作品时,评委都会向您反馈真实艺术品的外观以及复制品的接近程度。 在最初的几次尝试中,由于您对原始作品的了解非常有限,因此您的作品得分不高。 经过几番尝试,由于法官提供了有用的提示,您的作品越来越接近真实的艺术品。 您会不断尝试和改进,并将法官的反馈纳入您的尝试中,而在最近的几次尝试中,您的工作看起来与原始工作非常接近。 希望您最终能赢得比赛。
想象一下,您正在模仿一个最初并不了解的艺术品(例如 Vincent van Gogh 的《星空》)。 您可以随意参加多次。 每次您提交作品时,评委都会向您反馈真实艺术品的外观以及复制品的接近程度。 在最初的几次尝试中,由于您对原始作品的了解非常有限,因此您的作品得分不高。 经过几番尝试,由于法官提供了有用的提示,您的作品越来越接近真实的艺术品。 您会不断尝试和改进,并将法官的反馈纳入您的尝试中,而在最近的几次尝试中,您的工作看起来与原始工作非常接近。 希望您最终能赢得比赛。
GAN 在合成图像,声波,视频和任何其他信号方面几乎具有相同的作用,我们将在本章中对此进行深入探讨。
......@@ -35,7 +35,7 @@ GAN 可能是深度神经网络最有趣的类型之一。 自从 Goodfellow 等
# 生成模型
机器学习中有两种主要类型的模型,即**生成模型****判别模型**。 顾名思义,区分模型试图在两个(或多个)类之间区分数据。 例如,我们在“第 4 章” *,CNN 架构*中讨论过的 CNN 模型,学会告诉我们一个图像是猫还是狗,给定其中一个图像, 以及 “第 6 章”,“循环神经网络”中的 RNN 模型经过训练,可以输出给定段落的正面或负面情绪。 判别模型着重于根据数据的特征预测数据类别。 相反,生成模型不尝试将要素映射到类,而是在给定特定类的情况下生成要素。 例如,训练**高斯混合模型****GMM**)以生成适合训练集分布的新数据。 生成模型对给定单个类的特征分布进行建模。 也就是说,可以使用生成模型对数据进行分类,例如 Naive Bayes 和 Boltzmann 机器,我们在“第 3 章”,*受限 Boltzmann 机器和自编码器*中进行了讨论。 但是,他们的首要任务是弄清楚某些功能的可能性,而不是识别标签。 然后将学习到的特征分布用于分类。 如果仍然感到困惑,这是区分生成模型和区分模型的简单方法:
机器学习中有两种主要类型的模型,即**生成模型****判别模型**。 顾名思义,区分模型试图在两个(或多个)类之间区分数据。 例如,我们在“第 4 章”,“CNN 架构”中讨论过的 CNN 模型,学会告诉我们一个图像是猫还是狗,给定其中一个图像, 以及 “第 6 章”,“循环神经网络”中的 RNN 模型经过训练,可以输出给定段落的正面或负面情绪。 判别模型着重于根据数据的特征预测数据类别。 相反,生成模型不尝试将要素映射到类,而是在给定特定类的情况下生成要素。 例如,训练**高斯混合模型****GMM**)以生成适合训练集分布的新数据。 生成模型对给定单个类的特征分布进行建模。 也就是说,可以使用生成模型对数据进行分类,例如 Naive Bayes 和 Boltzmann 机器,我们在“第 3 章”,“受限 Boltzmann 机器和自编码器”中进行了讨论。 但是,他们的首要任务是弄清楚某些功能的可能性,而不是识别标签。 然后将学习到的特征分布用于分类。 如果仍然感到困惑,这是区分生成模型和区分模型的简单方法:
* 区分模型对寻找边界或规则以分离数据感兴趣
* 生成模型侧重于对数据分布进行建模
......@@ -46,7 +46,7 @@ GAN 模型由两个网络组成。 一个称为生成器的网络负责生成新
如果我们还记得梵高(Van Gogh)的例子,那么 GAN 模型就在做类似的事情。 我们模仿艺术品,而 GAN 中的生成器生成候选对象,例如感兴趣的特定数据分布; 法官评估我们的副本,而 GAN 中的鉴别器则通过从真实数据分布中区分生成的候选对象和实例来评估生成的候选对象。
GAN 中的生成器和鉴别器以对抗性方式进行训练,也就是说,它们在零和框架中相互竞争,以便生成模拟真实数据分布的数据。 就像在美术比赛中一样,我们不断改进复制品,以期获得法官的高分,并且法官不断评估我们的工作并提供反馈。 GAN 中的生成器旨在生成被视为来自真实数据分布的合成实例,即使它们是*伪造*,而鉴别器的目标是识别单个实例是否是伪造的(已合成) 或真实的。 从优化的角度来看,生成器的训练目标是增加鉴别器的错误-鉴别器犯的错误越多,生成器的性能就越好。 鉴别器的目的是减少其误差,这是显而易见的。 在每次迭代中,两个网络都使用梯度下降来实现其目标,这并不是什么新鲜事。 有趣的是,每个网络都在试图击败另一个网络,即生成器试图欺骗鉴别器,而鉴别器则试图不被欺骗。 最终,来自发生器的合成数据(例如图像,音频,视频,时间序列)(希望)能够欺骗最复杂的鉴别器,类似于艺术品复制品竞赛,我们能够从最严格的标准中获得最高分 但最有帮助的法官。
GAN 中的生成器和鉴别器以对抗性方式进行训练,也就是说,它们在零和框架中相互竞争,以便生成模拟真实数据分布的数据。 就像在美术比赛中一样,我们不断改进复制品,以期获得法官的高分,并且法官不断评估我们的工作并提供反馈。 GAN 中的生成器旨在生成被视为来自真实数据分布的合成实例,即使它们是*伪造*,而鉴别器的目标是识别单个实例是否是伪造的(已合成) 或真实的。 从优化的角度来看,生成器的训练目标是增加鉴别器的错误-鉴别器犯的错误越多,生成器的性能就越好。 鉴别器的目的是减少其误差,这是显而易见的。 在每次迭代中,两个网络都使用梯度下降来实现其目标,这并不是什么新鲜事。 有趣的是,每个网络都在试图击败另一个网络,即生成器试图欺骗鉴别器,而鉴别器则试图不被欺骗。 最终,来自发生器的合成数据(例如图像,音频,视频,时间序列)(希望)能够欺骗最复杂的鉴别器,类似于艺术品复制品竞赛,我们能够从最严格的标准中获得最高分 但最有帮助的法官。
实际上,生成器从具有高斯分布的多元高斯分布的预定义分布中抽取随机样本作为最受欢迎的输入,并生成看起来好像可能来自目标分布的数据。 这与复制品竞赛非常相似,在复制品竞赛中,我们最初对艺术品一无所知,并一直朝着像样的复制品努力。
......@@ -69,9 +69,9 @@ GAN 采取的步骤如下:
# GAN 的演进路径
对抗训练的思想可以追溯到 1990 年代早期的工作,例如 Schmidhuber 的*通过可预测性最小化*学习阶乘代码(神经计算,1992,4(6):863-879)。 2013 年,在*通过受控相互作用学习动物行为的协同进化方法*中提出了无模型推断的对抗模型(李等人,第 15 届“遗传与进化计算”年会,2013,223-230)。 2014 年,Goodfellow 等人在《生成对抗网络》中首次引入了 GAN。
对抗训练的思想可以追溯到 1990 年代早期的工作,例如 Schmidhuber 的《通过可预测性最小化学习阶乘代码》。 2013 年,在《通过受控相互作用学习动物行为的协同进化方法》中提出了无模型推断的对抗模型。 2014 年,Goodfellow 等人在《生成对抗网络》中首次引入了 GAN。
Li 等人(提出动物行为推断的同一作者)在 *Turing learning:推断行为的无度量方法及其在群体*中于 2016 年提出了 **Turing learning** 一词。 ](Swarm Intelligence,10(3):211-243)。 图灵学习与图灵测试相关,并且是 GAN 的概括,如*概括 GAN:图灵透视图*中所总结(Gross 等人,“神经信息处理系统年会”第 31 个论文集,2017,1-11)。 在图灵学习中,模型不仅限于 GAN 或神经网络; 鉴别器会影响发生器的输入,在图灵测试中充当询问器。
Li 等人(提出动物行为推断的同一作者)在《图灵学习:一种无度量的行为推断方法及其在群体中的应用》中于 2016 年提出了**图灵学习** 一词。 图灵学习与图灵测试相关,并且是 GAN 的概括,如《概括 GAN:图灵的视角》中所总结。 在图灵学习中,模型不仅限于 GAN 或神经网络; 鉴别器会影响发生器的输入,在图灵测试中充当询问器。
提出的第一个 GAN 由用于发生器和鉴别器的全连接层组成。 自从香草架构以来,已经开发了许多新的创新方法,例如,深度卷积 GAN,条件 GAN 和信息最大化的 GAN。 在下一节中,我们将详细研究这些架构,并从头开始实现每个架构。
......@@ -175,7 +175,7 @@ Training dataset shape: (70000, 784)
... return out
```
发生器将输入的随机噪声依次馈入三个隐藏层,分别具有 256、512 和 1,024 个隐藏单元。 请注意,每个隐藏层的激活功能是**泄漏 ReLU** ,这是 ReLU 的变体。 发明它是为了解决即将死去的 ReLU 问题,即对于该函数的任何负输入,其输出变为零。 它定义为![](img/2ecc70bc-0e05-4657-80ff-790bda4aa62a.png),其中![](img/7b12021f-d3c1-44e4-a3d3-dc5f6c9b38af.png)是介于 0 到 1 之间的斜率因子(但较小的值更常见)。 下图显示了 ReLU 和泄漏版本之间的比较(例如*斜率= 0.2* ):
发生器将输入的随机噪声依次馈入三个隐藏层,分别具有 256、512 和 1,024 个隐藏单元。 请注意,每个隐藏层的激活功能是**泄漏 ReLU** ,这是 ReLU 的变体。 发明它是为了解决即将死去的 ReLU 问题,即对于该函数的任何负输入,其输出变为零。 它定义为![](img/2ecc70bc-0e05-4657-80ff-790bda4aa62a.png),其中![](img/7b12021f-d3c1-44e4-a3d3-dc5f6c9b38af.png)是介于 0 到 1 之间的斜率因子(但较小的值更常见)。 下图显示了 ReLU 和泄漏版本之间的比较(例如`leak = 0.2`):
![](img/cf5a3eb1-3ff7-456e-88cc-6a0da05e52df.png)
......@@ -346,7 +346,7 @@ tensorboard --logdir=logdir/
# 深度卷积 GAN
**卷积层**已成为解决图像问题的必备条件。 使用 GAN 生成图像也不例外。 因此,Radford 等人提出了**深度卷积生成对抗网络****DCGAN**)。 于 2016 年在*中使用深度卷积生成对抗网络*进行无监督表示学习
**卷积层**已成为解决图像问题的必备条件。 使用 GAN 生成图像也不例外。 因此,Radford 等人在《使用深度卷积生成对抗网络进行无监督表示学习》提出了**深度卷积生成对抗网络****DCGAN**
很容易理解 DCGAN 中的区分符。 它也非常类似于用于分类的标准 CNN,其中使用一个或多个卷积层,每个卷积层之后是一个非线性层,最后是一个全连接层。 例如,我们可以具有以下架构:
......@@ -409,7 +409,7 @@ tensorboard --logdir=logdir/
这很容易。 三个卷积层分别包含 64、128 和 256 个 5 x 5 滤波器。
开发发电机有点棘手。 回想一下,我们需要首先将输入的一维噪声整形为三维图像,以启用转置卷积。 我们知道,由于两个网络的对称性,第三维是 256。 那么,前两个维度是什么? 它们是`2`x`2`,在第一个转置的卷积层之后变为`4`x`4``8`x *第二个之后的*为 8,第三个之后的为 16 x 16,如果它是 *3,则与我们的`28`x`28`的目标相去甚远。* x`3`。 同样,它在第三个转置的卷积层之后变为 24 x 24,这又不够大。 如果它是 4 x 4,则在第三个转置的卷积层之后变为 32 x 32。 因此,将线性输入重塑为 4 x 4 图像就足够了。 请注意,现在生成的图像输出的大小为 32 x 32,这与我们的真实图像的大小 28 x 28 不同。要确保对鉴别器的输入恒定,我们只需要在真实图像上填充零即可。 在`load_dataset`函数的顶部实现了实图像的零填充:
开发发电机有点棘手。 回想一下,我们需要首先将输入的一维噪声整形为三维图像,以启用转置卷积。 我们知道,由于两个网络的对称性,第三维是 256。 那么,前两个维度是什么? 它们是`2 x 2`,在第一个转置的卷积层之后变为`4 x 4`,第二个之后的为`8 x 8`,第三个之后的为 16 x 16,如果它是`3 x 3`,则与我们的`28 x 28`的目标相去甚远。 同样,它在第三个转置的卷积层之后变为 24 x 24,这又不够大。 如果它是 4 x 4,则在第三个转置的卷积层之后变为 32 x 32。 因此,将线性输入重塑为 4 x 4 图像就足够了。 请注意,现在生成的图像输出的大小为 32 x 32,这与我们的真实图像的大小 28 x 28 不同。要确保对鉴别器的输入恒定,我们只需要在真实图像上填充零即可。 在`load_dataset`函数的顶部实现了实图像的零填充:
```py
>>> def load_dataset_pad():
......@@ -709,7 +709,7 @@ TensorBoard 中显示的学习图如下所示:
# InfoGAN
**InfoGANs****最大化生成对抗网络**信息的缩写)在某种意义上类似于 CGAN,因为两个生成器网络都接受一个附加参数,并且条件变量`c`,例如标签信息。 他们都试图学习相同的条件分布 *P(X | z,c)*。 InfoGAN 与 CGAN 的区别在于它们处理条件变量的方式。
**InfoGANs****最大化生成对抗网络**信息的缩写)在某种意义上类似于 CGAN,因为两个生成器网络都接受一个附加参数,并且条件变量`c`,例如标签信息。 他们都试图学习相同的条件分布`P(X | z, c`。 InfoGAN 与 CGAN 的区别在于它们处理条件变量的方式。
CGAN 认为条件变量是已知的。 因此,在训练期间将条件变量显式馈送到鉴别器。 相反,InfoGAN 假设条件变量是未知的且是潜在的,我们需要根据训练数据来推断条件变量。 InfoGAN 中的鉴别符负责推导后验`P(c | X)`。 下图显示了 InfoGAN 的体系结构:
......@@ -721,11 +721,11 @@ CGAN 认为条件变量是已知的。 因此,在训练期间将条件变量
`L_InfoGAN = (D, G) = L(D, G) - I(c, G(z, c))`
此处,`L(D, G)`是常规 GAN 中的`loss`函数, *I(c,G(z,c))**c 之间的互信息* 和生成的输出。 更准确地,将 P( *c | G(z,c)*)预测为更高的 *I(c,G(z,c))*
此处,`L(D, G)`是常规 GAN 中的`loss`函数,`I(c | G(z, c))``c`和生成的输出之间的互信息。 更准确地,将`P(c | G(z, c))`预测为更高的`I(c | G(z, c))`
互信息 *I(a,b)*衡量如果我们知道`b`,我们对`a`的了解程度。 *P(a | b)(或 P(b | a))*预测得越准确, *I(a,b)*越高。 *I(a,b)= 0* 表示`a``b`完全无关。
互信息`I(a, b)`衡量如果我们知道`b`,我们对`a`的了解程度。`P(a | b)`(或`P(b | a)`)预测得越准确,`I(a, b)`越高。 `I(a, b) = 0`表示`a``b`完全无关。
取决于潜在变量是什么,可以不同地计算 *I(c,G(z,c))*。 对于分类变量,它是通过`cross`熵来衡量的。 对于连续变量,可以将其计算为其分布(例如高斯分布)之间的方差。
取决于潜在变量是什么,可以不同地计算`I(c | G(z, c))`。 对于分类变量,它是通过`cross`熵来衡量的。 对于连续变量,可以将其计算为其分布(例如高斯分布)之间的方差。
考虑到所有这些概念,我们可以开始开发 InfoGAN 模型。 回想一下,我们不需要在 InfoGAN 中提供标签数据。 因此,我们可以将`load_dataset_pad``gen_batches`函数用作 DCGAN。 让我们像往常一样先加载数据:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册