2020李宏毅学习笔记——58.Generative Adversarial Network(1_10)

在这里插入图片描述
这个学校的官网对GAN的定义是:我们提出了一个通过对抗过程来估计生成模型的新框架,在该框架中,我们同时训练了两个模型:捕获数据分布的生成模型G和估计样本来自训练数据的概率的区分模型D, The training procedure for G is to maximize the probability of D making a mistake.G的训练过程是使D犯错的可能性最大化。该框架对应于minimax两人游戏。在任意函数G和D的空间中,存在唯一的解决方案,其中G恢复训练数据分布,并且D各处都等于1/2。在G和D由多层感知器定义的情况下,整个系统可以通过反向传播进行训练。在训练或样本生成期间,不需要任何马尔可夫链或展开的近似推理网络。

1.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.
(sliced bread:美国人往往会用这么一句俚语来形容极好极赞的事物:“This is the best thing since sliced bread!(这是自切片面包以来最棒的东西!)”之前是不切片的。。。一般用作对产品、商品、发明等的赞美语。这一夸,也让人瞬间明白了切片面包的地位。)
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).
在无监督学习方面,最近和潜在的一些突破是什么?
对抗性训练是自切片面包以来最酷的事情。我在前面的回答中列出了一堆相关的论文。在未来的几年里,我们期待着这项技术能带来更多令人印象深刻的结果。目前缺少的是对它的良好理解,这样我们才能使它可靠地工作。太挑剔了。有点像90年代的ConvNet,当时我是唯一一个能让他们成功的人(事实并非如此)。

常见的GAN变种:
在这里插入图片描述

  • 先大概看一下本节课程大纲:
    Basic ldea of GAN
    GAN as structured learning
    Can Generator learn by itself?
    Can Discriminator generate?
    A little bit theory

  • 先大概看一下GAN作用:
    GAN主要用于生成东西:生成图片,生成句子等。

Image Generation
In a specific range,一般都是从一个分布(高斯)随机采样一个向量,根据这个向量生成图片。
在这里插入图片描述

Sentence Generation
在这里插入图片描述

We will control what to generate latter. → Conditional Generation.

2.Basic Idea of GAN

GAN里面有两个重要的东西,一个是Generator,一个是Discriminator

2.1 Generator
Generator可以是一个NN

在这里插入图片描述
输入向量每一个维度都对应生成对象的某些特征。一个维度一个特征,Each dimension of input vector represents some characteristics.
在这里插入图片描述
改第一个维度:
在这里插入图片描述
改倒数第二个维度:
在这里插入图片描述
改倒数第一个维度:
在这里插入图片描述
2.2Discriminator
Discriminator也可以是一个NN。注意它的输入和上面的Generator的不同。
在这里插入图片描述
例如:
逼真的二次元:
在这里插入图片描述
垃圾二次元:
在这里插入图片描述
2.3 二者的关系
适者生存:
在这里插入图片描述
这就是“敌对”一词的由来。你可以用不同的方式解释这个过程。用模型来描述上面的关系:
在这里插入图片描述
GAN的原文中把Generator和Discriminator的关系描述为假钞制作者和警察,老师说这样太暴力,会教坏小孩子,换个讲法:在这里插入图片描述
老师看过很多真实的二次元人物。下面这个图很形象了。
在这里插入图片描述
另外最后给出两个问题。
Generator为什么不自己学,还需要Discriminator来指导?
Discriminator为什么不自己直接做?
二者的关系可以描述为:写作敌人,念做朋友:
左边是棋魂,右边是火影。他们都是对立又互相帮助的典型,促使对方进步。

3.Algorithm:算法

3.1 语言描述版
先把算法流程描述一遍
在这里插入图片描述
干啥呢:

  • Initialize generator and discriminator.这两个是NN,这里的初始化就是初始化NN的参数。

  • In each training iteration迭代:
    Step 1: Fix generator G, and update discriminator D修复生成器G,并更新鉴别器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来做更新就可以。
    在这里插入图片描述
    3.2 数学描述版
    重要的一张图:
    在这里插入图片描述
    上面的目标函数是原始论文中的公式,不是最好的方式,其中第一项目的是要把真实图片得分求和取平均后最大化,第二项目的是要把生成图像得分求和取平均后最小化。这里生成图像的得分会经过一个sigmoid函数,使得分数值在[0,1]之间,然后1减去这个分数就不会是负数,取log不会出错,然后整个第二项由于有一个1减去这个操作,就从最小变成求最大。整个式子就是求最大值。
    在这里插入图片描述
    由于是求最大值,这里更新参数是用+
    在这里插入图片描述

4.例子:Anime Face Generation

拿的例子也是二次元的例子。
100 updates
在这里插入图片描述
1000 updates
在这里插入图片描述
50000 updates
在这里插入图片描述
人脸生成上的研究:在这里插入图片描述
调整生成的向量,可以得到:在这里插入图片描述

5.GAN as structured learning

5.1 Structured Learning
普通的机器学习是找到一个函数,使得输入得到对应的输出。
在这里插入图片描述
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.输出由具有依赖关系的组件组成。
5.2 下面给几个Structured Learning的例子:
Output Sequence:在这里插入图片描述
Output Matrix:
在这里插入图片描述
5.3 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之间的关系。
    生成数字,先生成一个点,这个时候并不能说这个点生成得好或者不好:
    在这里插入图片描述
    生成文本,要看整体效果,只看部分是不够的:
    在这里插入图片描述

6.Structured Learning Approach

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

7.Can Generator learn by itself?

7.1 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的训练出来的模型一样吗?

8.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学习的结果在这里插入图片描述

9.Can Discriminator generate?

Discriminator 在不同文献中有不同的名字:Evaluation function, Potential Function, Energy Function …
Discriminator is a function D (network, can deep)
在这里插入图片描述
它是干啥的呢?
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˜ 的时候只需要穷举所有可能的x˜ ,再挑一个使得discriminator 得分最好的那个即可:在这里插入图片描述

9.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.在这里插入图片描述
n each iteration
• • Learn a discriminator D that can discriminate positive and negative examples.
在这里插入图片描述
Generate negative examples by discriminator D
在这里插入图片描述
Learn a discriminator D that can discriminate positive and negative examples.在这里插入图片描述
Generate negative examples by discriminator D
在这里插入图片描述
不断反复。
从可视化的角度来看,在这里插入图片描述
输入一个对象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是这个?)
在这里插入图片描述

10.小结:Generator v.s. Discriminator

之前的Generator 只能学到表面现象,而且Discriminator生成的argmax又难算,现在是Generator可以解决argmax的问题类
先把Generator v.s. Discriminator的优缺点对比一下
在这里插入图片描述
现在在回过头来看Generator + Discriminator的GAN的算法(在前面有描述):
实际上是Generator在模拟生成对象,使得Discriminator给出高分。

11.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的效果(应该是看星号位置)要好。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值