跳到主要内容

GAN 基础【选修】

本节定位

GAN 最吸引人的地方是:

  • 它不是学“标签”
  • 而是学“像不像真的”

这让它在生成任务里很有魅力。
但它也非常容易让初学者发虚,因为训练方式看起来不像普通监督学习。

这一节的目标不是把 GAN 神秘化,而是把它还原成一场很具体的博弈:

生成器想骗过判别器,判别器想识破生成器。

学习目标

  • 理解生成器和判别器各自负责什么
  • 理解“对抗训练”为什么能推动生成质量提升
  • 通过可运行示例建立最小 GAN 训练直觉
  • 理解 mode collapse 和训练不稳为何高频出现

一、GAN 到底在做什么?

1.1 生成器

输入:

  • 随机噪声

输出:

  • 一个伪造样本

它的目标是:

  • 让样本看起来像真实数据分布里来的

1.2 判别器

输入:

  • 一个样本

输出:

  • 这个样本像不像真的

它的目标是:

  • 把真实样本和伪造样本区分开

1.3 一个类比

GAN 像假钞工厂和验钞机的对抗:

  • 假钞工厂越做越像
  • 验钞机也越识别越准

在不断博弈中,伪造样本质量提升。


二、为什么 GAN 会比“直接拟合像素”更有意思?

因为它不是让模型逐像素去复制一张图,
而是让模型学会:

  • 什么样的样本整体上更像真实分布

所以 GAN 更像在学:

  • 数据分布的“真假边界”

这也是它后来在图像生成里很有影响力的原因之一。


三、先跑一个最小 GAN 博弈示例

下面这个例子不会生成图片,
而是用一维数字来模拟真实分布和生成分布。

真实数据假设集中在:

  • 2.0 左右

生成器一开始输出很差,
然后不断往真实分布靠近。

real_samples = [1.8, 2.0, 2.2, 1.9, 2.1]


def discriminator_score(x):
# 越接近真实中心 2.0,越像真样本
return max(0.0, 1.0 - abs(x - 2.0))


generator_output = -1.0

for step in range(8):
score = discriminator_score(generator_output)
print(
f"step={step} generated={generator_output:.2f} "
f"disc_score={score:.2f}"
)

# 极简“更新”:往判别器认为更真实的方向移动
if generator_output < 2.0:
generator_output += 0.5
else:
generator_output -= 0.2

3.1 这个例子最该抓住什么?

它说明 GAN 的关键不是固定答案,
而是:

  • 生成器根据“真假反馈”不断调整

3.2 为什么这和普通分类训练感觉不一样?

因为目标本身会动。
判别器在变,生成器也在变。
这就是对抗训练不稳定的根源之一。


四、GAN 为什么经常训练不稳?

4.1 两边强弱不平衡

如果判别器太强:

  • 生成器学不到有效梯度

如果生成器太强:

  • 判别器分不出真假

4.2 目标本身在变化

普通监督学习里,标签不动。
GAN 里,生成器和判别器彼此改变对方的学习环境。

4.3 mode collapse 是什么?

最常见的一种坏情况是:

  • 生成器发现某一类样本特别容易骗过判别器
  • 就反复只生成那一小类

这就叫:

  • mode collapse

也就是:

  • 看起来“像”了
  • 但多样性丢了

五、GAN 适合什么时候学?

5.1 适合建立“生成模型不只有重建和似然”这条认知

它能帮你理解:

  • 还有一种从对抗信号出发学分布的路线

5.2 也适合看清生成模型训练为什么会难

GAN 是很好的反例教材:

  • 你会非常直观地看到训练不稳、模式崩塌这些问题

5.3 但不建议把它当成所有生成项目的默认起点

在今天很多任务里,
扩散模型往往更稳定、更主流。


六、最常见误区

6.1 误区一:GAN 就是“会生成图像的模型”

它更本质上是一种:

  • 对抗式生成学习方法

6.2 误区二:判别器越强越好

不对。
过强会让生成器学不到东西。

6.3 误区三:只看生成样本够不够像

还要看:

  • 多样性
  • 训练稳定性

小结

这节最重要的是建立一个判断:

GAN 的核心是通过生成器与判别器的对抗博弈逼近真实数据分布,它很强,但也天然带来训练不稳和多样性退化的风险。

只要这一点看清楚,后面你再学 VAE、扩散模型和更现代生成路线时,就会更容易比较它们的优缺点。


练习

  1. 把示例里的真实中心从 2.0 改成 5.0,观察生成器轨迹怎么变。
  2. 用自己的话解释:为什么 GAN 的训练目标比普通监督学习更容易不稳定?
  3. mode collapse 为什么会让“看起来生成得不错”的模型依然不好用?
  4. 如果你要做一个需要稳定训练的生成项目,你会优先考虑 GAN 还是更现代的方法?为什么?