GAN

引入

生成对抗网络(GAN, Generative Adversarial Network) 与之前讲到的 VAE、PixelCNN 等显式概率建模方法的根本区别:

生成模型类型 是否显式建模数据的概率密度函数(pdf)? 是否能评估 p(x)(图像的概率)?
VAE、PixelCNN 是的,它们尝试建模或逼近 p(x) 可以估计或计算(如下界)
GAN 否,不建模密度函数 不能评估 p(x),也没有下界

“我们将完全放弃尝试明确地模拟图像的密度函数”

GAN 不关心 p(x),也不去用公式描述它,它不关心图像的“概率”。

“我们不再关心能够计算图像的密度,甚至一些下限或密度的近似值”

VAE 需要最大化密度下界 ELBO(Evidence Lower Bound),GAN 完全不用这套概率论推导。

“而是使用通用对抗网络,我们唯一关心的是能够从一些密度中采样数据”

GAN 的目标是:我能不能“画出”(采样出)像训练数据那样的图片?

不管它属于哪个分布,反正要让人看不出真假。

“我们关心的是采样,我们不关心实际写下或吐出我们的训练数据的可能性”

GAN 关注 生成能力(sampling ability),而不关心 生成结果的概率是多少,也就是说,不评估“这个图像有多大概率出现”,只管“它像不像”。

总结:

GAN 不建模图像的概率函数,只关心生成图像是否真实、逼真,看起来像是从训练数据分布中采样的。


GAN roughly基本原理: 零和博弈

目标问题(Problem Setup)

我们有一个真实数据集 xi ∼ pdata(x)

但是 我们无法显式地建模或评估这个真实分布 pdata

现在我们要解决的问题是:

如何从这个神秘但真实的数据分布 pdata 中生成新样本?

GAN 的核心思想(Key Idea)

1. 定义一个潜变量 z ∼ p(z)

这个 p(z) 是一个简单的分布(比如高斯分布),我们可以从中轻松采样。

2. 用一个生成器网络 G(z) 将潜变量映射为样本 x = G(z)

这就定义了一个“隐式分布” p_G(x),就是生成器生成的图像分布。

3. 最终目标:让生成器生成的图像分布 pG(x) ≈ pdata(x)

也就是说,生成器学会“模仿”真实世界的数据分布。

GAN 的结构(Two Networks)

网络 作用 输入 输出
生成器 G 生成图像 z ∼ p(z) 生成图像 x = G(z)
判别器 D 分辨真假 图像 x 输出 0(假)或 1(真)

训练方式:对抗学习(Adversarial Training)

这两张网络是 一对对手

  • 判别器 D 学习如何分辨真假图像(监督任务:真假标签是已知的)
  • 生成器 G 学习如何“欺骗”判别器,让生成图像尽可能被判别为真图

最终目标是:

生成器越强,判别器越难分辨;当判别器无法分辨真假时,说明生成器已经成功地模仿了数据分布。

为什么叫对抗网络?

因为:

  • 判别器 D 在最大化分辨能力(判别准确率);
  • 生成器 G 在最小化判别器的分辨能力(尽量骗过它);
  • 两者对抗博弈,直到达到纳什均衡。

直觉总结

  • GAN 不建模 pdata(x) ,也不会告诉你某张图片的概率是多少;
  • GAN 的目标是 让生成的图像“以假乱真”
  • 它通过“博弈”方式学习逼近真实数据分布。

核心公式

minGmaxD(𝔼x ∼ pdata[log D(x)] + 𝔼z ∼ p(z)[log (1 − D(G(z)))])

各部分解释

第一项:

𝔼x ∼ pdata[log D(x)]

  • 这是对 真实数据 的期望。
  • 判别器 D 想要 把真实样本判为真(输出接近 1),因此它试图 最大化 这个项。
  • 生成器对这个项没影响,因为它只涉及真实样本。

第二项:

𝔼z ∼ p(z)[log (1 − D(G(z)))]

1. 公式含义:

  • z ∼ p(z) :从潜在变量的先验分布(例如标准正态分布)中采样。
  • G(z) :把潜在变量 z 输入生成器,生成一个伪造的样本 x
  • D(G(z)) :把这个伪造的样本输入判别器,判别器会输出一个接近 0(假)或 1(真)的概率。
  • log (1 − D(G(z))) :生成器希望这个值小,说明判别器认为伪造样本是假的。

2. 意义 - 这是对 生成数据(假数据)** 的期望。 - 判别器 D 想要 把假的样本判为假(输出接近 0),所以它试图最大化这个项。 - 生成器 G 想要 欺骗判别器,即让 D(G(z)) 趋近于 1,从而最小化这个项。

GAN 的训练目标

  • 判别器 D:训练得更聪明,能分清真假图像;
  • 生成器 G:训练得更狡猾,生成更像真的图像;
  • 最终达到:生成的图像足以“骗过”判别器
角色 目标 优化方向
判别器 D 最大化整体目标 提高识别真假图像的能力
生成器 G 最小化整体目标 让假图像看起来像真的,骗过 D

训练过程以及问题

训练过程:交替梯度更新

如图所示,我们用交替更新的方法进行训练:

  1. 更新判别器 D:最大化目标函数中的两项。

  1. 更新生成器 G:最小化第二项。


⚠️面临的两个核心问题:

1. 梯度消失(Vanishing Gradients for G)

如右图所示,在训练初期:

  • 生成器 G 很差,生成的图像容易被判别器识破。
  • 因此 D(G(z)) ≈ 0
  • 此时 log (1 − D(G(z))) ≈ log (1) = 0 ,而它的梯度也接近 0。
  • 所以 G 得不到有效的梯度更新,学不动了

解决方法:将 G 的目标函数换成最大化 log D(G(z)) ,让梯度更稳定(不那么容易趋近于 0)。

2. 博弈训练不稳定

因为 G 和 D 是两个对立目标的神经网络,训练很容易陷入以下情况:

  • D 太强,G 无法改进。
  • G 太强,D 失去判断力。
  • 容易出现震荡、模式崩溃(mode collapse)等现象。

解决梯度消失:非饱和性 loss

目标函数的原始形式(饱和式 loss)

在标准 GAN 中,生成器 G 的目标是最小化:

minG 𝔼z ∼ p(z)[log (1 − D(G(z)))]

这个函数在训练早期会面临 梯度消失,原因是:

D(G(z)) ≈ 0 (即判别器很确信是假的),

我们来看:

  • log (1 − D(G(z))) ≈ log (1) = 0
  • 导数:

,但:

然后再链式回传到 G:

可问题是当 D(G(z)) ≈ 0 时,虽然分母是稳定的(1 附近),但 D(G(z)) 本身非常平坦,其梯度 也几乎为 0

非饱和式 loss:最大化 log D(G(z))

我们改成最大化下面这个:

maxG 𝔼z ∼ p(z)[log D(G(z))]

这个形式其实没有改变最终的最优点(Nash equilibrium),但早期训练阶段提供了更大的梯度

  • 当 $$D(G(z)) ,

D(G(z)) -$$

⇒ loss 非常大,梯度非常大

  • 导数:

D(G(z)) → 0 ,这个梯度会非常大,反而推着 G 快速更新、变好

公式推导:min-max 推到 JS 散度

目标函数起点:

我们从 GAN 的原始 min-max 目标函数出发:

minGmaxD(𝔼x ∼ pdata[log D(x)] + 𝔼z ∼ p(z)[log (1 − D(G(z)))])

换个记法,把生成器生成的分布记为 p_G,我们将目标函数写成:

minGmaxD(𝔼x ∼ pdata[log D(x)] + 𝔼x ∼ pG[log (1 − D(x))])


Step 1:求解判别器的最优解 Missing superscript or subscript argumentD^

对于固定的 G,我们优化 D,最大化如下项:

V(D) = ∫x[pdata(x)log D(x) + pG(x)log (1 − D(x))]dx

这是一个点对点的最优化问题,对每个 x,我们最大化:

f(D(x)) = alog D(x) + blog (1 − D(x))  其中 a = pdata(x), b = pG(x)

对这个函数求导并设为 0:

解得最优解为:

Step 2:代入最优 D^ 回目标函数*

我们将这个 D^*(x) 代入原目标函数:

Step 3:变形为 KL 散度形式

我们对上式两项同时乘以 2 并加减 log 4 ,写成:

上式中出现了两个 KL 散度:

[

]

Step 4:识别出 Jensen-Shannon 散度 根据 Jensen-Shannon 散度的定义:

[

]

所以上面目标函数的最终形式是:

minGV(G, D*) = −log 4 + 2 ⋅ JSD(pdatapG)

所以,训练 GAN 的目标就是让生成器 G 产生的分布 p_G 和真实数据分布 p_{} 之间的 Jensen-Shannon 散度最小化

pG = pdata 时,JSD 为 0,目标函数达到最小值 -,这就是 GAN 训练在理论上可以完美拟合数据分布的数学基础。


生成对抗网络(GAN)理论最优性的局限性

总结部分回顾

我们前面得出结论:

  • 最优的判别器为:

  • 当生成器学出了真实分布 pG = pdata ,min-max 博弈达到全局最小值。

Caveat 1:表达能力受限(Representation Limit)

“G and D are neural nets with fixed architecture. We don’t know whether they can actually represent the optimal D and G.”

解释:

  • 数学推导中我们默认 G 和 D 是“万能函数”(即可以拟合任意复杂函数)。
  • 但在实际中,G 和 D 是有限容量的神经网络,它们只能表示一小部分函数(受限于网络深度、宽度、非线性结构等)。
  • 所以:
  • 真实的最优判别器 D* 和最优生成器 G* 可能无法被当前的模型结构表达
  • 也就是说:存在解 ≠ 我们的模型能学到这个解

Caveat 2:收敛性问题(Convergence Problem)

“This tells us nothing about convergence to the optimal solution.”

解释:

  • 数学推导告诉我们全局最优点在哪,但它没有说明训练过程是否一定会到达那里
  • 实际训练是一个 非凸优化问题 + 非稳定对抗博弈,很容易出现:
  • 梯度消失
  • 模式崩溃(mode collapse)
  • 振荡、不收敛
  • 所以:
  • 即使我们的网络有足够能力表示最优 G 和 D,也不代表训练一定能收敛到那个点
  • GAN 实际训练更像是“调参艺术”,而不是完全可控的优化。

总结

虽然 GAN 理论推导显示其目标函数在 pG = pdata 时可以达到最优(JSD 为 0),但:

问题 描述
表达能力 G 和 D 是有结构限制的神经网络,不一定能拟合理想最优函数
收敛性 理论没有保证训练过程一定能到达最优点,实际可能陷入震荡或局部最优

这就是为什么你学 GAN 不光要懂理论,还得调 optimizer、batch size、判别器训练次数、架构深度……因为理论只是告诉你山顶在哪,但训练能不能爬到山顶是另一回事。

JS 散度的病根

S 散度在生成模型中会出现“梯度消失”(训练停滞)尤其是当真实分布和生成分布没有重叠时。

Jensen-Shannon 散度(JS divergence)回顾

对于两个分布 p 和 q,JS 散度定义如下:

其中:

解释:

JS 散度度量的是两个分布之间的“对称”差异(相比于 KL 是非对称的)。它的值范围在 [0, log 2] 之间。

问题出现的场景:真实分布和生成分布完全没有重叠

也就是支持集是 disjoint 的,比如:

  • 真实数据在图像空间的一个子区域
  • 生成器初期在完全不同的地方胡乱生成

这时 pdata(x) > 0 的地方, pG(x) = 0 ,反之亦然。

这时 JS 散度变成了常数

我们来分析:

由于 p 和 q 没有交集(overlap),合成分布 ,那么:

  • 在 p(x) > 0 的地方,
  • 在 q(x) > 0 的地方,

所以:

同理:

KL(qm) = log 2

所以最终:

结论:JS 散度是常数 → 无梯度 → 无法优化

GAN 中的体现:

在 GAN 的训练过程中,loss:

𝔼x ∼ pdata[log D(x)] + 𝔼z ∼ p(z)[log (1 − D(G(z)))]

如果判别器已经“太厉害”,能完全区分真假,那就会出现:

  • D(x) ≈ 1 ,对于真实样本
  • D(G(z)) ≈ 0 ,对于生成样本

于是:

  • log D(x) ≈ 0
  • log (1 − D(G(z))) ≈ log 1 = 0

整个 loss 基本趋近于常数,梯度消失,G 学不到任何信息。

总结

情况 解释 JS 散度 是否有梯度
分布完全不重合 G 初期生成数据远离真实分布 固定为 无梯度,训练停滞
分布稍有重合 G 较好但未完全学到 JS < 有梯度
分布重合 G 生成数据等于真实分布 JS = 0 收敛完成

解决方案

  • Wasserstein GAN:即使分布不重叠,也能给出“有意义”的距离 → 有梯度
  • Label Smoothing / Feature Matching:也是缓解梯度消失的 tricks,但本质问题在于 loss 本身

从传统的 min-max 推到Wasserstein GAN(WGAN)

Goal

我们要将传统 GAN 的目标函数从 Jensen-Shannon 散度(JS):

minGmaxDV(D, G) = 𝔼x ∼ pdata[log D(x)] + 𝔼z ∼ p(z)[log (1 − D(G(z)))]

替换为 Wasserstein 距离_:_

W(pdata, pG)

Step 1:定义 Wasserstein 距离

对两个分布 p 和 q,一阶 Wasserstein 距离定义为:

W(p, q) = infγ ∈ Π(p, q)𝔼(x, y) ∼ γ[∥x − y∥]

其中 Π(p, q) 是所有边缘分布为 p, q 的联合分布。

这个定义太难直接优化。我们采用Kantorovich-Rubinstein 对偶形式(关键一步!):

W(p, q) = supfL ≤ 1𝔼x ∼ p[f(x)] − 𝔼x ∼ q[f(x)]

其中,f 是 1-Lipschitz 函数(即对任意 x, y,有 |f(x) - f(y)| |x - y|)。

Step 2:替换 GAN 的目标为 Wasserstein 距离

传统 GAN 中,判别器输出的是真假概率 D(x) ∈ [0, 1] ,但在 WGAN 中,我们让判别器 f 输出一个实数,代表对真假分布之间“拉开的距离估计”。

我们优化:

minGmaxf ∈ Lip-1𝔼x ∼ pdata[f(x)] − 𝔼z ∼ p(z)[f(G(z))]

这里的 f 就是我们之前的判别器,只不过它现在不输出概率,而是输出实数,且被限制为 1-Lipschitz 函数。

Step 3:判别器优化目标

maxf ∈ Lip-1𝔼x ∼ pdata[f(x)] − 𝔼z ∼ p(z)[f(G(z))]

这就是估计 Wasserstein 距离。

Step 4:生成器优化目标

固定判别器(也称为“critic”) f 之后,生成器优化:

minG𝔼z ∼ p(z)[f(G(z))]

也就是说,尽量让生成数据在 f 的评价下得分高 —— 而判别器 f 会学习在真实数据和生成数据之间拉开距离。

为什么更稳定?对比 JS 和 W

  • JS 距离问题:当两个分布没有重叠时(支持集 disjoint),JS divergence 是一个常数 → 无梯度,训练停滞。
  • Wasserstein 距离:即使分布不重合也有有意义的距离梯度。
分布支持集相交? JS 散度梯度 W 距离梯度
0 非 0
不稳定 平滑

实现技巧(附加)

WGAN 中 1-Lipschitz 的约束要靠以下方法实现:

  1. 权重裁剪(原始 WGAN):将判别器的参数限制在 [-c, c]。
  2. 梯度惩罚(WGAN-GP):在输入上计算判别器的梯度,并加上惩罚项:

λ(∥∇f()∥2 − 1)2


GAN 潜在空间的语义结构性

潜在空间的插值(interpolation)潜在空间的向量运算(vector arithmetic)

一、潜在空间插值(Latent Space Interpolation)

原理

StyleGAN 是一个生成模型,它的输入是一个随机向量 z ∼ 𝒩(0, I) ,这个向量位于一个高维的潜在空间(latent space)。模型学习了如何从这个空间中的任意一个向量生成一张“合理”的图像。

插值,就是我们拿两个向量 z1 , z2 ,计算它们之间的线性插值

z(t) = (1 − t) ⋅ z1 + t ⋅ z2,  t ∈ [0, 1]

然后把 z(t) 输送进 StyleGAN 中,观察输出图像的变化。

效果

  • 如果模型仅仅是记忆了训练图像,那么插值结果会很奇怪(混乱、跳变)
  • 但在实际中,StyleGAN 插值后的人脸会连续地变化:性别、发型、角度、背景光照等缓慢变化
  • 这说明了模型学到的是一个连续语义空间,而不是“记住了离散样本”

二、潜在空间的向量运算(Vector Arithmetic)

原理

在之前的 DCGAN 实验中,我们发现可以对潜在向量做“加减法”,结果仍然有语义意义,比如:

zsmiling man = zsmiling woman − zneutral woman + zneutral man

这个“类比推理”之所以成立,是因为 GAN 的潜在空间近似是线性的,每个方向可能对应于某个语义维度。

在 StyleGAN 中,作者发现如果不直接用输入 z,而是用一个通过 MLP 映射的中间潜在向量 w  ∈ 𝒲 ,这个空间比 𝒵 更解耦、更线性,更适合进行语义运算。这就是 StyleGAN 相较于传统 GAN 的创新点之一。

三、从视觉角度理解

  1. 插值的“平滑性” 说明了:模型学到的潜在空间中,不同的点对应着语义连续的图像。
  2. 向量运算的“可控性” 表示:GAN 潜在空间存在“方向”,这些方向可以控制属性(如性别、年龄、微笑、戴眼镜)。

四、总结类比

技术手段 本质原理 意义
插值(interpolation) 潜在空间中线性插值 z(t) 展示空间的连续性和非记忆性生成能力
向量运算(arithmetic) 潜在空间中方向具有语义(某一维代表“微笑”或“年龄”) 潜在空间具有线性、解耦的结构

发展历程

一、最初的 GAN 结果(2014)

背景:

Goodfellow 提出 GAN 的那一年(2014),尽管是早期尝试,但就已经能生成一些:

  • 手写数字(MNIST)
  • 人脸图像(LFW)

亮点:

对比了生成图像和最近邻图像,发现生成样本不是直接从训练集中“抄袭”,而是真正“学会了”生成新的、相似的样本。

二、DCGAN(2015-2016):第一个成功的稳定 GAN 架构

关键点:

  • 使用 卷积神经网络(CNN) 替代 MLP
  • 提高了稳定性和生成质量

生成例子:

  • 生成卧室图像(LSUN 数据集)
  • 能学出卧室的结构:窗户、床、墙、灯、家具

潜在空间插值:

  • 将两个随机向量 z1 , z2 线性插值
  • 发现 图像在 z 空间中会连续变化,这表明 GAN 学到了一个连贯的低维潜在空间

三、潜在空间的向量运算(2016)

例子:

  • 平均多个潜在向量得到“平均脸”
  • 做潜在向量加减运算:

zsmiling man = zsmiling woman − zneutral woman + zneutral man

现象:

  • 得到的结果“真的有意义”,比如会出现微笑的男人、戴眼镜的女人

意义:

  • 潜在空间学到了一些“语义方向”
  • 向量之间的线性变化可以控制属性(微笑、眼镜、性别)

四、GAN 爆炸式发展(2016–2018)

证据:

  • GAN Zoo 网站汇总大量 GAN 变种
  • 论文数量年年倍增,研究者争相提出新变种

五、关键进展总结

1. Wasserstein GAN(WGAN)

  • 使用 Earth-Mover 距离(Wasserstein Distance)
  • 优点:训练更稳定,避免梯度消失
  • 更容易判断训练是否收敛

2. Progressive GAN(渐进式训练)

  • 提高分辨率从低到高(如从 4 )
  • 生成的图像质量大幅提升(如超高清人脸)
  • 例如人脸图像看起来极其逼真,很难分辨真假
阶段 特点 技术突破
2014 初代 GAN,结构简单 手写数字/人脸生成
2015–2016 DCGAN 稳定性、卷积结构
2016 潜在空间操作,语义向量学习 向量计算模拟属性变化
2017 Wasserstein GAN 解决梯度消失问题
2018–2019 Progressive GAN、高分辨率生成 达到真实人脸级别效果

 Conditional GAN(条件生成对抗网络及其一系列 应用和发展趋势**

一.Conditional GAN?

传统 GAN 是无条件的,生成器 G(z) 只是接收一个随机噪声向量 z,生成图像。但如果我们希望:

  • “生成一张微笑的女性人脸”
  • “输出一张猫的图像”
  • “将这张马的图像变成斑马”

这时我们就需要引入 条件变量 y,于是生成器变成:

G(z, y)

而判别器也要接受条件:

D(x, y)


二、如何把标签 y 加入网络?(条件 BatchNorm)

非常成功的技术——Conditional Batch Normalization(CBN)

普通 BN 条件 BN(CBN)
归一化后再乘以固定的 _j 和加 _j 归一化后乘以跟类别 y 有关的 y_j、y_j
无法感知标签 每类标签都有自己的归一化参数,有助于信息注入与控制

左边:普通 Batch Normalization (BN)

标准的 BN 过程如下,对第 j 个特征通道:

  1. 计算均值和方差(在 mini-batch 中):

  1. 归一化

  1. 线性变换(可学习参数)

yi, j = γji, j + βj

其中 γj , βj 是每个通道上的学习参数。

右边:Conditional Batch Normalization (CBN)

CBN 与 BN 的区别在于 缩放和偏移系数( γ , β * * )依赖于条件标签** y:

yi, j = γjyi, j + βjy

也就是说,对于每一个类别 y,都使用不同的 γy , βy

它解决了什么问题?

在 Conditional GAN 中,我们希望生成图像的类别能够受标签控制。

  • 如果直接将标签 y 连接进网络,难以稳定训练;
  • 而 CBN 将标签信息显式注入每一层的归一化中,这使得网络从底层就受到“类别偏好”的调制。

数学本质

CBN 就是在标准 BN 的基础上,把:

(γj, βj) → (γjy, βjy)

也可以理解为:

  • CBN 是一个 类别条件下的仿射变换(Affine Transform)
  • 类似于为每个类设置一套“风格参数”。

应用场景

  • BigGAN(ImageNet 上的高分辨率图像生成)
  • StyleGAN2-ADA(类别引导图像合成)
  • 图像翻译(如:语义分割图 → 图像)

三、条件 GAN 的应用案例

应用类型 条件变量 y 输出 x 示例
图像分类生成 类别标签(如”狗”、“消防车”) 图像 BigGAN 在 ImageNet 生成高清图
图像超分辨率 低分辨率图像 高清图像 SRGAN
图像到图像翻译 语义图、草图、照片等 真实图像、风格图 pix2pix, CycleGAN
文本到图像生成 一句话(自然语言) 图片 StackGAN, AttnGAN
视频生成 前几帧或其他提示信息 连续帧 GAN for video
人类轨迹预测 历史轨迹 未来移动轨迹 SocialGAN(作者论文)

四、未来趋势 & 进化方向

  1. BigGAN(2019):提出使用大模型 + trick(如Spectral Norm、Self-Attention)在 ImageNet 上生成 512x512 的高质量图像。
  2. Self-Attention GAN(SAGAN):加入自注意力模块提升长距离结构建模能力。
  3. CycleGAN:实现 非配对图像翻译(如马 ↔︎ 斑马),关键创新是 cycle consistency loss。
  4. 多模态条件:从简单标签 y 扩展到语言描述、图像、布局、风格等复合条件。

五、核心价值总结

特性 GAN 做到了什么?
控制能力增强 通过条件变量控制输出内容类型
潜在空间结构性 插值/向量运算体现结构语义
多模态交互 结合语言、图像、风格等多模态信息
应用领域不断扩展 不止图像,还能生成视频、轨迹、声音甚至代码等多模态数据