Generation是一个neural network,它的输入是一个vector,它的输出是一个更高维的vector,以图片生成为例,输出就是一张图片,其中每个维度的值代表生成图片的某种特征。
Discriminator也是一个neural network,它的输入是一张图片,输出是一个scalar,scalar的数值越大说明这张图片越像真实的图片。
举了鸟和蝴蝶例子说明Generation和Discriminator之间的关系是相互对抗,相互提高。然后提出两个问题:
Algorithm(算法说明)
首先要随机初始化generator 、discriminator的参数;
然后在每一个training iteration要做两件事:
(1)固定generator的参数,然后只训练discriminator。
将generator生成的图片与从database sample出来的图片放入discriminator中训练,如果是generator生成的图片就给低分,从database sample出来的图片就给高分。
(2)固定discriminator的参数,然后只训练generator。
把generator生成的图片当做discriminator的输入,训练目标是让输出越大越好。
具体算法如下:
训练D(固定G):
训练G(固定D):
结构化学习的输入和输出多种多样,可以是序列(sequence)到序列,序列到矩阵(matrix),矩阵到图(graph),图到树(tree)等。例如,机器翻译、语音识别、聊天机器人、文本转图像等。GAN也是结构化学习的一种。
传统的structured learning主要有两种做法:Bottom up 和 Top down。
Bottom up:机器逐个产生object的component。
Top down:从整体来评价产生的component的好坏。
Generator可以视为是一个Bottom Up的方法,discriminator可以视为是一个Top Down的方法,把这两个方法结合起来就是GAN。
可以用监督学习的方法来对generator进行训练,但是还会存在一个问题:表示图片的code从哪里来。如果随机产生,训练起来可能非常困难。因为如果两种图片很像,它们输入vector差异很大的话,就很难去训练。
可以通过训练一个encoder,得到相应的code。但是存在的问题就是:Vector a 输出结果是向左的1,vector b 输出结果是向右的1。若把a、b平均作为输入,则输出不一定是数字,可以使用VAE来解决这个问题。
VAE不仅产生一个code还会产生每一个维度的方差;然后将方差和正态分布中抽取的噪声进行相乘,之后加上code上去,就相当于加上noise的code。
在生成图片时,不是单纯的让生成结果与真实结果越接近越好,还要保证整幅图片符合现实规律。
假设Layer L-1的值是给定的,则Layer L每一个dimension的输出都是独立的,无法相互影响。因此只有在L后面在加几个隐藏层,才可以调整第L层的神经元输出。也就是说,VAE要想获得GAN的效果,它的网络要比GAN要深才行。
下图中绿色是目标,蓝色是VAE学习的结果。VAE在做一些离散的目标效果不好。
Discriminator就是给定一个输入,输出一个分数。对discriminator来说,要考虑component和component之间的联系就比较容易。比如有一个滤波器,它会去检索有没有独立的像素点,有的话就是低分。
假如有一个discriminator,它能够鉴别图片的好坏,就可以用这个discriminator去生成图片。穷举所有的输入x,比较discriminator给出的分数,找到分数最高的就是discriminator的生成结果。
从可视化和概率的角度来看一下整个过程。蓝色的是discriminator生成图片的分布,绿色的是真实图片分布。训练discriminator给绿色的高分,蓝色的低分。然后寻找discriminator除了真实图片之外,得分最大高的地方把它变成负样反复迭代,最终正样本和负样本就会重合在一起。
generator:很容易生成图片,但是它不考虑component之间的联系。只学到了目标的表象,没有学到精神。
Discriminator:能够考虑大局,但是很难生成图片。
Generator就是取代了这个argmax的过程。GAN的优点如下:
从discriminator来看,利用generator去生成样本,去求解argmax问题,更加有效。
从generator来看,虽然在生成图片过程中的像素之间依然没有联系,但是它的图片好坏是由有大局观的discriminator来判断的。从而能够学到有大局观的generator。