DCGAN的全称是Deep Convolution Generative Adversarial Networks(深度卷积生成对抗网络)。是2014年Ian J.Goodfellow 的那篇开创性的GAN论文之后一个新的提出将GAN和卷积网络结合起来,以解决GAN训练不稳定的问题的一篇paper.
关于基本的GAN的原理,可以参考原始paper,或者其他一些有用的文章和代码,比如:GAN mnist 数据生成,深度卷积GAN之图像生成,GAN tutorial等。这里不再赘述。
一. DCGAN 论文简单解读
ABSTRACT
1.1 摘要。作者说,这篇文章的初衷是,CNN在supervised learning 领域取得了非常了不起的成就(比如大规模的图片分类,目标检测等等),但是在unsupervised learning领域却没有特别大的进展。所以作者想弥补CNN在supervised 和 unsupervised之间的gap。作者提出了将CNN和GAN相结合的DCGAN,并展示了它在unsupervised learning所取得的不俗的成绩。作者通过在大量不同的image datasets上的训练,充分展示了DCGAN的generator(生成器)和discriminator(鉴别器)不论是在物体的组成部分(parts of object)还是场景方面(scenes)都学习到了丰富的层次表达(hierarchy representations)。作者还将学习到的特征应用于新的任务上(比如image classification),结果表明这些特征是非常好的通用图片表达(具有非常好的泛化能力)。
INTRODUCTION
1.2 将GAN作为feature extractors。我们往往希望从大量未标注的数据中学习到有用的特征表达,然后将这些特征应用于监督学习领域。这是非常热门的研究领域。作者表明GAN是达成这一目的的一个非常好的工具。GAN的一大问题就是其训练非常不稳定,有的时候会得到非常奇怪的结果。而且目前对于可视化展示multi layer GAN内部到底学到了什么representation 研究非常少。这篇文章在以下几个方面做出了贡献:
- 文中提出并评估了一系列的对于卷积GAN的结构的限制,这些限制确保了在大多数情况下,卷积GAN可以保持稳定。文中将这种结构命名为DCGAN。
- 文中将训练好的鉴别器应用于图片分类任务,并和其他的非监督方法进行对比,发现它非常competitive。
- 文中可视化了DCGAN的filters,结果表明特定的filter学习到了特定的object。
- 文中表明生成器具有有趣的向量算数属性(vector arithmetic property),这使得我们可以对生成的样本进行语义上的操作(类似于NLP中的word embedding 的性质,文中作者举了给女性戴墨镜的例子,详见下文)。
RELATED WORK
2.1 从未标注的数据学习representation。之前使用的比较多的方法是聚类(层次k-means等),还有auto-endcoders,以及深度信念网络(deep blief networks)。
2.2 产生自然的图片。这一任务主要分为参数的和非参数的。
非参数方法
这种方法主要是从图片数据库对图片碎片(pathes)做match,应用在了图片的纹理合成(texture synthesis)以及超分辨率图片合成等方面。
参数方法
这种方法以前研究的就比较多,但是主要是对一些简单的图片做实验的(比如MNIST),在大规模真实图片上做实验取得比较好的结果也就是最近几年的事情。作者简单讲了有variational sampling,iterative forward diffusion等方法。2014年提出GAN之后,这种模型可以生成图片,但是不稳定,而且有的时候会产生噪声以及怪异的图片。这之后,又有人提出了laplacian pyramid extension的GAN,与GAN相比,它可以产生更好质量的图片,但是仍然不稳定。还有人提出了recurent network approach 和 deconvolution(反卷积)的方法,可以产生一定质量的图片,但是生成的features无法保证在监督学习任务中取得很好的效果。
2.2 对CNN进行可视化
可以使用deconvolution(反卷积)以及对输入进行梯度下降,这有助于探索CNN内部的每一层到底学到了什么表达。
2.3 DCGAN的方法以及模型架构
历史上已经有人尝试将GAN和CNN相结合,但是失败了。LAPGAN的作者尝试迭代地将低分辨率的图片逐步转化为更好的图片,从而产生更可靠的结果。文中作者在使用传统的监督学习CNN架构扩展GAN的过程中,也遇到了困难。在反复实验和尝试之后,作者提出了一系列的架构,可以让GAN+CNN更加稳定,可以deeper,并且产生更高分辨率的图像。核心的工作是对现有的CNN架构做了如下三个方面的修改:
- 全卷积网络。主要就是使用了strided convolution 替代确定性的pooling 操作,从而可以让网络自己学习downsampling(下采样)。作者对generator和discriminator都采用了这种方法,让它们可以学习自己的空间下采样。
- 取消全连接层。最近的做法比如使用global average pooling 去替代fully connected layer。global average pooling可以提高模型的稳定性,但是却降低了收敛速度。GAN的输入采用均匀分布初始化,可能会使用全连接层(矩阵相乘),然后得到的结果可以reshape成一个4 dimension的tensor,然后后面堆叠卷积层即可;对于鉴别器,最后的卷积层可以先flatten,然后送入一个sigmoid分类器。可视化的架构如下图1所示:
图1
- Batch Normalization。BN可以加速学习和收敛,其将每一层的输入变换到0均值和单位标准差(其实还需要shift 和 scale),这被证明是深度学习中非常重要的加速收敛和减缓过拟合的手段。它可以帮助由于初始化不当而导致的训练困难,可以让梯度flow to deeper layers。实践表明,这对于deep generator的有效learning是至关重要的,可以防止generator将所有的samples变成一个single point,这是GAN训练经常会碰到的问题。实践表明,如果直接将BN应用到all layers,会导致sample震荡和不稳定,所以我们只对生成器的输出层和鉴别器的输入层使用BN。
- (Leaky)Relu Activation。对于generator,其输出层使用tanh 激活函数,其余层使用relu 激活函数。我们发现如果使用bounded activation可以加速模型的学习,覆盖训练样本的color space。对于discriminator,我们发现使用leaky relu 更好一点,特别是对于生成高分辨率的图片。
总结一下,DCGAN的主要的tricks如下图2所示:
图2
DETAILS OF ADVERSARIAL TRANING(对抗训练的细节)
3.1 概述
文章主要在LSUN数据集,ImageNet 1k以及一个较新的celebA数据集上进行了实验。训练的一些细节如下:
- image preprocessing。我们没有对图片进行pre-processing,除了将generator的输出变换到[-1,1]。
- SGD。训练使用mini-batch SGD,batch size = 128。
- parameters initialize。所有的参数都采用0均值,标准差为0.02的初始化方式。
- leaky relu。leaky relu 的 \(\alpha\)的取值为0.2。
- optimizers。我们使用Adam optimizer,并且对参数做了一些fine tuing,我们实验发现默认的学习率为0.001,太高了,我们调整为0.0002。Adam中的momentum term \(\beta_1\)=0.9太高了,会使得训练过程震荡,不稳定,我们将其调整为0.5发现可以使训练过程更加稳定。
3.2 LSUN
overfitting。当生成模型产生的图片质量越来越好的时候,我们就需要考虑overfitting的问题了,即generator有可能只是简单记住训练样本,然后产生类似的输出结果。为了展示DCGAN如何扩展到更大的数据集以及产生更高质量的图片,我们在包含300万训练样本的celebA bedroom datasets 上进行了训练。作者展示了每一轮训练之后采样的结果,表明模型产生的高质量输出不是简单通过记住训练样本而得到的。
去重(deduplication)
为了防止模型过拟合,即模型简单记住输入的特征,然后生成类似的图片。作者还对训练样本进行了去重处理,即去除相似度较高的图片。具体的原理可以参考论文。
3.3 FACES
原始的celebA数据集是从互联网网页上抓取的现代人的人脸数据集。大约包含300张约10000个人的人脸数据。文中对这些数据使用opencv的face detector进行人脸检测,保证得到具有一定高精度的人脸bounding box,最后得到大约35w个face bounding box,然后使用这些face bounding box 进行训练。没有使用data augmentation。
3.4 imagenet-1k
对imagenet-1k的图片使用32x32的min-resized-center-crops进行训练。同样没有进行data augmentation。
对于DCGAN性能的经验验证
4.1 使用DCGAN作为feature extrctor对cifar-10数据进行分类。通常评估非监督表达学习性能的一个常用方法是将它作为特征提取器(feature extrator)应用于监督学习,然后评估linear model 基于这些learned features 的performance。
4.2 对于cifar-10数据集,非监督特征提取一个非常强的baseline是基fine-tuned的k-means模型。为了评估DCGAN在cifar-10上的表现,我们使用imagenet-1k训练DCGAN,然后使用鉴别器的所有卷积features,对每一个layer使用maxpooling 得到一个4x4的spatial grid。然后再将再将这些各层spatial grid展平,连接最后组成一个28672维的向量,然后再送入L2正则化的svm分类器进行分类。注意DCGAN每一个卷积层得到的最大feature maps为512,这个是要低于k-means的,但是由于DCGAN有很多个layers,所以总的feature maps要高于k-means。总体来说,得到的分类结果accuracy为82,8%,要高于所有基于k-means的方法,略低于state-of-art。考虑到我们得到的feature maps并不是通过训练cifar-10得到的,这说明我们通过DCGAN得到的image feature maps具有良好的通用性和泛化能力。
图3 训练1轮之后生成的图片
图4 训练5轮之后生成的图片
图5 DCGAN在imagenet-1k上训练,然后对cifar-10进行分类,和k-means方法进行对比
4.3 使用DCGAN作为feature extrctor对SVHN数据进行分类
在 StreetView House Numbers dataset(SVHN,一个街景拍摄门牌号数据集)中,我们是在labeled data不足的情况下使用DCGAN的disciminator进行监督学习。我们从non-extra数据集中划分了一个10000的validation set,用来进行超参数调节以及模型选择。我们使用类别均匀分布的1000个样本,通过discriminator采用和cifar-10一样的特征提取方法,然后基于这些特征训练一个L2正则化的SVM,这取得了state-of-art的结果(在只使用1000个data的情况下):22.48%的test error。而且我们发现CNN并非是这一结果的key factor,因为我们对比使用了纯粹的CNN架构,经过了64次的随机超参数搜索,得到的validation error是28.87%,要远高于之前的22.48%。
图6 SVHN classification with 1000 labels
5.1 对DCGAN内部的探索和可视化
文中使用了很多种探索DCGAN的方式,但是没有采用对traning set 进行最近邻搜索的方式,因为无论是在pixel还是feature space上这种方法都很容易受图片微小改变的影响。我们也没有使用对数似然(log-likelihood)的方式进行评估,因为有实验表明这也是不太好的metric。
5.2 探索latent space
我们首先要做的第一个实验就是探索latent space的landscape。这种exploration可以告诉我们是否发生了memorization,或者是图片发生分层崩塌(hierarchically collapsed)。如果walking in the latent space 导致了图片生成发生了语义上的改变,比如说有物体被增加或者移除了。我们就可以推断模型学到了相关的,有趣的表达。
5.3 可视化discriminator features
之前的工作已经表明,有监督的CNN在大型数据集上可以学习到非常有用的特征表达。特别的,训练在场景分类(scenes classification)的有监督CNN可以学习到一个物体检测器(object detector)。我们的实验表明,训练在大型数据集上的无监督的DCGAN同样可以学习到分层的,有趣的特征表达。使用guided backpropagation,我们发现disciminator在bedroom的典型的部分被激活(activation),比如beds,windows等。作为对比,我们采用了随机初始化的features,不会产生任何语义相关的有趣的activation。
5.4 操作生成器表达
5.4.1 忘记去画特定的物体。除了鉴别器学习到的特征表达,还有一个问题是生成器到底学习到了什么特征表达。生成的样本的质量表明生成器学习到了场景的主要构成部分,比如beds,windows,lamps(灯),doors,miscellaneous furniture(混杂的家具)的特征表达。为了探索这样的特征是以什么形式存在的,我们做了一个实验:试图将windows从generator的output中彻底移除。
我们选取了150个sample,其中52个我们手工绘制了window bounding boxes。在倒数第二层的conv layer features中,我们训练了一个简单的logistic regression来判断一个feature activation是否在window中,具体来说采用如下的准则:在绘制的window bounding box中的feature activation是正的,同一个图片的其他部分是负的。使用这个简单的模型,所有的权重大于0的feature maps(共有200个)都被从所有的空间位置(spatial locations)移除。然后,随机产生的新的样本,一个移除这些feture maps,另外一个保留。
下图7展示了带有window的和不带有window的生成图片。有意思的是,网络大部分时候都会忘记绘制在bedrooms中绘制window,而是将window替换成其他的物体。
图7 generated images with and without windows
5.4.2 在人脸样本中的向量算术性质
2013年那篇著名的(google word2vec)评估单词学习到的表达文章中,揭示了单词在表达空间中满足简单的算术操作,这表明其具有良好的线性性质。一个经典的例子是vector(”King”) - vector(”Man”) + vector(”Woman”)得到的结果,与之最相近的vector是Queen。我们想探索类似的结构和性质,是不是也存在generator的Z表达中。文中作者对一系列典型的Z representations 做了实验,结果发现确实有类似的性质。但是如果只对单个样本进行操作得到的结果不是很稳定,而如果使用三个的平均值,结果就会很不错而且比较稳定。实验还表明fave pose(脸部姿态)在Z空间中也满足类似的线性性质。
实验表明模型学习到的Z representations可以导出很多有趣的性质和应用。之前有实验表明条件生成模型(conditional generative model)可以学习物体属性(object attribute),比如scale(尺度),position(位置),rotation(旋转)等。而DCGAN是目前为止第一篇只使用非监督学习的方法就可以得到类似的性质的模型。如果对于上面的vector arithmetic进行更进一步探索的话,有望减少条件生成模型在对复杂图片分布进行建模时所需要的数据量。
图8 random filters and trained filters
图9 remove windows experiment
CONCLUSION AND FEATURE WORK
我们提出了一个更加稳定的GAN模型DCGAN,而且实验表明这种对抗网络可以学习到无论是对监督学习还是生成模型都都非常好的特征表达。但是我们注意到模型仍然有一些不稳定的地方,比如随着训练时间的增加,有些filters就会崩溃发生震荡。未来仍需要做一些工作来改善这种不稳定性。我们也相信将DCGAN应用到其他领域比如视频的frame prediction,音频领域的语音合成的预训练features,都会是非常有趣的工作。继续探索学习的latent space的属性也会非常有趣。
图10 Vector arithmetic for visual concepts
图11 looking left vs. looking right