原文出处:Generative Adversarial Networks 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
生成对抗网络
上一节我们学了生成模型(generative model):能生成与训练数据集中的图像相似的新图像的模型。VAE 就是生成模型的一个好例子。
课前小测
可是,如果我们想生成真正有意义的东西,比如一张分辨率合理的画作,用 VAE 就会发现训练收敛得不好。针对这种用途,我们需要学习另一个专为生成模型设计的架构:生成对抗网络(Generative Adversarial Network),简称 GAN。
GAN 的核心想法,是让两个神经网络互相对抗着训练:
原文此处有一张图,画的是 GAN 的整体结构:生成器拿一个随机向量作为输入,产出一张图像;判别器分别接收生成器产出的图像和训练集里的真实图像,判断哪张是真、哪张是假;两个网络互相对抗。图为原作者 Dmitry Soshnikov 绘制。
✅ 一点术语: * 生成器(generator)是一个网络,它接受某个随机向量,结果产出一张图像 * 判别器(discriminator)是一个网络,它接受一张图像,要说出这是真实图像(来自训练数据集)还是生成器造出来的。它本质上就是一个图像分类器。
判别器
判别器的架构和普通的图像分类网络没有区别。最简单的情况下,它可以是全连接分类器,但大概率会是一个卷积网络(convolutional network)。
✅ 基于卷积网络的 GAN 叫作 DCGAN
CNN 判别器由下面这些层组成:若干卷积+池化层(空间尺寸逐步缩小),一个或多个全连接层用来得到"特征向量",最后是一个二分类器。
✅ 这里的"池化(pooling)"是一种缩小图像尺寸的技术。"池化层把上一层神经元集群的输出合并成下一层的单个神经元,从而降低数据的维度。"——出处
生成器
生成器要更棘手一点。你可以把它看成反过来的判别器:从潜向量(latent vector)出发(站在特征向量的位置上),经过一个全连接层把它转换成需要的尺寸/形状,后面接反卷积(deconvolution)+上采样。这和自编码器(autoencoder)的解码器部分很像。
✅ 由于卷积层是实现为一个在线性图像上滑动的滤波器,反卷积在本质上与卷积相似,可以用同样的层逻辑来实现。
原文此处又有一张图,画的是 GAN 内部两个网络的展开结构:生成器从潜向量出发,经全连接层和反卷积/上采样逐层放大成图像;判别器把图像经卷积+池化逐层缩小,最后输出真/假判断。图为 Dmitry Soshnikov 绘制。
训练 GAN
GAN 被称为对抗(adversarial)网络,因为生成器和判别器之间存在持续的竞争。在这场竞争里,生成器和判别器都在进步,于是整个网络学会了生成越来越好的图像。
训练分两个阶段:
- 训练判别器。这个任务相当直接:我们用生成器生成一批图像,标为 0,代表假图像,再从输入数据集取一批图像(标为 1,真图像)。我们得到某个判别器损失,执行反向传播(backprop)。
- 训练生成器。这一步稍微棘手,因为我们并不直接知道生成器的期望输出。我们取整个 GAN 网络(生成器后接判别器),喂进一些随机向量,期望结果为 1(对应真实图像)。然后把判别器的参数冻结(这一步不想让它被训练),执行反向传播。
在这个过程中,生成器和判别器的损失都不会显著下降。理想情况下,它们应该来回振荡,对应两个网络的表现都在变好。
✍️ 练习:GAN
GAN 训练的问题
GAN 出了名的难训练。这里有几个问题:
- 模式坍塌(mode collapse)。这个词的意思是,生成器学会了只产出一张能骗过判别器的成功图像,而不是各种各样的不同图像。
- 对超参数(hyperparameters)敏感。你经常会看到 GAN 完全不收敛,然后学习率一降,突然就收敛了。
- 保持生成器和判别器之间的平衡。很多情况下,判别器损失会相对快速地掉到零,结果是生成器无法继续训练。为了克服这一点,我们可以尝试给生成器和判别器设不同的学习率,或者在判别器损失已经太低时跳过它的训练。
- 高分辨率(high resolution)训练。这和自编码器遇到的是同一个问题:重建太多层卷积网络会导致伪影。这个问题通常用所谓渐进式生长(progressive growing)来解决:先在低分辨率图像上训练最初的几层,然后逐层"解锁"或添加。另一种方案是在层与层之间增加额外连接,同时训练多个分辨率,细节见这篇 Multi-Scale Gradient GANs 论文。
风格迁移
GAN 是生成艺术类图像的好办法。另一种有趣的技术是所谓的风格迁移(style transfer):它拿一张内容图像(content image),把它按另一种风格重画,套用风格图像(style image)的滤镜。
它的工作方式如下: * 我们从一张随机噪声图像开始(也可以从内容图像开始,但为了便于理解,从随机噪声开始更容易) * 我们的目标是造出这样一张图像:它既接近内容图像,又接近风格图像。这由两个损失函数决定: - 内容损失(content loss)根据 CNN 在某几层从当前图像和内容图像中提取的特征来计算 - 风格损失(style loss)在当前图像和风格图像之间计算,巧妙之处在于用了 Gram 矩阵(更多细节见这份示例 notebook) * 为了让图像更平滑、去掉噪声,我们还引入变异损失(variation loss),它计算相邻像素之间的平均距离 * 主优化循环用梯度下降(或其他优化算法)调整当前图像,最小化总损失。总损失就是这三个损失的加权和。
✍️ 示例:风格迁移
课后小测
小结
这节课里,你学了 GAN 和它们的训练方法,也学了这类神经网络会遇到的特殊挑战,以及一些绕开这些挑战的策略。
🚀 挑战
用你自己的图像,跑一遍风格迁移 notebook。
复习与自学
作为参考,可以在这些资源里读更多 GAN 的内容:
- Marco Pasini,我训练 GAN 一年学到的 10 个教训
- StyleGAN,一种事实上的主流 GAN 架构,值得关注
- 在 Azure ML 上用 GAN 创作生成艺术
作业
回到这节课附带的两个 notebook 里挑一个,用你自己的图像重新训练 GAN。你能创造出什么?