生成对抗网络:两个神经网络的对弈(文字版)

点击这里收听本期节目音频版

编辑: 肖怡婷

本期嘉宾: 刘爽(UCSD 博士学生) (G)

主播: 舒晏 (S), 阿拉法特 (A)

A
我周末想的这样一个方法,想改进我做节目的质量。
S
你想怎么做?
A
你看,高晓松主持他的《矮大紧指北》就非常的好,我打算模仿他。但是为了帮助我更快地进步,我决定把每期我做的节目和高晓松做的节目都发给你,如果你能区分出哪个是我做的,哪个是高晓松做的,那我就继续努力,直到有一天你再也区分不出我和高晓松了。
S
所以你是想靠无厘头的想法来引出我们今天要讨论的生成对抗网络,是吗?
A
是的。

 00:40 
A
大家好,欢迎收听德塔赛。我是阿拉法特。
S
我是舒晏。
A
今天参加我们节目的是我办公室的同事,刘爽。
G
大家好,我是刘爽。我是 UCSD 二年级的博士生。
S
今天我们要跟刘爽来一起讨论 Generative Adversarial Network 这个模型,它的中文叫生成对抗网络。刘爽你可以先给我们介绍一下生成对抗网络这个模型吗?
G
为了介绍生成对抗网络这个概念,首先我们要从它的起源说起。机器学习这个领域自古以来有两种模型:一种叫做生成模型,一种叫做判别模型。判别模型,举个例子,就是说如果我有猫和狗的图片,那我这个模型就是用来判别一幅图片是猫还是狗;生成模型就是专门为了生成某一类图片,比如专门为了生成猫的图片,或者专门为了生成狗的图片。最开始的生成模型,它的结构比较简单,它只有一个组成部分,比如可以是一个神经网络,也可以是其他任何一个模型,这个模型会带有很多参数,我们通过改变这些参数来达到一个比较好的生成效果。但是从 2014 年开始,一种新的思路被提出了,那就是用两个网络来训练一个生成模型。它的工作原理是这样的:首先我们要有一个生成器,它和以前一样专门负责生成比如图片。但是我们为了衡量生成出来的图片的质量,我们就引入另外一个网络,叫做判别器。假设我们有一个真实世界的猫的图片数据集,然后我们的生成器自己生成了一个它认为比较好的猫的图片集,那我们怎么来判断这两个图片集是否相近呢?一个比较直观的想法可能是把这两个数据集的猫两两配对,看看每一对之间的猫像不像。但这个想法基本上是行不通的,因为首先你不知道怎么样配对比较好;其次,配对以后你也没有一个很好的判别标准。
A
为什么会有问题呢?如果我们直接要求网络生成和我们给它的图片尽可能相似的图片,会有什么问题吗?
G
如果配对以后,每一对图片真的很相似的话,那我们生成出来的其实并不是一个猫的数据集,而只是原来数据集的一个拷贝。
S
所以我们想要生成的数据集它应该具有什么样的特点呢?
G
我们想要生成的数据集一般需要符合两个要求。第一个是质量的要求,就是说我拿出任何一张生成的图片,它都要长的足够像猫,它不能像一个不猫不狗的东西,也就是说图片质量得到保证。另外一个是多样化的要求,也就是说我不能光生成某一只猫的图片,我要生成各种各样猫的图片。更进一步要求是我虽然生成了各种各样的猫的图片,但却不是原来数据集猫里面图片的一个简单拷贝,可能会生成一些我数据集里没有的猫,比如说我数据集里有白猫,有黑猫,那我可能生成出来一张黑白混血猫的图片,那这个一般来说是被认为一个比较好的表现。
A
这两点也就是我们对生成网络的期待了。
G
对,这两点就是我们对生成网络的期待。这时候我们就需要一个很好的衡量两个数据集之间距离的标准,其中一个数据集就是真实的数据集,另外一个是我们生成器生成出来的数据集。这个标准,根据刚刚的解释,它并不是一个很容易得到的一个标准,这个时候判别器就起作用了。
A
这个标准具体是怎么和你刚刚提到的我们的生成图片的两个要求联系起来的?
G
这个标准应该是一个关于这两个数据集的函数。它的输入是两个数据集,它的输出是一个数值,这个数值越小,它就越符合刚刚那两个标准;这个数值越大,它就越不符合。
S
所以它比较像是两个数据集之间的一种距离,这个距离越小,说明它们就更相似。
G
对。
A
如果判别器认为生成器生成的图片和我们真实的图片越相似,这说明生成器的生成就做得越好。
G
对的,回到我们的假设。我们有一个真实世界的猫的数据集,以及我们有另外一个我们的生成器生成出来的猫的数据集。这个时候我们就想训练一个分类器,它的目标是把所有真实世界的猫图片都判为 1,所有生成器生成出来的猫图片都判为 0。那么我们都知道,判别器的能力是有限的。所以对一个能力有限的判别器,如果它的表现越好,那就说明这两个数据集越容易被区分开来。两个数据集越容易被区分开来,就说明我们的生成器表现越差。
A
那这也就是对抗的意思了。生成器的目标就是要骗过判别器,让它无法区分它生成的图片和原始图片,从而让判别器表现非常的差。
G
对的,这就是这个模型名字最开始的来源。但事情并没有表面上看的这么美好,事实上我们现在得到的距离函数,衡量两个数据集之间距离的这样一个函数,它并不是一个简单的函数。简单的函数一般就是有数学表达式的函数,比如说两个点 X1 到 X2 的距离,它们可能可以是 | X1 - X2 | 的平方。而我们现在这个距离函数相当于是一个分类器的表现,一个分类器的表现是没有一个数学表达式的,而且是需要通过不断的迭代优化才能得出来的。所以我们其实并不能把它直接运用于对生成器的优化。因为一个可以直接给生成器用来优化的函数,它是需要可以求导的,而我们现在这个函数并不可以直接求导。

 07:43 
S
那么我们现在清楚了,在生成对抗网络里面,它主要有两个部分,一个是生成器,一个是判别器。那么生成对抗网络它的结构到底是什么样的呢?
G
一个比较传统的结构,我们先来讲生成器吧。生成器的输入是一个随机的变量,一般可能会选用比如说长度为 100 的一个 01 串,其实任何一个随机性质的数字都可以满足要求。它的输出当然就是一张图片,因为它的目的是为了生成图片。它中间经过的可能就是一个 Feedforward Network,也就是说这个网络的作用是把一个随机的 01 串变成一张比如说猫的图片。那我们再来讲判别器的输入和输出。如果我们判别器用的是一个简单的分类器,那它的输入输出就是传统意义上的输入是一张图片,输出是一个 0 到 1 之间的一个数。它越接近 1 就说明这个判别器越认为它是从真实数据集来的,越接近 0 就说明这个判别器越认为它是由生成器生成出来的。
A
听起来这两个结构其实也并不一定必须是神经网络。
G
对,其实这两个都不一定要是神经网络。只是由于现在不管是生成的任务,还是判别的任务,神经网络都能取得最好的效果,所以现在大家这两个模型都会用神经网络来实现。

 09:31 
A
那我们回到一开始 Ian Goodfellow 的那篇论文。他们一开始提出生成对抗网络是想把这个网络用来做什么事情呢?
G
其实生成一个数据集的任务可以追溯到上个世纪,也就是说这是一个人们一直关心的一个问题。这篇论文的主要贡献就是解决了以往的生成网络生成的图片质量都比较低,都不是很像真实世界的图片。也就是说,你一看到它生成的图片就知道它是由机器生成出来的。但如果我们用生成对抗网络模型来训练的话,我们可以生成出质量直逼真实世界的图片。
A
他们一开始更多还是关注了如何生成更加精细的图片的这样一个目标。
G
对。
S
那么这个时候观众朋友们可能会问,生成图片这个任务的意义是什么呢?为什么有人会想要去在这个任务上做提高呢?
G
这也是一个人们已经讨论或者说争论了很久的一个问题。从现实的角度来讲,它有一些比较直接的应用,比如有的时候我们比较缺乏训练数据,那我们可以用机器生成一些人工数据,它们虽然质量比较低,但它确实能帮助我们其他的训练。但我们也可以把这个问题上升到一个比较哲学的高度。我记得有一句比较有名的话叫做 what you cannot create you don’t understand。我相信这句话也经常被用在介绍生成对抗网络的文章里。从很久以前,人们就倾向于相信我们现实生活中的图片,虽然它们看上去维数很高,比如说它们可能是 128×128 的图片,那么它的维度就有 128×128,但它实际上的维度是非常低的,比如说可能只有20。为了理解这样一种现象,我们就试图通过一个维度只有 20 的一个向量把它做变化,变化成一个自然世界的图片。如果我们能成功的进行这种变化,那我们就相当于能够进一步了解自然世界的这些图片有一些什么样的内在的规律。那这个把一个维度 20 的向量变成一个真实的图片,这个过程其实就是生成器做的事情。
S
并且这个向量像你刚才说的,它还甚至可以是完全随机的。
G
对,它甚至可以是完全随机的一个向量。

 12:11 
A
但是这几年我们在生成对抗网络的论文中看到了比生成图片更加广泛的一些应用。
G
对的,我印象比较深刻的一个应用就是,前一段时间,有人把生成对抗网络用于 domain transformation。两个比较简单的例子,其中一个就是说我们都知道,很久以前就有那种可以把一个普通的线条画变成一个梵高风格的画的这样一个应用。那个时候生成对抗网络还没有出现。现在生成对抗网络出现了,我们就可以用生成对抗网络来解决同样的问题,可能可以取得与之前相当甚至更好的效果。
A
那在这个例子中,判别器和生成器分别在做什么?
G
为了解决这个问题,首先我们需要两个数据集。一个是铅笔线条画的数据集,比如说我有铅笔线条画画的一些向日葵。然后我现在又有梵高画的很多向日葵。这个时候我的生成器其实已经不简单的是一个生成器了,它相当于是一个映射器。它的目标是把一幅简单的铅笔线条画出来的向日葵映射为一个梵高风格的向日葵。那我们的铅笔线条画的数据集在这个网络的映射下,它就会变成一个梵高风格的数据集,哪怕它其实并不是很梵高分格。那这个时候我们的判别网络它就会来判断我们生成器转化过后的我们希望是梵高风格的这个数据集以及真真正正是梵高风格的这个数据集它们之间到底相不相似。如果判别器认为不是很相似,那生成器就可以获得一些反馈,使得它从铅笔线条画到梵高风格转化就更加的精细。
S
但是梵高有很多画都保存到现在吗?
G
其实这个问题我并不是很清楚,但是我有一个相关的例子,可能可以支持我刚刚的想法。另外一个应用就是把马变成斑马,我们知道马和斑马的区别主要是它们身上的条纹。所以有一个实验,他们声称只需要一千幅马的图片以及一千幅斑马的图片,他们就能训练出一个很好的转化器,可以把任何一幅比较清楚的马的图片转化成斑马的图片。他们甚至可以把一个马在地上走动的视频直接转化成一个斑马在地上走动的视频。那么回到梵高的例子。梵高可能没有一千幅存留下的画作,但是可能也有上百幅吧。那我相信上百幅画其实也可以达到一个比较好的训练效果。
S
所以说生成对抗网络的一大优点就是它对于训练集的要求比较小,它可能对质量有一定的要求,但是对数量其实要求并不高。
G
恰恰相反。最原始的生成对抗网络对数据集的要求其实是非常苛刻的。但很奇怪的是,这种生成对抗网络偏门的应用,比如说把马转化成斑马,这种情况下需要的数据量就大大的减少了。我们可以这样想,因为马到斑马这个转化的概念是比较好学的。所以我们其实并不需要太多幅图片就可以掌握其中的规律。而如果你想学一个现实世界中猫的数据集,那现实世界中猫光品种就有上千种,那我们少说也要上千幅猫的图片才能学出点像样的东西吧。
A
而且输入信息可能也是不够,不如像马的图片那么的丰富。
G
对的。

 16:23 
S
因为我知道有好几个人,他们都有训练生成对抗网络的经验,并且他们的训练效果是一塌糊涂。所以我就在想,相比于训练其他的神经网络,训练生成对抗网络有什么格外的困难吗?
G
这也是这几年被讨论的比较热烈的问题之一。为了理解这个问题,我们不如先回忆一下在生成对抗网络出现之前,我们最关心的基本上是分类器这个问题。而分类器一个最大问题就是它会过拟合,也就是说它有可能在训练数据集上表现得非常好,但在测试数据上表现得非常差。这个原因就在于它很可能只是单纯地记住了训练数据的映射,比如它单纯地记住这张图片就是猫,那张图片就是狗,以至于当它在面临特殊数据集时,它看到了一张没有见过的猫或者狗的图片,它就不知所措了。但这个问题同样也会出现在生成对抗网络中,因为生成对抗网络或多或少都会用到一个类似于分类器一样的东西。我们考虑如下这样一种情况。在训练一开始,我们的生成器表现很差,它输出的是一些没有意义的噪声图片,那么判别器很轻易地就能区分出全是噪音的图片以及真实的图片对吧。这个时候我们不希望发生的事情就发生了,因为这个时候我们的生成器是几乎没有获得什么有用的反馈的。生成器希望获得的反馈是,如果我把我生成的图片稍微做一些改动,我会不会更像真实的图片呢?但由于现在的判别器,分类器学得非常完美,所以它只要看到长的哪怕是有一丁点像是噪音的图片,它就会把这个图片比如说标为零,所以说我们的生成器在现在的输出上做一些微小的改动,它的目标函数是不会变的,和之前一样都是零,所以它就不能获得很好的倒数,也就是说它的训练就暂时停滞了,不能继续了。为了解决这个问题,一般我们故意让我们的判别器做得非常不好,比如说判别器看到噪音的时候,它也有可能认为是一张比较好的图片。比如说它看到一张满是噪音的图片,但它似乎能看到一个数字 7 的轮廓,那它就会觉得它有 0.5 的概率是数字 7。虽然在这种情况下我的判别器是一个不合格的判别器,但对于生成器来说,这是个非常好的事情,因为它如果现在生成了一张全是噪音的图片,它如果知道我改变某几个像素点它就可以生成一张带有数字 7 轮廓的图片,那它就知道如果我只要改变这几个像素点我就会更靠近数字 7 了。
S
也就是说我们是希望能保证生成器和判别器尽可能一样聪明?
G
其实也不完全是这样。我们可以让我们的生成器非常的聪明,但是我们必须让我们的判别器一直保持着一种有一丁点儿聪明的状态。

 19:49 
A
那么刘爽,我们回到你的研究上。我知道你今年在 NIPS 是发表了一篇跟生成对抗网络有关的论文。那么你的工作是集中在哪一方面呢?
G
我们分析了近几年出现的各种各样的生成对抗网络,总结出它们其实都在干一件或多或少相同的事情,这件事情我们称之为 general moment matching。moment matching 就是说我有两个数据集,我希望比较它们是不是相似,那我们就算一下这两个数据集的统计量,可以是平均值、方差,任何统计量都可以。如果两个数据集很相似,他们的统计量就会非常接近,比如说他们的平均值应该非常接近,他们的方差应该非常接近,他们的三次方的平均值也应该非常接近。那这几年出现的生成对抗网络模型都或多或少是在干如下的这样事情。就是我们现在有一个函数库,这些函数库里面包含各种各样的统计量,我们希望在这个函数库里找一个最好的统计量,能够最大化地区分出两个数据集。
A
在他们不同的情况下。
G
对。那我们的工作的主要贡献就是证明了现在出现的各种各样的生成对抗网络是符合我刚刚说的那些特性。
A
那么听到这里观众朋友们应该就能够理解,我一开始是想做一个高晓松的生成器,然后请舒晏做一个不那么严格的判别器帮助我改进。
S
那现在判别器觉得,你离高晓松还有很大的距离。
A
那么我们今天的节目差不多就到这里了。我们非常感谢刘爽能够给我们解释这么多跟生成对抗网络有关的内容。
G
谢谢阿拉法特和舒晏邀请我来做节目。
S
感谢大家的收听,希望大家喜欢这期节目,并且和你身边的朋友分享。我们下期节目见。
A
再见。