【CANN训练营】基于昇思的GAN实现随笔
前言
介绍GAN背后的天才想法,几种精度GAN网络的结构解析,基于昇思的GAN代码分析。介绍DALLE2, Imagen是如何设计,能够生成拟真图片。
活动链接:https://www.hiascend.com/zh/developer/canncamp
概述
GAN是什么?
GAN(Generative Adversarial Network)全称对抗生成网络,顾名思义是生成模型的一种,而他的训练则是处于一种对抗博弈状态中的。自2014年Ian Goodfellow提出了GAN(Generative Adversarial Network)以来,对GAN的研究可谓如火如荼。各种GAN的变体不断涌现,下图是GAN相关论文的发表情况:
大牛Yann LeCun甚至评价GAN为 “adversarial training is the coolest thing since sliced bread”。
GAN的基本原理
GAN的主要结构包括一个生成器G(Generator)和一个判别器D(Discriminator)。以我们熟悉的足球运动为例,球员就相当于生成器,我们需要他在球场上能有好的表现。而球员一开始都是初学者,这个时候就需要一个教练员来指导他们训练,告诉他们训练得怎么样,直到真的能够达到上场的标准。而这个教练就相当于判别器。回到实际生活中,球员也不能太差,否则教练也带不动。
下面我们举另外一个手写字的例子来进行进一步窥探GAN的结构。
假设现在拥有大量的手写数字的数据集,我们希望通过GAN生成一些能够以假乱真的手写字图片。主要由如下两个部分组成:
- 定义一个模型来作为生成器(图三中蓝色部分Generator),能够输入一个向量,输出手写数字大小的像素图像。
- 定义一个分类器来作为判别器(图三中红色部分Discriminator)用来判别图片是真的还是假的(或者说是来自数据集中的还是生成器中生成的),输入为手写图片,输出为判别图片的标签。
好了,上面都是比较感性的认识和理解,落实到具体工程和实践中,就需要数学公式作为支撑,下面来看看GAN背后的数学原理:
说实话,初看有点懵,看上去很复杂,但背后的原理还是很通俗易懂的,先来说下GAN最初遇到的问题,如下所示,后面会展开介绍上面的数学问题。
关于GAN原理的公式介绍,首先,来看下:
几种典型的GAN
针对上述GAN的两个问题,后面的研究者做了很多改进和优化,下面介绍几种比较有代表性的作品:
WGAN
WGAN的作者首先从理论上分析了原始GAN的问题所在,从而针对性地给出了改进要点,之后又再从这个改进点出发推导了公式定理,最终给出了改进的算法实现流程,而改进后相比原始GAN的算法实现流程只改了四点:
- 判别器最后一层去掉sigmoid
- 生成器和判别器的loss不取log
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
- 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
其实,站在后来者的角度来看,改动还是比较简单的,但是效果却有了很大的提升,可谓大道至简啊。
这里还要着重介绍下Wasserstein距离,又叫Earth-Mover(EM)距离,定义如下:
Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。
KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。
CGAN
原始的GAN的生成器只能根据随机噪声进行生成图像,至于这个图像是什么(即标签是什么我们无从得知),判别器也只能接收图像输入进行判别是否图像来使生成器。因此CGAN的主要贡献就是在原始GAN的生成器与判别器中的输入中加入额外信息y。额外信息y可以是任何信息,例如标签。因此CGAN的提出使得GAN可以利用图像与对应的标签进行训练,并在测试阶段 利用给定标签生成特定图像。
CycleGAN
CycleGAN的一个重要应用领域是Domain Adaptation(域迁移:可以通俗的理解为画风迁移),比如可以把一张普通的风景照变化成梵高化作,或者将游戏画面变化成真实世界画面等等。
以下是原论文中给出的一些应用:
论文:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
链接:https://arxiv.org/pdf/1703.10593.pdf
StyleGAN
StyleGAN是NVIDIA继ProGAN之后提出的新的生成网络,其主要通过分别修改每一层级的输入,在不影响其他层级的情况下,来控制该层级所表示的视觉特征。这些特征可以是粗的特征(如姿势、脸型等),也可以是一些细节特征(如瞳色、发色等)。
基于样式的生成器b)有18层,每个分辨率有两个卷积层(4,8,16…1024)。
①移除了传统的输入(remove traditional input)
②映射网络(Mapping Network)
③样式模块(style modules,AdaIN,自适应实例归一化)
④随机变化(Stohastic variation,通过加入噪声为生成器生成随机细节)
上图中的右图说明了将随机变化应用于不同的层的效果(将噪声输入不同层)。a噪声加入了所有层;b没有噪声;c在精细层(fine layers,64-1024)加入噪声;d在粗糙层(coarse layer,4-32)加入噪声。粗糙的噪声导致头发大规模卷曲,背景特征更大,而细小的噪声则使头发卷曲更细,背景细节更细,皮肤毛孔更细。
论文:A Style-Based Generator Architecture for Generative Adversarial Networks
链接:https://arxiv.org/abs/1812.04948
结语
最后是老师打了一个广告,我也放在这里:
参考文章
- 点赞
- 收藏
- 关注作者
评论(0)