0. 引言
GANs, 全称 Generative Adversarial Networks, 即生成对抗网络。
Yann LeCun 曾将 GANs 评价为 “过去 10 年在机器学习领域最有趣的想法”。 行业大牛的高度评价是对 GANs 最好的广告。 自从 2014年 Ian J. Goodfellow 与合作者提出 GANs 以来,GANs 确实取得了巨大的成功。
那么到底什么是 GANs? 为何如此与众不同?在这篇博文中,我们将会看到极具启发性的对抗训练 (adversarial training) 思想,简约而优美,可以称之为机器学习领域(尤其是生成模型领域)概念性的进步。其重要性可以与反向传播(BP,backpropagation)相媲美,反向传播也是简单而绝妙的思想,正是由于 BP 才导致神经网络如此流行和高效。
在深入细节之前,先来看一下 GANs 能做什么。GANs 属于一个更大的范畴——生成模型(generative models)。这类模型具有产生新数据的能力。
下边感受一下由 GANs 产生的新数据:
上边左图中,GAN 首先在 MNIST 数据集上训练,然后用来产生新的数据,即图中前 5 列。最后一列是实际数据集中与第 5 列最接近的样本数据,两者有明显差异。由此可见,GAN 确实产生了与训练样本不同的新数据,而不是单纯记忆训练样本。右图是在 TFD (Toronto Faces Dataset) 数据集上的效果。
GANs 的这种产生新数据的能力让它看起来很魔幻,至少乍一看起来是这样的。在接下来的内容中,我们将穿过这些表面的魔幻,深入到 GANs 背后的思想和数学细节,一步一步推导出 GANs.
后边的内容组织安排如下:
第 1 节讨论从简单概率分布生成更加复杂分布的方法。
第 2 节通过一个例子表明 GANs 实际上可以看作是生成概率分布的一种方法。
第 3 节讨论基于匹配的生成网络(Generative Matching Networks)以及它如何解决生成复杂分布的问题。
第 4 节详细地介绍 GANs,尤其是它的整体架构,并与前边几节的内容关联起来。
第 5 节包含 GANs 的一些数学细节。
废话不多说,让我们开始 GANs 的重新发现之旅吧!
1. 生成服从某种分布的随机变量
1.1. 生成服从均匀分布的随机变量
由于计算机中的运算操作本质上都是确定性的,理论上来说,计算机程序不可能产生真正的随机数。但是,我们可以设计程序使它产生一系列数,这些数从统计性质上来说非常接近理论上的随机数。尤其是,计算机可以使用一个伪随机数生成器产生一组数近似服从 [0,1] 上的均匀随机分布。服从均匀分布的随机数是非常简单的,其他更复杂的随机数可以以它为基础构造出来。
1.2. 通过运算构造更加复杂的随机变量
目前存在多种构造复杂随机变量的方式,例如逆变换方法(inverse transform),拒绝采样方法(rejection sampling)以及 Metropolis-Hasting 算法。
尽管具体操作方式不同,但是上述方法的基本思想都是一样的:通过对服从简单分布的随机变量进行运算生成服从某种特定复杂分布的随机变量。
这里先简要介绍一下 rejection sampling 和 Metropolis-Hasting 算法,它们与 GANs 关系不大,这部分可以直接跳过去。我们的重点是后边的 inverse transform 方法。
rejection sampling 方法的基本思想是:首先对简单分布进行采样,然后基于某种规则接受或者拒绝采样值,最后得到的采样结果就服从某种特定分布。这里的关键是设计恰当的接受或者拒绝规则。
Metropolis-Hasting 算法的基本思想是:找到一个马氏链,使其稳态分布对应我们希望的某种特定分布。一旦找到了这个马氏链,我们就可以仿真足够长的时间以确保该马氏链达到稳态。此时采样得到的数据就相当于从希望的分布中采样的数据。
1.3. 逆变换方法(Inverse Transform)
基本思想:将我们希望得到的服从某个复杂分布的随机变量表示成对均匀随机变量的函数映射。
考虑如下的一维例子:
令 为希望得到的复杂随机变量, 为已有的 [0,1] 上的均匀随机变量。
我们知道由累积分布函数(cumulative distribution function, CDF)可以完全确定一个随机变量。回忆一下 CDF 的定义:
具体到均匀随机变量的 CDF 为:
上述等式是均匀分布的一个很好的性质,后边会用到。
为了方便分析,我们这里假设待求的复杂随机变量 的 CDF 是可逆的,表示为 . 实际上,后续的分析方法可以借助函数广义逆扩展到 CDF 不可逆的情形,不过这已经超过本文的讨论范围了。
下边讨论如何构造这个复杂随机变量。
借助于均匀随机变量累积分布函数的性质,我们有
在 CDF 可逆的条件下,上述公式等价于
即 与 具有相同的 CDF 。由于 CDF 完全确定一个随机变量,因此 就是我们希望得到的服从特定分布的复杂随机变量 ,至此我们就得到了基于均匀随机变量 构造复杂随机变量 的逆变换方法。
总结一下:
逆变换方法具有相对固定的形式,它基于的简单随机变量必须是均匀随机变量,从简单随机变量到复杂随机变量用到的变换函数必须是复杂随机变量 CDF 的逆函数。
逆变换实际上属于一类更广义的变换方法,更一般化的形式可以使用其他简单随机变量,相应的变换函数也不再是 CDF 的逆函数。“变换函数”,顾名思义,目的就是把原本的随机分布变换到希望的形式,例如将相对于目标分布过高的部分变换到过低的部分。
2. 生成模型(Generative Models)
2.1. 如果我们希望生成的随机变量非常复杂。。。
我们的目的是生成一些关于“狗”的图片,每个图片大小为 个像素,每个像素为黑或者白。
假设我们已经有了一些关于“狗”的图片,这些图片(矩阵)可以通过列堆积的形式转化成 维的列向量。这样一张关于“狗”的图片就被表示成了一个向量。但是,很显然这并不意味着任意一个随机的向量经过还原成矩阵之后都可以表示“狗”。因此,我们可以说那些对应“狗”的图片的向量在整个 维向量空间中具有某种特定分布,也就是说这个空间中的某些点(也就是向量)更有可能表示"狗",而另外某些点则不太可能表示“狗”。
基于以上讨论,我们还可以说在这个 维向量空间中,某些点表示“猫”的概率更高,某些点表示"鸟"的概率更高。也就是说每种物体在该空间中具有某个对应的特定分布。
更进一步地,生成关于 "狗" 的图片的问题,可以转化为从该 维空间中依据“狗”的概率分布采样得到新的向量(并转化成图片矩阵)的问题。
现在我们明确两件事情:第一,上述例子中关于“狗”的图片的概率分布是一个在高维空间中的非常复杂的分布(虽然不太好证明,但我们可以认为这个分布确实存在);第二,我们没办法用显式表示这个复杂的分布。如果连分布都无法表示出来,那么基于这个分布来产生新的数据就更困难了。下边我们就来看一下如何解决这个分布表示的问题。
2.2. 那么我们就求助于神经网络吧。。。
虽然我们无法直接写出“狗”的图片的分布,但是通过第 1 节的介绍,我们知道了一些基于简单分布构造复杂分布的方法。依然假设我们已经知道如何生成一个服从均匀分布的随机变量,那么我们可以进一步得到 个独立的均匀随机变量,它们可以构造一个 维的均匀随机变量。下面要做的就是用一个非常复杂的变换函数,将这个简单的 维随机变量变换到服从目标分布的复杂 维随机变量。
在深度学习领域,当我们要得到一个“非常复杂的函数”时,往往意味着用神经网络建模。具体到我们的问题,就是希望神经网络的输入为一个简单的 维均匀随机变量,输出的是另一个 随机变量服从“狗”的图片的分布。如下图所示:
当确定了神经网络架构之后,我们需要对它进行训练。下面介绍两种训练方法。
3. 生成匹配网络(Generative Matching Networks, GMNs)
(第 3 节介绍的 GMNs 采用了与 GANs 完全不同的训练方式,不感兴趣的话可以安全跳过。)
3.1. 训练生成网络
训练生成网络的方式有两种:直接方式和间接方式。
直接训练方式中,直接对比真实和生成的概率分布,然后通过传统的误差 BP 方式训练网络。这就是 GMNs 中用到的训练方式
间接训练方式中,并不直接比较两个分布,而是将它们送入后续的任务中,而在优化后续任务的过程中可以使得生成的分布逼近真实分布。这就是 GANs 中使用的训练方式。
本节先介绍 GMNs 和直接训练方法。
3.2. 通过采样数据比较两个概率分布
前边提到 GMNs 中训练生成网络是直接比较真实分布与生成的概率分布,但是这两个分布我们都无法显式表示。我们能做的是通过采样近似反映两个概率分布。理论上来说,我们可以采用任意的能够基于采样比较概率分布的度量。这里采用了最大均值差异(Maximum Mean Discrepancy, MMD)作为度量指标。对 MMD 的详细介绍超出了本文的范围,感兴趣的读者可以参考这些资料 (参考1, 参考2,参考3)。
3.3. 分布匹配误差反向传播
当我们定义了基于采样的概率分布差别比较方式之后,下一步就可以对 GMNs 进行训练了。回顾一下我们要实现的目标:将一个服从均匀分布的随机变量作为输入,我们希望 GMNs 生成新的随机变量,服从“狗”的图片的概率分布。
GMNs 优化网络参数的步骤总结如下:
- 从均匀分布中采样得到一些输入
- 将输入送入 GMNs 得到相应的输出
- 从真实的”狗“的图片中采样一些数据,采用 MMD 方法计算这些真实数据与 GMNs 生成数据概率分布的差异
- 基于上述差异采用 BP +梯度下降算法调整 GMNs 网络参数,以降低真实数据与生成数据之间的概率分布差异
上述流程的示意图如下:
4. 生成对抗网络
4.1. 间接训练方法
上述 GMNs 中用到的直接方法是(基于采样数据)直接比较真实分布与生成分布。而 GANs 架构中一个亮点是将这两个分布同时送入下游任务中进行间接的比较。在训练过程中对于下游任务的优化可以迫使生成分布逐渐逼近真实分布。在 GANs 中,所谓的下游任务是对真实数据和生成数据的判别任务。或者,从生成网络的角度来看,下游任务是尽量使生成数据不被识别出来。
总结一下,在 GANs 的架构中,我们有一个判别器,功能是尽量正确区分真实数据和生成的数据;一个生成器,功能是尽量使生成的数据瞒过判别器。
下一节我们讨论,用上述间接方式训练好的 GANs 为什么可以像直接训练方式那样,保证生成数据的分布逼近真实分布。
4.2. 理想情况:完美的生成器和完美的判别器
假设我们要逼近的真实分布是一维高斯分布。
另外,假设判别器是完美的,它知道真实分布和生成的分布的形式,当两者差别明显时,判别器有较大概率正确区分来自两个分布的采样数据。
如果我们要欺骗判别器,就不得不生成一个逼近真实分布的分布,此时将会给判别器制造最大的困难:对于输入判别器的任何一个数据,它来自真实分布的概率等于来自生成分布的概率。那么判别器能做到的最好情况就是随机猜测,正确率为 50%
下图中,蓝色曲线表示真实分布(一维高斯),黄色曲线表示生成的分布,灰色曲线(纵轴在右侧)表示判别器作出正确判断的概率。可以看出,在真实分布与生成分布差别较大的区域,判别器正确判断的概率较高;当两者相同时,正确的概率最低,为 50%。直观地看,生成网络训练的过程,就是不断地将“绿色区域”(生成的分布太高)向“红色区域”(生成的分布太低)转移。
讨论到了这里,我们或许会有疑问:这种间接训练方式是否是个好的想法?这个疑问很正常,一方面,相比于直接对比两个分布的直接训练方式,GANs 中的间接训练方式看起来更复杂,因为引入了下游任务环节;另一方面,我们前边假设判别器是完美的,它清楚的知道真实分布和生成的分布,但实际上这个假设太苛刻,我们并不能直接获得这么一个完美的判别器。
作为回答,对于第一个方面我们可以说,直接方法中基于采样计算分布差异的复杂性并不比 GANs 中的间接方法低;第二个方面,尽管我们不能直接得到完美的判别器,但是我们可以训练一个神经网络去逼近它!
4.3. 逼近的方式:对抗神经网络
让我们再次概括一下 GANs 的结构:GANs 包括一个生成器(generator)和一个判别器(discriminator)。
- 生成器实际上是一个神经网络,扮演着变换函数的角色。它的输入是一个简单的随机变量,(训练之后)输出的是新的随机变量,服从目标分布。
- 判别器也是一个神经网络,具有二分类功能。它的输入是一个采样数据(来自真实的分布或者由生成器产生的),输出是该采样数据来自真实分布的概率。
上述两个神经网络可以联合训练,优化目标完全相反:
- 生成器的目标是欺骗判别器,也就是最大化判别器的分类误差
- 判别器的目标是正确区分真实数据和生成数据,也就是最小化分类误差。
因此,在每一步训练迭代过程中,生成网络的权重向着增大分类误差的方向改变,也就是误差梯度上升的方向;而判别网络的权重向着减小分类误差的方向改变,也就是误差梯度下降的方向。
训练流程图如下:
两个网络优化目标的对立性就是生成“对抗”网络名字的由来,是以“对抗”的形式训练两个网络,使它们都变得越来越好。最终理想的训练效果是:生成器产生的数据服从真实的目标分布,而判别器以 1/2 的概率预测输入的数据是真实的还是生成的。
5. GANs 背后的数学
这一部分包含一些数学细节,不喜欢数学的读者可以跳过,不会影响对 GANs 的直观理解。
神经网络建模至少应该包含两方面内容:网络架构和损失函数(loss function)。我们前边已经描述了 GANs 中的网络架构,它包含两个网络:
- 生成网络 ,输入的是 , 相应的概率密度为 ,(训练之后)输出的是 ,其中 服从希望的目标概率分布。
- 判别网络 ,输入为 ,它可能是一个真实的数据 , 概率密度为 ,也可能是一个生成的数据 ,概率密度为 ,其中 是 经过 变换之后的概率密度。判别网络的输出 是 为真实数据的概率。
如果我们给判别网络送入同样数量的真实数据和生成数据,那么判别网络输出误差的期望为
在训练生成网络时,我们希望最大化上述误差,而在训练判别网络时,希望最小化上述误差。
整体训练目标可以表示成
下边我们分开来看两个网络各自能够达到的最佳效果。
若生成网络 已给定,那么判别网络能做的就是选择一个 使得下式最小:
为了最小化上述积分,我们可以对于每个 最小化积分项,结果得到的最优 形式如下:
即对于每个 值,如果 ,则 输出为 1, 否则输出为 0
再来看一下生成网络 的寻优。在 已经取得最优 (表示为 ) 的前提下, 的目标是最大化下式:
其中等号右边的式子就是代入最优 之后的化简形式。
为了最大化上述积分,对于每一个 我们可以最大化相应的积分项。由于我们只能改变 进而影响 ,而 是无法改变的,因此我们能得到的最好结果如下:
考虑到 和 都是概率密度,都有和为 1 的限制,因此最优的 只能满足:
至此,我们就得到了在理想情况下, 和 分别能够达到的最佳效果,这也符合我们之前的直观感觉。
全文总结
- 计算机可以生成简单的伪随机变量
- 存在多种由简单随机变量生成复杂随机变量的方式,例如在变换方法(transform method)中,复杂随机变量可以表示为简单随机变量的函数的形式
- 在机器学习中,生成模型的目的是生成数据服从目标分布。
- 基于深度学习的生成模型是通过神经网络建模的,输入一个简单的随机变量,输出新的随机变量服从目标分布
- 这些基于神经网络的生成模型可以用直接方式训练,即直接比较生成数据的分布与目标分布,这是 GMNs (Generative Matching Networks,生成匹配网络) 采用的训练方法
- 也可以用间接方式训练,在尝试欺骗判别网络的过程中逐步提高生成网络的效果,这是 GAN 的思想
即使关于 GANs 的某些宣传可能有些夸张,但是 Ian Goodfellow 等人提出的 GANs 的思想确实非常伟大,尤其是将直接对比转换成间接对比的方法很有启发性。
作为总结,我们不确定 GANs 是否真的如 Yann LeCun 所说的那样,是 “过去 10 年在机器学习领域最有趣的想法”,但是加上 “之一” 是绝对没问题的!
转载自:
作者:isl_qdu
链接:https://www.jianshu.com/p/eef6c224e376
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详细理解 GAN(生成对抗网络) - Python技术站