第2章 GAN初步:2.1 GAN的概念

2.1 GAN的概念

在探索GAN之前,我们先设定一个应用场景。

2.1.1 生成图像

通常情况下,我们使用神经网络来减少、提取、总结信息。
MNIST分类器就是一个很好的例子。它有784个输入值,但只有10个输出值,输出值数量远小于输入值数量。

在这里插入图片描述
让我们做一个思维实验。如果把一个神经网络的输入与输出反转,应该能够实现与“减少”相反的功能。换句话说,可以把较少的数据扩展成更多的数据。这样一来,我们就得到了图像数据。
想象一下,一个可以自己创造数据的网络!

这并不是天方夜谭。在《Python神经网络编程》中,我们将一个代表数字的独热目标向量,通过一个训练好的网络向后传播,以生成该数字的某种理想化图像。我们把这个过程称为反向查询(backquery)。
在这里插入图片描述
我们发现,由反向查询创建的图像具有以下特征:

  • 在独热向量相同的情况下,生成的图像总是相同的;
  • 它们是有标签的训练数据的像素平均值。

能够用网络来生成图像已经很不错了,但理想的情况应该是:

  • 网络可以生成不同的图像;
  • 生成的图像看起来像训练数据中的一个样本,而不是数据集的平滑平均值。

这两个挑战对于生成逼真、可用的图像非常重要。简单的反向查询并不能解决这些挑战。因此,我们需要一种不同的方法。

2.1.2 对抗训练

2014年,伊恩·古德费洛提出了一种不同的网络架构。这种架构并不比其他神经网络更大、更广,或者更深。它也没有使用更高级的激活函数或者更先进的优化技术。但它在结构上完全不同于其他神经网络。
让我们一步一步地了解这个想法。
下图是一个神经网络,可以学习分类一幅图像是不是猫咪的图像。
如果网络的输入是一幅猫咪的图像,输出值应该是1,对应真(true);如果图像中不是猫咪,输出值应该是0,对应伪(false)。该架构与我们在MNIST分类中使用的架构很相似。唯一的区别在于,这个分类器输出的是一个值,而不是10个值。
在这里插入图片描述
接着,我们稍微改动一下这个任务。改动之前,分类器试图区分一幅图像是不是猫咪的图像;改动之后,分类器可以区分一幅图像是真实的猫咪照片还是我画的卡通猫咪。
在这里插入图片描述
这个改动在架构上没有明显的变化。我们仍然有两种图像,而神经网络分类器可以被训练用于区分这两种图像。

我们可以把分类器想象成一个侦探。在训练之前,侦探无法很好地分辨真猫咪和假猫咪。随着训练的进行,侦探会越来越善于发现假猫咪,并将它们与真猫咪区分开来。
这个任务到目前为止仍然很简单。让我们进行下一步改动。我们不再用一叠假的图像,现在想象一下,我们有一个能生成假图像的网络组件。

在这里插入图片描述
这样一来,我们无须准备假猫咪图像数据集,只需要通过代码来生成图像。要生成杂乱无章的、看起来一点也不像猫的图像并不难。比方说,我们可以随意画一些简单的三角形。同时,分类器的甄别工作也同样轻松。

重要的是下面的一步。
现在,假设我们用一个被训练用于生成图像的神经网络,取代之前只能生成低质量图像的组件。我们称它为生成器(generator)。同时,我们把分类器称为鉴别器(discriminator),这也是它在该架构中通用的命名。
在这里插入图片描述
让我们思考一下该如何训练生成器。训练的关键在于,我们希望奖励哪些行为,惩罚哪些行为。这也正是损失函数的作用。

  • 如果图像通过了鉴别器的检验,我们奖励生成器。
  • 如果伪造的图像被识破,我们惩罚生成器。

暂时不需要担心关于损失函数的问题,只需要看整体框架。

鉴别器的作用是把真实的图像和生成的图像区分开。如果生成器的表现不佳,区分工作就很容易。不过,如果训练生成器,它的表现应该越来越好,并生成越来越逼真的图像。

这个想法的确很酷。不过这还不是全部。

随着训练的进展,鉴别器的表现越来越好,生成器也必须不断进步,才能骗过更好的鉴别器。最终,生成器也变得非常出色,可以生成足以以假乱真的图像。

鉴别器和生成器是竞争对手(adversary)关系,双方都试图超越对方,并在这个过程中逐步提高。我们称这种架构为生成对抗网络 (Generative Adversarial Network,GAN)。

这是一个非常巧妙的设计,不仅因为它利用竞争来驱动进步,也因为我们不需要定义具体的规则来描述要编码到损失函数中的真实图像。机器学习的历史告诉我们,我们并不擅长定义这样的规则。相反,我们让GAN自己来学习什么是真正的图像。

以上描述的设计着实让人兴奋。世界顶尖机器学习专家之一杨立昆称GAN为“机器学习领域近20年来最酷的想法”。

2.1.3 GAN的训练

在GAN的架构中,生成器和鉴别器都需要训练。我们不希望先用所有的训练数据训练其中任何一方,再训练另一方。我们希望它们能一起学习,任何一方都不应该超过另一方太多。

下面的三步训练循环是实现这一目标的一种方法。

  • 第1步——向鉴别器展示一个真实的数据样本,告诉它该样本的分类应该是1.0。
  • 第2步——向鉴别器显示一个生成器的输出,告诉它该样本的分类应该是0.0。
  • 第3步——向鉴别器显示一个生成器的输出,告诉生成器结果应该是1.0。

这就是大多数GAN训练方案的核心。

我们用下面几幅图说明这些步骤的实际意义。
在这里插入图片描述
第1步最简单,我们也最熟悉。我们向鉴别器展示一幅实际数据集中的图像,并让它对图像进行分类。输出应为1.0,我们再用损失来更新鉴别器

在这里插入图片描述
第2步同样是训练鉴别器,不过这一次我们向它展示的是生成器的图像。输出的结果应该是0.0。我们只用损失来更新鉴别器。在这一步中,我们必须注意不要更新生成器。因为我们不希望它因为被鉴别器识破而受到奖励。稍后,在编写GAN的代码时,我们将看到具体如何防止更新通过计算图回到生成器。

在这里插入图片描述
第3步是训练生成器。我们先用它生成一个图像,并将生成的图像输入给鉴别器进行分类。鉴别器的预期输出应该是1.0。换句话说,我们希望生成器能成功骗过鉴别器,让它误以为图像是真实的,而不是生成的。我们只用结果的损失来更新生成器,而不更新鉴别器。因为我们不希望因为错误分类而奖励鉴别器。在编码时,这也很容易做到。

这些步骤看起来好像很复杂。但是,在实践中我们会发现,它们非常容易实现。

2.1.4 训练GAN的挑战

刚才,我们讲解了GAN的原理。在现实中,训练GAN可能很困难。如果我们把生成器和鉴别器对立起来,不难发现,只有当它们之间达到微妙的平衡时,它们才会互相提高。

如果鉴别器进步得太快,生成器可能永远也追不上。另一方面,如果鉴别器的学习速度太慢,生成器则会因为不断生成质量较差的图像而受到奖励。

2.1.5 学习要点

  • 分类是对数据的简化。分类神经网络把较多的输入值缩减成很少的输出值,每个输出值对应一个类别。
  • 生成是对数据的扩展。一个生成神经网络将少量的输入种子值扩展成大量的输出值,例如图像像素值。
  • 生成对抗网络(GAN)由两个神经网络组成,一个是生成器,另一个是鉴别器,它们被设计为竞争对手。 鉴别器经过训练后,可将训练集中的数据分类为真实数 据,将生成器产生的数据分类为伪造数据;生成器在训练后,能创建可以以假乱真的数据来欺骗鉴别器。
  • 成功地设计和训练GAN并不容易。因为GAN的概念还很新,描述其工作原理以及为什么会训练失败的基本理 论尚未成熟。
  • 标准的GAN训练循环有3个步骤。(1)用真实的训练数据集训练鉴别器;(2)用生成的数据训练鉴别 器;(3)训练生成器生成数据,并使鉴别器以为它是真实数据。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值