男:哎,你看我给你拍的好不好?

女:这是什么鬼,你不能学学XXX的构图吗?

男:哦

……

男:这次你看我拍的行不行?

女:你看看你的后期,再看看YYY的后期吧,呵呵

男:哦

……

男:这次好点了吧?

女:呵呵,我看你这辈子是学不会摄影了

……

男:这次呢?

女:嗯,我拿去当头像了

上面这段对话讲述了一位“男朋友摄影师”的成长历程。很多人可能会问:这个故事和生成式对抗网络(GAN)有什么关系?其实,只要你能理解这段故事,就可以了解生成式对抗网络的工作原理。

首先,先介绍一下生成模型(generative model),它在机器学习的历史上一直占有举足轻重的地位。当我们拥有大量的数据,例如图像、语音、文本等,如果生成模型可以帮助我们模拟这些高维数据的分布,那么对很多应用将大有裨益。

针对数据量缺乏的场景,生成模型则可以帮助生成数据,提高数据数量,从而利用半监督学习提升学习效率。语言模型(language model)是生成模型被广泛使用的例子之一,通过合理建模,语言模型不仅可以帮助生成语言通顺的句子,还在机器翻译、聊天对话等研究领域有着广泛的辅助应用。

那么,如果有数据集S={x1,…xn},如何建立一个关于这个类型数据的生成模型呢?最简单的方法就是:假设这些数据的分布P{X}服从g(x;θ),在观测数据上通过最大化似然函数得到θ的值,即最大似然法:

  

  GAN的工作原理是这样的

文章开头描述的场景中有两个参与者,一个是摄影师(男生),一个是摄影师的女朋友(女生)。男生一直试图拍出像众多优秀摄影师一样的好照片,而女生一直以挑剔的眼光找出“自己男朋友”拍的照片和“别人家的男朋友”拍的照片的区别。于是两者的交流过程类似于:男生拍一些照片 ->女生分辨男生拍的照片和自己喜欢的照片的区别->男生根据反馈改进自己的技术,拍新的照片->女生根据新的照片继续提出改进意见->……,这个过程直到均衡出现:即女生不能再分辨出“自己男朋友”拍的照片和“别人家的男朋友”拍的照片的区别。

我们将视线回看到生成模型,以图像生成模型举例。假设我们有一个图片生成模型(generator),它的目标是生成一张真实的图片。与此同时我们有一个图像判别模型(discriminator),它的目标是能够正确判别一张图片是生成出来的还是真实存在的。那么如果我们把刚才的场景映射成图片生成模型和判别模型之间的博弈,就变成了如下模式:生成模型生成一些图片->判别模型学习区分生成的图片和真实图片->生成模型根据判别模型改进自己,生成新的图片->····

这个场景直至生成模型与判别模型无法提高自己——即判别模型无法判断一张图片是生成出来的还是真实的而结束,此时生成模型就会成为一个完美的模型。这种相互学习的过程听起来是不是很有趣?

上述这种博弈式的训练过程,如果采用神经网络作为模型类型,则被称为生成式对抗网络(GAN)。用数学语言描述整个博弈过程的话,就是:假设我们的生成模型是g(z),其中z是一个随机噪声,而g将这个随机噪声转化为数据类型x,仍拿图片问题举例,这里g的输出就是一张图片。D是一个判别模型,对任何输入x,D(x)的输出是0-1范围内的一个实数,用来判断这个图片是一个真实图片的概率是多大。令Pr和Pg分别代表真实图像的分布与生成图像的分布,我们判别模型的目标函数如下:

  

类似的生成模型的目标是让判别模型无法区分真实图片与生成图片,那么整个的优化目标函数如下:

  

这个最大最小化目标函数如何进行优化呢?最直观的处理办法就是分别对D和g进行交互迭代,固定g,优化D,一段时间后,固定D再优化g,直到过程收敛。

一个简单的例子如下图所示:假设在训练开始时,真实样本分布、生成样本分布以及判别模型分别是图中的黑线、绿线和蓝线。可以看出,在训练开始时,判别模型是无法很好地区分真实样本和生成样本的。接下来当我们固定生成模型,而优化判别模型时,优化结果如第二幅图所示,可以看出,这个时候判别模型已经可以较好的区分生成数据和真实数据了。第三步是固定判别模型,改进生成模型,试图让判别模型无法区分生成图片与真实图片,在这个过程中,可以看出由模型生成的图片分布与真实图片分布更加接近,这样的迭代不断进行,直到最终收敛,生成分布和真实分布重合。

以上就是生成式对抗网络的基本核心知识,下面我们看几个在实际中应用的例子。

  GAN在图像中的应用——DCGAN

为了方便大家更好地理解生成式对抗网络的工作过程,下面介绍一个GAN的使用场景——在图片中的生成模型DCGAN。

在图像生成过程中,如何设计生成模型和判别模型呢?深度学习里,对图像分类建模,刻画图像不同层次,抽象信息表达的最有效的模型是:CNN (convolutional neural network,卷积神经网络)。

CNN是深度神经网络的一种,可以通过卷积层(convolutional layer)提取不同层级的信息,如上图所示。CNN模型以图片作为输入,以图片、类别抽象表达作为输出,如:纹理、形状等等,其实这与人类对图像的认知有相似之处,即:我们对一张照片的理解也是多层次逐渐深入的。

那么生成图像的模型应该是什么样子的呢?想想小时候上美术课,我们会先考虑构图,再勾画轮廓,然后再画细节,最后填充颜色,这事实上也是一个多层级的过程,就像是把图像理解的过程反过来,于是,人们为图像生成设计了一种类似反卷积的结构:Deep convolutional NN for GAN(DCGAN)

DCGAN采用一个随机噪声向量作为输入,如高斯噪声。输入通过与CNN类似但是相反的结构,将输入放大成二维数据。通过采用这种结构的生成模型和CNN结构的判别模型,DCGAN在图片生成上可以达到相当可观的效果。如下是一些生成的案例照片。

  GAN在半监督学习中的应用

再来看一个GAN在半监督学习(semi supervised learning)中的例子。假如我们面对一个多分类的任务,手里只有很少有标注的样本,同时有很多没有标注的样本,怎么能够利用GAN的思路合理使用无标签数据,提高分类性能呢?

在去年NIPS大会上,来自OpenAI的作者提供了如下思路:考虑一个K分类任务,有一个判别模型 G可以帮助生成样本,与此同时,有一个判别模型做一个K+1分类任务,其中新加的类是预测样本是否是由生成模型生成的。跟传统GAN不同,这里我们最终需要的是判别模型,而不是生成模型。

简单而言,目标函数针对不同数据,可以分为两部分。对于有标注的样本,目标是希望判别模型能够正确输出标签。而对于没有标注的生成样本,则是由GAN定义的loss。

该作者认为这样处理的好处是可以充分利用未标注数据来学习样本分布,从而辅助监督学习的训练过程。实验结果也显示通过这种处理方法训练出来的判别模型,在合理利用未标注数据方面,有着比其他方法更好的效果。

  GAN的改进——WGAN

刚才谈到很多GAN的优点、应用和变种,那么GAN真的是完美无缺的吗?

其实使用过GAN的人应该知道,训练GAN有很多头疼的问题。例如:GAN的训练对超参数特别敏感,需要精心设计。GAN中关于生成模型和判别模型的迭代也很有问题,按照通常理解,如果判别模型训练地很好,应该对生成的提高有很大作用,但实际中恰恰相反,如果将判别模型训练地很充分,生成模型甚至会变差。那么问题出在哪里呢?

在ICLR 2017大会上有一篇口头报告论文提出了这个问题产生的机理和解决办法。问题就出在目标函数的设计上。这篇文章的作者证明,GAN的本质其实是优化真实样本分布和生成样本分布之间的差异,并最小化这个差异。特别需要指出的是,优化的目标函数是两个分布上的Jensen-Shannon距离,但这个距离有这样一个问题,如果两个分布的样本空间并不完全重合,这个距离是无法定义的。

作者接着证明了“真实分布与生成分布的样本空间并不完全重合”是一个极大概率事件,并证明在一些假设条件下,可以从理论层面推导出一些实际中遇到的现象。

既然知道了问题的关键所在,那么应该如何解决问题呢?该文章提出了一种解决方案:使用Wasserstein距离代替Jensen-Shannon距离。并依据Wasserstein距离设计了相应的算法,即WGAN。新的算法与原始GAN相比,参数更加不敏感,训练过程更加平滑。

  GAN的未来

无论是无监督学习、半监督学习,GAN给我们提供了一个处理问题的崭新思路,就是把博弈论引入到机器学习过程中来。可以预见,GAN本身的算法以及看问题的角度,必将对未来设计算法、以及解决实际问题产生深远的影响。

那么,GAN当前有哪些急需解决的问题呢:

首先,针对图片生成问题而言,一个至关重要的问题是GAN和其他方法比,到底好多少?GAN框架中的各种衍生算法相互比较,谁好谁坏?很可惜的是,现在没有一个客观的公认标准去衡量不同图片生成算法的差异性。其实这本身就是一个难题,因为人会从多角度判断一张图片是否真实,如图片是否清晰、图片物体线条颜色是否正确、图片里是否有一些反直觉的物体等,只有有了合理的衡量标准,才能科学系统地研究并改进GAN的算法。

其次,GAN是着眼于对所有生成模型的学习,并不局限于图像生成一个应用层面。那么GAN如何运用于其他问题,如机器翻译、对话生成、语音生成等?这些都是有趣、富有挑战的事情。其实还有更有趣的事情,如GAN能不能生成真实场景作为模拟器,帮助训练自动驾驶?GAN能否生成逼真的虚拟视觉给人们提供全新的游戏体验?

也许盗梦空间离我们很近,也许盗梦空间的创造者就是你。

参考文献:

1.Wasserstein GAN

https://arxiv.org/abs/1701.07875

2.Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks

https://arxiv.org/abs/1511.06434

3.Improved techniques for training gans

https://arxiv.org/abs/1606.03498

4."Generative Adversarial Networks," NIPS 2016 tutorial by Ian Goodfellow

http://www.iangoodfellow.com/slides/2016-12-04-NIPS.pdf

  作者简介

  

贺笛,微软亚洲研究院副研究员。主要研究方向为深度学习和增强学习的算法设计、理论分析及在实际问题中的应用。

  ● 关于GAN的未来应用和发展,你有什么新奇的想法吗?欢迎在文章下方留言讨论~

  你也许还想看:

  • 秦涛:深度学习的五个挑战和其解决方案

  • LightRNN:深度学习之以小见大

  • 研究|对偶学习:一种新的机器学习范式

  感谢你关注“微软研究院AI头条”,我们期待你的留言和投稿,共建交流平台。来稿请寄:msraai@microsoft.com。微软小冰进驻微软研究院微信啦!快去主页和她聊聊天吧。

到底什么是生成式对抗网络GAN?相关推荐

  1. 王飞跃教授:生成式对抗网络GAN的研究进展与展望

    本次汇报的主要内容包括GAN的提出背景.GAN的理论与实现模型.发展以及我们所做的工作,即GAN与平行智能.  生成式对抗网络GAN GAN是Goodfellow在2014年提出来的一种思想,是一种比 ...

  2. 如何用 TensorFlow 实现生成式对抗网络(GAN)

    我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodfellow 在 14 年发表了 论文 Generative Adversarial Nets 以 ...

  3. 简述生成式对抗网络 GAN

    本文主要阐述了对生成式对抗网络的理解,首先谈到了什么是对抗样本,以及它与对抗网络的关系,然后解释了对抗网络的每个组成部分,再结合算法流程和代码实现来解释具体是如何实现并执行这个算法的,最后通过给出一个 ...

  4. 深度学习之生成式对抗网络 GAN(Generative Adversarial Networks)

    一.GAN介绍 生成式对抗网络GAN(Generative Adversarial Networks)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一.它源于2014年发表的论文:& ...

  5. 生成式对抗网络GAN(一)—基于python实现

    基于python实现生成式对抗网络GAN 构建和训练一个生成对抗网络(GAN) ,使其可以生成数字(0-9)的手写图像. 学习目标 从零开始构建GAN的生成器和判别器. 创建GAN的生成器和判别器的损 ...

  6. 《生成式对抗网络GAN的研究进展与展望》论文笔记

    本文主要是对论文:王坤峰, 苟超, 段艳杰, 林懿伦, 郑心湖, 王飞跃. 生成式对抗网络GAN的研究进展与展望. 自动化学报, 2017, 43(3): 321-332. 进行总结. 相关博客地址: ...

  7. 深度学习之生成式对抗网络GAN

    一.GAN介绍 生成式对抗网络GAN(Generative Adversarial Networks)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一.模型通过框架中(至少)两个模块 ...

  8. 生成式对抗网络(GAN, Generaitive Adversarial Networks)总结

    最近要做有关图像生成的工作-也是小白,今天简单学习一些有关GAN的基础知识,很浅,入个门,大神勿喷. GAN目前确实是在深度学习领域最热门,最有前景的方向之一.近几年有关于GAN的论文非常非常之多,从 ...

  9. 生成式对抗网络GAN模型搭建

    生成式对抗网络GAN模型搭建 目录 一.理论部分 1.GAN基本原理介绍 2.对KL散度的理解 3.模块导入命令 二.编程实现 1.加载所需要的模块和库,设定展示图片函数以及其他对图像预处理函数 1) ...

最新文章

  1. 比尔.盖茨人生的四张面孔
  2. Linux shell test用法
  3. 物联网基础之了解CCP协议,COAP协议,MTQQ协议等
  4. 小白科普:Java EE vs J2EE vs Jakarta EE
  5. 如何一键部署项目代码自动更新
  6. Android inflate方法与 findViewById 方法区别
  7. php5.6.16,OSX 10.11 中重新编译PHP5.6.16问题
  8. JDK6 中队web service的支持
  9. 工作192:vue项目如何刷新当前页面
  10. Linux 命令[2]:mkdir
  11. windows python安装包_Python-3.9安装包(windows版)
  12. linux中mysql不显示中文_linux中解决mysql中文乱码方法
  13. Java中遍历Set集合的三种方法
  14. win10任务栏不合并图标如何设置
  15. 【网络基础】以太网电缆:UTP和STP,直连线和交叉线,网线类别
  16. Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
  17. ubuntu18之wine
  18. 什么是DNS污染?DNS污染怎么办怎么解决?
  19. 免费的天气查询api接口调用
  20. map的常用用法详解(新手入门!!!)

热门文章

  1. java类加载 复制_Java 类加载全过程
  2. python多进程_python语法:多进程
  3. 大专生自学Java到找到工作的过程
  4. 一致性哈希算法的理解
  5. atitit. 文件上传带进度条 atiUP 设计 java c# php
  6. centos6.5下部署用于生产的hadoop,并使用C语言API连接hadoop
  7. 第一回写的用arraylist模拟栈操作
  8. 多学一点(八)——LNMP环境搭建
  9. oracle 11g RAC Grid Infrastructure
  10. weblogic登录验证被拒绝_使用Kubernetes身份在微服务之间进行身份验证