Generative Adversarial Network (GAN)于2014年提出。相对于其他一些有完善笔记整理的经典课程,网上能找到的笔记及资料有限。这里算是个人向的课程要点整理,对课件内容的先后顺序进行了调整方便自己日后的复习归纳。
李宏毅对抗生成网络(GAN)国语教程(2018):
https://www.bilibili.com/video/av24011528?from=search&seid=13805566188303016426
课件:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html
Structured Learning
在正式进入GAN之前,我们先要简单看一下Structured Learning结构化学习的概念。
结构化学习的输入和输出都是序列模型,以下是一些现实生活中的结构化学习例子。
结构化学习存在一些挑战,一是序列模型的样本问题。想象下在一个语句翻译的模型里,输入和输出都是语句,很可能所有样本里没有重复的句子。如果我们把翻译的每个结果视为一个分类,可能每一个分类的样本就出现一次。如果输出的分类很多,有一些分类甚至可能没有训练样本。所以要让模型处理从来没有见过的句子是一个难题。
下图是几个例子,说明结构化学习的模型需要对输出的整体有规划,即"大局观"而不是输出一个个独立的序列元素。
所以在结构化学习中,我们要将自底向上和自顶向下两种方法结合起来。自底向上即生成一个一个独立的元素构成序列,自顶向下即从整体上来评估序列。其实自底向上的思路和GAN中的Generator一致,自顶向下的思路和GAN中的Discriminator一致。后文中会介绍GAN以及GAN的这两个部件。
Basic Idea of GAN
GAN由两部分组成,分别是G(Generator)和D(Discriminator),注意这两部分都是神经网络。
对于G
输入是一个向量,输出是一个高维向量,如图像或者语句。
对于D
输入是G输出的高维向量,输出一个标量。一般而言标量的值越高说明输入的高维向量的越符合最终的要求(比如说输入一张图像输出分值高则说明这个图像符合设计需求)。
G和D都在不断进化(权重迭代更新)。第N+1代的G输出向量可以在第N代的D中获得相对较高的输出,但是在第N+1代的D中无法获得高分。以下是形象的比喻:
之后我们还会讨论,为什么要用GAN这样的结构,而不是Generator自己学会更新自己生成更好的样本,而Discriminator自己生成样本。
Algorithm
初始化G和D,在之后的每次迭代(进化)中:
按照老师课上的说法,分类和回归都适用于D。分类的话就是数据库里的是1类,G生成的是0类。回归则是给数据库里的样本高分,G生成的低分。D通过学习,可以分辨出第一代G生成的样本与数据库里的样本。
将G与D合并成一个大的神经网络,该网络输入一个向量输出一个标量,G与D之间存在一个高维向量。G升级(训练)的目标是大网络的输出能尽可能高,即G生成的样本分数尽量高。注意因为这里是要使输出变大,所以字面上不再是梯度下降而是梯度上升。如果不固定住D进行梯度上升,那么只更新最后一层的权重就可以获得很好的效果没有意义。
先训练D再训练G随后迭代进行。为了让D可以更好地分别真实样本和G产生的样本,在一次迭代中D训练多次G只训练一次。m是batchsize的大小,z是G的输入向量,从任一分布采样初始化。迭代次数是一个超参数。
Can Generator learn by itself?
那为什么一定要加入Discriminator,我们可以让Generator自己学会生成更好的图像么?这里提出了VAE的结构,Generator的作用其实就是该结构中的Decoder。
那VAE中的Decoder和GAN中存在Discriminator的Generator的效果区别在哪里?我们先上实验结果:
可以看到VAE的效果不如GAN。那区别是在哪里呢?
如下图,虽然上面的两张图片像素上和目标图片的差距比下面两张图片要小,但是我们可以知道下面两张图片更接近目标图片。
所以我们知道了输出序列和目标序列的相似程度,不能单单以序列中单个元素进行比较而是需要整体地观察,元素间的关系很重要我们的模型需要捕捉到这种关系。
Can Discriminator generate?
Discriminator可以用来直接生成样本。
假设我们已经有一个Discriminator D(x),生成样本即输入所有可能的序列x,找出令D(x)最大的序列x。这里存在一个问题即穷举所有可能的x是否可行,这里我们先假设其可行,看下一步会怎么样。
因为少了Generator,我们少了反例样本,模型就很有可能学会将所有的输出都标记为正例。这里我们先假设可以获得反例样本,继续看下一步会怎么样。
有了初始的反例样本,按以上方法可以在每一次迭代中获得新的反例样本,这个类似与每次Generator生成的样本。
Discriminator的训练过程如上图,即每次迭代找到D(x)分类的弱点(即空白没有正反例样本的区域),在弱点处生成新的反例样本来更新D(x)。等到D(x)和正例反例的曲线趋于一致时,说明生成的样本已经很接近真实的样本了。
实际上用Discriminator来生成样本,就是结构化学习中的概率图模型。以上是几种概率图模型。
以上是G和D的优缺点。
所以G其实是一种很好的解arg max D(x)的方法,而传统的方法往往很难解决这个问题。总结如下: