生成器与判别器
了解对抗性攻击如何催生了生成对抗网络(GAN)的诞生。
对抗性攻击
深度学习模型在测试阶段极易受到基于输入微小修改的攻击。
假设你有一个训练好的分类器,能够正确识别图像中的物体并给出正确的标签。
此时可以构造出一种对抗样本,即一张在视觉上与原图几乎无法区分的图像。
这些对抗性图像可以通过添加噪声扰动来构造,但经过扰动后的图像却会被模型错误分类。为解决这一问题,常用的方法是将对抗样本注入训练集,这种方法被称为对抗训练。通过这种方式,可以提升神经网络的鲁棒性。这类样本可通过添加噪声、应用数据增强技术,或沿着梯度反方向扰动图像(以最大化损失而非最小化损失)来生成。
一个示例
以下代码接收前向传播和反向传播后得到的输入图像和计算出的梯度,并对图像进行扰动,使得模型无法以相同的置信度识别该图像。
1import torch 2## FGSM 攻击代码 3def fgsm_attack(image, epsilon, data_grad): 4 # 获取数据梯度的逐元素符号 5 sign_data_grad = data_grad.sign() 6 # 通过调整输入图像的每个像素生成扰动图像 7 perturbed_image = image + epsilon * sign_data_grad 8 # 添加裁剪以保持像素值在 [0,1] 范围内 9 perturbed_image = torch.clamp(perturbed_image, 0, 1) 10 # 返回扰动后的图像 11 return perturbed_image
这种扰动看起来大致如下:
该扰动被加到原始图像上。
扰动后的图像对人眼而言几乎无法分辨差异,但模型将很难正确识别。
现在,让我们换一个角度思考!
从对抗攻击到生成式学习
如果我们并不关心构建一个鲁棒的分类器,而是希望用神经网络替代人工设计的对抗样本生成过程呢?
这样,我们就可以让网络自动生成各种视觉上逼真的新样本。
这正是“生成式”一词的由来。
在生成式对抗学习中,我们的目标不再是提高网络对扰动的鲁棒性,而是生成能够代表数据分布的新样本!
我们使用另一个网络来完成这项任务。
什么样的网络能够生成与训练数据相似且逼真的样本?
当然是生成器(Generator)!
生成器
由于生成器本质上只是一个神经网络,我们需要确定其输入和输出形式。
输入
最简单的情况下,输入是从实数区间内的某个概率分布中采样的随机噪声。这个空间被称为潜在空间(latent space)或连续空间。其中“潜在”意味着信息是隐藏的,类似于自编码器中的隐变量表示。
由于使用了“随机”一词,意味着每次采样都来自随机分布,因此每次都会得到不同的向量样本。这就是所谓的随机性(stochasticity)。
这样的输入会带来非确定性的输出结果。因此,我们可以无限生成新的样本!
正因为存在随机性,在生成对抗学习(GAN)相关的论文中,你经常会看到期望值(expected value)的符号出现。
输出
输出通常是生成的图像(用于图像生成任务),或其他我们希望生成的内容。关键区别在于:我们现在关注的是生成符合特定数据分布的代表性样本(例如狗、画作、街景、飞机等)。
判别器
判别器本质上就是一个分类器。但与传统分类不同的是,它的目标是学习数据的分布特征。换句话说,假设我们希望生成花卉图像。由于目标类别已知,我们希望判别器能够衡量生成样本与真实数据分布之间的相似程度。因此,判别器输出一个单一的概率值:0 表示生成的假图像,1 表示来自真实数据分布的真实样本。
这就使判别器成为一个二分类器。
在训练判别器时,所有真实图像的标签为 1,而生成图像的标签为 0。
理想的生成器应能产生难以区分真假的样本,此时判别器的输出应接近 0.5。从博弈论角度看,这种对抗关系被称为二人极小极大博弈(min-max game)。
在博弈论中,极小极大博弈是一种描述两个参与者之间非合作博弈的数学模型。每个参与者都知道对方的均衡策略,且单方面改变自身策略无法获得额外收益。
这意味着什么?
生成器 G 力图生成接近真实分布的虚假样本,以欺骗判别器 D;而 D 则努力判断样本来源是真实数据还是生成结果。
GAN 的核心思想正是基于判别器 D 所实现的“间接训练”,并且 D 是在动态更新的。“间接”意味着我们并不直接最小化像素级的欧氏距离,而是利用判别器的二分类结果来计算梯度。
我们交替训练这两个模型。具体来说,在训练判别器时,必须冻结生成器的权重;反之亦然。
正是这种交替训练机制,构成了 GAN 模型真正的魔力所在。