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

Conditional Generation by GAN

1.简介:

上节讲了GAN,GAN的主要作用是用来做生成对象,输入向量,得到对应的对象,但是生成的对象无法控制,因此本节来讨论如何考虑控制生成对象。Conditional GAN和GAN的Generator是一样的,差别就是在Discriminator。

2.Text-to-Image

2.1 Traditional supervised approach
用传统的做法来怎么做?• Traditional supervised approach2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
以上是数据的例子,我们训练一个NN,然后输入一个文字,输出对应一个图片,我们希望图片与目标图片越接近越好。2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
这样做有什么问题?我们来看一下,例如文字:train对应的图片有很多张。例如下面的火车有正面,有侧面的,如果用传统的NN来训练,模型会想让火车长得像左边,又像一个右边的,这样的结果是不好的。模型会想产生多张图像的平均,结果就会很模糊。2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
2.2 Normal GAN
如果是用GAN来做:
先用Generator来生成图片,输入是两个:一个是条件,一个是从某个分布中sample出来的向量。
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
然后Discriminator来判断图片是否是生成的:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
Generator will learn to generate realistic images ….
But completely ignore the input conditions.
这样做是有问题的,因为Discriminator只会根据生成的图片是否清晰,是否真实来进行判别,所以Generator 只会按这个标准来生成图片,而没有去按条件(例如:火车)来生成图片。
2.3 Conditional GAN
因此要改进为Conditional GAN,这个时候Generator的部分不变,但是Discriminator要改为:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
这里的Discriminator吃两个输入:一个是条件,一个是要判断的图片对象。输出是一个向量,输出向量要判断两个事情:
x is realistic or not + c and x are matched or not
下面是输出向量的例子:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)

3.算法

In each training iteration:
3.1 Learning Discriminator
第一步:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
这里是Conditional GAN所以每个样本包含两个东西,都是image和text的pair。这个是真实样本,要给高分的。
第二步:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
第三步:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
这里是生成对象,要给低分
第四步:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
第五步:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
这里和上节中的GAN算法就是多了最后一项,就是图片和文本不对应也是给低分。

3.2 Learning Generator
第一步:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
第二步:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
第三步:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)

4.Conditional GAN - Discriminator

常见的Discriminator构架如下图,把x丢到一个NN里面得到一个向量表示,然后把文字丢到一个NN里面得到一个向量表示,把两个向量concat起来之后,丢到一个NN里面得到具体的分数。
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
但是有三个文章提出来的Discriminator构架貌似效果也还不错:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
感觉有点像之前讲的魔主化的东西。把一个x丢到一个NN里面,出来一个结果:x是否是真实对象。另外还出来一个向量表示(embedding),然后把条件文本和刚才的向量表示丢到另外一个NN(这个NN同时看到两个东西)里面,得到对象和文本是否匹配的结果。比起上面模型而言,上面模型虽然能work,但是给出的分数并没有告诉我们为什么得到这个分数。下面的模型则可以看出来,是不匹配,还是生成对象有问题。
[ Augustus Odena et al., ICML,2017]
[ Takeru Miyato, et al., ICLR,2018]
[ Han Zhang, et al., arXiv,2017]

5.作业实例

学生做的效果:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
可以看到里面有些图片翻车,右下角那个图片的眼睛一个红一个蓝。

6.Stack GAN

先生成小图,再生成大图。
大概流程:先有一个Generator1吃文字描述(先要embedding变成φt )生成一个64×64的小图片,然后经过一个Discriminator1,判断小图片和文字是否匹配,如果匹配,进入Generator2,吃小图片和φt,然后得到大图片,然后经过一个Discriminator2,判断大图片和文字是否匹配
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
可以把以上过程重复多次,有论文生成1024×1024的超级大图。

7.Image-to-image

2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
可以有很多用途,白天变黑夜,黑白变彩色等,例子:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
7.1 传统做法
先收集大量的样本:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
然后训练模型:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
在测试的结果却很模糊,原因在上面有讲:It is blurry because it is the average of several images.它是模糊的,因为它是几个图像的平均值。2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
7.2 Conditional GAN
Generator:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
Discriminator,这里注意要吃两个东西,条件和要判断的对象:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
看到使用条件GAN生成的结果更加清晰了,但是这里有点问题,就是左上角那里多了一些东西2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
因此可以针对这个进行改进,在Generator生成对象的时候加上限制,要使得生成的对象与真实对象越接近越好:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
最后结果:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)

8.Patch GAN

当用一个Discriminator来进行评估整个大张的图片的时候会有很多问题:容易overfitting,训练时间长。因此可以用个Discriminator来进行评估。每个Discriminator检查的区域的大小是超参数。不能太小例如一个pixel那么整个图片就会糊掉。2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)

9.Speech Enhancement

给一段声音去掉噪音:
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
9.1 传统做法
先要有数据:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
然后训练一个NN,注意这里会直接套CNN
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
效果当然不好,要用条件GAN
2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
Generator:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
Discriminator:2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)

10.Video Generation

看一段影片,然后预测接下来发生什么事情。2020李宏毅学习笔记——59.Generative Adversarial Network(2_10)
还有用GAN来玩游戏,如果不用GAN,就是会有问题,例如角色往左或者往右都是正确的,那么用传统的学习得到的结果就是进行平均,然后角色就会定住不动。