生成反抗网络 (GANs) 近年来在人工智能畛域,尤其是计算机视觉畛域十分受欢迎。随着论文“Generative Adversarial Nets”[1]的引入,这种弱小生成策略呈现了,许多钻研和钻研我的项目从那时起衰亡并倒退成了新的利用,咱们当初看到的最新的 DALL-E 2[2]或 GLIDE3
本文具体解释了 GAN 优化函数中的最小最大博弈和总损失函数是如何失去的。将介绍原始 GAN 中优化函数的含意和推理,以及它与模型的总损失函数的区别,这对于了解 Generative Adversarial Nets 是十分重要的
GANs 简介
生成反抗网络 (Generative Adversarial Networks) 是一种深度学习框架,它被设计为生成模型,目标是生成新的简单数据(输入)。
为了训练 GAN,只须要一组想要模拟的数据(图像、音频、甚至是表格数据……),网络会找出办法来创立看起来像咱们提供的数据集示例的新数据。换句话说,咱们给模型一些示例数据作为“取得灵感”的输出,并让它齐全自在地生成新的输入
因为咱们只向网络输出 X 信息,而不给它们增加任何标签(或冀望的输入),所以这种训练过程是无监督学习。
GAN 体系结构是由两个相互竞争的网络 (因而得名“反抗网络”) 组成的。通常将这两个网络称为 Generator (G)和 Discriminator (D)。Generator 的工作是学习从随机噪声开始生成数据的函数,而 Discriminator 必须决定生成的数据是否“实在”(这里的“实在”是指数据是不是属于示例数据集的),这两个网络同时训练和学习。
GAN 有很多不同的变体,所以训练有许多不同的变动。然而如果遵循原始论文 [1],原始的 GAN 训练循环如下:
对于训练每次迭代会执行以下操作:
- 从示意的样本分布(即随机噪声 z)生成 m 个示例(图像、音频……):G(z)
- 从训练数据集中取 m 个样本:x
- 混合所有示例(生成和训练数据集)并将它们提供给鉴别器 D。D 的输入将介于 0 和 1 之间,这意味着 示例是假的,1 示意示例是真的
- 取得鉴别器损失函数并调整参数
- 生成新的 m 个示例 G'(z)
- 将 G'(z) 法送到鉴别器。取得 Generator Loss 函数并调整参数。
阐明:个别状况下咱们对 GAN 的训练都是在第 4 步测量生成器损失并调整其参数以及鉴别器,这样能够跳过第 5 步和第 6 步,节省时间和计算机资源。
优化函数 (最小 - 最大博弈) 和损失函数
GAN 的原始论文中模型的优化函数为以下函数:
上式为 Optimization 函数,即网络 (Generator 和 Discriminator) 都要优化的表达式。在这种状况下,G 想要最小化它而 D 想要最大化它。然而这不是模型的总损失函数。
为了了解这个最小 - 最大博弈,须要思考如何掂量模型的性能,这样才能够通过反向流传来优化它。因为 GAN 架构是由两个同时训练的网络组成的,咱们必须计算两个指标: 生成器损失和鉴别器损失。
1、鉴别器损失函数
依据原始论文 [1] 中形容的训练循环,鉴别器从数据集中接管一批 m 个示例,从生成器接管其余 m 个示例,并输入一个数字 ∈ [0,1],即输出数据属于数据集散布的概率(即数据为“实在”的概率)。
通过甄别曾经晓得哪些样本是实在的(来自数据集的样本 x 是实在的),哪些是生成的(生成器的输入 G(z) 生成),能够为它们调配一个标签:y = 0(生成),y = 1(实在)。
这样就能够应用二元穿插熵损失函数将鉴别器训练为一个常见的二元分类器:
因为这是一个二元分类器,咱们能够做以下的简化:
- 当输出实在数据时,y = 1→∑= log(D(k))
- 输出为生成器生成的数据时,y = 0→∑= log(1-D(k))
表达式就能够改写为更简略的模式:
2、优化函数
判断器心愿最小化其损失,它心愿最小化上述公式。然而如果咱们批改公式去掉“负号”的话。就须要最大化它:
最初,咱们的操作变为:
而后咱们重写这个公式:
上面咱们再看看生成器的状况:生成器的指标是伪造鉴别器。生成器必须与判断器相同,找到 V(G,D) 的最小值。
总结两个表达式(判断器和生成器优化函数)并失去最初一个:
咱们失去了优化函数。然而这不是总损失函数,它只通知咱们模型的整体性能(因为鉴别器来判断虚实)。如果须要计算总损失还要增加上生成器相干的局部。
3、生成器损失函数
生成器只参加表达式 E(log(1-D(G(z))) 的第二项,而第一项放弃不变。因而生成器损失函数试图最小化的是:
在原始论文中提到了,“Early in learning, when G is poor, D can reject samples with high confidence because they are clearly different from the training data.”即在训练的晚期阶段,判断器很容易辨别实在图像和生成的图像,因为生成器还没有学习。在这种状况下,log(1 − D(G(z))) 是饱和的,因为 D(G(z)) ∼ 0
为了防止这种状况,钻研人员提出了以下倡议:“咱们能够训练 G 最大化 log D(G(z)),而不是训练 G 以最小化 log(1 – D(G(z)))”。
这就相当于说,不是训练生成器最小化图像是假的概率,而是最大化图像是实在的概率。因为在实质上这两种优化办法是雷同的,咱们能够在图中看到:
论文中应用的生成器损失函数是:
在理论应用时,编写生成器损失函数通常采纳上述公式的正数模式,目标不是使函数最大化而是使其最小化。因为这样就不便了应用 Tensorflow 等库来调整参数。
总损失函数
下面咱们曾经给出了生成器和鉴别器的的损失公式,并给出了模型的优化函数。然而如何掂量模型的整体性能呢?
仅仅看优化函数并不是一个很好的衡量标准,因为优化函数是对鉴别器损失函数的批改,因而它并不能反映生成器的性能(只管生成器损失函数源于它,但咱们只是在该函数中思考了鉴别器的性能),然而如果同时思考这两个函数来评估性能咱们就须要思考到这两个函数的差异并加以修改:
a,这两个独自的损失函数必须以最小化或最大化为指标。否则,加法所反映的误差将高于或低于应有的误差。例如,让咱们以优化函数为例,它心愿被 D 最大化:
和以 G 最小为指标的第一个生成器损失函数:
当 D 做得很差 (低谬误) 而 G 做得很好 (也是低谬误) 时,整体性能将产生一个低谬误,从指标上看这意味着两个网络 (G 和 D) 都做得很好,然而实际上咱们晓得其中一个不是。
如果一个损失的指标是最小化,另一个是最大化,失去了一个高错误率咱们也不晓得是好是坏,因为两个指标的方向是不一样的。并且如果以最大化为指标的损失函数,将其称为“谬误”可能听起来有点奇怪,因为“谬误”越高,性能越好。尽管咱们也能够应用对数来转换它,比方 log(1+Error)
b, 对于构建一个总损失函数,其独自的损失必须在雷同的值范畴内,让咱们持续看上面的损失
和
对于第一个问题咱们曾经将两个函数都转换为满足最小化的条件。然而,D 的损失在 [0,+∞] 范畴内,G 的损失的输入值在 (-∞,0) 范畴内。这两个函数相加等于是减去了 D 的损失,因而说整体损失是没有生成器影响的鉴别器损失(即 E(log(D(xi))),其中 E 示意期望值),这样其实是不正确的。
如果咱们用 D 和批改后的 G 损失的正数模式呢?
这不就是论文中说到的 GAN 的总损失函数吗,咱们还是来测验一下它是否满足咱们的要求。
✅咱们晓得 D 损失的目标是最小化,并且批改 G 损失正数模式也是最小化。
✅D 损失的输入值在 [0,+∞) 范畴内,后果是负的 G 损失也将值映射到雷同的范畴内。
不仅是在方向上是雷同的,在数值得取值范畴内也是雷同的。
总结
- GAN 得优化函数 (也叫最大 - 最小博弈) 和总损失函数是不同的概念: 最小 - 最大优化≠总损失
- 优化函数的起源来自二元穿插熵(这反过来是鉴别器损失),并从这也衍生出生成器损失函数。
- 在理论利用中生成器损失函数进行了批改,进行了对数操作。这一批改也有助于计算模型的总损失函数。
- 总损失 = D 损失 + G 损失。并且为了进行总损失得计算还进行了批改以保障方向和取值得范畴都是雷同的。
你喜爱这篇文章,任何反馈或纠正请随时留言。
https://avoid.overfit.cn/post/db7a155b9da9436f993db597d65824b2
作者:Gabriel Furnieles