查看全课大纲(第 90 / 93 节)
- 1.计算机视觉概述
- 2.计算机视觉应用场景
- 3.困难与挑战
- 4.开源库介绍
- 5.图像显示与存储
- 6.CLAHE
- 7.腐蚀膨胀与开闭运算
- 8.滤波与边缘填充
- 9.各种滤波
- 10.图像金字塔
- 11.傅里叶变换
- 12.短时傅里叶变换与小波变换
- 13.颜色特征与颜色直方图
- 14.几何特征_边缘
- 15.几何特征-角点与斑点
- 16.局部特征-SIFT特征描述子
- 17.局部特征-SURF特征描述子
- 18.局部特征-ORB特征描述子
- 19.其他特征描述子
- 20.传统图像分割技术
- 21.GraphCut
- 22.GrabCut
- 23.人脸检测的传统方法
- 24.行人检测的传统方法HOG+SVM
- 25.行人检测DPM
- 26.人工神经网络的架构
- 27.目标函数与梯度下降
- 28.误差反向传播
- 29.可手算的神经网络
- 30.改进目标函数与克服梯度消散
- 31.神经网络之传统神经网络与深度网络的差异
- 32.各种梯度下降算法
- 33.如何选择合适的梯度下降算法
- 34.避免过适应
- 35.CNN的架构
- 36.CNN的误差反向传播_卷积层
- 37.CNN的误差反向传播_池化层
- 38.分类所用的数据集
- 39.Alexnet详解
- 40.VGG详解
- 41.GoogLeNet_v1
- 42.BatchNormalization
- 43.GoogLeNet_v3v4
- 44.ResNet
- 45.ResNeXt
- 46.CNN设计准则
- 47.图像检索与推土机距离
- 48.基于颜色相似性
- 49.基于形状相似性
- 50.基于纹理相似性
- 51.基于局部特征相似性
- 52.DL的二值哈希编码
- 53.高维空间中检索KDTree
- 54.高维空间中检索LSH
- 55.目标识别任务综述
- 56.RCNN
- 57.SPP-Net
- 58.Fast R-CNN
- 59.Faster R-CNN
- 60.R-CNN系列模型回顾
- 61.R-FCN的设计思路
- 62.R-FCN的实现
- 63.YOLOv1
- 64.YOLOv2_9000
- 65.YOLOv3
- 66.图像分割应用场景与数据集
- 67.上采样的实现方式
- 68.FCN网络架构的由来
- 69.FCN构建细节
- 70.DeepLabv1
- 71.CRF
- 72.DeepLabv2
- 73.DeepLabv3
- 74.特定的医学影像分割任务
- 75.U-Net
- 76.3D U-Net
- 77.V-Net
- 78.DenseNet
- 79.病理切片分析任务及数据集
- 80.病理切片分析
- 81.图说任务及其传统处理方法
- 82.深度语言模型与RNN
- 83.LSTM及其变种
- 84.NIC模型
- 85.SAT模型
- 86.图说的性能指标
- 87.判别模型与生成模型
- 88.KL散度与JS散度
- 89.VAE
- 90.GAN的基本原理
- 91.DCGAN与CGAN
- 92.Wasserstein GAN
- 93.SRGAN
GAN的基本原理
小象实战讲义 · 基于深度学习的计算机视觉
在上一节我们学习了变分自编码器(VAE),它是一种经典的生成模型。本节我们将介绍生成对抗网络(GAN)——图灵奖得主 Yann LeCun 曾把它称为近十年来最有意思的想法之一。GAN由Ian Goodfellow在2014年提出(他也是《深度学习》一书的第一作者,该书常被称为“花书”),通过让两个神经网络相互对抗、共同进化,最终让生成器能够创造出足以“以假乱真”的数据。学完本节,你将理解GAN的核心思想、训练机制以及其面临的挑战。
💡 核心导读
- GAN是什么:由生成器(Generator)和判别器(Discriminator)组成的对抗性生成模型,目标是让生成器学会从随机噪声中生成逼真的数据。
- 对抗训练机制:理解“警察与伪币制造者”的比喻,以及生成器如何在不“见过”真实数据的情况下,仅凭判别器的反馈进行进化。
- 目标函数与优化:掌握GAN的Minimax博弈目标函数,以及生成器和判别器交替优化的训练过程。
- GAN的挑战:了解原始GAN在训练中面临的困难,如训练难以收敛、模式崩溃等问题。
从VAE到GAN:生成思想的演进
在上一节介绍的变分自编码器(VAE)中,模型先把输入数据 X 编码成潜在变量 z,再解码得到重构结果 X_hat,训练目标是让 X_hat 尽可能接近原始输入 X。其核心在于对潜在变量 z 施加一个先验分布(如均值 0、标准差 1 的标准正态分布),从而让整个潜在空间变得连续、平滑,便于采样生成新数据。
生成对抗网络(GAN)的出发点与VAE不同。2014 年 Goodfellow 等人提出 GAN,初衷是构建一种无需显式写出似然函数、而是通过两个网络的对抗博弈来估计数据分布的生成模型框架——让网络自己“造”出与原始数据有所区别、却又足够逼真、以至于难以被识别为“假货”的新样本。(用生成样本来扩充训练集,是这一框架后来常见的用途之一,而非原论文的出发点。)
GAN巧妙地将这个过程设计成一场两个神经网络之间的“博弈”:
- 生成器(Generator, G):像一个“伪币制造者”,目标是接收一个随机噪声(如高斯白噪声),并生成一张足以“以假乱真”的图片。
- 判别器(Discriminator, D):像一个“警察”,目标是准确判断一张图片是来自真实数据集(真币)还是生成器(伪币)。
GAN最精妙之处在于:生成器从未见过真实的图片。它仅凭判别器给出的“这个假货被识破了”或“这个假货骗过我了”这样的反馈信号,来不断调整自己,最终闭门造车地造出逼真的图片。
GAN的基本架构
一个标准的GAN由两个可微分的深度神经网络构成,通常可以是全连接网络或卷积神经网络(CNN)。
生成器网络(Generator Network)
- 职责:负责生成伪造的样本数据。
- 输入:一个从先验分布(如标准正态分布)中采样得到的高斯白噪声向量
z。 - 输出:一个样本数据向量
x = G(z),在图像任务中就是一张生成的图片。 - 关键特性:必须是一个可微分的函数,以便通过梯度下降进行训练。对于图像生成,常采用深度卷积网络(如DCGAN)作为生成器。
判别器网络(Discriminator Network)
- 职责:负责检测输入的样本数据是真实的还是生成的。
- 输入:一张图片,可能是真实的
x(来自数据集),也可能是生成的G(z)。 - 输出:一个标量概率值
D(x),表示判别器认为输入图片是真实图片的概率。通常,对于真实图片,我们希望输出接近1;对于生成图片,希望输出接近0。 - 关键特性:同样必须可微分,通常也采用深度神经网络。
下图清晰地展示了GAN的数据流:
高斯白噪声 z
↓
生成器 G
↓
生成的假图片 G(z) -----------\
↓
判别器 D ---> 输出概率 D(·)
↑
真实图片 x (来自数据集) --------/对抗训练:一场迭代的“军备竞赛”
GAN的训练过程不是一步到位的,而是一个生成器和判别器交替训练、共同进化的迭代过程。我们可以通过“代际”的比喻来理解:
第一代:
- 生成器G₁:权重随机初始化,输入噪声
z,输出一些完全不像样的、类似噪声的图片G₁(z)。 - 判别器D₁:任务很简单。我们将真实的图片
x(标签为1)和G₁生成的糟糕图片G₁(z)(标签为0)一起喂给D₁进行训练。由于两者差异巨大,D₁能轻松学会区分。
- 生成器G₁:权重随机初始化,输入噪声
第二代:
- 生成器G₂:关键步骤。G₂的目标是“骗过”已经训练好的第一代判别器D₁。如何训练?我们将G₂和冻结了权重的D₁连接起来,形成一个新网络。输入噪声
z,希望这个串联网络的最终输出D₁(G₂(z))尽可能接近1(即让D₁认为G₂生成的是真图)。通过反向传播,只更新G₂的权重,G₂就学会了生成更能迷惑D₁的图片。 - 判别器D₂:在D₁的基础上继续训练,用真实的图片
x(标签1)和G₂生成的改进版假图G₂(z)(标签0),使D₂能重新准确区分。
- 生成器G₂:关键步骤。G₂的目标是“骗过”已经训练好的第一代判别器D₁。如何训练?我们将G₂和冻结了权重的D₁连接起来,形成一个新网络。输入噪声
迭代: 重复上述过程:训练G₃去骗D₂,训练D₃去区分G₃的假图和真图……如此反复。
最终,理想情况下,双方会达到一个纳什均衡点:生成器生成的图片分布 p_g 与真实数据分布 p_data 完全一致。此时,判别器对于任何输入,判断其为真的概率都是50%,相当于完全“瞎猜”,因为它再也无法区分真假。
目标函数:Minimax博弈的数学表达
GAN的训练目标可以用一个价值函数(Value Function)来形式化,这是一个极小极大博弈(Minimax Game):
让我们拆解这个公式:
x ~ p_data(x):表示从真实数据分布中采样图片x。z ~ p_z(z):表示从先验噪声分布(如高斯分布)中采样噪声z。D(x):判别器认为真实图片x为真的概率,理想情况是1。G(z):生成器根据噪声z生成的假图片。D(G(z)):判别器认为生成图片G(z)为真的概率。判别器希望它接近0,生成器希望它接近1。log D(x):当D(x)接近1时,此项接近0(因为log1=0)。log(1 - D(G(z))):当D(G(z))接近0时,此项也接近0(因为log1=0)。
判别器D的目标(内层max):最大化V(D,G)。
- 它希望
D(x)尽可能大(接近1),使第一项log D(x)变大。 - 同时希望
D(G(z))尽可能小(接近0):log(1 - D(G(z)))在D(G(z))=0时取到最大值0,D(G(z))越大这一项越负,所以D要极力把它压到0附近。 - 当D完美判别时,
D(x)=1,D(G(z))=0,则V(D,G) = log1 + log1 = 0。这是D能达到的最大值。
生成器G的目标(外层min):最小化V(D,G)。
- 它无法影响第一项(与真实数据
x无关),只能影响第二项。 - 它希望
D(G(z))尽可能大(接近1),这样log(1 - D(G(z)))就会变成一个很大的负数(因为log(一个接近0的正数)趋向于负无穷),从而拉低整个V(D,G)的值。 - 当G完美生成、使
D(G(z))→1时,第二项log(1 - D(G(z))) → -∞。这是G在判别器固定时能取到的最小值(理论下界)。
需要区分“单方最优”与“双方均衡”:上面D(x)=1, D(G(z))=0和D(G(z))=1都是固定对手时的单方最优。当双方同时达到最优、即p_g = p_data时,最优判别器对任何输入都输出D(x)=0.5,此时V(D,G) = log0.5 + log0.5 = -log4 ≈ -1.386,这才是博弈的均衡值。
这个均衡点既不是普通的极小值也不是极大值,而是价值函数的鞍点(Saddle Point):沿判别器参数方向它是极大,沿生成器参数方向它是极小,在该点梯度为零。一般神经网络的训练要尽量避开鞍点,GAN却要主动找到并停在这个鞍点上。理论上可以证明,在最优判别器下最小化V等价于最小化p_data与p_g之间的Jensen-Shannon散度(JSD),这一点在后续讲WGAN时会展开。
因此,训练过程就是交替执行以下两步:
D-step(判别器更新,k通常取1):
- 从噪声分布采样m个噪声
{z⁽¹⁾, ..., z⁽ᵐ⁾}。 - 从真实数据分布采样m个样本
{x⁽¹⁾, ..., x⁽ᵐ⁾}。 - 通过梯度上升更新判别器参数,以最大化目标函数:
G-step(生成器更新):
- 从噪声分布采样m个噪声
{z⁽¹⁾, ..., z⁽ᵐ⁾}。 - 通过梯度下降更新生成器参数,以最小化目标函数: 在实际实现中,常改用非饱和目标——最大化 。两者最优解相同,但梯度动态不同:训练初期 D 很容易把生成样本判假,后者的梯度更强,因此并非严格等价。
下图直观展示了训练过程中数据分布的变化:
初始状态:
真实分布 p_data (黑线) 与生成分布 p_g (绿线) 相差甚远。
判别器D (蓝线) 能清晰地将两者分开(高概率判真,低概率判假)。
训练中:
生成器G在判别器D的反馈下不断调整,p_g 逐渐向 p_data 靠拢。
判别器D的判别边界逐渐变得模糊,准确率下降。
理想均衡:
p_g 与 p_data 完全重合。
判别器D对于所有输入,输出概率均为0.5(完全随机猜测)。GAN的挑战与问题
尽管思想巧妙,但原始GAN在训练中面临着诸多挑战:
训练困难,难以收敛:
- 需要精心平衡生成器和判别器的训练强度。如果判别器训练得太强(太快达到最优),生成器的梯度会消失或变得不稳定,导致无法继续学习。
- 没有一个像传统损失函数那样单调下降的指标来监控训练进程,何时停止训练多凭经验。
模式崩溃(Mode Collapse,也常译作“模型崩溃”):
- 典型诱因是判别器训练得过快、过强(很快接近最优),生成器被压制得几乎没有可用的梯度,只能退而求其次:找到判别器最认可的那几个点,反复输出。
- 于是生成器不再覆盖整个真实数据分布,只生成极少数几类样本。例如生成人脸时,只输出同一张脸或寥寥几张脸,输出的多样性极低。
- 需要强调:GAN的目标是学到与真实数据同分布的新样本(看上去是人脸,但是各不相同的人脸),而不是复制某张真实图片;模式崩溃恰恰违背了这一点。
不适用于离散输出:
- GAN的训练依赖于通过判别器向生成器传递可微分的梯度。如果生成器的输出是离散的(如自然语言文本中的one-hot编码词),梯度将无法有效回传,导致训练失败。这使得原始GAN在文本生成等任务上应用困难。
📝 动手练一练
- 概念辨析:在GAN的“警察与伪币制造者”比喻中,为什么说生成器“从未见过真币”是这个模型精妙的关键?如果让生成器也能看到真实数据,训练过程会变成什么样?
👉 点击查看参考答案
关键点:生成器不见真实数据,迫使它只能通过判别器这个“中介”来理解什么是“真实”。这创造了一个纯粹的对抗环境。生成器的唯一目标就是让判别器犯错,而不是去直接模仿某一张具体图片。这有助于学习到真实数据的分布,而不是记忆单个样本。
如果生成器能见真实数据:训练可能会退化为一种简单的模仿或重建任务,生成器可能会倾向于直接复制或过度拟合某些真实样本,从而失去创造多样新样本的能力,也更容易导致模式崩溃。对抗博弈的本质会被削弱。
- 目标函数理解:假设在一个训练步骤中,对于一批生成图片,判别器给出的平均概率
D(G(z)) = 0.9。请计算此时生成器目标函数E[log(1 - D(G(z)))]这一项的近似值,并说明这个值对生成器训练意味着什么?
👉 点击查看参考答案
计算:log(1 - 0.9) = log(0.1) ≈ -2.3026。
含义:这个值是一个较大的负数(远离负无穷)。对于生成器来说,其目标是最小化这个值(即让它变得更负,趋向负无穷)。当前值-2.3表明生成器做得“还不错”,因为判别器以高达0.9的概率误判生成为真。但生成器仍需继续优化,目标是让 D(G(z)) 尽量接近1,使得 log(1 - D(G(z))) 趋向负无穷,从而最小化目标函数(注意这是判别器固定时的单方最优;双方均衡时 D(G(z)) 只能到0.5)。不过在实际中,我们常用 -E[log(D(G(z)))] 作为替代损失,此时该值为 -log(0.9) ≈ 0.1054,是一个需要被推向0的较小正数。
本章小结
本节我们深入探讨了生成对抗网络(GAN)的基本原理。GAN通过构建生成器与判别器这两个相互对抗的神经网络,以一种新颖的对抗博弈方式学习数据分布。我们理解了其Minimax目标函数的数学内涵,以及交替训练的动态过程。同时,我们也认识到原始GAN在训练稳定性和模式崩溃等方面的固有挑战,这些挑战也催生了DCGAN(2015)、WGAN(2017)、StyleGAN(2019)等一系列重要的改进工作。站在今天回看,GAN是2014年提出的开创性工作,图像生成的主流已转向扩散模型与多模态大模型,但它的“对抗训练”思想仍被广泛沿用。
📋 行动清单
- 复述核心思想:尝试用自己的话向他人解释GAN中生成器和判别器是如何通过对抗实现共同进化的。
- 推导目标函数:在纸上写出GAN的Minimax目标函数,并分别说明生成器和判别器在优化时各自关注哪一部分,以及理想的优化终点是什么。
- 思考改进方向:基于GAN的“训练困难”和“模式崩溃”问题,思考一下,如果让你来设计,可能会从哪些角度对原始GAN进行改进?(提示:损失函数、网络结构、训练策略)
2026视角
自2014年GAN被提出以来,生成式AI领域经历了爆炸式的发展。站在2026年的视角回看,GAN依然是深度学习史上最具影响力的思想之一,但其技术生态位已发生显著变化。
扩散模型成为主流:当前,基于扩散过程(Diffusion Models)的生成模型(如DALL-E 2/3、Stable Diffusion、Imagen)已在图像生成质量、多样性和稳定性上全面超越传统GAN,成为文本到图像、图像编辑等领域的绝对主流。它们从一个随机噪声出发,通过逐步去噪的迭代采样过程生成图像,避免了GAN训练中的模式崩溃和不稳定问题。
GAN的特定优势领域:尽管如此,GAN并未被淘汰,而是在特定场景中凭借其实时性和高效性坚守阵地。例如,在实时图像超分辨率、实时视频增强、风格迁移等对推理速度要求极高的任务中,经过良好训练的GAN模型(如ESRGAN、StyleGAN系列)因其单次前向传播即可生成结果,相比需要多步迭代的扩散模型,仍有不可替代的优势。
技术与思想遗产:GAN最重要的遗产是其“对抗训练”的思想。这一思想被广泛嵌入到其他模型中,用于提升生成质量或实现特定功能,例如在扩散模型中用判别器来增强细节(对抗性损失),或用于训练更鲁棒的分类器。此外,StyleGAN等工作的“隐空间解耦”研究,对理解深度生成模型的表征学习产生了深远影响。
统一于多模态大模型:如今的趋势是把生成能力整合进更大的多模态大模型——图像生成不再是一个独立的GAN/VAE/扩散模型,而是与视觉理解、推理一起出现在统一接口中(如GPT-4o、Gemini的图像生成)。生成任务不再是孤立的存在,而是与视觉理解、推理等能力紧密结合。
因此,学习GAN的原理,不仅是掌握一项重要的历史技术,更是理解现代生成式AI核心思想演进的基石。其对抗博弈的哲学,将持续启发新的算法设计。
—— 小象教研组