作者:PULKIT SHARMA
翻译:吴金笛
校对:王婷
本文长度约为4700字,建议阅读15分钟
本文介绍了生成模型和生成对抗网络(GAN)的工作原理和训练步骤。
概况
- 生成模型和GAN是计算机视觉应用领域中最新进展的核心内容。
- 本文将向您介绍GAN的世界及其不同组件。
- 现实世界中有一些令人兴奋的GAN实例在等待-让我们深入研究!
引言
你能挑出以下图片集中的奇特之处吗:
那这个图片集呢?
这些图像中的所有物体和动物都是由称为生成对抗网络(GAN)的计算机视觉模型生成的! 这是目前最流行的深度学习分支之一。 这当然有助于激发我们隐藏的创造力!
GAN绝对是我在深度学习领域最喜欢的主题之一。 我喜欢我们可以将这些模型应用到不同领域-从生成新面孔到创作绘画(以及填充旧绘画中的缺失部分)。
本文旨在向您介绍生成网络和GAN。 我们还将研究这些生成网络的各种应用,并深入研究使它们工作的组件。
目录
1. 什么是生成模型?
2. 生成模型的应用程序
3. 生成模型的类型
a. 显示密度
b. 隐式密度
4. 了解显示密度模型
5. 生成对抗网络(GANs)的介绍
6. GAN的分步训练过程
1. 什么是生成模型?
首先,让我们先了解生成模型的概念,然后再广泛地研究其应用。 这将帮助您可视化不同的用例,并在稍后讨论GAN时将它们联系起来。
在机器学习或深度学习中,我们主要处理两种主要类型的问题:监督学习和无监督学习。
在监督学习问题中,我们有自变量(x)和目标标签(y)。 目的是学习用于映射x和y的映射函数:
监督学习的示例包括分类,回归,目标检测,图像分割等。
另一方面,无监督学习问题只有自变量(x),没有目标标签。 这里的目的是从数据中学习一些潜在的模式。 无监督学习的示例包括聚类,降维等。
那么生成模型适合什么地方?
当我们获取训练数据后,生成模型会从训练集的数据分布中生成新样本。假设我们有一个训练集,其分布为。我们想要生成样本,以使生成的样本的分布类似于。让我进一步简化一下。
使用生成模型,我们首先学习训练集的分布,然后使用带有一些变量的学习分布生成一些新的观察值或数据点。
现在,有多种方法可以学习模型分布和数据真实分布之间的映射,我们将在后面的部分中讨论。在那之前,让我向你展示一些很棒的生成应用程序,它们可能会激发你对生成模型的兴趣。
2. 生成模型的应用
为什么我们首先需要生成模型?我一开始也有这个问题。但当我遇到的应用情况越多,我就越相信生成模型的力量。
因此,让我在本节中解释生成模型的一些用例来回答这个问题。
生成数据
你是否曾经尝试过从头开始建立一个深度学习?我们大多数人面临的最常见的挑战之一是缺乏训练数据。即使你有很多数据,我相信你也不会介意获得更多的数据!谁不喜欢更多的数据呢?
在某些行业中,我们需要更多的数据来训练更深的模型。医疗行业就是一个很好的例子。生成模型可以在这里发挥重要作用,因为它们可以用来生成新的数据。这些生成的图像可以用来增加数据集的大小。这是一个很酷的例子,生成模型被用来生成卧室的例子。
(https://arxiv.org/abs/1511.06434)
我们也可以使用生成模型来生成人脸。本文论述了逼真的人脸照片的生成。有许多这样的用例,我们可以使用生成模型来生成数据——卡通人物,名人的图像等。
图到图的翻译
我特别喜欢这个生成模型应用程序。你可以做一些有趣的事情,比如把卫星照片转换成谷歌地图,把白天的照片转换成夜晚的照片,把黑白照片转换成彩色照片,改变季节(比如把夏天转换成冬天):
这些都是图像到图像的翻译任务。这片论文阐述了许多图像到图像翻译任务的方法
(https://arxiv.org/abs/1611.07004)
面部老化和去老化
人脸衰老和去衰老是对人脸进行自然老化和去衰老的面部图像的绘制过程:
这可以用于识别跨年龄的面孔,也可以用于娱乐目的。 如果你希望获得更多详细信息,请随时参考这篇论文
(https://arxiv.org/pdf/1802.00237.pdf)
生成模型还有更多应用,例如3D对象生成,注意力预测,文本到图像翻译等。 让我们首先了解不同类型的生成模型。
3. 生成模型的类型
生成模型有两种类型:
1. 显式密度模型
2. 隐式密度模型
首先,请看下表了解两者之间的区别:
显式密度模型定义了显式密度函数,而隐式密度模型定义了可以直接生成数据的随机过程。
这是,伊恩·古德费洛(Ian Goodfellow)不同类型的生成模型的思维导图:
让我们更详细地了解这些生成模型。
4. 了解显式密度模型
我们知道显式密度模型定义了显式密度函数。然后,它试图在训练数据上最大化该函数的可能性。根据这些显式密度模型是否易于处理,我们可以进一步将它们划分为几个子部分:
- 可处理密度
- 近似密度
可处理意味着我们可以定义一个参数函数来有效地捕获分布。但是许多分布,如图像的分布或语音波的分布是复杂的,很难设计一个参数函数来捕捉它们。这种没有参数函数来捕捉分布的模型属于近似密度模型。
为了定义密度函数,我们使用链式规则将图像(x)的似然分解为一维分布的乘积:
这里p(x)表示图像x的似然性,右侧表示在给定所有先前像素的情况下,第i个像素值的概率。在定义了这个函数之后,我们最大化了训练数据的可能性。这就是可处理的显式密度模型的工作原理。
Pixel RNN和Pixel CNN是最常用的可处理密度模型。让我们在下面更加详细地讨论它们。
Pixel RNN
Pixel RNN是一种按顺序生成图像像素的深度神经网络。它从角开始生成像素,然后生成两个连续的像素。让我用一个例子来说明这一点。
假设我们要生成一个5×5的图像。它将有25像素值如下所示:
模型将首先从一个角生成像素:
然后,它将使用此角像素生成相应的两个像素:
并且此过程一直持续到生成最后一个像素为止:
像素的生成依赖于所有之前的像素值,该依赖关系使用递循环神经网络(RNN)或长短期记忆(LSTM)建模。
这是对Pixel RNN工作原理的简要概述。你可以查看官方的Pixel RNN 文件来深入阅读更多信息。(https://arxiv.org/pdf/1601.06759.pdf)
使用Piexl RNN的缺点在于速度很慢,由于生成是连续的。这就是为什么引入了Piexl CNN。
Piexl CNN
Pixel CNN的概念与Pixel RNN非常相似。 但是不是使用RNN对先前像素的依赖关系进行建模,而是在上下文区域上使用CNN。 就像在Pixel RNN中一样,我们从角落开始,然后生成两个连续的像素。
要生成像素(假设xi),模型只能使用先前生成的像素,即x1,x2,…,xi-1。 我们使用屏蔽过滤器来确保发生这种情况:
已生成的像素的值为1,其余的赋值为0。这将仅考虑生成的像素值。与Pixel RNN的训练时间相比,Pixel CNN的训练速度更快,但是像素的生成仍然是连续的,因此过程比较慢。
综上所述,Pixel RNN和Pixel CNN都可以显式计算似然p(x),这为我们提供了一个很好的评估指标来衡量模型的性能。上面我们看到生成的样本是好的。另一方面,从这些模型生成是缓慢的,因为它是一个连续的过程。
到目前为止,我们已经看到了可处理的密度函数。我们可以直接优化这些函数在训练数据上的可能性。现在,我们将讨论一个更有生成力的模型,称为变分自动编码器(VA)。
自动编码器工作原理简述
让我们快速理解什么是自动编码器,然后我们将讨论变分自动编码器的概念,以及我们如何使用它们来生成图像。
自动编码器是一种学习低维特征表示的非监督方式。
它们由两个相互连接的网络组成——编码器和解码器。编码器的目的是获取一个输入(x)并产生一个特征图(z):
这个特征图 (z)的形状通常比x小,你认为为什么会这样呢?
由于我们希望z只捕获能够描述输入数据的变化的有意义的因素,所以z的形状通常小于x。现在的问题是我们如何学习这个特征表示(z)?我们如何训练这个模型?为此,我们可以在提取特征的基础上加入解码器网络,利用L2 loss训练模型:
这是自动编码器网络的样子。该网络经过训练可以使用特征(z)来重建原始输入数据(x)。如果输出(Ẋ)不同于输入(x), L2损失将惩罚它,这有助于重建输入数据。
现在,我们如何从这些自动编码器生成新的图像?
变分自动编码器
这就是变分自编码器的用处所在。他们假设训练数据来自一些底层未观察到的表示(z)。
简单自编码器与变分自编码器的主要区别在于,我们不是直接从输入数据中提取特征,而是尝试对训练数据的概率分布进行建模。
为此,我们不是让编码器输出一个大小为n的编码向量,而是输出两个大小为n的向量——一个均值向量和另一个标准差向量。
变分自编码器的完整网络结构是这样的:
这里的平均值控制着输入编码的中心位置,而标准差则控制着平均值编码的变化幅度。用于训练这种变分自编码器的损失函数是Kullback-Leibler发散(或KL发散)。它衡量了两个概率分布的不同程度:
我们需要使KL差异最小化。 这优化了概率分布的参数(均值和标准差)。 一旦完成了模型训练,我们就可以从中生成新图像。 让我告诉你怎么做。
我们如何使用变分自动编码器生成图像?
训练模型后,我们将删除编码器部分,并获得以下网络:
现在我们选择一个简单的概率分布,均值为0,标准差为1,并将其作为输入传递到上述网络。然后生成一个输出。这就是变分自编码器帮助我们生成图像的方法。
虽然这种方法对于生成图像非常有用,但是也有一些缺点。变分自编码器的一个主要缺点是生成的样本与来自最先进的GANs样本相比更加模糊和低质量。这是一个活跃的研究领域——希望我们能很快看到改进!
到目前为止,我们看到的所有生成模型都定义了一个显式的密度函数。如果我们不想显式地对密度建模,而只是隐式地从训练集中采样呢?这就是GANs的用武之地。它们有一个隐式的密度函数,有助于从训练集中采样。
5. 生成式对抗网络(GANs)简介
让我先举例说明一个架构,使GANs更容易理解:
GAN由两个不同的网络组成:
- 生成器网络
- 判别器网络
让我详细解释每个网络。
发生成器网络
生成器网络的目的是在给定一些随机噪声作为输入的情况下生成图像:
该生成器网络是神经网络或卷积神经网络(CNN)。 我们传入一些随机噪声,并且该网络使用该噪声生成图像。
判别器网络
判别器网络的工作非常简单。 它必须识别输入是真实的还是假的:
训练集中的所有图像都标记为真(或1),生成器网络中生成的所有图像都标记为假(或0)。判别器的任务是执行二分类,它必须将输入分类为真或假(1或0)。
这个模型的优点是它是完全可求导的。由于生成器和判别器都是神经网络(或卷积神经网络),我们得到了一个完全可求导的网络。
我们对模型进行了训练,计算了判别器网络末端的损耗函数,并将损耗反向传播到判别器和生成器模型中。
这将更新两个网络的参数,并随后改进结果。生成器和判别器在一个minimax的博弈中共同训练:
在这里:
- p(data)表示训练集数据的分布
- D(x)是x来自训练数据的概率
- p(z)表示输入噪声变量
判别器(D)想要最大化目标函数,使D(x)接近1,D(G(z))接近0。它只是意味着判别器应该识别来自训练集的所有图像为真(1),生成的所有图像为假(0)。
生成器(G)想要最小化目标函数,使得D(G(z))等于1。这意味着生成器尝试生成由判别器网络分类为真实(1)的图像。
这就是产生式对抗网络(GAN)的工作原理。现在让我们讨论一下GANs的逐步训练过程。
6. GAN的分步训练过程
GAN的训练方法如下:
1. 首先,我们从随机分布中获取噪声样本,将其馈送到Generator(G)网络,并生成一些图像(假图像,label = 0):
2. 然后,我们获取从生成器网络生成的假图像(label= 0)和来自训练集的真实图像(label= 1),并将这些对输入到判别器(D)网络中,对它们进行分类:
3. 正如你已经观察到的,判别器是二进制分类器。 它计算损失(可以是二进制交叉熵)
4. 然后,我们将此损失反向传播到判别器和生成器网络,并更新其权重。 我们可以选择Adam或任何其他优化器进行反向传播
这就是训练GAN的过程。
尾注
GAN是活跃的研究领域。 我们几乎每个星期都会在下一个GAN版本上看到定期更新。 你可以在此处查看研究人员所做的工作。
https://github.com/zhangqianhui/AdversarialNetsPapers
在我的下一篇文章中,我将进行一个案例研究,并演示生成对抗网络(GAN)的实现方面,以生成新图像。 充满乐趣的等待着我们!
原文标题:
What are Generative Models and GANs? The Magic of Computer Vision
原文链接:
https://www.analyticsvidhya.com/blog/2020/01/generative-models-gans-computer-vision/
编辑:王菁
校对:林亦霖
译者简介
吴金笛,雪城大学计算机科学硕士一年级在读。迎难而上是我最舒服的状态,动心忍性,曾益我所不能。我的目标是做个早睡早起的Cool Girl。