6.2 训练不稳定:震荡、梯度消失与对策


6.2 训练不稳定:震荡、梯度消失与对策

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 损失趋零),降学习率只是让碾压来得慢一点,正确的刀在平衡策略矩阵第二行。

本节要点回顾

  • 两大病灶:梯度消失(信号侧)与震荡(动力学侧),症状相似病因不同;
  • 两个掐断点:判别器输出压 0(账本层,非饱和账本保住 0.990 梯度)与 JS 平原(函数层,换 WGAN 拔除);
  • 震荡三层因:博弈无鞍点、步长过大、容量失衡,逐层排查;
  • 策略矩阵:按 D 准确率与损失形态下刀,先治判别器再动生成器;
  • 加噪声的刀:制造分布重叠抬升判别难度,幅度约取分布间距三分之一。

常见问题:震荡实战

怎么区分"正常波动"与"病态震荡"? 看样本质量与损失是否脱钩。正常博弈里损失围绕均值小幅波动、样本质量稳步向好;病态震荡时损失波幅增大且样本质量随之忽好忽坏,甚至周期性退回噪声。判定靠固定噪声批的纵向对比,不靠单点损失读数。

学习率是不是越稳越好? 不是。压得太低会训不动(表现为损失平坦、样本长期停滞),博弈需要一定的"探索力度"。健康带通常比判别器"刚好能跟上"略低半档,用 D 准确率落区反推:准确率偏高就把步子调小。

崩了以后能从 checkpoint 续训吗? 能,但建议回退到崩溃前若干步的存档并调参后再续,而不是原地重启——崩溃瞬间的参数状态往往已经处于病态区域,原地续训大概率重蹈覆辙。这也是 4.1 节"留对照日志"的另一个用处:知道崩在哪个存档点。

演算自测

某训练 D 损失趋近零、G 损失线性上升到 8 以上、样本千步不变。三连问:病灶?依据?第一刀?参考答案:病灶是判别器碾压引发梯度断供;依据是 D 损失趋零加样本停滞(本节矩阵第一行);第一刀降 k 或降判别器学习率,把 D 准确率压回 0.8 以内,若不缓解再查是否分布支撑不重叠(考虑换 WGAN-GP)。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U