生成式对抗网络(GANs)——未完成

目录

什么是 GAN?

怎样教机器画⼀张从未⻅过的⼈脸呢?我们知道计算机可以存储⼤量照⽚,但它并不知道像素与外观是如何关联起来的。多年来,各种各样的⽣成模型都试图解决这个问题。它们使⽤不同的假设模拟底层数据分布,但那些假设通常并不实⽤。⽬前的实现⽅法都不是最优解:隐⻢尔可夫模型⽣成的⽂本⾮常枯燥,由上⼀句就能预测下⼀句;变分⾃编码器(Variational Autoencoders)⽣成的图像是模糊的,图像之间尽管名称不同,但实际上变化很⼩,缺乏多样性。要解决这些问题就要采⽤⼀种全新的⽅法,⽣成式对抗⽹络(GAN)应运⽽⽣。在这篇⽂章中,我们会全⾯介绍GAN的基础概念,展⽰其主要架构,并提供⼤量能显著优化结果的技巧。[1]

⽣成模型主要是⽤来收集训练样本并表⽰样本的概率分布,解决⽅案通常是直接推断其概率密度函数。⽣成模型的初学者会好奇,既然有这么多真实的训练案例,那为什么还要去找这些⽣成模型呢?这⾥是⼀些通过好的⽣成模型可能实现的应⽤,也可以算作这个问题的答案:1.模拟实验可能的结果,降低损耗,加快研究速度;2.能够预测未来的⾏动规划,想象⼀个GAN能预先知道下⼀步“路况”;3.⽣成缺失的数据和标签:缺乏正确格式的清洗的数据会导致过度拟合;4.⽣成⾼质量语⾳;5.照⽚的⾃动优化(图像的超分辨率重建)2014年,蒙特利尔⼤学的Ian Goodfellow和他的同事创造了⽣成式对抗⽹络(GAN)。它可以通过学习⽣成逼真物体的底层数据分布。GAN背后的原理很简单,就是⽣成器和判别器的相互作⽤。⽣成器的⽬标是⽣成⼀个逼真的物体,试图以假乱真。判别器的⽬标是分辨⽣成图像和真实图像之间的差异。⽬前最重要的是明⽩GAN是⼀种让⽣成器和判别器协同⼯作的⽅法,并且⼆者都有⾃⼰的体系结构。[1]

本文将介绍生成式对抗网络(GAN, Generative Adversarial Networks ),是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。[2]

许多机器学习系统有着复杂的输入和简单的输出,例如输入一直猫的图片,输出是猫的标签。与此相反,生成模型的输入是简单的,例如几个随机的数字,然后可以输出一张图片,例如一张看出来很真实的人脸。生成式对抗网络(GAN)就是一种非常有效的生成模型, 在2014年首次提出后,一直是机器学习领域热门的话题。[1]

生成式对抗网络的开山之作是由“GANs之父”Ian J. Goodfellow于2014年提出的。

生成式对抗网络(Generative Adversarial Nets)

暂略.

⽆监督特征学习与深度卷积⽣成式对抗⽹络(DCGAN)

论文:[Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]

Ian J. Goodfellow 的⾸篇GAN论⽂发表⼀年后,⼤家发现GAN模型不稳定,并且需要⼤量的技巧。 2016年,Radford等⼈发表了⼀篇名为《⽆监督代表性学习与深度卷积⽣成式对抗性⽹络》的论⽂,⽂中提出了GAN架构的升级版,命名为DCGAN模型。[1]

练习是学习GAN不可或缺的⼀环,仅从论⽂中学习还是远远不够的。很多时候论⽂中的⽅法只适⽤于论⽂中的数据集,我们希望提供⼀组通⽤⼯具让⼊⻔者直接拿来研究。⼀般来说,训练GAN的⼯作流程简洁明确,⼤致可分下⾯三步⾛:1. 抽取minibatch的训练⽰例并估算判别器的评分2. ⽣成minibatch的样本并估算判别器的评分3. ⽤上两步中累积的梯度完成更新分别处理训练和⽣成minibatch并分别计算这些不同批次的batch norm是必要的,可以帮助我们确定判别器的快速初始训练。下⾯是⼀个正确⽣成minibatch的说明:在⽣成器的每⼀步中判别器运⾏次数⼤于1有时是好的,因此,如果您的⽣成器在有损失函数的情况下能⽣成出判别器分辨不了的东西,可以考虑这样做。本质上说,每个batch都会产⽣轻微的变化,怎样避免这种情况发⽣呢?⼀种⽅法是预计算平均像素和标准偏差并每次都⽤它,但这种解决⽅法经常导致过度拟合。因此,我们采⽤Virtual Batch Norm⽅法,在开始训练前先定义⼀个batch R作为参考,对于每个新batch X,利⽤R和X的关联计算标准化参数。第⼆种⽅法是,从球体⽽不是⽴⽅体中搜集输⼊的噪⾳。虽然仅通过控制噪声向量模量就可以实现这种近似,但从⾼维⽴⽅体中均匀采样更可取。还有⼀个技巧是避免使⽤稀疏的梯度,特别是在⽣成器中。我们可以通过将某些图层转换成“平滑”的类似效果来实现,⽐如:1. ReLU -> LeakyReLU;2. MaxPooling -> AvgPooling, Convolution+stride;3. Unpooling ->Deconvolution; [1]

参考

  1. 微信公众号“量子位”
  2. https://poloclub.github.io/ganlab/