我有一个两部分的问题。
上下文 我正在学习 GAN 并从最简单的对抗性学习示例(1 参数节点)开始编写自己的内容,然后实现一个非常简单的 1 维模式(1010)学习 GAN .. 现在我正在尝试实现一个MNIST 学习 GAN,然后再进行更逼真的照片。
我有一些机器学习和数据挖掘的背景(很久以前的大师),并且对神经网络的工作原理有一定的了解。
您可以在此处阅读我在初始步骤中的进展:
我已经阅读了很多最新的博客、文章并观看了 youtube 教程,但仍然无法解决实现 MNIST 学习 GANS 的两个关键问题。
Q 1. 我看到模式崩溃了吗?
经过一些调整和迭代后,我有了一个 GAN,它确实学会了生成看起来可能来自 MNIST 数据集的图像。实际上它们还不是数字,但它们是可识别的笔划,当然不是随机噪音。
您可以在此处查看我的 pytorch 代码的最新迭代:github notebook。
当输入随机噪声时,经过训练的 GAN 总是生成相同或极其相似的图像。喂它 1-shot noise (00001000...) 也会生成类似的图像。
GAN 是否应该只生成一张图像?我们看到的不同图像是否来自 GAN 的单独训练?我认为这个想法是一个经过训练的 GAN 可以从随机输入噪声中生成许多不同的图像。我误解了吗?
Q 2. 如何逃脱模式-折叠?
如果上面的答案是训练 GAN 应该输出许多不同但有效的图像,那么我有模式崩溃。
我已经广泛阅读并尝试了许多避免模式崩溃的方法,但都没有奏效:
- 有/无批量标准化
- 有/没有最大池化
- 有/无辍学
- 带/不带标签软化
- 在输入和目标标签中添加/不添加噪声,包括随训练时间衰减的噪声
- 生成器的各种宽度和深度,鉴别器则更少
- 增加训练时间(但较差的计算能力只允许我在完整数据集上进行大约 6-10 个时期)
我观察到或注意到的是:
- 首先测试鉴别器的宽度/深度/架构,以确保它在用于 GAN 之前具有学习多类 MNIST 的能力,以避免出现鉴别器实际上无法学习鉴别 MNIST 的情况
- 绘制训练进行时的误差(D 误差,G 输入上的 D 误差)有助于显示 D 误差接近 1/2,而 G 输入上的 D 误差接近 1(更像是 0.8)。
- 绘图错误还显示某种稳定性或崩溃,这有助于调整学习率,例如
- 我本以为向输入或目标标签添加噪声可能会将 GAN 踢出任何模式崩溃的局部最小值,但我怀疑理论比这更复杂
- 对优化器参数尝试不同的建议没有帮助,我必须找到自己的最佳调整,并且学习率比其他人使用的要低得多,例如 Adam lr=0.00002 而不是 0.001 这会导致不稳定
- 更高的训练时期会产生高对比度的图像,这些图像看起来不像具有柔和边缘笔划的 MNIST 数据。我希望更高的训练时期能够提高输出的多样性
我找不到太多指导的一个领域是鉴别器和生成器的实际架构:
- 它们必须匹配但相反吗?我的不是——鉴别器被证明具有学习能力,仅此而已。之后越浅越好,以确保更容易地反向传播到生成器。
- 反卷积的使用在生成器中很常见,但是网上一些例子使用了简单的全连接映射。在计算上,反卷积具有较少的学习参数,并且直观地在构建图像时有意义。
我欢迎你的想法和建议。