GAN
由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在空间的VAE的替代方案。它们通过强制生成的图像在统计上几乎与真实图像几乎无法区分,从而能够生成相当逼真的合成图像。
理解GAN的直观方式是想象一个伪造者试图创造一幅伪造的毕加索作品。起初,伪造者的任务非常糟糕。他将他的一些假货与真正的毕加索混合在一起,并将它们全部展示给艺术品经销商。艺术品经销商对每幅画进行真实性评估,并给出关于毕加索看起来像毕加索的原因的伪造反馈。伪造者回到他的工作室准备一些新的假货。随着时间的推移,伪造者越来越有能力模仿毕加索的风格,艺术品经销商越来越专业地发现假货。最后,他们手上拿着一些优秀的假毕加索。
这就是GAN的意义:伪造网络和专家网络,每个网络都经过最好的培训。因此,GAN由两部分组成:
- 生成网络(generator): 将随机向量(潜在空间中的随机点)作为输入,并将其解码为合成图像;
- 辨别网络(discriminator): 将图像(真实的或合成的)作为输入,并预测图像是来自训练集还是由生成器网络创建。
生成器网络经过训练,能够欺骗鉴别器网络,因此随着训练的进行,它逐渐产生越来越逼真的图像:人工图像看起来与真实图像无法区分,只要鉴别器网络不可能鉴别两张图片。同时,鉴别器不断适应发生器逐渐改进的能力,为生成的图像设置了高度的真实感。一旦训练结束,生成器就能够将其输入空间中的任何点转换为可信的图像。与VAE不同,这个潜在空间对有意义结构的明确保证较少;特别是,它不是连续的。
[图片上传失败…(image-599f61-1536326082049)]
值得注意的是,GAN是一个优化最小值不固定的系统。通常,梯度下降包括在静态损失中滚下山丘。但是使用GAN,从山上下来的每一步都会改变整个景观。这是一个动态系统,其中优化过程寻求的不是最小,而是两个力之间的平衡。出于这个原因,GAN是众所周知的难以训练 - 让GAN工作需要大量仔细调整模型架构和训练参数。
GAN实现示意图
使用keras实现一个简单的GAN网络:DCGAN,Generator和Discriminator都是由卷积网络组成。使用Conv2DTranspose网络层在Generator用来对图片上采样。
在CIFAR10,50000张32x32 RGB图片数据集上训练。为了训练更容易,仅使用“青蛙”类图片。
实现GAN网络流程:
- generator网络将(latent_dim, )向量转换成(32,32,3)图片;
- discriminator将(32,32,3)图片映射到2分类得分上,得到图片为真的概率;
- gan网络将generator和discriminator结合起来:gan(x) = discriminator(generator(x))。gan网络将隐空间向量映射到鉴别器鉴别generator由隐空间向量生成图片为真的概率上;
- 使用带real/fake标签的real、fake图片对Discriminator训练;
- 要训练Generator,可以使用gan模型损失对Generator权重的梯度。这意味着,在每个步骤中,将生成器的权重移动到使鉴别器更可能将生成器解码的图像归类为“真实”的方向上。换句话说,你训练生成器来欺骗鉴别器。
A bag of tricks
众所周知,训练GAN和调整GAN实现的过程非常困难。你应该记住一些已知的技巧。像深度学习中的大多数事情一样:这些技巧是启发式的,而不是理论支持的指导方针。 他们得到了对手头现象的直观理解的支持,并且他们已经知道在经验上运作良好,尽管不一定在每种情况下都有效。
以下是实现GAN生成器和鉴别器时使用的一些技巧。它不是GAN相关技巧的详尽列表;你会在GAN文献中找到更多:
- Generator使用tanh作为最后一层的激活函数,而不是sigmoid;
- 隐空间取样时使用正态分布(高斯分布),而不是均匀分布;
- 为了健壮性可以增加随机性。由于GAN训练导致动态平衡,GAN可能会以各种方式陷入困境。在训练期间引入随机性有助于防止这种情况。我们以两种方式引入随机性:通过在鉴别器中使用dropout并通