贪心科技编译
前言
这篇文章中,作者通过将生成对抗网络(GANs,以下均简称GANs)运用到图片生成任务中向我们解释了其的原理。GANs是无监督学习中少有的成功的技术,一经提出,将生成任务推动到了新的高度上。在多样的图片生成任务中,GANs独领风骚。Yann LeCun(深度学习的先驱)将GANs称作“近十年以来机器学习中最优秀的想法”。最重要的是,在显著的性能的同时,GANs的核心思想又是那么地浅显易懂。本文在图片生成的任务重向读者们揭开了GANs的神秘面纱,以下是本文的主要内容:
1,深度学习的简要回顾
2,图片生成
3,生成任务的关键问题
4,生成对抗网络
5,挑战
6,深入的学习
7,总结
图1神经网络,棕色的是输入,黄色的是中间层,红色的是输出
首先让我们回顾一下深度学习的发展。如图1所示,这是一个神经网络的简图。神经网络是由相互连接的神经元所组成。神经元们被组织分层,因此,我们将他们分为在中间的隐层,输入(最左)以及输出层(最右)。每一条边,都是有权重的;每一个神经元,都是与之相连的上一层的神经元,通过权重,加和其值,再通过一个非线性的激活函数(比如:sigmoid 或ReLu)得到的。正如图1所示,第一隐层的神经元是通过对输入层的神经元权重求和后,使用ReLU函数得到的。在这里,激活函数可以引入非线性。这样可以使神经网络对更复杂的情况建模(单个线性层可以达到多个线性层组合的效果)。
对于一个给定的输入,我们一个个地计算每一个神经元的输出。而我们的计算是一层层(图中的一列神经元为一层)地,从左到右利用上一层的的结果,计算下一层的输出。依据输出层的结果和我们希望得到的输出(目标值),我们定义一个代价,用来衡量神经网络的性能。比如,均方差代价函数:
其中x是输入,h(x)是输出,y是我们的目标值。整个函数是对我们数据集中所有的数据求和。
训练的每一步,我们的目的都是为了将边(图1中连接神经元的部分)的权重调整到合适的值,以尽可能地减小代价函数。在这个过程中,我们会计算梯度,它会告诉该如何调整权重。一旦我们计算好了代价,我们便可以使用反向传播法来计算梯度。利用微分的链式法则和反向传播法,我们可以得到每一层的权重的梯度。简单来说,我们从输出层到输入层,反向地计算梯度。最后,我们按照对应梯度的一定比例,更新每一个权重(即,梯度下降)。
所谓的图片生成,即利用机器学习模型去生成图片。通常,我们会有一个图片的数据集用来训练。在测试阶段,模型能够生成和训练集相似的图片,但并不是完全和数据集一样(具有一定的泛化)。即,我们生成的图片是新的,并不是简单地从数据集中来的,我们所做的是从训练集中学习到一定的模式,生成这类模式的图片。
图2图片生成:没有输入,输出时想要的图片
需要注意的是:在测试(或预测)阶段,并没有输入。每一次我们运行模型的时候,我们是想要它能生成一个新的图片。为了达到这个目的,我们的输入都是从一个分布中随机地采样(通常是正态分布)。
生成任务中的关键问题是:如何定义一个好的代价函数?当你有两张输出的图片时,你要如何决定哪一个更好?有多好?
在之前的方法中,最常见的解决方案是定义输出和它在训练集中最近邻的距离(distance)。比如,在语言翻译中,我们有原句子和一个小集合(假设5个)的目标句子(不同的人提供的译本)。当一个模型生成一句翻译的时候,比较译文和每一个目标句子,并以与之最接近的目标为基础进行打分(比如使用在n-grams匹配中的BLEU分数)。这对单个句子的翻译适用,但当文本内容增长时,代价函数的质量明显下降。比如,当我们的任务时要生成给定文章的比较长的概要(通过是好几个句子)时,少量的样本并不能代表多变的所有可能的答案时,代价函数并不能起到很好的作用。
GANs的提出,使用另外一个神经网络,解决了3中提到的问题。我们利用一个打分神经网络(被称作鉴别器)来对生成网络的输出进行打分,判断其以假乱真的程度。这样两个神经网络有着相反的目标(“对抗”)。生成网络的目标是生成以假乱真的图片,鉴别器的目标是分辨图片的真伪。
在GANs中,生成任务就像是在有两个玩家的强化学习当中(比如围棋)。我们的机器学习模型通过和自己博弈来提升自己。不同在于,在类似于围棋一样的游戏中,两位玩家的角色是对称相似的(虽然不总是这样)。在GANs中,两个网络的目标和角色是不同的,一个生成以假乱真的样本,一个分辨样本的真伪。
图3对抗生成网络,生成网络标注为G,鉴别网络标注为D
生成网络G和鉴别网络D之间,进行着二元的极小极大博弈。首先,从图中可以看到D的输入是从训练数据或生成网络的输出进行采样:一半是训练集,一半是生成网络的输出。G为了生成样本,潜在向量从高斯分布采样作为G的输入。如果我们要生成一个200x200的灰度图,那么G的输出就是一个200x200的矩阵。目标函数如下,是一个标准的对数似然函数:
生成网络G将会最小化目标函数(即,变化网络参数使得对数似然值变小,或者说,更好地迷惑D)。换句话说,希望D可以将G的输出认为是真实数据。鉴别网络D将会最大化目标函数(即,变化网络参数使得对数似然值变大,或者说,更好地分辨真伪)。当G起到效果时,它将会通过增大第二项中的来减小目标函数;当D起作用的时候,它将会通过增大第一项中的,减小第二项中的来增大目标函数。
训练的过程,使用随机初始化和向后传递算法。除此之外,我们还要交替地更新鉴别网络和生成网络(更新一个时,保持另一个参数不变)。使用GANs来解决一个特定的问题时,大致的步骤如下:
决定GANs的结构:G的结构如何?D的结构如何?
训练:交替更新D和G(更新一个时,固定另一个的参数)。 更新D(固定G):一半从真实数据采样,一般从生成数据; 更新G(固定D):均从生成数据采样(注意,即使D是固定的,但是梯度也是从D传递过来的)。
人为地观察以假乱真的样本。如果质量足够高(或者质量不再提高)停止训练。否则,重复步骤2。
G和D都是前馈神经网络,下图为在MNIST数据集上训练得到的结果:
图4引自Goodfellow等人,最右列(黄色方框内)是与其左方最接近的真实数据。其他所有图片均是生成的。
将G和D的网络构造得更为复杂(使用带步幅得卷积和adam优化器而不是用随机梯度下降……)我们可以得到这样的效果:
图5引自Alec Radford等人,卧室的图片
训练GANs的最大挑战是:可能不收敛。这个问题也被称为mode collapse。让我们用一个例子来简单地解释这个问题。假设,我们有个在MNIST数据上生成数字图片的任务。一种可能会发生的情况是,G也许会只生成6这个数字。一旦D适应了G这种行为,为了去最大化分类的准确性,它将会认为所有的6都是假的,所有的其他数字都是真的。那么,当G适应了D的这种行为,它会开始只生成数字8……我们会发现,G只生成一个真实数据的子集,而当D将这个子集全部否定的时候,G又会去生成另外一个子集。它们一直在摇摆。
尽管现在这个问题依旧没有完全解决,但目前已经有很多研究尝试对此进行优化。有一些方法是使用minibatch特征,或通过多次更新D来向后传递。在这里,我们不再深入讨论细节。
如果你想要深入的学习GANs,强烈推荐ICCV2017 tutorials on GANs(google sites)。这里有针对不同方面的介绍。在这里,作者想要特别提的是带条件的GANs。带条件的GANs:GANs的输入作为输出的条件,对输出进行约束。比如,要生成一张匹配输入文字的图片。如果,输入的是“狗”,那么输出的图片也是狗。
接下来是最近一些关于GANs的研究:
图6根据文字生成图片,引自Reed等人
图7图片超分辨率,引自Ledig等人
图8从图片到图片的转化,引自Isola等人
图9生成高分辨率的名流照片,Karras等人
总结
希望这篇文章帮助你了解到了一个新的深度学习的技术(对抗生成网络)。这是在无监督机器学习当中少有的非常成功的技术,并且革命性地改变了我们解决生成任务的能力。在最近几年来,取得了让人印象深刻的成就。GANs也被应用到了语言任务等其他领域当中。
联系客服