原题:Understanding Generative Adversarial Networks (GANs)——Building, step by step, the reasoning that leads to GANs.
原文:HTML
作者:Joseph Rocca
文章目录
Introduction
Yann LeCun 将其描述为“近十年来机器学习中最有趣的想法”。 当然,来自深度学习领域如此杰出的研究人员的这种赞美始终是我们所谈论的主题的绝佳广告!的确,自从2014年由 Ian J. Goodfellow 及其合著论文 Generative Adversarial Networks获得了巨大的成功。
什么是生成对抗网络? 是什么让他们如此“有趣”? 在这篇文章中,我们将看到对抗训练是一个启发性的想法,它的简单性就很漂亮,它代表了机器学习,尤其是生成模型的真正概念进展(就像反向传播是一个简单但非常聪明的技巧, 使得神经网络的基础思想变得如此流行和高效)。
在详细介绍之前,让我们快速概述一下GAN的用途。生成对抗网络属于生成模型集。这意味着他们能够制作/生成(我们将看到如何)新内容。为了说明“生成模型”的概念,我们可以看一下使用GAN获得的结果的一些众所周知的示例。
Ian Goodfellow及其合作者对GAN能力的说明。这些是在对抗两个数据集:MNIST和TFD训练后由对抗性生成网络生成的样本。对于这两者,最右边的列包含与直接相邻的生成样本最接近的真实数据。这向我们表明,生成的数据是真正生成的,而不仅仅是由网络存储的。
这种生成新内容的能力使GAN乍一看有点“神奇”。在以下部分中,我们将揭开GAN的神秘面纱,以便深入研究这些模型背后的思想,数学理论和建模过程。
事不宜迟,让我们一起重新探索GAN!
注意:尽管我们试图使本文尽可能独立,但是仍需要机器学习方面的基础知识。但是,大多数概念在需要时将保留,否则将另给出一些参考。我们确实试图使本文尽可能地通俗易懂。请不要犹豫在评论部分中提及你想阅读的更多信息(有关该主题的更多文章)。
Outline
在接下来的第一部分中,我们将讨论根据给定分布生成随机变量的过程。然后,在第2节中,我们将通过示例展示GAN尝试解决的问题可以表示为随机变量生成问题。在第3节中,我们将讨论基于匹配的生成网络,并展示它们如何解决第2节中描述的问题。最后,在第4节中,我们将介绍GAN。更具体地说,我们将介绍具有损失函数的通用结构,并与前面的所有部分进行关联。
本文已完成,内容如下:LINK。
以下短视频对本文进行了部分说明:VIDEO
Generating random variables
本节讨论生成随机变量的过程:我们将讨论一些现有方法,尤其是逆变换方法,该方法允许从简单的统一随机变量生成复杂的随机变量。尽管这似乎离主题GAN有点远,但将在下一节中看到生成模型存在的深层链接。
Uniform random variables can be pseudo-randomly generated
计算机从根本上是确定性的。因此,从理论上讲,不可能生成真正随机数。但是,可以定义生成数字序列的算法,这些序列的性质与理论随机数序列的性质非常接近。特别地,计算机能够使用伪随机数生成器生成一系列数字,这些数字近似遵循[0,1]的均匀随机分布。统一的情况是一种非常简单的情况,可以用不同的方式在其上构建更复杂的随机变量。
Random variables expressed as the result of an operation or a process
存在各种旨在生成更复杂的随机变量的技术。其中我们可以找到例如逆变换方法,rejection sampling,Metropolis-Hasting 算法等。所有这些方法都依赖于不同的数学技巧,这些技巧主要在于表示要作为操作(相对于简单的随机变量)或过程的结果生成的随机变量。
Rejection sampling将随机变量表示为一个过程的结果,该过程包括不从复杂分布中采样,而是从众所周知的简单分布中采样,并根据某些条件接受或拒绝采样值。重复此过程直到采样值被接受,可以证明在正确的接受条件下,被有效采样的值遵循正确的分布。
Metropolis-Hasting算法的核心思想是找到一个马尔可夫链(Markov Chain,MC),以使该MC的静态分布与我们要从中采样的随机变量的分布相对应。一旦找到此MC,就可以在此MC上模拟足够长的轨迹,以认为已经达到稳态,然后我们以这种方式获得的最后一个值可以被认为是从感兴趣的分布中得出的。
我们将不进一步讨论 rejection sampling 和 Metropolis-Hasting 的细节,因为这些方法并不是将我们引向GAN背后的概念的方法(有兴趣的读者可以参考Wikipedia上的文章)。 我们将更多的注意力集中在逆变换方法上。
The inverse transform method
逆变换方法的思想只是简单地表示复数——在本文中,“复数”应始终从“不简单”的意义上理解,而不是从数学意义上理解——随机变量是应用于知道如何生成均匀随机变量的函数的结果。
我们考虑一维示例。令X为要从中采样的复数随机变量,而U为知道如何采样的[0,1]上的均匀随机变量(uniform random variable)。注意,随机变量完全由其累积分布函数(Cumulative Distribution Function, CDF)定义。随机变量的临界密度函数是从随机变量的定义域到区间[0,1]的函数,在一维中的定义为:
在我们统一随机变量U的特殊情况下,我们有:
为了简单起见,我们在这里假设函数CDF_X是可逆的,并且表示它的逆:
(通过使用函数的广义逆(generalised inverse),该方法可以很容易地扩展到不可逆的情况,但这并不是我们要重点关注的重点)。如果我们定义
我们有
如我们所见,Y和X具有相同的CDF,然后定义相同的随机变量。因此,通过如上定义Y(作为均匀随机变量的函数),我们设法定义了具有目标分布的随机变量。
总而言之,逆变换方法是通过使均匀随机变量经过精心设计的“变换函数”(inverse CDF)来生成遵循给定分布的随机变量的方法。实际上,“逆变换方法”的概念可以扩展到“变换方法”的概念,更一般地说,它包括生成随机变量作为一些更简单的随机变量的函数(不一定是一致的,然后变换函数不再是逆CDF)。从概念上讲,“变换函数”的目的是对初始概率分布进行变形/重塑:与目标分布相比,变换函数从初始分布过高的地方开始,而从目标分布过低的地方开始进行变换。
逆变换方法的图示。蓝色:[0,1]上的均匀分布。橙色:标准高斯分布。灰色:从均匀分布到高斯分布(inverse CDF)的映射。
Generative models
We try to generate very complex random variables…
假设我们对生成的
n
×
n
n times n
n×n 像素的狗的黑白方形图像感兴趣。我们可以将每个数据重塑为
N
=
n
×
n
N = n times n
N=n×n 维向量(通过在彼此顶部堆叠列),这样狗的图像就可以用一个向量来表示。但是,这并不意味着所有向量当变回正方形时一定还是狗的图像!因此,我们可以说,有效给出看起来像狗的N维向量是根据整个N维向量空间上非常特定的概率分布分布的(该空间的某些点很可能代表狗,而其他情况则不可能)。同理,在这个N维向量空间上,也存在猫,鸟等图像的概率分布。
然后,生成狗的新图像的问题等价于在N维向量空间上遵循“狗的概率分布”的生成新向量的问题。因此,实际上,我们面临着针对特定概率分布生成随机变量的问题。
… so let’s use transform method with a neural network as function!
尝试生成新的狗图像时,我们的第一个问题是N维向量空间上的“狗的概率分布”非常复杂,我们不知道如何直接生成复杂的随机变量。 但是,由于我们非常了解如何生成N个不相关的均匀随机变量,因此可以使用 transform 方法。 为此,我们需要将N维随机变量表示为一个非常复杂的函数应用于一个简单N维随机变量的的结果!
此处需要强调,找到变换函数并不像我们在描述逆变换方法时所做的那样,只需要对累积分布函数(显然我们不知道)进行封闭形式的逆变换。转换函数不能显式表达,因此,我们必须从数据中学习它。
在大多数情况下,非常复杂的功能自然就意味着神经网络建模。 然后,我们的想法是通过神经网络对转换函数建模,该神经网络将一个简单的N维均匀随机变量作为输入,然后将另一个N维随机变量作为输出返回,训练后,该N维随机变量应遵循正确的“狗概率分布” 。一旦设计了网络架构,我们仍然需要对其进行培训。 在接下来的两节中,我们将讨论两种训练这些生成网络的方法,包括GAN背后的对抗训练思想!
使用神经网络的生成模型概念的插图。显然,我们真正在谈论的维数远高于此处表示的维数。
Generative Matching Networks
免责声明:生成匹配网络(Generative Matching Networks)的名称不是标准名称。然而,我们可以在文献中找到,例如,生成矩匹配网络(Generative Moments Matching Networks)或 生成特征匹配网络(Generative Features Matching Networks)。我们只是想在这里用一个稍微通用的名称来描述我们下面描述的内容。
Training generative models
到目前为止,我们已经表明,我们生成狗的新图像的问题可以被重新表述为在遵循“狗概率分布”的N维向量空间中生成随机向量的问题,并且我们已经建议使用具有神经网络的变换方法来建模变换函数。
现在,我们仍然需要训练(优化)网络以表达正确的变换功能。为此,我们可以建议两种不同的训练方法:直接训练和间接训练。直接训练方法包括比较真实分布和生成的概率分布,并通过网络反向传播错误差。这是生成匹配网络(Generative Matching Networks,GMN)的常用方法。对于间接训练方法,我们不直接比较真实和生成的分布。相反,我们通过使这两个分布通过选择的下游任务来训练生成网络,以使生成网络相对于下游任务的优化过程将使生成的分布逼近真实分布。最后一个想法是我们将在下一节介绍的生成性对抗网络背后的想法。现在,让我们从直接方法和GMNs开始。
Comparing two probability distributions based on samples
如前所述,GMN的想法是通过直接将生成的分布与真实分布进行比较来训练生成网络。但是,我们不知道如何明确表达真实的“狗概率分布”,我们也可以说生成的分布过于复杂而无法明确表达。因此,基于显式表达式的比较是不可能的。但是,如果我们有一种方法可以根据样本比较概率分布,则可以使用它来训练网络。确实,我们有一个真实数据的样本,并且在训练过程的每个迭代中,我们都可以生成一个生成数据的样本。
尽管从理论上讲,可以使用任何能够有效比较基于样本的两个分布的距离(相似性度量),但我们常用最大平均差异(Maximum Mean Discrepancy,MMD)方法。MMD定义了两个概率分布之间的距离,可以基于这些分布的样本进行计算(估计)。 尽管它并不完全超出本文的范围,但我们不会花费更多时间描述MMD。但是,我们有一个项目即将发布,其中将包含有关它的更多详细信息。现在想进一步了解MMD的读者可以参考这些:幻灯片,本文1或本文2。
Backpropagation of the distribution matching error
因此,一旦我们定义了一种基于样本比较两种分布的方法,就可以定义GMN中生成网络的训练过程。给定一个具有均匀概率分布作为输入的随机变量,我们希望生成的输出的概率分布为“狗概率分布”。然后,GMN的想法是通过重复以下步骤来优化网络:
- 产生一些统一的输入;
- 使这些输入通过网络并收集生成的输出;
- 根据可用样本比较真实的“狗概率分布”和生成的“狗概率分布”(例如,计算真实狗图像的样本与生成的狗图像的样本之间的MMD距离);
- 使用反向传播进行梯度下降,以减小真实分布与生成分布之间的距离(例如MMD)
如上所述,当遵循这些步骤时,我们在网络上应用梯度下降,其损失函数为当前迭代中真实分布与生成分布之间的距离。
生成匹配网络采用简单的随机输入,生成新数据,直接将生成数据的分布与真实数据的分布进行比较,并反向传播匹配误差以训练网络。
Generative Adversarial Networks
The “indirect” training method
上面介绍的“直接”方法在训练生成网络时将产生的分布直接与真实分布进行比较。支配GAN的绝妙主意是用一个间接任务代替此直接比较,该间接任务采取这两个分布上下游任务的形式。然后针对此任务进行生成网络的训练,以使其强制生成的分布越来越接近真实分布。
GAN的下游任务是真实样本与生成样本之间的区分(discrimination)任务。或者可以说是non-discrimination任务,因为我们希望discrimination尽可能地失败。因此,在GAN架构中,我们有一个鉴别器(discriminator),它会提取真实数据和生成的数据样本,并尝试对其进行尽可能的分类,并且还有一个经过训练的生成器(generator),可以使它尽可能地愚弄鉴别器。让我们看一个简单的例子,从理论上讲,为什么我们提到的直接和间接方法应该导致相同的最佳生成器。
The ideal case: perfect generator and discriminator
为了更好地理解为什么训练生成器来欺骗鉴别器会产生与直接训练生成器以匹配目标分布相同的结果,我们举一个简单的一维示例。我们暂时忘记了生成器和鉴别器是如何表示的,并把它们看作抽象的概念(这将在下一小节中详细说明)。此外,两者都被认为是“完美的”(具有无限的能力),因为它们不受任何类型的(参数化的)模型的约束。
假设我们有一个真实的分布,例如一维高斯分布,并且我们想要一个生成器从该概率分布中采样。然后,我们所谓的“直接”训练方法将包括迭代地调整生成器(梯度下降迭代)以校正真实分布和生成分布之间的测量误差。最后,假设优化过程完美,我们应该最终生成与实际分布完全匹配的分布。
直接匹配法(direct matching method)概念说明。蓝色曲线表示真实分布,橙色表示生成分布。通过一次又一次的迭代,我们比较了两种分布,并通过梯度下降步骤调整了网络的权重。这里的比较是对均值和方差进行的,类似于截断矩匹配方法(truncated moments matching method)。注意,这个例子非常简单,不需要迭代方法,目的只是为了说明上面给出的直觉。
对于“间接”方法,我们还必须考虑鉴别器(discriminator)。现在假设这个鉴别器确切地知道什么是真实的和生成的分布,并且能够基于这个信息预测任何给定点的类(“真实的”或“生成的”)。如果这两个分布相去甚远,则鉴别器将能够轻松,高度自信地对我们提出的大部分要点进行分类。如果要愚弄鉴别器,我们必须使生成的分布接近真实分布。
对抗方法的直觉。蓝色分布是真实的,橙色是生成的。在灰色中,对应的y轴在右边,如果鉴别器在每个点选择密度较高的类(假设“真实的”和“生成的”数据比例相等),则显示该鉴别器为真的概率。两个分布越接近,鉴别器出错的可能性就越大。训练的目标是将绿色区域(生成的分布太高)移向红色区域(生成的分布太低)。
在这一点上,似乎很想知道这种间接方法是否真的是一个好主意。实际上,它似乎更复杂(我们必须基于下游任务而不是直接基于分布来优化生成器),并且它需要一个鉴别器,我们在这里将其视为给定的oracle,但实际上,这两个都不知道也不完美。对于第一点,基于样本直接比较两个概率分布的困难抵消了间接方法明显更高的复杂性。对于第二点,显然不知道鉴别器。但是,可以学到!
The approximation: adversarial neural networks
现在让我们描述GANs架构中采用生成器和鉴别器的具体形式。生成器是对转换函数建模的神经网络。它以一个简单的随机变量作为输入,一旦训练,必须返回遵循目标分布的随机变量。由于它非常复杂且未知,我们决定使用另一个神经网络对鉴别器进行建模。该神经网络对判别函数进行建模。它以一个点作为输入(在我们的狗示例中为N维向量),输出返回该点成为“真实”点的概率。
注意,我们现在强加了一个参数化模型来描述生成器和鉴别器(而非上一小节中的理想版本),实际上这对上面给出的理论论证没有太大影响:我们只是在一些参数化空间中工作,而不是在理想的全空间中工作,因此,可以将我们在理想情况下应达到的最佳点视为由参数化模型的精确能力“舍入(rounded)”。
定义好之后,可以针对两个相反的目标联合(同时)训练两个网络:
- 生成器的目的是欺骗鉴别器,因此训练了生成神经网络以最大程度地提高最终分类误差(介于真实数据和生成数据之间);
- 鉴别器的目标是检测伪造的数据,因此对鉴别神经网络进行了训练,以最大程度地减少最终分类误差;
因此,在训练过程的每次迭代中,都会更新生成网络的权重,以增加分类误差(误差梯度相对于生成器的参数上升),而鉴别网络的权重会更新,以减少此误差(误差梯度相对于鉴别器的参数下降)。
生成性对抗网络表征。生成器以简单的随机变量作为输入,生成新的数据。鉴别器获取“真实的”和“生成的”数据,并试图鉴别它们,建立一个分类器。生成器的目标是欺骗鉴别器(通过将尽可能多的生成数据与真实数据混合来增加分类误差),鉴别器的目标是区分真实数据和生成数据。
这些相反的目标和两个网络对抗训练的隐含概念解释了“对抗网络”的名称:两个网络都试图击败对方,这样做,他们都变得越来越好。它们之间的竞争使这两个网络在各自的目标方面“进步”。从博弈论的角度来看,我们可以把这个设置看作是一个极小极大的两人博弈,其中平衡状态对应于生成器从精确的目标分布中产生数据的情况,并且鉴别器以1/2的概率预测它接收到的点是“真实的”还是“生成的”。
Mathematical details about GANs
注意:本节稍微讲一点技术,对于全面了解GAN并不是绝对必要的。因此,现在不想阅读的可以暂时跳过本部分。对于其他的,让我们看看上面给出的直觉在数学上是如何形式化的。
免责声明:以下方程式不是Ian Goodfellow的文章中的公式。我们在这里提出另一种数学形式的原因有两个:第一,与上面给出的直觉更近一点;第二,因为原始论文的方程式已经非常清楚,仅仅重写它们是没有用的。 还要注意,我们不考虑与可能的损失函数有关的实际情况(梯度消失或其他)。我们强烈建议读者也看一下原始论文的公式:主要区别在于Ian Goodfellow研究的是交叉熵误差而不是绝对误差(下文所述)。此外,在下文中,我们假设生成器和鉴别器的容量不受限制。
神经网络建模本质上需要定义两件事:网络架构和损失函数。我们已经描述了生成对抗网络的网络架构。它包含两个网络:
- 生成网络
G
(
.
)
G(.)
G(.) 接受具有密度
p
z
p_z
pz 的随机输入
z
z
z,并返回输出
x
g
=
G
(
z
)
x_g = G(z)
xg=G(z),训练后,该输出应遵循目标概率分布; - 判别网络
D
(
.
)
D(.)
D(.) 接受输入
x
x
x,该输入
x
x
x 可以是真实的(
x
t
x_t
xt,其密度表示为
p
t
p_t
pt)或生成的(
x
g
x_g
xg,其密度
p
g
p_g
pg 是由密度
p
z
p_z
pz 通过
G
G
G 计算的),然后返回
x
x
x 为真实的数据的概率
D
(
x
)
D(x)
D(x) 。
现在让我们仔细看一下GAN的理论损失函数。如果我们以相同比例向鉴别器输入“真实的”和“生成的”数据,则鉴别器的预期绝对误差可以表示为:
生成器的目的是欺骗鉴别器,该鉴别器的目标是能够区分真实的数据和生成的数据。因此,在训练生成器时,我们希望最大化此误差,同时最小化鉴别器上的误差。所以有下式成立:
对于任何给定的生成器
G
G
G 以及概率密度
p
g
p_g
pg,最好的鉴别器是能够最小化误差:
为了最小化(相对于D)此积分,我们可以针对
x
x
x 的每个值最小化积分内部的函数。然后,它为给定的生成器定义最佳的鉴别器:
实际上,这是最好的方法之一,因为
x
x
x 的值使得
p
t
(
x
)
=
p
g
(
x
)
p_t(x)= p_g(x)
pt(x)=pg(x) 可以用另一种方式处理,但随后的内容无关紧要。然后我们搜索最大化的
G
G
G:
同样,为了最大化(相对于
G
G
G)该积分,我们可以针对
x
x
x 的每个值最大化积分内部的函数。由于密度
p
t
p_t
pt 与生成器
G
G
G 无关,因此我们要做的最好莫过于将
G
G
G 设置为:
当然,因为
p
g
p_g
pg 是积分为1的概率密度,所以对于最佳
G
G
G:
因此,我们已经表明,在理想情况下,具有无限容量的生成器和鉴别器,对抗设置的最佳点是这样的,生成器产生与真实密度相同的密度,鉴别器在两种情况中的一种情况下不能比真实做得更好,就像直觉告诉我们的那样。最后,还要注意
G
G
G 最大化:
在这种形式下,我们更好地看到
G
G
G 希望最大化鉴别器误差的预期概率。
Takeaways
本文的主要内容是:
- 计算机基本上可以生成简单的伪随机变量(例如,它们可以生成非常接近均匀分布的变量);
- 存在多种生成更复杂的随机变量的方法,例如转换方法,该方法包含将随机变量表示为一些更简单的随机变量的函数;
- 在机器学习中,生成模型尝试从给定(复杂)的概率分布中生成数据;
- 深度学习生成模型被建模为神经网络(非常复杂的函数),该神经网络采用简单的随机变量作为输入,并返回遵循目标分布的随机变量(例如“变换方法”);
- 可以直接训练这些生成网络(通过将生成的数据的分布与真实分布进行比较):这就是生成匹配网络的思想;
- 这些生成网络也可以间接地进行训练(通过尝试欺骗同时受过训练的另一个网络,以区分“生成的”数据与“真实的”数据):这是生成式对抗网络的思想。
即使围绕GAN的讨论可能有点夸张,但不得不承认Ian Goodfellow及其合作者提出的对抗训练的想法确实是一个很棒的想法。这种将损失函数从直接比较转变为间接比较的方法确实可以为深度学习领域的进一步工作带来启发。总之,我们不知道GANs的想法是否真的是“过去十年中机器学习中最有趣的想法”……但很显然,它至少是最有趣的一个!
注意:我们强烈建议有兴趣的读者阅读GAN的初始论文“Adversarial Neural Nets”,这实际上是科学论文的清晰模型,并观看有关Ali Ghodsi GAN的讲座视频,他确实是一位了不起的讲师。可以在Ian Goodfellow撰写的有关GAN的教程中找到更多说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【GANs】了解生成式对抗网络(GAN) - Python技术站