来也科技利用GAN在手写生成上探索

原文:https://laiye.com/news/post/2582.html

  1. 导读

  2. 最早期的GAN
    1. 结构
    2. 损失函数
  3. 一些GAN的改进
    1. DCGAN
    2. WGAN
    3. 关于模式崩溃与梯度消失
  4. GAN的应用–图到图翻译、风格迁移
    1. cGAN
    2. pix2pix
    3. CycleGAN
  5. 来也科技基于GAN的手写字体风格迁移实践
    1. 基于BicycleGAN的手写风格迁移实践
      1. 模型简介
      2. 具体实践
    2. 基于Zi2Zi的手写汉字风格迁移实践

      1. 模型简介
      2. 具体实践
    3. 总结
  6. GAN的优缺点分析

  7. 训练GAN的技巧

  8. 应用场景

  9. 参考资料

1. 导读

自2014年Ian Goodfellow提出生成对抗网络(Generative Adversarial Networks,GAN)以来,GAN的变种层出不穷。研究者们从不同方向对GAN进行深入研究,其中包括通过数学推导对GAN损失函数的各种优化(例如Wasserstein-loss,LS-loss等)、对模型结构的各种尝试(如DCGAN等)。经过多年的发展,GAN踏足于多种视觉任务的子领域,比如风格迁移和图到图翻译。

2. 最早期的GAN

GAN的本质是希望得到一个映射关系G(·),将一个分布z(例如:均匀分布的随机噪声向量),映射到指定的分布G(z)上。

其中映射使用的参数通过学习得到,这样一来就得到了一个实现z → G(z)的模型。通过对输入随机变量z不断的采样、送进模型,就能得到许多不一样,但是符合某种分布的输出(也就是我们期望生成的数据,图像等),即一个生成器G。

问题是:如何训练才能使生成器G足够逼真?

常言道“魔高一尺道高一丈”,Ian等人提出了一种对抗训练的方法,同时训练生成器G和一个鉴别器D,构建两者的竞争关系,从而完成训练。两个子模型的任务如下:

  • G:不断生成自认为是“真实”的假数据(fake data)
  • D:判断数据为真的可能性,一般是个二分类器

训练流程一般先使用一些真实数据训练鉴别器D,使其拥有一定的鉴别能力。训练中正样本使用真实数据本身,负样本使用未经训练的G生成的数据。之后对抗训练整个网络,在每轮迭代中:

  1. 对噪声进行一个batch的采样作为本轮输入送入G,生成一个batch的fake data
  2. 将fake data标记为正样本,输入D,用于“欺骗”鉴别器,计算损失,更新G的参数

重复上述流程,一个好的GAN训练中,D的分类准确率不应一直太高或太低,动态维持准确率的波动才能说明GAN中的两个部分在进行对抗训练。否则,要么D太强导致G参数更新停滞,无法生成更真实的fake data;或者D太弱,导致G任意生成的fake data都会被认为是真实的,同样导致G偏离真实的分布学习。

一个原始GAN实现的样例代码:https://github.com/RikoLi/Keras-GAN/blob/master/gan/gan.py

结构

最原始的GAN使用多层感知机作为模型的主干:

图片

####

损失函数

GAN的优化目标V(D, G)如下所示:

图片

训练目标是令D能够最大化目标函数,同时G能够最小化目标函数,从而构建“对抗”训练。论文中给出了算法的收敛性证明,这里不做展开,有兴趣可以看一下原文的证明。我们只需要知道最终收敛的方向是朝着D结果为0.5前进的即可。

在这里一定要注意一点,V(D, G)并不是GAN的损失函数!对于输出D(x)或者D(G(z))进行log变换,我们得到的是对数似然(log-likelihood),因此V(D, G)表示的是一个似然函数。结合一点概率论的知识我们知道,极大似然估计是对分布模型参数估计的一种方式,此处对D的训练实际上就是极大似然估计的一种体现。只不过似然来自两部分,用真实数据x计算的以及用G(z)生成的,这也说明了为何对于D而言优化目标是最大化V。在真实计算中,损失函数只是二分类的交叉熵。

实际训练中,每一轮迭代如上文提到的分为两个阶段:先训练D,再训练整个GAN。其中训练D时使用所有与D相关的损失,因此此时用于更新D的梯度为:

图片

表示mini batch数量,x表示来自于真实数据的样本,theta_d表示D中待学习的参数。注意更新D的时候需要最大化目标函数,因此在使用梯度下降法进行迭代时一般将损失函数设计为目标函数V取负。

D训练完成后,开始训练整个GAN,此时应使用与G和D相关的损失并冻结D的权重,仅更新G的权重:

图片

theta_g是G的参数,此时直接进行梯度下降更新就可以了。

因此,在每一轮训练迭代中都保证D和G得到了训练,且训练方向是相互竞争的。

3. 一些GAN的改进

传统的GAN提出了一种对抗式训练的框架,后续的研究在模型结构和损失函数上进行了大量的创新,这里简单介绍两个模型:DCGAN和WGAN。

DCGAN

最早期的GAN是全部使用MLP进行全连接的,自然就会有MLP存在的问题,例如连接过于稠密,参数量大的问题,这对一些图像生成任务来说并不是一个好的选择。

DCGAN是早期对GAN的一种改进。DCGAN全称Deep Convolutional GAN,发表于ICLR2016。望文知意,DCGAN将传统的GAN架构改造为CNN架构,使得模型能更好处理图像相关任务。

在结构上,DCGAN的生成器和鉴别器就是常见的CNN架构,鉴别器就是CNN架构的二分类器,生成器如下图所示:

图片

DCGAN将输入的噪声向量全连接投影到一个1024x4x4的更大向量,之后reshape成一组feature map,然后反复使用反卷积操作进行上采样,直至最后输出为指定的大小和通道。其中使用BatchNormlization技术,并抛弃池化层,除了输出层激活使用tanh外,其他均使用ReLU作为激活函数。

其中的反卷积操作又称为“分数步长卷积”(fractional-strided convolution)或“转置卷积”(transposed convolution),可以视为一种与正常卷积“相反”的操作,这里不是指反卷积是卷积的逆变换,而是使用一种类似卷积的方法实现了上采样。具体操作如下所示:

图片

反卷积在具体实现上其实仍然是一种卷积,但是为了能将输入转换到输出的尺寸(一般来说是变得更大),往往需要进行填充处理。上图所示的蓝色部分是2x2的输入图像,经过padding后进行3x3大小卷积核以步长1进行卷积操作,输出得到5x5的绿色图像。这整个过程可以看做将2x2图像反卷积成5x5的输出。

此外也有观点认为“反卷积”一词使用的不恰当,真正的“反卷积”应该只在图像边缘进行填充处理,而不是将像素拆开进行填充。

反卷积对步长和卷积核大小的设计有特别的限制,如果卷积核大小不能整除步长,则很容易出现棋盘格效应,体现在图像上就是棋盘状纹理的交替出现,原因是反卷积过程中出现了周期性的像素重叠。在进行反卷积操作时往往选择偶数大小的卷积核变长,并且以偶数作为步长,这能够减轻棋盘格效应,但效果有限。在实际中往往通过使用上采样+普通卷积的方式实现反卷积的功能。

以下是尝试DCGAN做过一些图像生成的demo,例如从噪声中生成动漫风格头像,不过效果有限:

图片

DCGAN较大的改进了GAN在图像生成任务上的性能,替换掉了最早的MLP架构,后续基本所有涉及到图像的基于GAN的模型都采用了卷积结构。

WGAN

WGAN全称Wasserstein GAN。

文章(3)中提出了一种使用EM距离作为损失函数的GAN网络结构:WGAN, 解决了传统GAN训练中出现的模式崩溃问题,同时增加了GAN训练的稳定性。

EM距离是作者使用的测度,就像其他测度如:TV距离、KL散度、JS散度等,EM距离也能用来描述两个概率分布之间的“距离”。EM距离的原始数学定义为:

图片

让我们不那么“数学”地去理解它。x和y表示两个分布下的随机变量,   x-y   描述了分布变换的距离。实际中,从x所在的分布变换到y所在的分布可能有多种变换方式。这些变换方式中,每一种变换方式出现的概率可以用联合分布gamma(x, y)表示,所有变换方式的组成了集合Pi(Pr, Pg)。

在每种变换方式下,求每种联合分布gamma中变换距离的期望,我们就能得到当前变换方式下的平均变换距离。然后,针对集合Pi中所有变换方式的平均变换距离求下界,我们就能得到所有变换距离中的最近距离,将这个最近距离称为:EM距离。

为什么使用EM距离呢?

作者发现:针对某些学习任务,使用其他距离作为损失函数无法得到收敛的模型,原因出在因损失函数不连续而无法使用梯度下降去优化。而EM距离能够弥补这一缺点。关于EM距离的连续性,作者进行了大量数学推导进行证明,可以参看原论文的附录内的推导过程。

EM距离虽然很好描述了两个分布之间的差异,但根据定义式我可以看出:无法用数值梯度优化模型。可以经过数学推导可以用一个等价的式子描述EM距离!

图片

对上式的最大化等价于对EM距离的最小化。其中:函数fw描述一组由w作为参数的拥有Lipschitz性质的函数,实际上是鉴别器,而g_theta自然就是生成器了。

如此一来,上式可以通过反向传播进行梯度更新了。如果将EM距离的损失函数和传统GAN的损失函数进行对比,可以看出:在WGAN中不进行对数映射的对抗损失反而性能更好。

至此,WGAN的损失设计基本已经完成了。此外作者在优化器上进行了一些分析,认为使用基于动量的优化器会导致WGAN训练变得不稳定,推荐使用RMSprop进行更新。作者还发现WGAN解决了梯度消失和模式崩溃的问题,具体推导可以看原论文。

WGAN最主要的贡献是从原理上解决了模式崩溃问题,使GAN的训练更加稳定,随之而来的问题就是训练耗时会变长(需要在一轮迭代中训练多次鉴别器)。后续有人提出LSGAN进一步修改了损失函数使得收敛更快。

关于模式崩溃与梯度消失

模式崩溃是指:对于不同的输入,比如传统GAN中的噪声输入z,生成器只能生成相似的G(z)。即:生成器生成样本多样性不足,且经过长时间训练也难以改善。下图的几个生成结果就出现了模式崩溃:

图片

模式崩溃的原因是:传统GAN训练的会面临一个严重问题–梯度消失。传统神经网络提到的梯度消失往往是由sigmoid激活函数在远离原点的区域梯度过小导致,或是网络太深导致回传梯度累计值过小。在GAN中的梯度消失问题源于其损失函数。

WGAN论文中给出了分析,传统GAN的损失实际上是JS散度(对KL散度的改进)下界经伸缩和平移变换而来,JS散度对于没有重叠的两个分布给出的损失是一个常数,这就意味着没有梯度来更新模型,从而造成了梯度消失。因为梯度消失,模型参数更新基本停滞,也就导致了模型学习的映射不再向一个方向进行改变,间接导致了模式崩溃。

针对梯度消失和模式崩溃,WGAN给出的EM距离是一个很好的解决方案,它的设计使得梯度不会消失,也就解决了模式崩溃问题。

4. GAN的应用–图到图翻译、风格迁移

图到图翻译可以看做风格迁移的一种实现方式。针对图像而言,给定图A和图B,其中将A作为风格迁移的对象,通过特定算法将B拥有的风格赋予A,如下图:

图片

关于风格迁移的发展,综述文章Neural Style Transfer: A Review描述的十分具体。

如果我们端到端的去看这个系统,实际上我们可以将这个过程视为一个翻译的过程。和语言翻译类似,图到图翻译也是将一个域的图像通过模型转换为另一个域内的图像,本质上是一个分布向目标分布的映射。

既然GAN能够完成分布之间的映射学习,那么使用GAN进行图像到图像的翻译就是值得一试的了。目前关于使用GAN进行图到图翻译已存在大量的模型,下面介绍几个经典模型。它们可以分为两类:

  • 有监督:cGAN,pix2pix

  • 无监督:CycleGAN

cGAN

cGAN全称Conditional GAN,是紧接着GAN提出的模型改进。这种改进是自然的,在GAN一文中作者就将其视为有价值的future works之一。

传统的GAN学习噪声到某个分布的映射z → G(z),噪声可以进一步拓展到任意一个分布,因此GAN学习分布到分布的映射,这种映射可以看成先验概率分布Ps(x_s) → Pt(x_t)的映射。

cGAN指出,如果我们在分布中加入一个条件变量,例如一个one-hot向量,使映射改为条件概率分布的映射Ps(x_s c) → Pt(x_t c),那么就等价于加入了一个作为引导的条件信息,从而可以控制生成器生成的方向。举个例子,通过改变条件变量,我们可以让一个人脸图像生成器生成带有不同属性的人脸图像,例如特定颜色的眼睛、特定发型的头发等。

在模型架构上,cGAN仅加入了一个控制条件的向量y作为输入:

图片

可以认为条件向量编码了特定的条件,此时cGAN的优化目标各项也需要加上引入的条件:

图片

其他部分完全与GAN相同。

pix2pix

pix2pix是Berkeley AI Research Lab于2018年提出的一个基于cGAN思想的图到图翻译模型。

在pix2pix中,作者使用成对的图片进行训练,例如我们有一个图片配对{x, y},其中x∈X,y∈Y,X和Y分别表示翻译前后的源图像域和目标图像域。此时x不仅担任了作为输入数据的角色,还担任了类似于cGAN中的条件信息的角色。这里不再需要随机向量z作为输入,仍然能训练生成器G: x → y。

图片

同GAN的训练流程一样,我们让x通过生成器生成G(x)。但是之后送入鉴别器的不再是G(x)自己了,还要包括x本身,因此pix2pix中的鉴别器接受两个输入。这是希望鉴别器利用条件信息x进行学习。

此时,鉴别器判断的是存在x的条件下,G(x)为真实图像的概率。

在真实训练中,通过向鉴别器输入{x, G(x)}的负样本和{x, x_real}的正样本来更新权重。换句话说,这是通过告知鉴别器什么是正确的翻译(x → x_real)、什么是错误的翻译(x → G(x)),库完成鉴别器的训练。

此外,作者在鉴别器的设计上采用了PatchGAN的想法,大致思路是:不使用整张图来训练鉴别器,而是选取许多来自于整张图的小patch进行鉴别器训练,判断每个patch是否为真实数据,最终取平均结果作为整张图是否为真实数据的判据。这样做能够在模型性能基本不变的情况下使鉴别器参数量减少、运行更快。

在生成器设计方面,pix2pix采用了U-Net架构的网络。U-Net类似encoder-decoder,先进行下采样,再进行上采样,不同的是U-Net增加了跨层连接以弥补下采样导致的信息丢失。

图片

pix2pix的损失函数设计,采用了多种损失组合的形式。论文指出,除了对抗损失外,引入其他的经典损失有助于模型性能改善。对抗损失和cGAN基本一致:

图片

实际训练中没有随机噪声向量z。此外,还有专门用于优化生成器性能的L1损失,作者使用L1损失而非L2损失的理由是:L1损失能更好地减少生成图像的模糊程度:

图片

最后,通过一个参数lambda调整两个损失函数的比重,得到总体损失函数:

图片

pix2pix的提出,使得图到图翻译、风格化的工作可以端到端的实现。不过,要求数据一定是成对出现的,对训练数据要求有不少难度。

那么,有没有非监督式的方法呢?

下面的CycleGAN通过引入循环一致损失(cycle-consistency loss)提供了一种非监督的训练方法。

CycleGAN

基于pix2pix的研究,BAIR的研究人员将目光投向非监督式的图到图翻译算法,提出了CycleGAN模型,其架构如下:

图片

CycleGAN基于这样一个思想:如果将一句英语翻译成法语,然后再将其翻译回英语,我们应该得到完全一样的一句英语。同样的事情也要发生在图到图翻译中,图像x经过两次翻译,回到源图像域后应该尽可能一致,即:x → G(x) → F(G(x)) ≈ x,对于目标域图像y同理。于是CycleGAN设计了循环一致损失:

图片

这样一来就涉及到两组生成器和鉴别器,每一组生成器和鉴别器都需要考虑对抗损失,此外再加上循环一致损失,我们得到总损失函数:

图片

CycleGAN的好处在于:我们不再需要特意准备配好对的图像进行训练了。

原本pix2pix要求图像配对是为了显式增加翻译方向的监督信息,从而让网络学习定向的映射关系。因为如果直接取消配对,从原图像域和目标图像域内随机挑选样本进行学习,网络学习到的映射有太强的随机性,可以将源图像域的图像翻译成目标图像域中的任意一种甚至是几种组合,而这种映射关系可能不是我们想要的。换句话说,网络没有学到我们希望它学到的映射。

举个例子:假设我们训练一个网络,学习将黑白线稿上色。源图像域内的训练样本全是线稿,目标图像域内的样本全是彩色图。如果我们使用有监督的成对图像进行训练,比如如下的三个样本:

  • {cat_sketch, cat_color}
  • {handbag_sketch, handbag_color}
  • {lemon_sketch, lemon_color}

那么很好,网络学到了将猫的线稿映射到彩色猫、将手提包线稿映射到彩色手提包、将柠檬线稿映射到彩色柠檬;如果取消配对,设置两个图像域:

  • X = {cat_sketch, handbag_sketch, lemon_sketch}
  • Y = {cat_color, handbag_color, lemon_color}

训练的时候让网络随机从两个集合中选取样本来学习映射,那么很有可能你将得到一个有着猫咪毛色和纹理的诡异柠檬,又或是一只长满棕色人造革“皮肤”的可怜猫咪……这个例子可能比较惊悚,这是用一种极端的方式去说明去掉图像配对进行非监督式训练,网络学到的映射有多么不可控。

CycleGAN考虑到了这一点,因此提出了之前说到的循环一致损失,循环一致损失使得生成器不仅仅学习到从域X向域Y的映射就万事大吉了,更要求它学到能够使得让Y向X的重建同样成功的参数。可以说,循环一致损失的加入减小了生成器学习的映射空间,避免了很多过于随机化的映射被学习。

** **

5. 来也科技基于GAN的手写字体风格迁移实践

手写体在我们的日常生活中有着非常广泛的应用:某些重要文档的签署、电子阅卷、票据等都依赖人工书写。然而,目前对于手写体的检测和识别仍比较困难。最大的困难是文字上比较成功的深度模型属于数据驱动,而仅靠公开的手写数据集根本无法覆盖实际需求。因此,如果能开发一种印刷体到任意手写体风格的迁移网络就可以大大增加数据的多样性,本质上解决了训练样本缺乏的问题。

手写字体风格迁移一般可以从两个思路进行解决:一种是将手写字体视为图像通过计算机视觉领域内的生成模型进行处理,常见的生成算法如GAN、VAE等;另一种是将手写字体视为关键点集序列,通过序列生成算法如RNN、LSTM等进行处理。下文分享了来也科技采用了GAN对手写字体风格迁移进行实践研究:

基于BicycleGAN的手写风格迁移实践

BicycleGAN是2017年发表于NIPS的基于cGAN的多域图像翻译模型,其提出:在输入和隐空间内使用双射变换以保证网络输出的多样性。即:在训练阶段,模型不仅需要学习从输入、隐向量到输出的映射任务,同时还需要学习从输出到隐空间的映射关系,这将会避免模型忽略隐向量信息,从而保证输出的多样性。

模型简介

整个模型由两个GAN网络以及一个编码器组成,其中两个GAN网络共用一个生成器G。

针对第一个模块cVAE-GAN来说,其先将目标风格图像B通过编码器处理为隐向量,这里的编码器通常是由四层下采样层以及一层全连接组成,目的是为了提取目标风格图像的风格信息。之后原始风格图像A与隐向量通过通道级连后作为生成器G的输入,这里的生成器是基于U-Net架构设计的编码-解码型网络,输出为目标风格图图片

与上文描述的pix2pix一样,这里的鉴别器类似于一个二分类网络,主要用于判断输入图像的真实性。为了提升鉴别准确性,这里依旧使用了Patch Discriminator,不仅对输入图像整体进行判别打分,而且对输入图像的每一个细分Patch块进行判别打分。通过约束生成目标风格图像图片与真实目标风格图像B之间的L1损失与对抗损失以及隐向量与高斯分布之间的KL损失优化模型参数。

cVAE-GAN的目的是希望隐向量不仅要蕴含目标风格信息,还要尽可能的与标准正态分布保持一致。这样,在理想情况下,训练完成后我们直接从标准正态分布中随机采样,即可生成无限多样风格的结果,当然也可以通过编码器输出指定的风格迁移结果。但在实际中,这部分模型可能受限于KL损失难优化以及隐向量容易被模型忽略等问题。因此这里还使用了cLR-GAN用于防止隐向量信息丢失问题。

图片

针对cLR-GAN来说,其弥补了cVAE-GAN容易忽略隐向量信息的问题。首先从高斯分布中随机采样隐向量N(z)与原始风格图像A通过通道级连后再次输入生成器G中,生成器输出目标风格图像图片图片再次通过cLR-GAN中的编码器提取隐向量z,通过约束z与N(z)之间的L1距离来促使中保留隐向量信息。

由于此时图片携带了随机隐向量N(z)信息,因此不能再与B进行像素约束,即:与B仅通过鉴别器计算对抗损失。注意:这里最好不复用cVAE-GAN中的鉴别器。

图片

综上所述,通过这两部分的联合训练,BicycleGAN能够建立生成结果与隐向量之间的双射一致性,从而促使模型生成更多样的结果。整个模型使用L1、KL以及对抗损失约束。

具体实践

我们基于该思路在手写英文及数字上进行了风格迁移实践。我们从Google Font中选择了27种字体作为基础数据,并将Caveat-Regular作为原始风格,其余字体作为目标风格,以1:9的方式划分测试集与训练集。最终获得了1451张训练集,161张测试集。

通过多次调整损失权重我们发现:一般将图片会有较为稳定的结果。但是我们在原始论文的架构上(附录8)上实验发现:模型有较严重的笔画丢失问题,因此尝试引入Feature-Loss和AC-Loss,并设计了LSTM鉴别器来缓解这一问题,但实验效果不及预期。其中,加入Feature-Loss后生成结果有细微增强,下面是实验结果展示,可以看出有些风格上较细的笔画容易在迁移过程中丢失:

图片

基于Zi2Zi的手写汉字风格迁移实践

模型简介

Zi2Zi是在条件GAN网络(cGAN)的基础上,用于解决One-to-Many汉字风格转换问题的模型。One-to-Many是指从某一种固定风格字体生成任意多种风格字体的任务。如上文所述,模型以生成器和鉴别器作为基础架构。

生成器以某种固定风格的字体及风格类别标签作为输入,输出具有指定风格的汉字图像。

鉴别器以固定风格与目标风格的汉字图像对作为输入,输出图像真实性分类结果以及风格类别分类结果。

首先需要先对数据进行预处理操作,整个过程如下图所示:

图片

模型将输入数据进行拆分处理,整体拆分为固定风格字体、目标风格字体以及目标风格标签三个部分。其中固定风格字体是指基于的原始字体,目标风格字体是指我们希望生成的风格字体,即Zi2Zi可以仅通过修改目标风格标签就能将固定风格字体转化为任意目标风格的字体。

生成器基于比较经典的编码-解码架构。

首先,原始字符图像经过编码器对字符内容进行编码。该编码器由8层下采样层组成,每个下采样层内包括了卷积、归一化、激活三层网络,注意这里没有使用池化去降采样图像,而是选择调整卷积步长来降采样图像。

之后,风格标签和编码器的输出通过通道级连。这里风格标签其实是以一个预定义的高斯分布矩阵中的第label维作为当前目标风格字体的风格标签。

最后,解码器从风格嵌入后的特征向量中恢复出目标风格字体。该解码器是由8层上采样层组成,每个上采样层内包括了分步卷积层、归一化层以及激活层。

图片

鉴别器以原始字体图像与目标风格字体图像对作为输入,通过4层下采样层提取图像的深层特征,之后通过两个全连接层分别输出图像真/假分类结果以及风格分类结果。

如上文所述,传统的鉴别器其实可以被视为是二分类网络。为了使目标风格保留的更加清晰,这里的鉴别器还承担着多风格分类任务。

图片

整个模型使用了对抗损失、分类损失、像素损失(L1)、编码一致损失进行约束。另外在实验中发现部分生成结果会有噪点以及模糊问题,因此这里还使用了TV-loss用于平滑生成结果。

具体实践

我们基于Zi2Zi对手写汉字风格迁移进行了实验:

以黑体作为原始风格字体,选择了15种风格迥异的字体作为目标风格字体。除对风格差异较大的手写体随机采样4000张图像外,其余字体均采样2000张图像作为训练集,最终我们获得了45,000张训练集, 4000张测试集。

多次调整损失权重后发现:将图片,其他权重均设为1,会有较稳定良好的训练结果。

另外,我们参考作者(附录12)建议的两阶段训练方案,即:先用全部字体训练整个模型,之后固定编码器对某几种字体进行微调训练。

可以发现:前期生成结果可能会有明显的噪点,并且在细节区域会有明显的模糊。加入TV-Loss后,噪点问题有所缓解;参考FontRNN引入Binary-Loss后,希望生成结果更清晰,但发现该损失会加重生成笔画丢失的问题,而这也是基于CNN处理汉字图像风格迁移难以避免的问题之一。以下是我们的部分实验结果:

图片

总结

将字符视为图像的风格迁移模型在多样性上具有卓越的表现,并且满足One-to-Many的工业需求。但是,由于CNN的网络特性,会不可避免地发生笔画连接错误或笔画丢失等问题,而这些问题对于汉字来说是非常关键的(如:银和锒)。在未来我们期望通过引入笔画序列监督以及注意力机制等算法改善这一问题。

6. GAN的优缺点分析

优点:

1.仅用到BP进行训练,在实现上有成熟框架支持

2.相比其他生成模型(如VAE等),GAN生成样本的质量更高

3.经过改进的GAN应用场景丰富,尤其是在图像领域,包括风格迁移、超分辨率、去噪,损失函数设计较为统一(以对抗损失为核心,无需设计针对任务特定的损失)

4.对于图像任务,可以进行端到端训练,比较方便

缺点:

1.训练不稳定(希望对抗损失训练达到纳什均衡, 但使用基于梯度的方法,不能保证达到较好的均衡状态)

2.不适合处理离散数据,例如文本

3.梯度消失和模式崩溃的问题 → 已经提出了解决方案,参考WGAN

7. 训练GAN的技巧

大部分的技巧只针对从噪声z → G(z)的传统意义的GAN而提出。

lhttps://cloud.tencent.com/developer/article/1335652

关于训练技巧的研究很少,大部分还是16-17年提出来的一些经验性的方法。

8. 应用场景

除了上文描述的字体图像风格迁移外GAN在其他场景下也有卓越的表现,比如:

  • Generate Examples for Image Datasets
  • Generate Photographs of Human Faces
  • Generate Realistic Photographs
  • Generate Cartoon Characters
  • Image-to-Image Translation
  • Text-to-Image Translation
  • Semantic-Image-to-Photo Translation
  • Face Frontal View Generation
  • Generate New Human Poses
  • Photos to Emojis
  • Photograph Editing
  • Face Aging
  • Photo Blending
  • Super Resolution
  • Photo Inpainting
  • Clothing Translation
  • Video Prediction
  • 3D Object Generation

传统GAN作为框架指导,基本已经不投入直接使用。目前的模型往往结合较新的架构(如残差网络)和改进过的损失函数(从原理上改进,如WGAN;根据任务改进,如pix2pix和CycleGAN的损失),用于特定工作。

GAN典型应用介绍:

  1. https://medium.com/@jonathan_hui/gan-some-cool-applications-of-gans-4c9ecca35900

  2. https://machinelearningmastery.com/impressive-applications-of-generative-adversarial-networks/

9. 参考资料

  1. Generative Adversarial Networks http://arxiv.org/abs/1406.2661
  2. Deep Convolutional GAN https://arxiv.org/abs/1511.06434
  3. Wasserstein GAN https://arxiv.org/abs/1701.07875
  4. Neural Style Transfer: A Review https://arxiv.org/abs/1705.04058
  5. Conditional GAN https://arxiv.org/abs/1411.1784
  6. Image-to-Image Translation with Conditional Adversarial Networks https://arxiv.org/abs/1611.07004
  7. Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks https://arxiv.org/abs/1703.10593
  8. https://cloud.tencent.com/developer/article/1335705
  9. 比较详细的GAN综述:http://www.gwylab.com/note-gans.html
  10. BicycleGAN:https://arxiv.org/abs/1711.11586
  11. FontRNN:https://onlinelibrary.wiley.com/doi/full/10.1111/cgf.13861
  12. ZI2ZI:https://github.com/kaonashi-tyc/zi2zi

Mac M1 使用 playcover 运行原神 《动手学深度学习》第二版 摘录