GAN的基本介绍和变种
GAN:前景广阔,理论与应用极速发展中
GAN,全称为Generative Adversarial Nets,直译为“生成式对抗网络”。GAN作为生成模型的代表,自2014年被Ian Goodfellow提出后引起了业界的广泛关注并不断涌现出新的改进模型,深度学习泰斗之一的Yann LeCun高度评价GAN是机器学习界近十年来最有意思的想法。
GAN始终存在训练难、稳定性差以及模型崩塌(Model Collapse)等问题。产生这种不匹配的根本原因其实还是对GAN背后产生作用的理论机制没有探索清楚。
在推动GAN应用方面,2017年有两项技术是非常值得关注的。其中一个是CycleGAN,其本质是利用对偶学习并结合GAN机制来优化生成图片的效果的,采取类似思想的包括DualGAN以及DiscoGAN等,包括后续的很多改进模型例如StarGAN等。CycleGAN的重要性主要在于使得GAN系列的模型不再局限于监督学习,它引入了无监督学习的方式,只要准备两个不同领域的图片集合即可,不需要训练模型所需的两个领域的图片一一对应,这样极大扩展了它的使用范围并降低了应用的普及难度。
另外一项值得关注的技术是英伟达采取“渐进式生成”技术路线的GAN方案,这项方案的引人之处在于使得计算机可以生成1024*1024大小的高清图片,它是目前无论图像清晰度还是图片生成质量都达到最好效果的技术,其生成的明星图片几乎可以达到以假乱真的效果(参考图3)。英伟达这项由粗到细,首先生成图像的模糊轮廓,再逐步添加细节的思想其实并非特别新颖的思路,在之前的StackGAN等很多方案都采用了类似思想,它的独特之处在于这种由粗到细的网络结构是动态生成的而非事先固定的静态网络,更关键的是产生的图片效果特别好
image首先,有一个一代的 generator,它能生成一些很差的图片,然后有一个一代的 discriminator,它能准确的把生成的图片,和真实的图片分类,简而言之,这个 discriminator 就是一个二分类器,对生成的图片输出 0,对真实的图片输出 1。
接着,开始训练出二代的 generator,它能生成稍好一点的图片,能够让一代的 discriminator 认为这些生成的图片是真实的图片。然后会训练出一个二代的 discriminator,它能准确的识别出真实的图片,和二代 generator 生成的图片。以此类推,会有三代,四代。。。n 代的 generator 和 discriminator,最后 discriminator 无法分辨生成的图片和真实图片,这个网络就拟合了。
对抗样本
对抗样本(adversarial examples)是机器学习模型的输入,攻击者故意设计它们以引起模型出错;它们就像是机器的视觉错觉。
对抗样本指的是一个经过微小调整就可以让机器学习算法输出错误结果的输入样本。在图像识别中,可以理解为原来被一个卷积神经网络(CNN)分类为一个类(比如“熊猫”)的图片,经过非常细微甚至人眼无法察觉的改动后,突然被误分成另一个类(比如“长臂猿”)。
对抗训练
对抗训练是防御对抗样本攻击的一种方法。将对抗样本和正常样本一起训练是一种有效的正则化,可以提高模型的准确度,同时也能有效降低对抗样本的攻击成功率。不过这种防御也只是针对同样用来产生训练集中的对抗样本的方法。
确实在下图中可以看到,训练集是正常样本和对抗样本,测试集是正常样本的红线比训练集和测试集都是正常样本的错误率要降低,说明对抗训练是有正则化的功能。
imageFigure 9
在训练的时候直接生成对抗样本是比较低效的,之前提到的FGSM是一个高效的对抗训练方法。只需要改变目标函数就能在训练每个正常样本的同时也考虑了对抗样本。模型训练去给对抗样本赋予和正常样本原分类同样的类别。
用经过FGSM训练的网络,可以有效的防御用FGSM产生的对抗样本攻击,但是如果换其他对抗攻击方法,也会被攻破。
对抗样本的工作思路,可以有以下两个方面的意义:
1)对抗样本主要诉求是寻找模型的薄弱点,并对此展开攻击。这种思路反过来就可以应用于设计泛化性和鲁棒性更好的模型。
2)对抗场景下的一些现实应用,如反作弊和风控系统,可以模拟产生badcase,提早对可能出现的效果反弹做预判和准备,甚至可以提前反spam。但是这一应用的难点是:模拟产生的badcase是否是物理世界中真实可能出现的badcase。
结论
要为集成模型创建对抗样本,因为梯度方法的问题,难度会加大。但是生成的算法更为可行有效。
单个模型出现盲点可以由其他模型弥补,采用的会是输出结果最好的模型数据。
我们发现当我们用动态创建的对抗模型来训练算法时,能够解决这些对抗样本的问题。这是因为当模型面对这些可能出现问题的对抗低概率区域时,可以产生更高的“免疫力”。这同时也支持了低概率区域的论点,在这些区域的对抗样本更难处理。
训练GAN的一些技巧
-
输入规范化到(-1,1)之间,最后一层的激活函数使用tanh(BEGAN除外)
-
使用wassertein GAN的损失函数,
-
如果有标签数据的话,尽量使用标签,也有人提出使用反转标签效果很好,另外使用标签平滑,单边标签平滑或者双边标签平滑
-
使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm
-
避免使用RELU和pooling层,减少稀疏梯度的可能性,可以使用leakrelu激活函数
-
优化器尽量选择ADAM,学习率不要设置太大,初始1e-4可以参考,另外可以随着训练进行不断缩小学习率,
-
给D的网络层增加高斯噪声,相当于是一种正则
DCGAN原理介绍
DCGAN是继GAN之后比较好的改进,其主要的改进主要是在网络结构上,到目前为止,DCGAN的网络结构还是被广泛的使用,DCGAN极大的提升了GAN训练的稳定性以及生成结果质量。
论文的主要贡献是:
◆ 为GAN的训练提供了一个很好的网络拓扑结构。
◆ 表明生成的特征具有向量的计算特性。
D(x)表示D网络判断真实图片是否真实的概率(因为x是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))D(G(z))是为了D判断G生成的图片是否真实的概率。
G的目的:G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))D(G(z))尽可能得大,这是V(D,G)V(D,G)会变小。
D的目的:D的能力越强,D(x)D(x)应该越大,D(G(x))D(G(x))应该越小。因此D的目的和G不同,D希望V(D,G)V(D,G)越大越好。
DCGAN对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度,这些改变有:
取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。
在D和G中均使用batch normalization
去掉FC层,使网络变为全卷积网络
G网络中使用ReLU作为激活函数,最后一层使用tanh
D网络中使用LeakyReLU作为激活函数
DCGAN中的G网络示意:
imageDCGAN的生成器网络结构如上图所示,相较原始的GAN,DCGAN几乎完全使用了卷积层代替全链接层,判别器几乎是和生成器对称的,从上图中我们可以看到,整个网络没有pooling层和上采样层的存在,实际上是使用了带步长(fractional-strided)的卷积代替了上采样,以增加训练的稳定性。
DCGAN能改进GAN训练稳定的原因主要有:
◆ 使用步长卷积代替上采样层,卷积在提取图像特征上具有很好的作用,并且使用卷积代替全连接层。
◆ 生成器G和判别器D中几乎每一层都使用batchnorm层,将特征层的输出归一化到一起,加速了训练,提升了训练的稳定性。(生成器的最后一层和判别器的第一层不加batchnorm)
◆ 在判别器中使用leakrelu激活函数,而不是RELU,防止梯度稀疏,生成器中仍然采用relu,但是输出层采用tanh
◆ 使用adam优化器训练,并且学习率最好是0.0002,(我也试过其他学习率,不得不说0.0002是表现最好的了)
史上最强GAN图像生成器—BigGAN
BigGAN在训练中 Batch 采用了很大的 Batch,已经达到了 2048(我们平常训练 Batch 正常都是 64 居多),在卷积的通道上也是变大了,还有就是网络的参数变多了,在 2048 的 Batch 下整个网络的参数达到了接近 16 亿
image