目录
Generative Adversarial Network(生成对抗网络)
Generative Adversarial Network(生成对抗网络)
Basic Idea of GAN
- Generation(生成器)
Generation是一个neural network,它的输入是一个vector,它的输出是一个更高维的vector,以图片生成为例,输出就是一张图片,其中每个维度的值代表生成图片的某种特征。
- Discriminator(判别器)
Discriminator也是一个neural network,它的输入是一张图片,输出是一个scalar,scalar的数值越大说明这张图片越像真实的图片。
- Generation和Discriminator两者的关系
举了鸟和蝴蝶例子说明Generation和Discriminator之间的关系是相互对抗,相互提高。然后提出两个问题:
- Generator为什么不自己学,还需要Discriminator来指导。
- Discriminator为什么不自己直接做。
- Algorithm(算法说明)
首先要随机初始化generator 、discriminator的参数;
然后在每一个training iteration要做两件事:
1. 固定generator的参数,然后只训练discriminator。
将generator生成的图片与从database sample出来的图片放入discriminator中训练,如果是generator生成的图片就给低分,从database sample出来的图片就给高分。
2. 固定discriminator的参数,然后只训练generator。
把generator生成的图片当做discriminator的输入,训练目标是让输出越大越好。
具体算法如下:
训练D(固定G):
- 首先从database中抽取m个样本。
- 从一个分布中抽取m个vector z。
- 将z输入generator,生成m张图片 。
- 计算损失,最大化损失。
训练G(固定D):
- 随机产生m个噪声,通过generator得到图片G(z);
- 然后经过discriminator得到D(G(z)),更改G中的参数,使得它的得分越高越好。
GAN as structured learning
结构化学习的输入和输出多种多样,可以是序列(sequence)到序列,序列到矩阵(matrix),矩阵到图(graph),图到树(tree)等。例如,机器翻译、语音识别、聊天机器人、文本转图像等。GAN也是结构化学习的一种。
- Structured Learning面临的挑战
- One-shot/Zero-shot Learning:比如在分类任务中,有些类别没有数据或者有很少的数据。
- 机器需要创造新的东西。如果把每个可能的输出都视为一个“class”,由于输出空间很大,大多数“class”都没有训练数据,也,这就导致了机器必须在testing时创造新的东西。
- 机器需要有规划的概念,要有大局观。因为输出组件具有依赖性,所以应全局考虑它们。
- Structured Learning Approach
传统的structured learning主要有两种做法:Bottom up 和 Top down。
Bottom up:机器逐个产生object的component。
Top down:从整体来评价产生的component的好坏。
Generator可以视为是一个Bottom Up的方法,discriminator可以视为是一个Top Down的方法,把这两个方法结合起来就是GAN。
Can Generator learn by itself
可以用监督学习的方法来对generator进行训练,但是还会存在一个问题:表示图片的code从哪里来。如果随机产生,训练起来可能非常困难。因为如果两种图片很像,它们输入vector差异很大的话,就很难去训练。
可以通过训练一个encoder,得到相应的code。但是存在的问题就是:Vector a 输出结果是向左的1,vector b 输出结果是向右的1。若把a、b平均作为输入,则输出不一定是数字,可以使用VAE来解决这个问题。
- VAE (Variational Auto-Encoder,变分编码器)
VAE不仅产生一个code还会产生每一个维度的方差;然后将方差和正态分布中抽取的噪声进行相乘,之后加上code上去,就相当于加上noise的code。
- VAE的缺陷
在生成图片时,不是单纯的让生成结果与真实结果越接近越好,还要保证整幅图片符合现实规律。
假设Layer L-1的值是给定的,则Layer L每一个dimension的输出都是独立的,无法相互影响。因此只有在L后面在加几个隐藏层,才可以调整第L层的神经元输出。也就是说,VAE要想获得GAN的效果,它的网络要比GAN要深才行。
下图中绿色是目标,蓝色是VAE学习的结果。VAE在做一些离散的目标效果不好。
Can Discriminator generate
Discriminator就是给定一个输入,输出一个分数。对discriminator来说,要考虑component和component之间的联系就比较容易。比如有一个滤波器,它会去检索有没有独立的像素点,有的话就是低分。
假如有一个discriminator,它能够鉴别图片的好坏,就可以用这个discriminator去生成图片。穷举所有的输入x,比较discriminator给出的分数,找到分数最高的就是discriminator的生成结果。
- 训练discriminator
- 首先给定一些正样本,随机产生一些负样本。
- 在每一个iteration里面,训练出discriminator能够鉴别正负样本。
- 然后用训练出来的discriminator生成图片当做负样本。
- 开始迭代。
从可视化和概率的角度来看一下整个过程。蓝色的是discriminator生成图片的分布,绿色的是真实图片分布。训练discriminator给绿色的高分,蓝色的低分。然后寻找discriminator除了真实图片之外,得分最大高的地方把它变成负样反复迭代,最终正样本和负样本就会重合在一起。
- Generator v.s. Discriminator
generator:很容易生成图片,但是它不考虑component之间的联系。只学到了目标的表象,没有学到精神。
Discriminator:能够考虑大局,但是很难生成图片。
- Generator + Discriminator
Generator就是取代了这个argmax的过程。GAN的优点如下:
从discriminator来看,利用generator去生成样本,去求解argmax问题,更加有效。
从generator来看,虽然在生成图片过程中的像素之间依然没有联系,但是它的图片好坏是由有大局观的discriminator来判断的。从而能够学到有大局观的generator。
Theory behind GAN
假如要生成一些人脸图,实际上就是想要找到一个分布,从这个分布内sample出来的图片像是人脸,分布之外生成的就不像人脸。而GAN要做的就是找到这个distribution。
在GAN之前用的是Maximum Likelihood Estimation。
- Maximum Likelihood Estimation(最大似然估计)
最大似然估计的思想是,假设数据的分布是 ,定义一个分布为 ,求得一组参数θ,使得 与 越接近越好。具体步骤如下:
- 从 中sample出一些样本;
- 对于sample出来的样本,可以计算出它们的likelihood;
- 计算总分likelihood L,并找到一组参数 使得L最大。
- MLE=Minimize KL Divergence
最大似然估计就相当于最小化的KL散度。
如果使用最大似然估计,采用高斯混合模型定义PG ,生成的图片会非常模糊,现在使用generator产生PG 。优化的目标就是使PG 和Pdata 越接近越好,即使得G* 越小越好,但是不知道PG 和Pdata 的公式。
虽然不知道PG 和Pdata 的公式,但是可以从这两个分布中做sample。可以用Discriminator来衡量PG 和Pdata 的Divergence。训练出来的maxV(G,D) 就相当于JS divergence。
- 证明过程
要求V(G,D)的最大值,就是求 的最大值。
因为 和 都是固定的,所以设为常数,然后通过求导求出最大值。
将求出的D* 回带入V(G,D),然后化简。
Generator 的训练目标就是,找到一个G* 去最小化 和 之间的差异,即 ,由于不知道 和 的具体公式,所以无法直接计算divergence。于是通过一个discriminator来计算两个分布之间的差异, 。所以最终优化目标为 。
首先训练D,多训练几次直至收敛;之后训练G:其中第一项是与生成器无关的,由于G不能训练太多,否则会导致D无法evaluate JS,所以update一次就好。
- In practice
理论上V是要取期望值,但是实际上是不可能的,只能用样本的均值进行估计。
论文原文在实作的时候把 换成 ,蓝色曲线刚开始的值很大,适合做梯度下降。其实后来实验证明两种结果都差不多。
Conditional GAN
- Text-to-Image
对于根据文字生成图像的问题,传统的做法就是训练一个NN,然后输入一段文字,输出对应一个图片,输出图片与目标图片越接近越好。存在的问题就是,比如火车对应的图片有很多张,如果用传统的NN来训练,模型会产生多张图像的平均,结果就会很模糊。
- Conditional GAN
Conditional GAN与普通GAN的区别在于输入加入了一个额外的condition,并且在训练的时候使得输出的结果拟合这个 condition。
此时的discriminator的输入是generator的输出和conditional vector,此时discriminator有两个任务:
- 判断图片质量的好坏(图片是否是真实图片)。
- 图片是否和输入条件匹配。
- Algorithm
训练D(固定G):
- 首先从database中抽取m个样本,每个样本都是一对条件和图片。
- 从一个分布中抽取m个vector z;然后每个vector都加上条件,表示为(c,z)。
- 将(c,z)输入generator,生成m张图片x (条件+图片)。
- 从database中随机选取m个真实图片 x 。
- 计算损失,最大化损失。
训练G(固定D):
- 随机产生m个噪声,随机从database中抽取m个条件;
- 通过generator得到G(C,Z),然后经过discriminator得到D(G(C,Z)),更改G中的参数,使得它的得分越高越好。
具体设计条件GAN判别器,有两种方式:
- 图片x经过一个网络变成一个code,条件经过一个网络也变成一个code;把这两种code组合在一输入到网络里面,输出一个分数。
- 首先让图片经过一个网络,输出一个分数(用于判断图片是否真实),同时这个网络也输出一个code,这个code和条件结合起来输入到另外一个网络里,也输出一个分数(图片和文字是否匹配)。
- Stack GAN(叠加生成对抗网络)
第一个网络生成小的图片,第二个网络生成大的图片。
- Image-to-image
传统做法存在的问题就是产生的图片很模糊,是因为它是许多张图片的平均。
Conditional GAN的做法就是,generator的输入一张图片和noise z,输出一张图片,discriminator会输入产生的image和input,输出一个scalar。通过算法的迭代,生成下面第三张图片,看起来很清晰,但和真实的图片还是有差异。所以提出了GAN+close,对generator生成的image加上限制,使得生成的image与真实对象越接近越好,得到第四张图片。
- Speech Enhancement(语音增强)
这里和image-to-image原理类似,都是把G的输入和输出作为D的输入。
Video Generation能够根据影片的前几帧产生后几帧。conditional 为之前几帧的图片。