DCGAN论⽂简单解读
的全称是Deep Convolution Generative Adversarial Networks(深度卷积⽣成对抗⽹络)。是2014年Ian
J.Goodfellow 的那篇开创性的之后⼀个新的提出将GAN和卷积⽹络结合起来,以解决GAN训练不稳定的问题的⼀篇paper.
关于基本的GAN的原理,可以参考原始,或者其他⼀些有⽤的⽂章和代码,⽐如:,,等。这⾥不再赘述。
⼀. 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 概述
⽂章主要在,以及⼀个较新的上进⾏了实验。训练的⼀些细节如下:
- 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发现可以使训练过程更加稳定。
resized3.2 LSUN
overfitting。当⽣成模型产⽣的图⽚质量越来越好的时候,我们就需要考虑overfitting的问题了,即generator有可能只是简单记住训练样本,然后产⽣类似的输出结果。为了展⽰DCGAN如何扩展到更⼤的数据集以及产⽣更⾼质量的图⽚,我们在包含300万训练样本的celebA bedroom datasets 上进⾏了训练。作者展⽰了每⼀轮训练之后采样的结果,表明模型产⽣的⾼质量输出不是简单通过记住训练样本⽽得到的。
 去重(deduplication)
为了防⽌模型过拟合,即模型简单记住输⼊的特征,然后⽣成类似的图⽚。作者还对训练样本进⾏了去重处理,即去除相似度较⾼的图⽚。具体的原理可以参考论⽂。
3.3 FACES
原始的celebA数据集是从互联⽹⽹页上抓取的现代⼈的⼈脸数据集。⼤约包含300张约10000个⼈的⼈脸数据。⽂中对这些数据使⽤opencv的face detector进⾏⼈脸检测,保证得到具有⼀定⾼精度的⼈脸bo
unding 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有很多个layer
s,所以总的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 b
ackpropagation,我们发现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
Processing math: 0%