Generative Adversarial Network (GAN)于2014年提出。论文下载地址:https://arxiv.org/pdf/1406.2661.pdf
李宏毅对抗生成网络(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)的概念。
结构化学习的输入和输出都是序列模型,结构化学习例子:
输出是序列sequence
1)机器翻译
2)语音识别
3)聊天机器人
输出是矩阵matrix
1)图片转图片
2)文本转文字
结构化学习存在一些挑战,一是序列模型的样本问题:one-shot/Zero-shot learning。想象下在一个语句翻译的模型里,输入和输出都是语句,很可能所有样本里没有重复的句子。如果我们把翻译的每个结果视为一个分类,可能每一个分类的样本就出现一次。如果输出的分类很多,有一些分类甚至可能没有训练样本。所以要让模型处理从来没有见过的句子是一个难题。
所以在结构化学习中,我们要将自底向上bottom up和自顶向下top down两种方法结合起来。
Generator :Bottom Up
学习在component级别生成对象;
Discriminator:Top Down
对整个对象进行评估,找出最好的一个。
自底向上即生成一个一个独立的元素构成序列,自顶向下即从整体上来评估序列。其实自底向上的思路和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?
判别网络自己也是可以生成的,需要解一个式子:
其中x为判别网络输入,D(x)为输出。所以使得输出最大的输入即为生成的最佳的图片。但这个很难解,且目前只有假设判别网络是线性的才能解,当然这大大失去了复杂程度。
假设我们已经有一个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)的方法,而传统的方法往往很难解决这个问题。总结如下:
作者:tianchen627
链接:https://www.jianshu.com/p/428603fb1f4c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。