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、扩散模型和更现代生成路线时,就会更容易比较它们的优缺点。
练习
- 把示例里的真实中心从
2.0改成5.0,观察生成器轨迹怎么变。 - 用自己的话解释:为什么 GAN 的训练目标比普通监督学习更容易不稳定?
- mode collapse 为什么会让“看起来生成得不错”的模型依然不好用?
- 如果你要做一个需要稳定训练的生成项目,你会优先考虑 GAN 还是更现代的方法?为什么?