机器学习面试题汇总与解析——GAN
本章讲解知识点
-
- 从 GAN 讲起
- 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。
- 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。
- 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
- 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
- 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。
-
关于机器学习算法书籍,我强烈推荐一本《百面机器学习算法工程师带你面试》,这个就很类似面经,还有讲解,写得比较好。
-
关于深度学习算法书籍,我强烈推荐一本《解析神经网络——深度学习实践手册》,简称 CNN book,通俗易懂。
1. 从 GAN 讲起
1.1 前言
2014 年,Generative Adversarial Networks(GANs)在深度学习领域掀起了一场革命。这场革命产生了一些重大的技术突破。Ian Goodfellow 等人在 “Generative Adversarial Networks” 中提出了生成对抗网络,这篇paper算是这个领域的开山之作。学术界和工业界都开始接受并欢迎 GAN 的到来。GAN 的崛起不可避免。
首先,GAN 最厉害的地方是它的学习性质是无监督的。GAN 也不需要标记数据,这使 GAN 功能强大,因为数据标记的工作非常枯燥。
1.2 GAN 原理
GAN的基本原理是通过博弈的方式训练生成器和判别器,使其相互竞争、相互提升,从而生成逼真的样本数据。
GAN 的工作流程如下:
1.生成器接收一个随机噪声向量作为输入,并生成一个与真实样本类似的样本数据。 2.判别器接收真实样本和生成器生成的样本作为输入,并尝试区分它们。判别器输出一个概率值,表示输入样本是真实样本的概率。 3.生成器和判别器交替进行训练:
- 生成器的目标是生成能够欺骗判别器的样本,使判别器无法区分真实样本和生成样本。生成器通过最小化生成样本被判别为假的概率来学习生成更真实的样本。
- 判别器的目标是准确地区分真实样本和生成样本,使其能够最大程度地正确判断样本的真实性。判别器通过最大化正确判断真实样本和生成样本的概率来学习更准确的判别能力。
这里以生成图片为例进行说明。假设我们有两个网络,G(Generator)和 D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是:
- G 是一个生成图片的网络,它接收一个随机的噪声 z,通过这个噪声生成图片,记做 G(z)。
- D 是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是 x,x 代表一张图片,输出 D(x)代表 x 为真实图片的概率,如果为 1,就代表 100% 是真实的图片,而输出为 0,就代表不可能是真实的图片。
在训练过程中,生成网络 G 的目标就是尽量生成真实的图片去欺骗判别网络 D。而 D 的目标就是尽量把 G 生成的图片和真实的图片分别开来。这样,G 和 D 构成了一个动态的“博弈过程”。
最后博弈的结果是什么?在最理想的状态下,G 可以生成足以“以假乱真”的图片 G(z)。对于 D 来说,它难以判定 G 生成的图片究竟是不是真实的,因此 D(G(z)) = 0.5。
这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。
以上过程的数学表达公式:
简单分析一下这个公式:
- 整个式子由两项构成。x 表示真实图片,z 表示输入 G 网络的噪声,而 G(z) 表示 G 网络生成的图片。
- D(x) 表示 D 网络判断真实图片是否真实的概率(因为 x 就是真实的,所以对于 D 来说,这个值越接近 1 越好)。而 D(G(z)) 是 D 网络判断 G 生成的图片的是否真实的概率。
- G 的目的:上面提到过,D(G(z)) 是 D 网络判断 G 生成的图片是否真实的概率,G 应该希望自己生成的图片“越接近真实越好”。也就是说,G 希望 D(G(z)) 尽可能得大,这时 V(D, G) 会变小。因此我们看到式子的最前面的记号是 。
- D 的目的:D 的能力越强,D(x) 应该越大,D(G(x)) 应该越小。这时 V(D,G) 会变大。因此式子对于 D 来说是求最大()
那么如何用随机梯度下降法训练D和G?论文中也给出了算法:
这里红框圈出的部分是我们要额外注意的。第一步我们训练 D,D 是希望 V(G, D) 越大越好,所以是加上梯度(ascending)。第二步训练 G 时,V(G, D) 越小越好,所以是减去梯度(descending)。整个训练过程交替进行。
训练过程中,生成网络 G 的目标就是尽量生成真实的图片去欺骗判别网络 D。而 D 的目标就是尽量辨别出 G 生成的假图像和真实的图像。这样,G 和 D 构成了一个动态的“博弈过程”,最终的平衡点即纳什均衡点
2. 发展中的 GAN 网络
2.1 DCGAN
这是第一次在 GAN 中使用卷积神经网络并取得了非常好的结果。之前,CNN 在计算机视觉方面取得了前所未有的成果。但在 GAN中还没有开始应用 CNNs。Alec Radford,Luke Metz,Soumith Chintala等人“Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks”提出了DCGAN。这是 GAN 研究的一个重要里程碑,因为 DCGAN 将 GAN 与 CNN 相结合,奠定了之后几乎所有 GAN 的基本网络架构。DCGAN 极大地提升了原始 GAN 训练的稳定性以及生成结果的质量。
DCGAN 主要是在网络架构上改进了原始的 GAN,DCGAN 的生成器与判别器都利用 CNN 架构替换了原始 GAN 的全连接网络,主要改进之处有如下几个方面:
-
深层卷积网络:DCGAN 使用了深层卷积神经网络作为生成器和判别器的主要组件。生成器通过堆叠转置卷积层(transpose convolutional layer)将低维的噪声输入转换为逼真的图像输出。判别器则通过堆叠卷积层来判断输入图像的真实性。
-
使用批归一化(batch normalization):DCGAN 在生成器和判别器中广泛应用批归一化 BN 技术,有助于提升网络的训练稳定性和生成图像的质量。批归一化可以将每个批次的数据进行归一化处理,减少训练过程中的内部协变量偏移。
-
使用 LeakyReLU 激活函数:为了避免梯度消失的问题,DCGAN 采用 LeakyReLU 激活函数作为生成器和判别器的非线性激活函数。LeakyReLU 允许小于 0 的激活值有一个小的斜率,从而保持梯度的流动。
-
去除全连接层:与传统的 GAN 模型不同,DCGAN 去除了全连接层,并且使用全局平均池化层(global average pooling)代替全连接层。这样可以减少模型的参数数量,降低过拟合的风险,并使生成器和判别器对输入图像的尺寸更加灵活。
DCGAN 中的 G 网络示意:
2.2 BigGAN
这是 GAN 中用于图像生成的里程碑式进展。一个谷歌的实习生和谷歌DeepMind部门的两名研究人员发表了一篇“Large Scale GAN Training for High Fidelity Natural Image Synthesis”的论文。
这些图像都是由 BigGAN 生成,正如你看到的,图像的质量足以以假乱真。这是 GAN 首次生成具有高保真度和低品种差距的图像。之前的最高初始得分为 52.52,BigGAN 的初始得分为 166.3,比现有技术(SOTA)好100%,FID(越小越好)从18.65下降到9.6。它最重要的改进是对生成器的正交正则化。
BigGAN 在 GAN 模型中的改进点主要包括以下几个方面:
-
模型规模的增大:BigGAN 通过增加生成器和判别器网络的规模和复杂度,引入更多的参数和层级结构,以提高生成图像的质量和多样性。
-
类别条件生成:BigGAN 引入了类别标签作为条件输入,使得生成器可以根据指定的类别生成相应的图像。这种类别条件生成使得模型能够生成特定类别的图像,并且在生成多类别图像集合时非常有用。
-
分层的噪声向量:BigGAN 使用分层的噪声向量作为输入,通过不同层级的噪声向量控制生成图像的不同特征和细节。这种分层的噪声向量可以更细粒度地调节生成图像的风格和内容。
-
改进的归一化技术:BigGAN 采用了 SN(Spectral Normalization)归一化技术,用于约束判别器网络的权重。这种归一化技术有助于提高模型的稳定性和生成图像的质量。
2.3 StyleGAN
StyleGAN 是 GAN 研究领域的另一项重大突破。StyleGAN 由 Nvidia 在题为“A Style-Based Generator Architecture for Generative Adversarial Network”的论文中介绍。
StyleGAN 在面部生成任务中创造了新记录。算法的核心是风格转移技术或风格混合。除了生成面部外,它还可以生成高质量的汽车,卧室等图像。这是 GANs 领域的另一项重大改进,也是深度学习研究人员的灵感来源。
2.4 CycleGAN
CycleGAN 有一些非常有趣的用例,例如将照片转换为绘画,将夏季拍摄的照片转换为冬季拍摄的照片,或将马的照片转换为斑马照片,或者相反。CycleGANs 在题为“Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks”的论文中提出。CycleGAN 用于不同的图像到图像翻译。
CycleGAN 特点就是通过一个循环,首先将图像从一个域转换到另一个域,然后,再转回来,如果两次转换都很精准的话,那么,转换后的图像应该与输入的图像基本一致。通过这样的的一个循环,CycleGAN 将转换前后图片的配对,类似于有监督学习,提升了转换效果。
如图所示,CycleGAN 包含四个部分,两个生成模型,x 域到 y 域的 G(x->y)和 y 域到 x 域的 G(y->x);两个辨别模型 x 域和 y 域的辨别模型,负责判断生成模型生成的图片是否足够逼真。
例如:在 斑马->野马 两组图像间进行翻译时,对应关系应当如下:
站姿斑马->站姿野马
跪姿斑马->跪姿野马
这样就在 x 域 和 y 域分别生成图片,分别辨别。CycleGAN 可以实现在两个域之间的双向图像转换,主要原因是引入循环一致性损失和域一致性损失:
-
循环一致性损失:为了保持图像转换的一致性,CycleGAN 引入了循环一致性损失。具体而言,对于输入图像 x 和生成的转换图像 y,CycleGAN 通过生成器进行双向转换,得到重构的图像 x' 和 y'。然后,计算原始图像与重构图像之间的像素级差异,并将其作为循环一致性损失。这个损失函数鼓励生成器学习到一个映射,能够使得输入图像通过转换再转换后能够尽可能地恢复到原始图像。
-
域一致性损失:CycleGAN 还引入了域一致性损失,以促进两个域之间的转换。对于输入图像 x 和转换图像 y,通过生成器进行转换得到转换的图像 x',然后再将转换图像 x' 通过生成器再转换回原始域得到重建图像 y'。然后,计算原始图像 y 与重建图像 y' 之间的像素级差异,并将其作为域一致性损失。这个损失函数鼓励生成器学习到一个映射,能够使得输入图像在两个域之间来