生成对抗网络(GAN):原理、挑战与实践
1. 生成对抗网络(GAN)的训练
生成对抗网络(GAN)由生成器和判别器组成。在训练过程中,我们需要控制更新哪些网络的权重。当我们使用真实数据训练判别器时,希望只更新判别器的权重;而在训练生成器时,只更新生成器的权重。
控制层权重是否更新的机制因库而异,通常会使用“冻结(freeze)”“锁定(lock)”或“禁用(disable)”等术语来防止对给定层进行更新。后续训练判别器时,再“解冻(unfreeze)”“解锁(unlock)”或“启用(enable)”这些层,使其能够学习。
训练过程如下:
1. 从训练集中选取一个小批量(mini-batch)的点。
2. 按照交替训练判别器和生成器的四阶段过程进行训练。
1.1 网络测试
为了训练 GAN,我们从起始的高斯分布中随机抽取 10,000 个点作为训练集,使用 32 个点的小批量进行训练,将所有 10,000 个点通过系统一次称为一个 epoch。
训练 1 到 13 个 epoch 的结果如下:
- 初始高斯分布用蓝色点表示,其均值和标准差用蓝色圆圈显示。
- GAN 学习的分布用橙色表示,生成的小批量点的中心和标准差用椭圆显示。
- 每个图中只显示原始数据和生成数据的随机子集,以保持图的清晰度。
训练结果分析:
- 经过 1 个 epoch,GAN 生成的点在西南 - 东北方向形成一条模糊的线,大致以 (1,1) 为中心。
- 随着训练的进行,生成的点逐渐接近原始数据的中心和形状。
- 在第 4 个 epoch 左右,生成的样本会超过中心,形状变得越来越椭圆而不是圆形,但随后会逐渐调整,到第 13 个 epoch 时匹配效果良好。
判别器和生成器的损失曲线显示,它们似乎在略高于理想值 0.5 的位置相遇并保持稳定。理想情况下,判别器的损失应稳定在 0.5 左右,意味着它无法确定输入是来自真实数据集还是生成器。在这个小例子中,结果相当接近理想情况。
2. 深度卷积生成对抗网络(DCGAN)
对于处理图像数据,我们通常会使用卷积层,因为它们非常适合处理图像。由多个卷积层构建的 GAN 被称为深度卷积生成对抗网络(DCGAN)。
2.1 DCGAN 在 MNIST 数据上的训练
我们使用 Gildenblat(2020)提出的模型在 MNIST 数据上训练 DCGAN。生成器和判别器的结构如下:
| 网络 | 输入 | 中间层 | 输出 | 激活函数 |
|---|---|---|---|---|
| 生成器 | 100 | 1024(tanh) -> 6272(无激活函数) -> 7x7x128 -> 2x2 上采样 -> 64x(5x5)(same, tanh) -> 1x(5x5)(same, tanh) | 28 x 28 x 1 | tanh |
| 判别器 | 28 x 28 x 1 | 128x(5x5)(same, tanh) -> 2x2 下采样 -> 64x(5x5)(same, tanh) -> 2x2 下采样 -> 1024(tanh) | 1 | sigmoid |
在这个网络中,判别器使用显式的下采样(或池化)层,生成器使用上采样(或扩展)层,而不是将它们作为卷积步骤的一部分。生成器中的带点圆圈表示批量归一化(batchnorm)层,有助于防止过拟合。tanh 激活函数后的小 3D 框是一个重塑层,将第二个全连接层输出的 1D 张量转换为 3D 张量,以适应后续的上采样和卷积层。
训练时使用标准的二元交叉熵损失函数和 Nesterov SGD 优化器,学习率设置为 0.0005,动量设置为 0.9。生成器的第二个密集层使用 6,272 个神经元,这是为了使生成器和判别器处理的数据量相等。判别器第二个下采样层的输出形状为 7 × 7 × 128,即 6,272 个元素,通过给生成器的第二个全连接层 6,272 个值,我们可以为其第一个上采样层提供相同形状的张量。
2.2 DCGAN 训练结果
- 训练 1 个 epoch 后,生成器的输出几乎无法辨认。
- 训练 100 个 epoch 后,生成器能够生成可识别的数字,尽管存在一些错误,但大多数数字很容易辨认。这是一个惊人的结果,因为生成器从未见过数据集,只是通过不断接收反馈来学习将随机数转换为可识别的数字。
3. GAN 的挑战
3.1 结构和超参数敏感性
GAN 对其特定的架构和训练变量非常敏感。判别器和生成器需要在训练过程中保持平衡,如果其中一方过快地优于另一方,另一方将无法赶上。找到合适的架构和超参数组合对于获得良好的性能至关重要,但这可能具有挑战性。
3.2 收敛性问题
目前,我们没有证明 GAN 一定会收敛。与感知机不同,感知机在足够的训练时间内总能找到将两个线性可分数据集分开的线,但对于 GAN,这样的证明并不存在。虽然很多人找到了使部分 GAN 正常训练的方法,但不能保证所有 GAN 都能收敛。
3.3 处理大样本问题
当尝试训练生成器生成大尺寸图像(如 1000x1000 像素)时,GAN 会遇到问题:
- 计算问题:大量的数据使得判别器很容易区分生成的假图像和真实图像,同时尝试同时修复所有像素可能导致误差梯度使生成器的输出几乎随机移动,而不是接近匹配输入。
- 实际问题:处理大量大尺寸图像需要足够的计算能力、内存和时间。每个像素都是一个特征,一个 1000 像素边长的图像有一百万个特征(彩色照片则有三百万个特征)。
为了解决这个问题,可以使用渐进式生成对抗网络(Progressive GAN 或 ProGAN):
1. 将训练集中的图像调整为各种较小的尺寸,如 512 像素边长、128 像素边长、64 像素边长等,直至 4 像素边长。
2. 构建一个小型的生成器和判别器,每个网络只有几个卷积层,使用 4x4 图像进行训练。
3. 当这些小型网络表现良好时,在每个网络末尾添加一些卷积层,并逐渐融合它们的贡献,直到网络在 8x8 图像上表现良好。
4. 重复上述步骤,不断增加图像尺寸,直到能够处理全尺寸(如 1024 像素边长)的图像。
这种方法可以让生成器和判别器在成长过程中利用之前的训练成果,相比直接使用全尺寸图像进行训练,所需的时间要少得多。
3.4 模态崩溃问题
GAN 可能会利用训练中的漏洞,出现模态崩溃问题。当生成器成功生成一个判别器认为是真实的图像后,它可能会反复生成相同的图像,而不管噪声输入如何变化。这种情况下,判别器会认为所有输入都是真实的,生成器达到了目标但停止了学习。
模态崩溃分为两种情况:
- 完全模态崩溃:生成器只生成单一的样本。
- 部分模态崩溃:生成器生成少数几种相同或略有变化的输出。
解决模态崩溃问题的一种方法是使用小批量数据,并扩展判别器的损失函数,以衡量小批量输出的多样性。如果输出落入少数几个相同或几乎相同的组中,判别器可以为结果分配更大的误差,促使生成器多样化输出。
3.5 使用生成数据进行训练的风险
GAN 最常见的用途是训练一个能够欺骗判别器的生成器,然后丢弃判别器,使用生成器生成任意数量的新数据。然而,使用生成的数据(合成数据)训练另一个神经网络是非常危险的,原因如下:
- 生成器的输出可能存在误差和偏差,判别器可能无法完全检测到这些问题。
- 生成器的输出可能不完整,无法涵盖输入数据的整个范围。
- 我们难以完全捕捉到所有可能出现的问题,生成器可能会以一种看似满足要求但实际上数据不够多样化或真实的方式生成数据。
如果使用这样的合成数据训练新的系统,它会继承这些误差和偏差,可能导致在实际应用中做出有缺陷或不公平的决策。因此,一般来说,最好避免使用合成数据训练网络。
综上所述,GAN 是一种强大的生成模型,但在实际应用中面临着诸多挑战。通过了解这些挑战并采取相应的解决方法,我们可以更好地利用 GAN 生成高质量的数据。
下面是一个简单的 mermaid 流程图,展示了 ProGAN 的训练过程:
graph LR
A[原始训练集] --> B[调整图像尺寸]
B --> C[构建小型网络]
C --> D[使用 4x4 图像训练]
D --> E{表现良好?}
E -- 是 --> F[添加卷积层]
F --> G[融合新层贡献]
G --> H[使用 8x8 图像训练]
H --> E
E -- 否 --> D
H --> I[重复直至全尺寸图像]
同时,我们可以用表格总结 GAN 的不同挑战及解决方法:
| 挑战 | 描述 | 解决方法 |
| ---- | ---- | ---- |
| 结构和超参数敏感性 | 判别器和生成器需要平衡,超参数组合难寻 | 遵循经验法则,进行实验 |
| 收敛性问题 | 目前无收敛证明 | 无 |
| 处理大样本问题 | 计算和实际资源需求大 | 使用 Progressive GAN |
| 模态崩溃问题 | 生成器生成单一或少数相同输出 | 使用小批量数据,扩展判别器损失函数 |
| 使用生成数据训练风险 | 生成数据可能有误差和偏差 | 避免使用生成数据训练网络 |
4. 总结与实践建议
4.1 生成对抗网络的核心要点
生成对抗网络(GAN)由生成器和判别器两个部分组成。生成器的任务是学习创建与给定数据集相似的新数据,而判别器则负责区分生成器的输出和真实数据。二者在训练过程中相互学习、相互促进,最终目标是让判别器无法可靠地区分合成数据和真实数据。此时,通常会丢弃判别器,仅使用生成器来生成任意数量的新数据。
4.2 训练策略总结
- 交替训练 :训练过程采用交替步骤,确保生成器和判别器以大致相同的速度学习。例如,在训练判别器时,只更新判别器的权重;训练生成器时,只更新生成器的权重。可以通过“冻结”“锁定”或“禁用”等操作控制层权重的更新。
- 适用架构选择 :对于简单的 2D 数据集,使用由密集层构成的简单模型即可;若处理图像数据,则倾向于使用深度卷积生成对抗网络(DCGAN),因为卷积层更适合处理图像。
4.3 应对挑战的实用建议
- 遵循经验法则 :由于 GAN 对架构和超参数十分敏感,参考一些经验法则能为新的 DCGAN 训练提供良好的起点,但仍需进行大量实验来找到最优组合。
-
渐进式训练
:当处理大尺寸图像时,采用渐进式生成对抗网络(ProGAN)。具体步骤如下:
- 对训练集中的图像进行多尺寸调整,如从 512 像素边长依次缩小到 4 像素边长。
- 构建简单的生成器和判别器,使用最小尺寸(如 4x4)的图像进行初始训练。
- 随着训练推进,逐步添加卷积层并融合其贡献,不断增大训练图像的尺寸,直至达到全尺寸。
- 避免模态崩溃 :使用小批量数据进行训练,并扩展判别器的损失函数,以此衡量小批量输出的多样性。若输出缺乏多样性,判别器可分配更大误差,促使生成器多样化输出。
- 谨慎使用合成数据 :虽然生成器能生成大量新数据,但这些数据可能存在误差和偏差,使用其训练新网络会带来风险。因此,一般应避免使用合成数据进行训练。
4.4 未来展望
尽管 GAN 面临诸多挑战,但它在图像生成、数据增强等领域展现出了巨大的潜力。随着研究的不断深入和技术的持续发展,相信未来会有更多有效的方法来解决这些问题,进一步提升 GAN 的性能和稳定性。
以下是一个 mermaid 流程图,展示了 GAN 训练的整体流程:
graph LR
A[准备训练集] --> B[初始化生成器和判别器]
B --> C[开始训练循环]
C --> D[训练判别器]
D --> E{判别器训练完成?}
E -- 是 --> F[训练生成器]
F --> G{生成器训练完成?}
G -- 是 --> H{达到训练轮数?}
H -- 是 --> I[结束训练]
H -- 否 --> C
E -- 否 --> D
G -- 否 --> F
同时,我们可以用表格总结 GAN 训练的关键步骤:
| 步骤 | 描述 |
| ---- | ---- |
| 准备训练集 | 收集并整理用于训练的数据 |
| 初始化网络 | 初始化生成器和判别器的参数 |
| 训练判别器 | 使用真实数据和生成数据训练判别器,更新判别器权重 |
| 训练生成器 | 训练生成器,使其生成更逼真的数据,更新生成器权重 |
| 循环训练 | 重复上述训练步骤,直到达到指定的训练轮数 |
| 结束训练 | 完成训练,可使用生成器生成新数据 |
通过对生成对抗网络的深入理解和实践,我们能够更好地应对其带来的挑战,充分发挥其在各个领域的应用价值。
超级会员免费看
423

被折叠的 条评论
为什么被折叠?



