前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文看懂GAN的原理

一文看懂GAN的原理

作者头像
张宏伦
发布2020-07-24 10:41:38
7520
发布2020-07-24 10:41:38
举报
文章被收录于专栏:宏伦工作室

生成对抗网络(Generative Adversarial Network,GAN)自从2014年由Ian Goodfellow提出以来,一直受到了广泛的关注和研究,在短短几年时间内获得了快速的发展,并在许多应用场景中取得了显著的成果

以计算机视觉(Computer Vision,CV)领域中的人脸生成(Face Generation)这一任务为例,GAN生成的人脸图片在分辨率、真实性、多样性等方面都实现了极大的提升,从Goodfellow在2019年所发的推文中便可见一斑

常用的模型大多可以分为两类,生成模型(Generative Model)和判别模型(Discriminative Model)。前者的输出是“看起来很逼真”的虚假数据,例如合成人脸图片、撰写新闻报道,应当和真实的数据尽可能相似;相比之下,后者一般实现一个从复杂结构数据到简单判别结果的映射(Mapping),例如判断图片是猫还是狗、文本所表达的情绪为积极或者消极

根据以上的定义,GAN显然属于生成模型,因为我们希望通过GAN生成一些以假乱真的合成数据。进一步而言,生成模型可以分为无条件(Unconditional)和有条件(Conditional)两类,其中前者的生成结果完全随机,后者的生成结果则是可控的,例如生成男性或女性的人脸图片、撰写符合某个话题的新闻报道

01

模型优化

在正式讨论GAN的原理之前,我们先介绍一些关于模型优化的基本知识。如果你不是小白,则完全可以跳过这一部分

模型(Model)就好比一台机器,通常用于完成某一项任务,有输入(Input)也有输出(Output),例如在猫狗图片二分类这一任务中,输入为各种各样的猫狗图片,输出为猫或狗这两个选择之一

模型会包含一些可调参数(Trainable Parameters),这些参数的取值都是可变的,就好比一台电压力锅,可以设置不同的压力和时长。对于同样的食材,当压力和时长设置得不一样时,煮出来的结果也会不一样。类似的,对于同样的输入,当模型的参数取不同的值时,得到的输出也将不同

一般而言,我们会通过某种初始化方法(Initializer)为模型的每个参数设置一个初始值,例如随机初始化。回到猫狗二分类的问题上来,初始化之后的模型,肯定是无法对于每张输入图片,都输出正确的分类的结果

为了让模型学会猫狗分类的能力,我们会准备一些标注数据(Labeled Data),例如1万张猫狗图片,以及每张图片所对应的标注(Label),比如用0代表猫、用1代表狗,然后通过这些标注数据来训练(train)模型。这种每个样本都提供了正确答案(Ground Truth)的训练模式,称为有监督学习(Supervised Learning)

具体如何训练呢?我们可以每次拿4张图片,输入模型并得到相应的输出,这些输出结果中有对的也有错的,我们希望它们尽可能地接近正确答案。可以使用某种损失函数(Loss Function)来衡量两者之间的差距,例如二分类问题中最常用的二元交叉熵(Binary Cross Entropy),损失函数越小,则表明模型的输出越接近正确答案

于是我们对模型说,你看啊,还差那么多,赶紧把参数调一下!具体怎么调呢?唯一的原则就是,每个参数调整之后,都应当使当前的损失函数往减小的方向变化,这一点在数学上可以通过求导来实现。如此一来,我们便完成了一次模型优化(Optimization),也称为一次迭代(Iteration),我们的模型变得更聪明了,对于同样的输入,输出结果将更接近正确答案

上面我们是每次拿4张图片来训练,如果每次只用一张图片,那么优点是迭代一次的时间将缩短,但缺点是训练可能不稳定,毕竟在做决定时,我们一般会同时听取多方意见。另一个极端是,每次都用全部图片来训练,这样得到的参数调整方案会更加靠谱,但迭代一次所需的时间也会大大增加

因此,通常我们会每次拿一批(Batch)数据来训练,一批数据中所包含的图片数量称为批大小(Batch Size)。在不同的优化任务中,批大小如何设置依赖于经验,但一般会设置为2的幂,例如2、4、8、16、32、64等。假设一共有1万张图片,批大小设为16,那么经过10000/16=625次迭代后,所有的数据都过了一遍,我们称训练了一轮(Epoch)

可想而知,随着训练的进行,我们的模型将变得越来越聪明,那么应当如何评估模型的性能呢?一种常用的做法是将标注数据划分为训练集(Train Set)和测试集(Test Set),仅用训练集来优化模型,然后在测试集上评估模型,就好比一共有100套卷子,80套用来练习,20套用来考试。评估的时候会用到一些评估指标(Evaluation Metric),例如分类问题中常用的正确率(Accuracy)、准确率(Precision)和召回率(Recall)等

还有一个待解决的问题,便是何时停止训练,我们可以只训练20轮,当然也可以训练100轮。一般而言,如果训练轮数过少,则模型可能学得不够,即还有优化的空间;如果训练轮数过多,则模型可能学得过头了,具体表现为在训练集上性能很好,但在测试集上性能很差。至于如何找到那个恰到好处的点,则需要了解欠拟合、过拟合、模型复杂度、正则化等内容,这里就不再展开介绍了

02

图片的表示

图片是由一个个像素点组成的,一张高度为H、宽度为W的图片,共包括H*W个像素点。如果是RGB彩色图,则每个像素点包括三个颜色通道,即红(Red)、绿(Green)、蓝(Blue),每个颜色通道的取值都是0~255之间的整数,这样一来,就一共有256*256*256=16,777,216种不同的像素值,也就是所谓的“颜色”

GAN在CV界所取得的进展和成果远远多于自然语言处理(Natural Language Processing,NLP),一个主要原因就是图片的表示是“连续”的,即当像素值发生微小变化时,视觉上并不会察觉出明显的区别。相比之下,NLP任务中一般会将字或词作为最基础的语义单元,而字和词的表示是“离散”的,即我们很难统一规定,当一个字或词发生微小变化时,对应的语义是哪一个其他的字或词。字或词的这种“离散跳变性”,无疑加大了GAN训练时的困难和不稳定性,从而导致GAN在NLP领域中的发展和应用相对较少

03

生成和对抗

在上面的猫狗图片二分类例子中,模型需要实现从图片到01二分类结果之间的映射,一般情况下只需要一个模块(Module)即可。相比之下,GAN包括两个模块,生成器(Generator,G)和判别器(Discriminator,D)

G的任务是随机生成以假乱真的合成数据。为了满足随机性,通常我们会使用多个随机数作为G的输入,例如100个从标准正态分布(Random Normal Distribution)中随机采样得到的随机数,记作随机噪音(Random Noise)z,输出则是和真实图片相同分辨率的图片

D的任务是区分真假,即判断一张图片到底是真实图片,还是G合成的虚假图片。因此,D的输入是图片,输出是一个分数D(·),分值越高表示输入图片越真实。理想情况下,D应当对于所有真实图片都输出高分,对于所有虚假图片都输出低分,如此一来,便可以完美实现判别真假的目标

回到我们之前介绍的模型优化上来,在具体实现上,G和D都可以通过神经网络(Neural Network)来实现,并且都包含大量的可调参数。在经过初始化之后,G不具备任何的生成能力,输出的虚假图片和真实图片相去甚远;D也不具备任何的判别能力,对于真实或虚假图片所输出的分数没有太大区别

现在开始模型的优化~在每次迭代中,我们随机选择一批真实图片x,并随机生成一批z,然后将z输入G得到一批虚假图片x'=G(z)。D的损失函数包括两方面:第一是x对应的分数D(x)应当比较高,例如和1尽可能接近;第二是x'对应的分数D(x')应当比较低,例如和0尽可能接近。按照损失函数减小的方向,调整D的每一个参数,便完成了D的一次优化。在经过优化之后,D对于真实或虚假图片所输出的分数,就更加有区分度了

至于G,其目标是让D误以为x'是真实图片,因此G的损失函数可以是D(x')和1之间的差距,这个差距越小,表明在D看来x'越真实。按照损失函数减小的方向,调整G的每一个参数,便完成了G的一次优化。在经过优化之后,G合成的虚假图片,在D的判别下,就变得更加真实了。值得一提的是,在整个优化过程中,G并没有接触到真实图片x,它也不在乎真实图片x长什么样,只要合成的虚假图片x'在D看来像真的就行

重复以上步骤,随着优化的进行,D的判别能力越来越强,G的生成能力也越来越强,两者互相博弈、共同进步。在理想的情况下,G最终可以生成和真实图片难以区别的虚假图片,如此一来,为了合成一些不存在的图片,我们只需要随机生成很多z,输入G即可得到对应的合成结果。

以上就是GAN的基本原理,最后再贴一下Goodfellow论文里所使用的损失函数

04

合成结果

在具体实现上,如果对深度学习(Deep Learning)中常用的层(Layer)和算子(Operator)比较熟悉,那么应该可以很轻松地想到如何实现G和D,只要使得G将随机向量映射为图片,而D将图片映射为数值即可。例如,在Goodfellow的论文中,一种方法是通过全连接层(Fully-Connected Layer,也称为Dense)来实现G和D,另一种方法则是用二维卷积层(Conv2d)实现G,以及二维逆卷积层(Deconv2d)实现D

论文展示了在MNIST、TFD、CIFAR-10三个数据集上的实验结果,其中最右一列表示和倒数第二列中的虚假样本,最为接近的真实样本。虽然这些结果在今天看起来不怎么样,但是在论文发表的2014年,能够实现这样的合成效果,已经足以引起相当大的轰动了

时间走到2019年底,无监督(Unsupervised)人脸生成的天花板(State-of-the-Art,SOTA)已经由StyleGAN2再次刷新,出品自NVIDIA,是在他们前期工作StyleGAN基础之上的又一次完善和升级。生成分辨率提升至1,024*1,024,合成人脸的真实性、清晰度、多样性也获得了极大提升,不禁让人直呼鹅妹子嘤,也许这就是GAN的魅力所在吧

以上就是今天的全部内容,在下一篇文章中,我将对GAN后续的研究方向进行整理和总结,我们下次见~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宏伦工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档