Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (arxiv 1511.06434)
和GAN开上之作: Generative Adversarial Networks(Goodfellow 2014)不同点:
其实本篇文章的本质贡献在于训练的一些技巧,作者给出了训练稳定DCGANs的一些guideline:
1.不要使用Pooling。Discriminator采用带stride的convolution,Generator采用带fractional-strided的convolution。作者说这样可以让网络自己去学习降采样\上采样的方法,效果比用Pooling的好。作者指出,deconvolution是错误的称呼,争取的称呼是convolution with fractional-strided。
2.BatchNormalize的使用。作者指出加BN是让CNN版本的Generator学习好的关键,但是不能所有的层都加BN,Generator的输出层和Discriminator的输入层不要加BN。
3.去掉所有的FullConnect层。作者指出去掉fc是一个趋势,比如采用Global Pooling就可以在分类问题上达到state-of-the-art的效果。Global Pooling增加了模型的稳定性,但是损失了收敛的速度。作者提出了一个折中的方法:直接把最高层特征连接到generator的输入和discriminator的输出。对于generator,输入信号(比如长度100的均匀分布采样)先经过fc层,然后reshape成一个4维的tensor,之后就可以用全卷积网络了。而对于discriminator,则是将最后一层的卷积的结果直接拉直输入到sigmoid中(取max?)。
作者在三个数据集上进行了实验:Large-scale Scene Understanding (LSUN) (Yu et al., 2015), Imagenet-1k and a newly assembled Faces dataset。
一些细节:
作者强调了对隐层进行分析和可视化的重要性。
1.对隐层进行分析有主意观察有没有memorization的成分。memorization问题是训练GAN需要关心的问题,有点类似ouverfit的概念,就是generator不是真的生成了新的样本而只是记忆了见过的样本而已。如果在在隐层中发现明显的变换(sharp transitions),则可以认为是momorization的信号。
2.对隐层进行分析有助于理解generator参数空间的架构方式。
3.对隐层进行分析可以观察是否新的语义变化的引入。这个和memorization问题直接相关,显然如果generator生成的样本有新的语义变化,则说明memorization问题不大,也说明模型确实学到了好的representation。下图展示了generator并不是完全地记忆原有的图像,而是引入了新的语义变化。
4.对discriminator进行的feature map进行可视化,可以看到特征学习的效果。
5.对z连续性的分析,可以看到一些语义元素的渐变过程。比如下图,调节某个z的参数,可以使得画面从无窗户渐变成为有窗户。
6.作者尝试在generator的feature map中去掉一些语义元素。设计了一个实验,去掉所有的窗户的特征。首先标注一些样本,把图中的窗户的bounding box标注出来,然后在倒数第二层的feature map之上训练了一个logitstic回归。使用回归的结果来把判断为窗户的地方的特征去掉。对比实现结果如下,可以看出虽然这种过滤方法很naive,但是确实可以看到效果,第二行确实把第一行对应的样本中的窗户用其他语义元素替代了。
作者指出,目前的GAN训练中,会出现一个问题:训练轮数多的时候,部分filter会出现振荡。以后会试图解决该问题。
另外作者还做了一些有趣的实验,比如对z进行操作。下图展示讲生成微笑女人的样本的z减掉生成不微笑女人样本的z,然后在加上不微笑男人的样本的z,得到的新的z作为generator的输入信号,就可以生成微笑的男人的样本。