李宏毅学习笔记30.GAN.01.Introduction of Generative Adversarial Network

简介

GAN系列好长,第一个视频就90分钟。。。
Introduction of Generative Adversarial Network (GAN)
这块貌似也是新内容。开场就很搞笑的用谷歌来读一下GAN,因为按拼音读就是:干。
然后给出了力坤大佬给出的评价:
问:What are some recent and potentially upcoming breakthroughs in unsupervised learning?
力坤答:Adversarial training is the coolest thing since sliced bread.
I’ ve listed a bunch of relevant papers in a previous answer.
Expect more impressive results with this technique in the coming years.
What’s missing at the moment is a good understanding of it so we can make it work reliably. It’s very finicky. Sort of like ConvNet were in the 1990s, when I had the reputation of being the only person who could make them work(which wasn’t true).


sliced bread:美国人往往会用这么一句俚语来形容极好极赞的事物:“This is the best thing since sliced bread!(这是自切片面包以来最棒的东西!)”之前是不切片的。。。一般用作对产品、商品、发明等的赞美语。这一夸,也让人瞬间明白了切片面包的地位。


The most important one, in my opinion, is adversarial training (also called GAN for Generative Adversarial Networks). This is an idea that was originally proposed by Ian Goodfellow when he was a student with Yoshua Bengio at the University of Montreal(he since moved to Google Brain and recently to OpenAI).
This, and the variations that are now being proposed is the most interesting idea in the last 10 years in ML, in my opinion.
常见的GAN变种:
https://github.com/hindupuravinash/the-gan-zoo
在这里插入图片描述
变种太多,名字都不够用,例如:
Mihaela Rosca, Balaji Lakshminarayanan, David Warde-Farley, Shakir Mohamed, “Variational Approaches for Auto-Encoding Generative Adversarial Networks”, arXiv, 2017
本来要叫AEGAN,但是发现有人已经用掉了,所以只能叫α-GAN。
本节GAN课程大纲:
Basic ldea of GAN
GAN as structured learning
Can Generator learn by itself?
Can Discriminator generate?
A little bit theory(未完。。。)
公式输入请参考:在线Latex公式

Generation

GAN主要用于生成东西:生成图片,生成句子等。
Image Generation
在这里插入图片描述
In a specific range,一般都是从一个分布(高斯)随机采样一个向量,根据这个向量生成图片。
Sentence Generation
在这里插入图片描述
We will control what to generate latter. → Conditional Generation(这块前面有提到,后面有详细讲解)

Basic Idea of GAN

Generator

GAN里面有两个重要的东西,一个是Generator,Generator可以是一个NN。
在这里插入图片描述
输入向量每一个维度都对应生成对象的某些特征。Each dimension of input vector represents some characteristics.例如:
在这里插入图片描述
改第一个维度:
在这里插入图片描述
改倒数第二个维度:
在这里插入图片描述
改倒数第一个维度:
在这里插入图片描述

Discriminator

GAN里面有两个重要的东西,另一个是Discriminator,Discriminator也可以是一个NN。注意它的输入和上面的Generator的不同。
在这里插入图片描述
例如:
逼真的二次元:
在这里插入图片描述
垃圾二次元:
在这里插入图片描述

二者的关系

这页PPT在RL里面貌似也有。。。
在这里插入图片描述
This is where the term “adversarial” comes from. You can explain the process in different ways…….
用模型来描述上面的关系:
在这里插入图片描述
GAN的原文中把Generator和Discriminator的关系描述为假钞制作者和警察,老师说这样太暴力,会教坏小孩子,换个讲法:
在这里插入图片描述
老师看过很多真实的二次元人物。
在这里插入图片描述
另外最后给出两个问题。
Generator为什么不自己学,还需要Discriminator来指导?
Discriminator为什么不自己直接做?
二者的关系可以描述为:写作敌人,念做朋友:
左边是棋魂,右边是火影。他们都是对立又互相帮助的典型,促使对方进步。
在这里插入图片描述

Algorithm

语言描述版

先把算法流程描述一遍
• Initialize generator and discriminator.在这里插入图片描述
这两个是NN,这里的初始化就是初始化NN的参数。
• In each training iteration:
Step 1: Fix generator G, and update discriminator D.这里的update就是调整参数。
这里有两组图片,一组是数据库中人工收集的真实的二次元图像,另外一组是generator生成的图像
在这里插入图片描述
Discriminator learns to assign high scores to real objects and low scores to generated objects.
Discriminator要学会分辨两组图像,如上图,真实图像得分与1越接近越好,生成图像得分与0越接近越好。可以用回归或者分类的方式来做,都可以。
Step 2: Fix discriminator D, and update generator G
在这里插入图片描述
这里generator 要调整参数,使得输出分数越大越好。
在这里插入图片描述
在实际做的过程中,会把中间部分看做是一个大的网络。例如generator 有5层,discriminator 有5层,我们会把两个5层接起来,中间再加一个隐藏层(这个隐藏层的大小实际与图片的维度大小一样),变成11层,然后固定后面5层的参数,更新前面5层的参数。用GD来做更新就可以。
在这里插入图片描述

数学描述版

Initialize θd\theta_d for D and θg\theta_g for G
• In each training iteration:
• • Learning D
• • • Sample m examples {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from database.这里m是超参数
• • • Sample m noise samples {z1,z2,,zm}\{z^1,z^2,\cdots,z^m\} from a distribution.
• • • Obtaining generated data {x~1,x~2,,x~m},x~i=G(zi)\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\}, \tilde x^i=G(z^i)
• • • Update discriminator parameters θd\theta_d to maximize
V~=1mi=1mlogD(xi)+1mi=1mlog(1D(xi))\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(x^i))
上面的目标函数是原始论文中的公式,不是最好的方式,其中第一项目的是要把真实图片得分求和取平均后最大化,第二项目的是要把生成图像得分求和取平均后最小化。这里生成图像的得分会经过一个sigmoid函数,使得分数值域在[0,1]之间,然后1减去这个分数就不会是负数,取log不会出错,然后整个第二项由于有一个1减去这个操作,就从最小变成求最大。整个式子就是求最大值。
θdθd+ηV~(θd)\theta_d\leftarrow\theta_d+\eta\triangledown\tilde V(\theta_d)
由于是求最大值,这里更新参数是用+
• • Learning G
• • • Sample m noise samples {z1,z2,,zm}\{z^1,z^2,\cdots,z^m\} from a distribution.
• • • Update generator parameters θg\theta_g to maximize
V~=1mi=1mlogD(G(zi))\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(G(z^i))
θgθg+ηV~(θg)\theta_g\leftarrow\theta_g+\eta\triangledown\tilde V(\theta_g)

例子:Anime Face Generation

https://zhuanlan.zhihu.com/p/24767059
没想到老师也刷知乎。。。拿的例子也是二次元的例子。
100 updates
在这里插入图片描述
1000 updates
在这里插入图片描述
2000 updates
在这里插入图片描述
5000 updates
在这里插入图片描述
10,000 updates
在这里插入图片描述
20,000 updates
在这里插入图片描述
50,000 updates
在这里插入图片描述
另外一个结果(学生的作业,使用了自己收集的数据集)
在这里插入图片描述
人脸生成上的研究:
在这里插入图片描述
调整生成的向量,可以得到:
在这里插入图片描述

GAN as structured learning

Structured Learning

这个应该是去年的最后部分的内容,这里稍微复习一下,普通的机器学习是找到一个函数,使得输入得到对应的输出
f:XYf:X\rightarrow Y
Regression: output a scalar
Classification: output a “class” (one-hot vector)
在这里插入图片描述
输出的东西都比较简单,如果要像输出比较复杂的东西(序列,图像等),就是Structured Learning
Structured Learning/Prediction: output a sequence, a matrix, a graph, a tree ……
Output is composed of components with dependency.
下面给几个Structured Learning的例子:
Output Sequence:
在这里插入图片描述
Output Matrix:
在这里插入图片描述

Structured Learning面临的挑战

One-shot/Zero-shot Learning:(就是训练数据中可能没有或者只有很少的某个类别的数据,而要求模型生成对应的东西)
在传统的分类问题中,每个分类都会有大量的样本。In classification, each class has some examples.
在Structured Learning:
• If you consider each possible output as a “class” ……
• Since the output space is huge, most “classes” do not have any training data.
• Machine has to create new stuff during testing.
• Need more intelligence
另外,机器需要有大局观。Machine has to learn to do planning
• Machine generates objects component-by-component, but it should have a big picture in its mind.
• Because the output components have dependency, they should be considered globally.
例如在图像生成的时候,每次生成一个像素,但是所有像素合起来要像一个人脸。不能人脸有三个眼睛,两个嘴巴,因此在Structured Learning中生成不是最重要的,重要的是component与component之间的关系。
生成数字,先生成一个点,这个时候并不能说这个点生成得好或者不好:
在这里插入图片描述
生成文本,要看整体效果,只看部分是不够的:
在这里插入图片描述
那么如何把GAN 和 structured learning联系起来?

Structured Learning Approach

我们可以把Generator看做Structured Learning中生成很小的component的部分
Discriminator看做整体的评估方法。
在这里插入图片描述
二者合起来,就是GAN.
接下来填前面挖到坑:
Generator为什么不自己学,还需要Discriminator来指导?
Discriminator为什么不自己直接做?

Can Generator learn by itself?

Generator

先来看下,如果不用GAN,怎么来训练Generator
在这里插入图片描述
之前说过,Generator就是一个NN,输入一个向量,生成一个图片,如果现在是做生成手写数字,那么就是输入一个向量,得到一个手写数字。输入不同的向量,得到不同的数字。
如果我们用不同的向量来代表不同的手写数字:
在这里插入图片描述
那么就可以用监督学习的方法来进行训练:
在这里插入图片描述
可以和NN分类器训练过程一样:
在这里插入图片描述
现在的问题是表示图片的code从哪里来?随机?不行啊,因为code要表示图片的特征,例如:
在这里插入图片描述
这里的两个code如果差很远,你叫机器如何学习?可以看到这里的第一维0.1可能表示数字1,然后第二维表示的是倾斜角度。
之前学过Encoder,可以把图片压缩为一个向量:
在这里插入图片描述
回顾Auto-encoder结构:
在这里插入图片描述
中间的c就是图片的向量表示,弄得详细一点:
在这里插入图片描述
分析上面的结构,发现Auto-encoder的Decoder就是根据c(向量)生成图片,这不就是和Generator干的事情是一样的吗?
在这里插入图片描述
我们看能不能把这块单独拿出来,Randomly generate a vector as code,然后生成图片。
在这里插入图片描述
通过随机生成的二维向量,然后生成手写数字图片。
在这里插入图片描述
假设给定下图中的两个二维向量得到的结果分别是手写数字0和1
在这里插入图片描述
那么,随着向量在座标轴上的变换,生成图片如下图所示:
在这里插入图片描述
通过上面的实验,我们可以下如下结论:
如果有两个向量a和b,那么我们可以分别生成两个手写数字:
在这里插入图片描述
如果我的输入是两个向量的计算呢?
在这里插入图片描述
可以用之前的内容VAE
来进行解决:
在这里插入图片描述
就可以训练VAE使得模型即使输入的是它从来没有看见过的向量,它也能正确的做出相应的输出。
但是这个做法能和GAN的训练出来的模型一样吗?

VAE vs GAN

在VAE中,我们的目标是模型G生成的图片与真实图片差距越小越好:
在这里插入图片描述
这个差距往往是通过两个图片逐像素进行比较得到的,例如上图中的箭头就是两个图片对应的像素,我们比较这些所有的像素,计算差距,换句话说就是用两个图片的向量,计算每个维度之间的距离来衡量差距。
当然如果生成的图片如果和真实图片一模一样当然没有问题,现在问题是生成的图片总是会和真实图片有一些差异,在计算差异的时候就会出现问题:
例如我们的真实图片是:
在这里插入图片描述
生成图片:
在这里插入图片描述
可以看到,虽然上面两个按差异计算来说比下面的图片的计算结果要好,但是从图片整体来看,反而下面的图片符合手写图片的规律。
也就是说模型的优化目标不是单纯的让你的生成结果与真实结果越接近越好。
而是要使得component与component之间的关系符合现实规律。例如:
在这里插入图片描述
左边多了一个像素是不行的,如果在多出来的像素附近填满像素当然是可以的。
但是这个事情在NN中很难做到:
在这里插入图片描述
例如上面的模型中Each neural in output layer corresponds to a pixel.
第二个神经元输出有颜色的时候,那么它会希望旁边的神经元也生成颜色,这样符合手写数字的规律,但是NN中,每个神经元都是独立的:
在这里插入图片描述
The relation between the components are critical.
Although highly correlated, they cannot influence each other.
Need deep structure to catch the relation between components.
我们需要structure 来约束这个事情。就是在后面在加几个隐藏层,就可以调整第L层的神经元输出。
也就是说理论上,VAE要想获得GAN的效果,它的网络要比GAN要深才行。
而且由于VAE算法采用的分布采样,因此做一些离得比较散的目标效果不好:
下图中绿色是目标,蓝色是VAE学习的结果
在这里插入图片描述

Can Discriminator generate?

Discriminator 在不同文献中有不同的名字:Evaluation function, Potential Function, Energy Function …
Discriminator is a function D (network, can deep)
D:XRD:X\rightarrow R
• Input x: an object x (e.g. an image)
• Output D(x): scalar which represents how “good” an object x is
在这里插入图片描述
Can we use the discriminator to generate objects?
回答:当然可以。
但是用Discriminator来生成对象和用Generator来生成对象不太一样,后者是一个一个component来生成,每个component之间的关系不好控制,而Discriminator由于是top-down evaluation,所以很容易控制component之间的关系。
• It is easier to catch the relation between the components by top-down evaluation.
也就是说Discriminator很容易分辨下面两张图片左边不行,右边ok。
在这里插入图片描述
因此检查component之间有没有isolate的component很容易,只需要用CNN的filter扫描一遍就知道了。
在这里插入图片描述
下面来看生成过程。假设:
• Suppose we already have a good discriminator D(x) …
discriminator 可以判断对象是否足够好,生成对象x~\tilde x的时候只需要穷举所有可能的x~\tilde x,再挑一个使得discriminator 得分最好的那个即可:
x~=argmaxxXD(x)(1)\tilde x=\text{arg}\underset{x\in X}{\text{max}}D(x)\tag1
Enumerate all possible x!这个事情可以吗?

Discriminator - Training

现在我们手上只有真实的对象,因此用这个东西来训练,得到的Discriminator会比较笨,看什么都是真实的。
在这里插入图片描述
Discriminator only learns to output “1” (real).
Discriminator training needs some negative examples. Negative examples are critical.
How to generate realistic negative examples?
普通的可以用加噪音来实现:
在这里插入图片描述
但是一些逼真的生成对象不好弄,例如:
在这里插入图片描述
下面是正确的训练方法:
Given a set of positive examples, randomly generate a set of negative examples.
在这里插入图片描述
在这里插入图片描述
• In each iteration
• • Learn a discriminator D that can discriminate positive and negative examples.
在这里插入图片描述
• • Generate negative examples by discriminator D(假设公式(1)已知)
在这里插入图片描述
• • Learn a discriminator D that can discriminate positive and negative examples.
在这里插入图片描述
• • Generate negative examples by discriminator D(假设公式(1)已知)
在这里插入图片描述
不断反复。
从可视化的角度来看,
在这里插入图片描述
输入一个对象x(例如图像),输出一个向量,用于评判x到底好还是不好,好就是真实对象,不好就是生成对象。
为了简单,我们把输出D(x)看成一维的。那么红色的分布曲线就是D(x)。这里我们希望对于真实对象(绿色)的得分集中在凸起部分,生成对象在其他部分。

在这里插入图片描述
但是由于D(x)一般是高维的,那么很难做到某个地方就是这么简单按取值来判定,高维空间的分布非常复杂,不能把没有真实对象出现的地方就弄成低分。
实作的时候是这样:
绿色代表真实对象;蓝色代表生成对象。
刚开始二者的分布如下图:
在这里插入图片描述
然后学习出来的discriminator分布:
在这里插入图片描述
可以看到,刚开始discriminator在没有分布的地方(右边)不知道要打什么分数,所以出现那个地方打分比实际对象分数要高。
然后用discriminator重新产生negative example:
在这里插入图片描述
然后再次学习出来的discriminator分布:
在这里插入图片描述
看到它修复了它自己的漏洞。右边是低分了。
再次迭代后:
在这里插入图片描述
最后希望训练到这样停止迭代:
在这里插入图片描述
其实用discriminator来生成对象就是GAN中的一种生成方法,记得在RL中里面有提到过,critical policy的生成方法。
最后贴一张图(Structured Learning的分支),图中的Graphical Model实际上就是相当于discriminator,整个训练也是迭代方式进行的(EM是这个?)
在这里插入图片描述

小结:Generator v.s. Discriminator

先把Generator v.s. Discriminator的优缺点对比一下

Generator Discriminator
Pros:
• Easy to generate even with deep model
Pros:
•Considering the big picture
Cons:
• Imitate the appearance
• Hard to learn the correlation between components
Cons:
• Generation is not always feasible
••Especially when your model is deep(就是那个argmax函数不好解)
• How to do negative sampling?

现在在回过头来看Generator + Discriminator的GAN的算法(在前面有描述):
实际上是Generator在模拟生成对象,使得Discriminator给出高分。

Benefit of GAN

• From Discriminator’s point of view
•• Using generator to generate negative samples
在这里插入图片描述
• From Generator’s point of view
•• Still generate the object component-bycomponent
•• But it is learned from the discriminator with global view. (跟discriminator 学习大局观)
之前VAE做下面的结果不好,现在用GAN来做效果不错。红色是generator生成的结果,蓝色是真实对象。
在这里插入图片描述
VAE生成的人脸比较模糊,GAN的比较清晰。
在这里插入图片描述
某篇论文中不同GAN和VAE的对比。从图中我们看到,实验数据集分别是MNIST和CIFAR10,然后评价指标是FID,这个指标具体后面还会讲,这里只要知道越小越好,结果显示所有的GAN其实都差不多,都有很大的范围,因为GAN的算法对于参数非常敏感,很容易产生很大的偏差,但是总体而言,GAN对比VAE,VAE的variance比较小,GAN比VAE的效果(应该是看星号位置)要好。

在这里插入图片描述
后面还有部分内容,时间不够了。贴点相关视频:
https://www.youtube.com/watch?v=KSN4QYgAtao&feature=youtu.be
https://www.youtube.com/watch?v=0CKeqXl5IY0&feature=youtu.be

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章