文章目录

  • 1 什么是GAN?
  • 2 GAN存在的问题
  • 3 训练的经验
    • 3.1 不要纠结于损失函数的选择
    • 3.2 关于增加模型的容量
    • 3.3 尝试改变标签
    • 3.4 尝试使用 batch normalization
    • 3.5 尝试分次训练
    • 3.6 最好不要提早结束
    • 3.7 关于k的选择
    • 3.8 关于学习率
    • 3.9 增加噪声
    • 3.10 不要使用性能太好的判别器
    • 3.10 可以尝试最新的multi-scale gradient方法
    • 3.11 可以尝试使用TTUR
    • 3.12 使用Spectral Normalization
  • 4 正常的损失函数波动情况
  • 参考

自从 GAN 提出后,它变得越来越火热,吸引了众多的爱好者前来学习实践。

但是只要你自己去从无到有写出一个 GAN 模型并运行,除非你运气太好,大多数情况下你都会发现自己的GAN并不能很好地 work 。

下面首先对 GAN 进行简要的介绍,然后整理了我自己在 GAN 的设计网络结构、调整参数等方面的经验。

1 什么是GAN?

GAN 是一种生成模型,由知名的学者 Ian Goodfellow 首先提出,并给出了实验结果和理论推导 https://papers.nips.cc/paper/5423-generative-adversarial-nets.pdf 。

它以造假币为例对 GAN 的工作原理进行解释,生成器(Generator)就像造假币的人,判别器(Discriminator)就像警察,原始数据的分布类比于真钱,生成的数据分布类比于假钱。

造假币的人不断模仿真钱去造假币,造出来的钱混入真钱一同交给警察去判断。造假币的人的目的是让自己造出来的假币不断逼近于真钱,而警察既需要认出假钱、又不能冤枉真钱。

两者以此方式,不断地对抗提升自己造假和打假的能力,最终理想的结果是使得造假币的人能造出几乎无法辨识的假钱成功迷惑警察。

2 GAN存在的问题

  • 训练不稳定,损失值波动幅度大
  • 判别器收敛迅速,损失值快速降到零
  • 生成器无能为力,损失函数不断增大

3 训练的经验

3.1 不要纠结于损失函数的选择

刚开始你可能会认为损失函数对结果会产生较大的影响,但是实践证明,一般来说其对结果的影响一般并没有你想象的那样大。

因此,对于 GAN 理论入门不久,正在打开实践大门的人,我的建议是选择最简单的损失函数就可以开始实验了。

因为后续还有好多事情值得你去头疼,微调损失函数可以留到最后一步再考虑。

3.2 关于增加模型的容量

当GAN生成的图像不够准确、清晰时,可尝试增加卷积层中的卷积核的大小和数量,特别是初始的卷积层。

卷积核的增大可以增加卷积的视野域,平滑卷积层的学习过程,使得训练不过分快速地收敛。

增加卷积核数(特别是生成器),可以增加网络的参数数量和复杂度,增加网络的学习能力。

但同时也可能存在,增加生成器的模型 capacity 但是对于它快速被判别器打败的事实无济于事的情况,每个人都使用不同的模型和数据,会有不同的情况,需要具体问题具体分析。

3.3 尝试改变标签

如果使用的是真实数据标签为1,生成数据标签为0的分配方法,可将其交换为真实数据标签为0,生成数据标签为1。

这个小技巧会帮助网络在早期快速进行梯度计算,帮助稳定训练过程。

此外,还可使用软标签和带噪声的标签。

所谓软标签指不是使用0和1作为标签,而是使用和0或1接近的小数来标记,这样会减弱梯度的传播速度,稳定训练。

而使用带噪声的标签指对少数的标签进行随机的扰动,这也是一个帮助训练的小技巧。

3.4 尝试使用 batch normalization

我在实践的过程中使用 batch normalization ,发现对结果的提升具有明显的帮助,它在每一层都对数据进行归一化,有利于防止数据发散,进而保护训练的过程与结果的稳定性。

3.5 尝试分次训练

对于一般的 GAN 模型和多分类问题,最好分次训练,一次只训练一个类别,以降低网络训练的难度并提高准确性。

而对于条件 GAN 等,比如可以将类比标签一同作为输入,以类别为先验条件的 GAN ,可适度增大训练的难度。

3.6 最好不要提早结束

有时候我们会看到自己模型的损失函数在几个batch训练过后就停止波动了,但是这个时候先不要为了节省时间而提前停止训练,实践证明这个时候网络很可能仍然在不断地调整结构中。

有时候损失函数也可能突然出现很大的异常波动,这个时候也不要马上提前停止训练,多观察一会儿。

非常建议在训练的过程中,通过保存等方式不断记录当前时刻下的训练结果。通过对结果图像的观察分析来判断训练的过程,损失函数可能会一时蒙蔽双眼,结果应该不会。

因此除非损失马上收敛到接近于0,否则耐心地等待网络训练完再评估结果,调整网络结构和参数。

3.7 关于k的选择

原论文中的 k 指每优化一次生成器的损失函数,优化判别器的损失函数 k 次。

但是在实验中,经常出现判别器迅速打败生成器的情况(即判别器的损失函数快速下降,生成器快速上升)。

于是常规的思路,就是增加生成器的训练次数。没训练一次判别器,训练k次生成器。这样可以增加生成器的学习次数,使得训练在开始时稍稳定。

然而实践证明,如果判别器真的比生成器强太多,这种调节k只是让结果崩溃来的晚一些。或者说只是相当于节省了少训练几次判别器的时间,稍稍提升了结果。

我个人不建议出问题就改k的习惯,还是应该从网络结构本身找问题所在才是治本的关键。

3.8 关于学习率

调整学习率是解决生成器崩溃的一剂良方。

当出现崩溃时,尝试降低学习率,可能会带来意想不到的效果。

3.9 增加噪声

与标签噪声相似,还可在数据中引入一定量的噪声,大多数情况下都能 work 。

3.10 不要使用性能太好的判别器

WGAN论文提到过,若使用性能过好的判别器可能会使得判别器的损失函数在训练一开始就降到非常低,后续对抗无法继续进行,或者使得训练出来的生成器性能不够好。

3.10 可以尝试最新的multi-scale gradient方法

https://arxiv.org/abs/1903.06048

对于稳定训练帮助很大。

3.11 可以尝试使用TTUR

https://arxiv.org/abs/1706.08500

对于生成器和判别器使用不同的学习率,看似简单的 trick 对结果的提升却有奇效。

3.12 使用Spectral Normalization

https://arxiv.org/abs/1802.05957

对卷积核使用Spectral Normalization,极力安利。

4 正常的损失函数波动情况

目前来看,正常的损失函数应该是:

  • 训练初始,生成器和判别器的损失函数快速波动,但是大致都分别朝着增大或减小的方向。
  • 趋于稳定后,生成器和判别器的损失函数在小的范围内做上下波动,此时模型趋于稳定。

参考

[1] https://arxiv.org/pdf/1406.2661.pdf
[2] https://mp.weixin.qq.com/s?__biz=MzUzNTA1NTQ3NA==&mid=2247486336&idx=1&sn=57c9fe8324a1addd73016c2f9dad4db8&chksm=fa8a169dcdfd9f8b17a02ab37eba61fdb3a1d89f694eaf89e2159275a553efe81c848e9a597c&mpshare=1&scene=1&srcid=&sharer_sharetime=1564758935068&sharer_shareid=f48c6499a7bee75abed9252093ec8062&key=83b29471f317cf4cb4c43b8d6f0f7141528141839d921d9fa05354867868f61243968a92b031ba8d4867003242ab09f1ca621380db5b7bc77bfcab13dc9cc7a0960adac628f5a805694c9fef0468a345&ascene=1&uin=MjYxNDk4MjcwNg%3D%3D&devicetype=Windows+10&version=62060833&lang=zh_CN&pass_ticket=RHjQjboJdAJhysQNM17TfCzpyiuR4K3LIS%2FvyT9wAnt%2BBDxNq0hsDyAO0BNEjE6l
[3] https://towardsdatascience.com/10-lessons-i-learned-training-generative-adversarial-networks-gans-for-a-year-c9071159628

GAN 的训练、调参实践相关推荐

  1. 深度学习如何提高训练集准确率_吴恩达深度学习笔记(61)-训练调参中的准确率和召回率...

    单一数字评估指标(Single number evaluation metric) 无论你是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,你会发现,如果你有一个单实数评估 ...

  2. 准确率 召回率_吴恩达深度学习笔记(61)-训练调参中的准确率和召回率

    单一数字评估指标(Single number evaluation metric) 无论你是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,你会发现,如果你有一个单实数评估 ...

  3. DL之CNN优化技术:学习卷积神经网络CNN的优化、实践经验(练习调参)、从代码深刻认知CNN架构之练习技巧

    DL之CNN优化技术:学习卷积神经网络CNN的优化.调参实践.从代码深刻认知CNN架构之练习技巧 目录 卷积神经网络CNN调参学习实践 练习技巧 1.练习攻略一 2.VGG16练习攻略二 卷积神经网络 ...

  4. 【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?

    大家好,欢迎来到专栏<调参实战>,虽然当前自动化调参研究越来越火,但那其实只是换了一些参数来调,对参数的理解和调试在机器学习相关任务中是最基本的素质,在这个专栏中我们会带领大家一步一步理解 ...

  5. 【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...

    大家好,欢迎来到专栏<调参实战>,虽然当前自动化调参研究越来越火,但那其实只是换了一些参数来调,对参数的理解和调试在机器学习相关任务中是最基本的素质,在这个专栏中我们会带领大家一步一步理解 ...

  6. 机器学习模型选择:调参参数选择

    http://blog.csdn.net/pipisorry/article/details/52902797 调参经验 好的实验环境是成功的一半 由于深度学习实验超参众多,代码风格良好的实验环境,可 ...

  7. 深度学习网络调参技巧

    深度学习网络调参技巧 本文转载自[炼丹实验室],讲了一些深度学习训练的技巧,其中包含了部分调参心得:深度学习训练心得.不过由于一般深度学习实验,相比普通机器学习任务,时间较长,因此调参技巧就显得尤为重 ...

  8. 深度模型调参知识总结

    深度模型调参知识总结 先保证数据质量再去调参 什么是高质量的数据? 高质量数据集应该包括以下特征: 类别均衡 数据充足 数据和标记中有高质量信息 数据和标记错误非常小 与你的问题相关 怎样获取高质量的 ...

  9. simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

    作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参. PID调参器( PIDTuner ...

  10. 如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

    作者 | 安布奇 责编 | 胡雪蕊 出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参. PID调参器( PIDTun ...

最新文章

  1. 【Qt笔记】对象模型
  2. Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
  3. 从0到1,了解NLP中的文本相似度 1
  4. 停止页面定时刷新_Flutter实现倒计时功能、定时任务功能
  5. C++自学08:类型推断(auto/typeid)
  6. 域渗透——Pass The Hash Pass The Key
  7. 计算机中的管理应用,计算机在企业管理中应用_29067.doc
  8. 百度文库中的文字不能复制,怎么办?
  9. Hookswork多帐户跨平台MT4跟单软件的十二大优势:
  10. mysql百万数据迁移_Mysql百万级数据迁移实战笔记
  11. w10控制面板卸载java_手把手教你解决Win10控制面板无法卸载软件的问题
  12. 利用Python从数据分析的角度告诉你NBA2018-2019常规赛季为什么字母哥比哈登强?
  13. Android JNI开发三: SO库的使用
  14. 【C语言程序设计】C语言求最小公倍数(详解版)!
  15. 聊聊 Python 代码覆盖率工具 - 大咖爱爬虫
  16. ipv6内网穿透,有ipv6地址外网无法访问
  17. 企业发放的奖金根据利润提成计算
  18. 主题:windows xp 系统CMD命令大全(一)
  19. 线性表-顺序表的基本操作
  20. 亚马逊UL2089车载电池充电器

热门文章

  1. python计算日期到天数_利用python计算时间差(返回天数)
  2. staruml 依赖于 libgcrypt11 (= 1.4.5);然而:未安装软件包 libgcrypt11。
  3. 关于写专利的一点感想
  4. 各种手段终于将土豆视频url请求找到了
  5. Python生信练习——hg38每条染色体基因,转录本的分布
  6. cba篮球暂停次数和时间_篮球比赛CBA中每节多长时间?每次暂停都分为多长
  7. BES2300x笔记(4) -- TWS组对与蓝牙配对(Peer or Pair傻傻分不清)
  8. android lut格式文件下载,一键调色?教你用Lut直接调出电影色调(内含下载)
  9. 前端vue项目下载zip压缩包及附加
  10. The APR based Apache Tomcat Native library which allows optimal performance in production environme