生成对抗网络(GAN)的损失函数设计与训练过程
字数 1088 2025-11-16 16:30:25
生成对抗网络(GAN)的损失函数设计与训练过程
我将为您详细讲解生成对抗网络(GAN)的损失函数设计与训练过程。这是一个深度学习中非常重要的生成模型算法。
题目描述
生成对抗网络由生成器(Generator)和判别器(Discriminator)两个神经网络组成,通过对抗训练的方式让生成器学习真实数据的分布。核心挑战在于如何设计合适的损失函数来平衡两个网络的训练,避免模式崩溃等问题。
损失函数设计原理
1. 原始GAN损失函数
原始GAN采用最小最大博弈的框架:
-
判别器损失:最大化区分真实数据与生成数据的能力
L_D = E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1 - D(G(z)))]其中D(x)是判别器对真实样本的判断,D(G(z))是对生成样本的判断
-
生成器损失:最小化被判别器识别的概率
L_G = E_{z~p_z}[log(1 - D(G(z)))]
2. 改进的损失函数设计
原始损失函数存在梯度消失问题,因此发展出多种改进版本:
最小二乘GAN(LSGAN)损失:
L_D = 1/2 E_{x~p_data}[(D(x) - 1)^2] + 1/2 E_{z~p_z}[D(G(z))^2]
L_G = 1/2 E_{z~p_z}[(D(G(z)) - 1)^2]
Wasserstein GAN(WGAN)损失:
L_D = E_{z~p_z}[D(G(z))] - E_{x~p_data}[D(x)]
L_G = -E_{z~p_z}[D(G(z))]
训练过程详解
步骤1:网络初始化
- 生成器G:输入噪声向量z,输出生成样本
- 判别器D:输入真实或生成样本,输出真伪概率
- 分别用较小的学习率初始化两个网络
步骤2:判别器训练
对于每个batch:
- 从真实数据分布采样m个样本 {x¹, x², ..., xᵐ}
- 从先验噪声分布采样m个噪声向量 {z¹, z², ..., zᵐ}
- 通过生成器得到生成样本 {G(z¹), G(z²), ..., G(zᵐ)}
- 计算判别器损失:
∇θ_d [1/m ∑ log D(xⁱ) + 1/m ∑ log(1 - D(G(zⁱ)))] - 更新判别器参数θ_d
步骤3:生成器训练
对于每个batch:
- 从先验噪声分布采样m个噪声向量 {z¹, z², ..., zᵐ}
- 计算生成器损失(原始版本):
或改进版本:∇θ_g [1/m ∑ log(1 - D(G(zⁱ)))]∇θ_g [-1/m ∑ log D(G(zⁱ))] - 更新生成器参数θ_g
步骤4:训练平衡策略
- 训练比例:通常判别器训练k步,生成器训练1步(k=1或5)
- 梯度裁剪:在WGAN中对判别器权重进行裁剪
- 谱归一化:稳定训练的重要技术
- 学习率调度:随着训练进行动态调整学习率
关键优化技巧
1. 模式崩溃应对
- 小批量判别:让判别器考虑样本间关系
- 特征匹配:匹配真实与生成样本的统计特征
- 历史平均:考虑参数的历史平均值
2. 训练稳定性提升
- 标签平滑:将真实样本标签从1改为0.9
- 实例噪声:在输入中加入噪声
- 梯度惩罚:WGAN-GP中使用的正则化方法
收敛判断标准
训练过程需要监控:
- 判别器损失与生成器损失的平衡
- 生成样本质量的视觉评估
- inception score(IS)和FID分数
- 特征空间的分布匹配程度
这个训练过程通过生成器与判别器的持续对抗,最终使生成器能够产生与真实数据分布高度相似的样本。