GAN 的训练不稳定有两大学区:动力学侧的震荡(双方追逐导致参数绕均衡打转甚至发散)与信号侧的梯度消失(判别器过强或分布支撑不重叠时,生成器的梯度通道被掐断)。 本节用梯度幅值演算把两类病灶定位到具体环节,再给一张平衡策略矩阵。
庭审第二案。与模式崩溃的"假健康"不同,训练不稳定通常很难看:损失曲线像心电图、样本质量忽好忽坏、有时干脆崩成噪声壁纸。本案的方法论与前案一致:先定量定位病灶,再对症下药。
生成器的所有梯度都途经判别器(2.2 节)。这条通道有两个已知的掐断点。
掐断点一:判别器过度自信。 当判别器练到碾压,它对赝品的输出 D(G(z)) 趋近 0。代入两种生成器账本看梯度供给(2.2 节演算的延伸):
import numpy as np for d in [0.01, 0.1, 0.3, 0.5]: sat = d # 原始账本 log(1-D) 的梯度幅值(对 logit) non = 1 - d # 非饱和账本 -log D 的梯度幅值 print(f"判别器输出 D(G(z))={d:4.2f}: 原始账本梯度 {sat:.3f} | 非饱和账本梯度 {non:.3f}") # 输出: # 判别器输出 D(G(z))=0.01: 原始账本梯度 0.010 | 非饱和账本梯度 0.990 # 判别器输出 D(G(z))=0.10: 原始账本梯度 0.100 | 非饱和账本梯度 0.900 # 判别器输出 D(G(z))=0.30: 原始账本梯度 0.300 | 非饱和账本梯度 0.700 # 判别器输出 D(G(z))=0.50: 原始账本梯度 0.500 | 非饱和账本梯度 0.500
关键读数:判别器输出压到 0.01 时,非饱和账本也保住了 0.990 的梯度——所以工程上必用非饱和形式。但注意这只是账本层面的保险,如果判别器的函数本身在赝品区域变成平地(下一个掐断点),改账本也救不了。
掐断点二:JS 平原(2.4 节的余震)。 分布支撑不重叠时,最优判别器在不重叠区域输出恒 0 或恒 1,生成器所在区域的"地形"是平的。对策在第 3.4 节已宣判:换 WGAN 度量。此处补一笔账:换度量后判别器(评论家)输出的是无界实数,不存在"压到 0 后梯度消失"的机制——两类掐断点一次拔除。
即使梯度通道健康,博弈的动力学仍可能不稳。原因有三层。博弈层:2.1 节的收益矩阵实验已证明,无鞍点的博弈没有稳定策略对,双方在混合策略间循环——对应参数空间里绕均衡点的轨道运动。步长层:轨道上步子迈太大(学习率高、batch 小导致梯度噪声大),会从"绕行"变成"甩出"。容量层:双方容量失衡(判别器架构远强于生成器),追逐变成单方碾压,先触发梯度消失再连锁震荡。

| 诊断信号 | 病因判断 | 第一刀 | 第二刀 | 别用的刀 |
|---|---|---|---|---|
| D 准确率长期 >0.9 | 判别器碾压 | 降 k(少训 D) | 给真实样本加噪声、D 降容量 | 加大 G 学习率硬追 |
| D 准确率 <0.5 | 判别器失灵 | 升 k | D 加容量/去正则 | 再降 G 学习率 |
| 双方损失剧烈震荡 | 步长过大 | 学习率减半 | batch 加倍 | 同时动多个参数 |
| G 损失单边飙升 | 梯度断供 | 确认非饱和账本 | 换 WGAN-GP | 继续 BCE 硬扛 |
| 样本周期性"换脸" | 与崩溃混发 | 查 6.1 节覆盖率 | 小批量判别 | 只调学习率 |
一个经过反复验证的次序原则:先治判别器,再动生成器。判别器是知识的中介(1.3 节),中介出问题,学生怎么调都白搭。诊断优先看 D 准确率落区(0.5~0.8 健康区,2.3/4.1 节),再决定往哪边下刀。
再用一个轻量演算把"给真实样本加噪声"这把刀的效果说透——它对付判别器碾压的原理是给真伪分布制造重叠,抬升判别难度:
# 判别器过强时, 给真实样本加噪制造分布重叠 rng = np.random.default_rng(1) real = rng.normal(0, 0.5, 400) # 真实样本(窄分布) fake = rng.normal(4, 0.5, 400) # 生成样本(相距 4, 支撑不重叠) real_noisy = real + rng.normal(0, 1.2, 400) # 加噪后: 分布变宽, 两支撑开始重叠 print(f"加噪前: 真|假 两分布几乎无重叠样本(间隔4)") overlap = ((real_noisy > 2) ).mean() print(f"加噪后: 真样本越入中间地带的比例 = {overlap:.3f}") # 输出: # 加噪前: 真|假 两分布几乎无重叠样本(间隔4) # 加噪后: 真样本越入中间地带的比例 = 0.058 # 判别器不再能靠"位置"一刀切, 必须学更细的结构差异——生成器梯度通道重开
(噪声幅度按间隔比例选:约为双方间距的三分之一量级起步试探。)
⚠️ 常见坑:见到震荡就无脑降学习率。若病因是判别器碾压(D 损失趋零),降学习率只是让碾压来得慢一点,正确的刀在平衡策略矩阵第二行。
怎么区分"正常波动"与"病态震荡"? 看样本质量与损失是否脱钩。正常博弈里损失围绕均值小幅波动、样本质量稳步向好;病态震荡时损失波幅增大且样本质量随之忽好忽坏,甚至周期性退回噪声。判定靠固定噪声批的纵向对比,不靠单点损失读数。
学习率是不是越稳越好? 不是。压得太低会训不动(表现为损失平坦、样本长期停滞),博弈需要一定的"探索力度"。健康带通常比判别器"刚好能跟上"略低半档,用 D 准确率落区反推:准确率偏高就把步子调小。
崩了以后能从 checkpoint 续训吗? 能,但建议回退到崩溃前若干步的存档并调参后再续,而不是原地重启——崩溃瞬间的参数状态往往已经处于病态区域,原地续训大概率重蹈覆辙。这也是 4.1 节"留对照日志"的另一个用处:知道崩在哪个存档点。
某训练 D 损失趋近零、G 损失线性上升到 8 以上、样本千步不变。三连问:病灶?依据?第一刀?参考答案:病灶是判别器碾压引发梯度断供;依据是 D 损失趋零加样本停滞(本节矩阵第一行);第一刀降 k 或降判别器学习率,把 D 准确率压回 0.8 以内,若不缓解再查是否分布支撑不重叠(考虑换 WGAN-GP)。