目录
1.4 Generator and Discriminator(两者的关系)
2.1 structured learning and application
2.2 Structured Learning Challenging
2.3 Structured Learning Approach
3.Can Generator learn by itself?
4. Can Discriminator generate?
摘要
本节讲的主要是GAN(生成式对抗网络)的技术,GAN 的基本思路是:输入一个向量,Generator 将输出一个高维向量(图片、语句),而Discriminator去评估这个生成的高维向量的好坏,二者之间形成一种相互对抗的关系,在反复的博弈训练中使得该网络达到最理想的状态。
接着讨论了,因为GAN中的Generator的作用很像Auto-encoder 的decoder,那么使用是否可以使用 Auto-encoder / VAE 作为替代方案呢,可以但是不好,因为模型的优化目标不是单纯的让你的生成结果与真实结果越接近越好。而是要使得component与component之间的关系符合现实规律,也就是说理论上,VAE要想获得GAN的效果,它的网络要比GAN要深才行。
1. Basic Idea of GAN
1.1 Generation
GAN主要用于生成东西:生成图片,生成句子等。
1.2 Generator
正如我们前面所说的,GAN里面有两个重要的东西,其中一个就是Generator,Generator可以是一个NN。它的输入是一个vector,它的输出是一个更高维的vector,也就是我们所需要产生的东西,在这里就是一张图片啦。输入向量每一个维度都对应生成对象的某些特征。Each dimension of input vector represents some characteristics.例如:
看图中,左上角是我们原始的vector以及其对应所生成的对象。现在我们分别改变了三个维度的数值,生成的图像会有所不同:
- 右上角:改变第一个维度,即改变生成对象的头发长度
- 左下角:改变倒数第二个维度,即改变了生成对象的头发颜色
- 右下角:改变倒数第一个维度,即改变了生成对象的嘴巴的张开程度
1.3 Discriminator
在GAN中,有两个重要的东西,除了前面所提及的Generator,还有一个就是我们接下来要说的Discriminator。Discriminator也可以是一个NN。但注意它的输入和上面的Generator的不同。
Discriminator的输入是一张图片,输出是一个scalar,scalar用于判断这张图片的质量。
- 当这个输出值越高,则越像真实图片
- 当这个输出值越低,则越不像真实图片
1.4 Generator and Discriminator(两者的关系)
在生物进化的过程中,被捕食者会慢慢演化自己的特征,从而达到欺骗捕食者的目的,而捕食者也会根据情况调整自己对被捕食者的识别,共同进化。它们的对抗思想与GAN类似,但GAN却有所不同。
GAN之所以有所不同,这里的原因是GAN所作的工作与自然界的生物进化不同,它是已经知道最终鉴别的目标是什么样子,不知道假目标是什么样子,它会对生成器所产生的假目标做惩罚和对真目标进行奖励,这样鉴别器就知道什么目标是不好的假目标,什么目标是好的真目标,而生成器则是希望通过进化,产生比上一次更好的假目标,使鉴别器对自己的惩罚更小。以上是一个轮回,下一个轮回,鉴别器通过学习上一个轮回进化的假目标和真目标,再次进化对假目标的惩罚,而生成器不屈不挠,再次进化,直到以假乱真,与真目标一致,至此进化结束。
以上图为例,我们最开始画人物头像只知道有一个头的大致形状,有眼睛有鼻子等等,但画得不精致,后来通过找老师学习,画得更好了,有模有样,直到,我们画得与专门画头像的老师一样好。这里的我们就像是生成器,一步步进化(对应生成器不同的等级),这里的老师就像是鉴别器(这里只是比喻说明,现实世界的老师已经是一个成熟的鉴别器,不需要通过假样本进行学习,这里有那个意思就行)
上图是一个形象的比喻,我们刚开始画人物头像的时候,只画了一个大概,并没有画眼睛,然后通过向老师学习,我们画出来的头像有了眼睛;但是此时我们的头像并没有涂颜色,于是我们继续向老师学习,画出来的头像有了颜色。…一直循环这个过程,直到我们画的头像和老师画的一样好。
这里我们就像是一个生成器,一步步的进化(对应生成器不同的等级);老师就像是鉴别器(注意一点的是,这里仅仅是一个比喻,现实世界的老师已经是一个成熟的鉴别器,不需要通过假样本进行学习)
这里还引出了两个问题:
- Generator为什么不自己学,还需要Discriminator来指导?
- Discriminator为什么不自己直接做?
二者的关系可以描述为:写作敌人,念做朋友:
左边是棋魂,右边是火影。他们都是对立又互相帮助的典型,促使对方进步。
1.5 Algorithm
接下来要讲的是Generator和Discriminator是咋样训练出来的,Generator和Discriminator都是neuron network,而它们的架构是咋样模样,这取决于想要做的任务。举例来说:你要generator产生一张图片,那显然generator里面有很多的convolution layer。若要generator产生一篇文章或者句子,显然generator就要使用RNN来产生句子。
训练neuron network时要随机初始化generator和discriminator的参数。在初始化参数以后,在每一个training iteration要做两件事:
第一件事情:固定generator,然后只训练discriminator(看到好的图片给高分,看到不好的图片给低分)。从一个资料库(都是二次元的图片)随机取样一些图片输入 discriminator,对于discriminator来说这些都是好的图片。因为generator的参数都是随机给定的,所以给generator一些向量,输出一些根本不像二次元的图像,这些对于generator来说就是不好的图片。接下来就可以教discriminator若看到上面的图片就输出1,看到下面的图片就输出0。训练discriminatro的方式跟我们一般训练neuron network的方式是一样的。
第二件事情:固定discriminator,然后只训练generator。一般我们训练network是minimize 人为定义的loss function,在训练generator时,generator学习的对象不是人为定义而是discriminator。你可以认为discriminator就是定义了某一种loss function,等于机器自己学习的loss function。
接下来我们把generator和discriminator串在一起视为一个巨大的network。这个巨大的network输入 是一个向量,输出是一个分数,在这个network中间hidden layer的输出可以看做是一张图片。
我们训练的目标是让输出越大越好,训练时依然会做backpropagation,只是要固定住discriminator对应的维度,只是调整generator对应的维度。调整完generator后输出会发生改变,generator新的输出会让discriminator给出高的分数。
2. GAN as structured learning
2.1 structured learning and application
首先,我们要知道结构化学习(Structured Learning),GAN也是结构化学习的一种。与分类和回归类似,结构化学习也是需要找到一个X->Y的隐射。
但结构化学习的输入和输出多种多样,可以是序列(sequence)到序列,序列到矩阵(matrix),矩阵到图(graph),图到树(tree)等等。这样,GAN的应用就十分广泛了。例如,机器翻译(machine translation),语音识别(speech recognition)以及聊天机器人(chat-bot):
在图像方面,我们可以做图像转图像(image-to-image),彩色化(colorization),还有文本转图像(text-to-image)
2.2 Structured Learning Challenging
One-shot/Zero-shot Learning:就是训练数据中可能没有或者只有很少的某个类别的数据,而要求模型生成对应的东西。另外,机器需要有大局观。机器逐个组件地生成对象,但是它应该具有广阔的前景。由于输出组件具有依赖性,因此应全局考虑它们。
例如在图像生成的时候,每次生成一个像素,但是所有像素合起来要像一个人脸。不能人脸有三个眼睛,两个嘴巴,因此在Structured Learning中生成不是最重要的,重要的是component与component之间的关系。
2.3 Structured Learning Approach
我们可以把Generator看做Structured Learning中生成很小的component的部分,Discriminator看做整体的评估方法。二者合起来,就是GAN.
3.Can Generator learn by itself?
先来看下,如果不用GAN,怎么来训练Generator:
3.1 Generator
之前说过,Generator就是一个NN,输入一个向量,生成一个图片,如果现在是做生成手写数字,那么就是输入一个向量,得到一个手写数字。输入不同的向量,得到不同的数字。如果我们用不同的向量来代表不同的手写数字:
如何训练这个生成器呢?可以用监督学习的方法来进行训练:
在传统的监督学习中,给NN一个输入和输出的pairs,就这样一直train下去就好。比如有一系列的图片,随便给他一个code,然后训练即可,使输出和label越接近越好。这就和我们训练分类器的过程一样。现在的问题是表示图片的code从哪里来?随机?不行啊,因为当输出类似的时候,输入由于是随机的,有很大差别,这样很难训练出一个网络。例如:
这里的两个code如果差很远,你叫机器如何学习?可以看到这里的第一维0.1可能表示数字1,然后第二维表示的是倾斜角度。
如何得到与实际数据有关的输入vector呢?
之前学过Encoder,可以把图片压缩为一个向量。你可以训练一个encoder,给encorder一个图片,它将输出一个相应的code。
3.2 Auto-encoder
回顾一下auto-encoder:
分析上面的结构,发现Auto-encoder的Decoder就是根据c(向量)生成图片,这不就是和Generator干的事情是一样的吗?
我们看能不能把这块单独拿出来,Randomly generate a vector as code,然后生成图片。通过随机生成的二维向量,然后生成手写数字图片。假设给定下图中的两个二维向量得到的结果分别是手写数字0和1。
那么,随着向量在坐标轴上的变换,生成图片如下图所示:
通过上面的实验,我们可以下如下结论:
如果有两个向量a和b,那么我们可以分别生成两个手写数字:
但是存在一个问题:你的training data里面的image是有限的,当生成器在看到a的情况下生成偏左的1,在看到b的情况下也生成偏右1,当a和b 的平均,会产生什么样的图片呢?事实是由于网络是非线性的,得到的不一定是正的1,也可能是噪声。可以使用VAE来解决!
3.3 Variational Auto-Encoder
为了解决上面的问题,因此我们有了VAE;VAE不仅产生一个code(m1,m2,m3)还会产生每一个维度的方差;然后将方差和正态分布中抽取的噪声进行相乘,之后加上code上去,相当于加上noise的code;之后输入到decoder中就得到图片;这样情况下,decoder不只是看到a或b产生一些数字,当看到a或b加上一些noise也要产生数字;这样使decoder更加鲁邦。
3.4 VAE vs GAN
但是这种VAE和decoder的生成器少了什么东西?生成器在train的时候,我们希望的是最终生成器生成的图片和我们给定的图片在像素级别上越像越好。但是肯定会产生一些mistake。
这个差距往往是通过两个图片逐像素进行比较得到的,例如上图中的箭头就是两个图片对应的像素,我们比较这些所有的像素,计算差距,换句话说就是用两个图片的向量,计算每个维度之间的距离来衡量差距。
我们的目标是要生成右上角的图片,但是实际上肯定会有一些mistake,可以看到,虽然上面两个按差异计算来说比下面的图片的计算结果要好,但是从图片整体来看,反而下面的图片符合手写图片的规律。也就是说模型的优化目标不是单纯的让你的生成结果与真实结果越接近越好。而是要使得component与component之间的关系符合现实规律。例如:
我们需要structure 来约束这个事情。就是在后面在加几个隐藏层,就可以调整第L层的神经元输出。也就是说理论上,VAE要想获得GAN的效果,它的网络要比GAN要深才行。
4. Can Discriminator generate?
4.1 Discriminator
鉴别器是给定一个输入,输出一个[0,1]的置信度,越接近1则置信越高,越接近0则置信度越低,如图所示:
对于单纯的生成器,想要去判别不同像素之间的关联是很困难的;但鉴别器的优势在于它可以很轻易地捕捉到元素之间的相关性,例如自编码器中出现的像素问题就不会在鉴别器中出现,因为你是把输出好的图片丢给判别器的,然后去评价它好不好。
假如说已经有了一个判别器,它能够鉴别一个图片是好的还是不好的,我们就可以用这个判别器去生成图片。穷举所有的输入x,看看判别器给它的分数,找到最大的就是判别器生成的。
4.2 Discriminator - Training
现在我们手上只有真实的对象,因此仅仅用这个东西来训练,得到的Discriminator会比较笨,看什么都是真实的。
因此我们需要一些负样本来进行训练。一个办法是直接在真实对象上加noise,让它成为负样本(图:左二):
但是这样就会出现一个问题,一旦出现一张稍微有点像动漫头像的picutre就会得到很高的分数(图:左三)。我们想要的判别器是,如果两只眼睛不一样,就能判断出这不是一张人脸的判别器(图:右二)。但是怎样产生这些好的负样本呢?
我们需要好的负样本才能训练处一个判别器,我们需要一个好的判别器才能找出好的负样本,需要一个迭代的算法开始的时候你有一堆正样本和负样本:正样本是真实图片,负样本是加了噪声后的图片开始迭代
1). 你的判别器需要做的就是去给正样本高的分数,负样本低的分数
2). 当你学出一个判别器后,再用判别器去做生成(就是一个argmax的过程,具体怎么做,不知道呀),生成一堆它觉得好的的图片,之后作为负样本重复 1)过程
5. Generator + Discriminator
GAN就是取代了这个argmax的过程;现在我们用生成器去得到好的负样本来取代argmax D(x);因为生成器在train的时候就是去学一些image,是可以躲过判别器的(给高分的)。
从上面可以看出生成器和鉴别器的优缺点是可以互补的,这也就是GAN的优势。
- 从生成器角度出发,虽然在生成图片过程中的像素之间依然没有联系,但是它的图片好坏是由有大局观的判别器来判断的。从而能够学到有大局观的生成器。
- 从鉴别器的角度出发,利用生成器去生成样本,去求解argmax问题
当然,GAN也是又缺点的,它是一种隐变量模型,可解释没有生成器和鉴别器强,另外GAN是不好进行训练。
结论与展望
本节讲的是GAN技术,首先讲了GAN的训练过程,首先应该对判别模型(Discriminator)先进行训练,因为必须先有一个好的判别器,使得能够比较好地区分出真实样本和生成样本之后,才好更为准确更新生成器的参数。当输入真实样本x时,D(x)=1,输入生成的样本x’=G(z)时,D(x’)=0。然后再将二者共同训练,判别器和生成器的的权重weight和偏差bias都是通过反向传播训练的。具体的训练算法使用stochastic gradient descent随机梯度下降法。 为了判别样本并归类,判别器采用了交叉熵(cross entropy)作为loss的计算方法来衡量相似性。
也讲了GAN的优势和不可替代性,对于同样的效果,使用VAE要想获得GAN的效果,它的网络要比GAN更Deep才行。GAN的优势在于,生成器和鉴别器的优缺点是可以互补的,生成器生成样本,判别器来判断的大局观,从而能够学到有大局观的生成器。
GAN技术是业界近十年最引起关注的技术(Facebook AI部长Yann LeCun说的),GAN的迷人之处在于它不是一个传统的计算工具,通过机器学习,计算机可以更好地认识事物,而是通过GAN,计算机可以去创造事物。之后,会通过实际编程去体会GAN技术的迷人之处。