热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍

一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h

一、GAN原理介绍

学习GAN的第一篇论文当然由是 Ian Goodfellow 于2014年发表的 Generative Adversarial Networks(论文下载链接arxiv:[https://arxiv.org/abs/1406.2661] ),这篇论文可谓这个领域的开山之作。

GAN的基本原理其实并不复杂,模型通过框架中两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。这里以生成图片为例进行说明。假设我们有两个网络,G(Generator)和D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是:

G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)
D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。

在训练过程中,生成网络G的目标就是尽可能生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。

最后博弈的结果,在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,即达到了一个纳什均衡,因此D(G(z)) = 0.5。此时,模型的收敛目标是生成器能够从随机噪声生成真实数据。

这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。
以上只是大致说了一下GAN的核心原理,如何用数学语言描述呢?这里直接摘录论文里的公式:
生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
简单分析一下这个公式:

整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率。

G的目的:上面提到过,D(G(z))是D网络判断G生成的图片是否真实的概率,G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此我们看到式子的最前面的记号是min_G。

D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大(max_D)
下面这幅图片很好地描述了这个过程:
生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍

二、CGAN原理

在原始GAN中,目的是使得生成器能够从随机噪声中生成真实数据,而CGAN(论文下载链接arxiv:https://arxiv.org/pdf/1411.1784.pdf)则更近一层,即给GAN加上条件,指导数据的生成过程,使得生成具有特定性质的样本。以生成MNIST数据集的图像样本来说,原始GAN得到的生成器可以由随机向量生成一张含有数字的图像样本,其中数字可能是0~9中的任意一个,而CGAN则是在生成器输入时添加一个条件y,使得可以生成符合预期数字的图像样本,如生成含有数字1的图像。如图Figure1所示。价值函数变化如下:

生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍

三、DCGAN原理

DCGAN(论文下载链接arxiv:https://arxiv.org/abs/1511.06434 )是应用比较广泛的改进结构,基本采用卷积层替代了原始的全连接层,其中在生成器中采用带步长的卷积代替了上采样,极大地提升了GAN训练时的稳定性及生成结果质量。如图所示
GAN的主要问题是训练过程不稳定,而DCGAN改进了其稳定性,原因在于:

  1. 几乎每层都使用batchnorm层,将特征层的输出归一化到一起,加速训练,提升训练的稳定性;
  2. 判别器中使用Leaky ReLU,防止梯度过度稀疏,生成器则仍然采用 ReLU,但最后输出层采用Tanh;
  3. 使用Adam优化器训练,且最佳学习率为0.0002;
  4. 使用带步长卷积替代上采样层,卷积在提取图像特征上有较好的作用,并且使用卷积代替全连接层。
    生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍

四、WGAN原理

为了使得GAN的训练更加稳定,与DCGAN不同的是,WGAN(论文下载链接arxiv:https://arxiv.org/pdf/1701.07875.pdf)主要从损失函数的角度进行改进:

A)判别器最后一层去掉Sigmoid;
B)生成器和判别器的loss不取Log;
C)对更新后的权重强制clip,如[-0.01,0.01],以满足连续性条件;
D)推荐SGD、RMSProp等优化器,不要采用含有动量的优化算法,如Adam。

原始的GAN存在的问题有:判别器越好,生成器梯度消失越严重,生成器loss降不下去;判别器不好,生成器梯度不准,训练不稳定,只有判别器训练得不好不坏才行,但这个尺度很难把握,甚至同一轮训练的不同阶段该尺度都不一样,所以GAN才难以训练。最小化生成器loss函数,会等价于最小化一个不合理的距离度量,使得最小化生成分布与真实分布的KL散度的同时又要最大化两者的JS散度,导致梯度不稳定,同时也会使得生成器宁可多生成一些重复但较为“安全”的样本,也不愿意生成多样性的样本,从而导致模式崩溃,即多样性不足。

下图所示为标准GAN与WGAN对真实样本分布和生成样本分布判别的差异,标注GAN会出现梯度消失的情况,而WGAN则有较好的线性梯度。
生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
要在于从理论上给出了GAN训练不稳定的原因,即交叉熵不适合衡量具有不相交部分的数据之间的距离,转而使用Wassertein距离去衡量生成数据与真实数据之间的距离,理论上解决了训练不稳定的问题;解决了模式崩溃问题,生成结果更加多样;对GAN的训练提供了一个指标,可以采用此指标来衡量GAN训练的好坏,而不像之前那样盲目训练。

五、LSGAN原理

LSGAN(论文下载链接arxiv:https://arxiv.org/pdf/1611.04076.pdf)的主要目的也是采用最小二乘损失函数代替了GAN目标函数的交叉熵,从而解决了GAN训练不稳定和生成图像质量差、多样性不足的问题。
生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
其中a,b,c属于超参数,a,b分别表示生成图片和真实图片的标记,c是生成器为了使判别器认为生成图片为真实样本而定的值,这里设定a=0,b=c=1。

论文主要回答了两个问题:为什么最小二乘损失可以提高生成图片质量;为什么最小二乘损失可以使得GAN训练更稳定。对于第一个问题,论文认为交叉熵作为损失函数,会使得生成器不再优化那些被判别器识别为真实图片的生成图片,即使这些生成图片距离判别器的决策边界仍较远。原因在于生成器只需要完成混淆判别器的目标生成图片即可,而最小二乘损失则在混淆判别器的前提下还得让生成器把距离决策边界较远的生成图片拉向决策边界。对于第二个问题,论文认为Sigmoid交叉熵损失容易达到饱和状态,即梯度为0,而最小二乘只在一个点达到饱和。

六、BEGAN原理

谷歌提出一种新的简单强大的GAN,这是一种新的评价生成器生成质量的方法,不需要太多的训练技巧即可实现快速稳定的训练。以往的GAN及其变体是希望生成器生成的数据分布尽可能地接近真实数据分布,因此研究者们设计了各种损失函数,而BEGAN则不采用这种估计概率分布的方法,即不直接去估计生成分布Pg和真实分布Pdata的差距,而是估计分布的误差分布差距,只要分布之间的误差分布相近,也可以认为这些分布是相近的。

BEGAN主要有3个贡献:

(1)提出了一种新的简单强大的GAN网络结构,使用标准的训练方式也能快速稳定的收敛。
(2)对于生成器和判别器的平衡提出了一种均衡的概念,提供了一个超参数,这个超参数用于平衡图像的多样性和生成质量。
(3)受WGAN启发,提出了一种收敛程度估计。

BEGAN采用自编码器作为判别器;在生成器的设计上,使用Wasserstein距离衍生出的损失去匹配自编码器的损失分布,这是通过传统的GAN目标加上一个用来平衡判别器和生成器的平衡项来实现的;还提出了一个衡量生成样本多样性的超参数Y:生成样本损失的期望与真实样本损失的期望值之比。Y值较低时会导致图像多样性较差,因为此时判别器过于关注对真实图像的自编码。


推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 如何为PDF文档添加水印?简单步骤实现
    为了增强PDF文档的安全性和版权保护,添加水印是一个有效的方法。本文将介绍如何通过专业软件或在线工具轻松为PDF文档添加水印,确保您的文档在共享时仍能保持其独特性和安全性。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
author-avatar
你的拥吻像情歌一样凄美_207
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有