生成对抗网络(GAN)是一种用于训练生成模型以进行图像合成的深度学习架构。
GAN架构相对简单,但对于初学者来说,其中一个具有挑战性的方面是GAN损失函数。主要原因是该架构涉及同时训练两个模型:生成器和判别器。
判别器模型像其他任何深度学习神经网络一样进行更新,而生成器则使用判别器作为损失函数,这意味着生成器的损失函数是隐式的,并在训练过程中学习。
在本篇博文中,您将了解生成对抗网络的损失函数简介。
阅读本文后,你将了解:
- GAN架构定义了极小极大GAN损失,但通常使用非饱和损失函数来实现。
- 现代GAN中常用的替代损失函数包括最小二乘法和Wasserstein损失函数。
- 对GAN损失函数进行大规模评估表明,当其他因素(如计算预算和模型超参数)保持不变时,差异很小。
开始您的项目,阅读我的新书《Python生成对抗网络》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

生成对抗网络损失函数简介
照片由Haoliang Yang拍摄,保留部分权利。
概述
本教程分为四个部分;它们是
- GAN损失的挑战
- 标准GAN损失函数
- 替代GAN损失函数
- 不同GAN损失函数的效果
GAN损失的挑战
生成对抗网络(GAN)是一种用于训练生成模型以进行图像合成的深度学习架构。
它们已被证明非常有效,在生成逼真的人脸、场景等方面取得了令人印象深刻的结果。
GAN架构相对简单,但对于初学者来说,其中一个具有挑战性的方面是GAN损失函数。
GAN架构由两个模型组成:判别器和生成器。判别器直接在真实和生成的图像上进行训练,并负责将图像分类为真实或伪造(生成的)。生成器不直接训练,而是通过判别器模型进行训练。
具体来说,判别器被训练用来为生成器提供损失函数。
这两个模型在一个双人游戏中竞争,生成器和判别器模型同时进行改进。
我们通常寻求模型在训练数据集上的收敛,这表现为在训练数据集上选择的损失函数的最小化。在GAN中,收敛标志着双人游戏的结束。取而代之的是,我们寻求生成器和判别器损失之间的平衡。
我们将仔细研究用于训练生成器和判别器模型的官方GAN损失函数,以及一些可替代使用的流行损失函数。
想从零开始开发GAN吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
标准GAN损失函数
GAN架构由Ian Goodfellow等人于2014年发表的论文“Generative Adversarial Networks”进行了描述。
该方法提出了两种损失函数:第一种被称为极小极大GAN损失,第二种被称为非饱和GAN损失。
判别器损失
在这两种方案下,判别器损失是相同的。判别器试图最大化对真实和伪造图像的概率分配。
我们训练D来最大化其对训练样本和G样本分配正确标签的概率。
— 生成对抗网络,2014年。
用数学描述,判别器试图最大化真实图像的对数概率的平均值以及伪造图像的对数反概率。
- 最大化 log D(x) + log(1 – D(G(z)))
如果直接实现,这需要使用随机上升而不是随机下降来修改模型权重。
更常见的是将其实现为一个传统的二元分类问题,将伪造图像和真实图像分别标记为0和1。
模型拟合时旨在最小化平均二元交叉熵,也称为对数损失。
- 最小化 y_true * -log(y_predicted) + (1 – y_true) * -log(1 – y_predicted)
极小极大GAN损失
极小极大GAN损失是指对判别器和生成器模型进行同时的极小极大优化。
极小极大是指在两人轮流制游戏中,一种旨在最小化对方最坏情况损失或成本的优化策略。
对于GAN,生成器和判别器是两个玩家,它们轮流更新其模型权重。min和max分别表示生成器损失的最小化和判别器损失的最大化。
- min max(D, G)
如上所述,判别器试图最大化真实图像的对数概率的平均值以及伪造图像的对数反概率。
- 判别器:最大化 log D(x) + log(1 – D(G(z)))
生成器试图最小化判别器对伪造图像预测的对数反概率。这会促使生成器生成具有低伪造概率的样本。
- 生成器:最小化 log(1 – D(G(z)))
在这里,生成器学会生成具有低伪造概率的样本。
— GANs是创建的平等吗?一项大规模研究, 2018.
虽然GAN的这种损失框架在分析模型作为极小极大游戏时很有用,但实践证明,这种生成器损失函数会饱和。
这意味着,如果它不能像判别器那样快速学习,判别器就会获胜,游戏就会结束,模型就无法有效地进行训练。
在实践中,[损失函数]可能无法为G提供足够的梯度以使其良好学习。在学习初期,当G较差时,D可以高置信度地拒绝样本,因为它们与训练数据明显不同。
— 生成对抗网络,2014年。
非饱和GAN损失
非饱和GAN损失是对生成器损失的修改,以克服饱和问题。
这是一个细微的改变,涉及生成器最大化生成图像的判别器概率的对数,而不是最小化生成图像的判别器反概率的对数。
- 生成器:最大化 log(D(G(z)))
这是问题表述的改变。
在前一种情况下,生成器试图最小化图像被预测为伪造的概率。在这里,生成器试图最大化图像被预测为真实的概率。
为了改善梯度信号,作者还提出了非饱和损失,即生成器反而旨在最大化生成样本为真实的概率。
— GANs是创建的平等吗?一项大规模研究, 2018.
结果是,在更新生成器权重时,梯度信息更好,训练过程更稳定。
这个目标函数会导致G和D动力学的相同固定点,但在学习初期提供了更强的梯度。
— 生成对抗网络,2014年。
在实践中,这也被实现为像判别器一样的二元分类问题。我们可以通过翻转真实和伪造图像的标签,并最小化交叉熵来代替最大化损失。
…一种方法是继续为生成器使用交叉熵最小化。不是通过改变判别器成本的符号来获得生成器成本,而是改变用于构建交叉熵成本的目标。
— NIPS 2016 教程:生成对抗网络, 2016。
替代GAN损失函数
损失函数的选择是一个热门的研究课题,已经提出了并评估了许多替代损失函数。
许多GAN实现中使用的两个流行的替代损失函数是最小二乘法损失和Wasserstein损失。
最小二乘GAN损失
最小二乘损失由Xudong Mao等人在他们2016年的论文“Least Squares Generative Adversarial Networks”中提出。
他们的研究基于这样一个观察:当生成的图像与真实图像非常不同时,使用二元交叉熵损失存在局限性,这可能导致非常小或消失的梯度,从而导致模型更新很少或没有更新。
…然而,当使用位于决策边界正确一侧但仍远离真实数据的伪造样本来更新生成器时,此损失函数会导致梯度消失的问题。
— 最小二乘生成对抗网络, 2016.
判别器试图最小化真实和伪造图像的预测值和期望值之间的平方差之和。
- 判别器:最小化 (D(x) – 1)^2 + (D(G(z)))^2
生成器试图最小化预测值和期望值之间的平方差之和,就像生成的图像是真实的。
- 生成器:最小化 (D(G(z)) – 1)^2
在实践中,这涉及到保持伪造图像和真实图像的类别标签分别为0和1,并最小化最小二乘误差,也称为均方误差或L2损失。
- l2 损失 = sum (y_predicted – y_true)^2
最小二乘损失的好处在于它对更大的误差给予更大的惩罚,从而导致更大的修正,而不是消失的梯度和模型更新。
…最小二乘损失函数能够将伪造样本移向决策边界,因为最小二乘损失函数会惩罚那些在决策边界正确一侧但距离较远的样本。
— 最小二乘生成对抗网络, 2016.
Wasserstein GAN损失
Wasserstein损失由Martin Arjovsky等人于2017年发表的论文“Wasserstein GAN”中提出。
Wasserstein损失基于这样的观察:传统的GAN致力于最小化真实和生成图像的实际和预测概率分布之间的距离,即所谓的Kullback-Leibler散度或Jensen-Shannon散度。
取而代之的是,他们提出将问题建模为Earth-Mover距离,也称为Wasserstein-1距离。Earth-Mover距离衡量了两个概率分布之间的距离,即从一个分布(一堆土)变成另一个分布的成本。
使用Wasserstein损失的GAN涉及到将判别器的概念改为一个评分器(critic),该评分器更新的频率比生成器模型更高(例如,五倍)。评分器用实数值对图像进行评分,而不是预测概率。它还要求模型权重保持较小,例如被裁剪到[-0.01, 0.01]的超立方体。
计算得分使得真实图像和伪造图像的得分之间的距离最大化。
损失函数可以通过计算真实和伪造图像的平均预测得分,并分别乘以1和-1来实现。这会有效地将真实和伪造图像的得分分开。
Wasserstein损失的好处在于它在几乎所有地方都提供了有用的梯度,从而允许模型持续训练。这也意味着较低的Wasserstein损失与更好的生成器图像质量相关,这意味着我们明确寻求最小化生成器损失。
据我们所知,这是GAN文献中首次显示出这种属性,即GAN的损失显示出收敛性。
— Wasserstein GAN,2017年。
不同GAN损失函数的效果
已经开发和评估了许多损失函数,以期提高GAN模型的训练稳定性。
最常见的是非饱和损失,通常是,而最小二乘法和Wasserstein损失则用于更大、更新的GAN模型。
因此,对于给定的模型实现,哪种损失函数确实更好,这是一个非常令人感兴趣的问题。
这个问题促使Mario Lucic等人在他们2018年的论文“Are GANs Created Equal? A Large-Scale Study”中对GAN损失函数进行了大规模研究。
尽管进行了大量的研究活动,产生了许多有趣的GAN算法,但仍然很难评估哪种算法比其他算法表现更好。我们对最先进的模型和评估指标进行了中立、多方面的广泛实证研究。
— GANs是创建的平等吗?一项大规模研究, 2018.
他们固定了模型的计算预算和超参数配置,并研究了一系列七种损失函数。
这包括上面描述的极小极大损失(MM GAN)、非饱和损失(NS GAN)、Wasserstein损失(WGAN)和最小二乘损失(LS GAN)。该研究还包括了Wasserstein损失的扩展,用于消除权重裁剪,称为Wasserstein梯度惩罚损失(WGAN GP),以及另外两个:DRAGAN和BEGAN。
下表摘自该论文,为判别器和生成器的不同损失函数提供了有用的总结。

不同GAN损失函数的总结。
摘自:GANs是创建的平等吗?一项大规模研究。
使用一系列GAN评估指标对模型进行了系统评估,包括流行的Frechet Inception Distance(FID)。
令人惊讶的是,他们发现所有评估的损失函数在其他所有因素都保持不变的情况下,性能都大致相同。
我们对最先进的GAN进行了公平且全面的比较,并实证证明,在足够高的计算预算下,它们几乎都可以达到相似的FID值。
— GANs是创建的平等吗?一项大规模研究, 2018.
这并不意味着损失函数的选择对于特定的问题和模型配置不重要。
相反,结果表明,当模型的其他因素(如计算预算和模型配置)保持不变时,损失函数选择的差异就会消失。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 生成对抗网络, 2014.
- NIPS 2016 教程:生成对抗网络, 2016.
- 最小二乘生成对抗网络, 2016.
- Wasserstein GAN, 2017.
- 改进Wasserstein GAN的训练, 2017.
- GANs是创建的平等吗?一项大规模研究, 2018.
文章
总结
在本篇博文中,您了解了生成对抗网络的损失函数简介。
具体来说,你学到了:
- GAN架构定义了极小极大GAN损失,但通常使用非饱和损失函数来实现。
- 现代GAN中常用的替代损失函数包括最小二乘法和Wasserstein损失函数。
- 对GAN损失函数进行大规模评估表明,当其他因素(如计算预算和模型超参数)保持不变时,差异很小。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
这篇精彩的文章为我解决了一些理论上的问题和疑虑。非常感谢Jason!
谢谢,很高兴对您有帮助。
我喜欢您的文章!
谢谢。
您好Jason Brownlee,我关注了您的许多帖子,它们真的非常棒。目前我想学习SRGAN,希望您能为社区提供一系列关于这个问题的教程。非常感谢。
感谢您的建议!
期待很快看到您的指南!
谢谢。
谢谢您的文章。
这让我思路清晰,并对我的研究思路有所帮助。
很高兴听到这个!
谢谢分享知识!
LS GAN生成器损失的损失函数表有问题吗?
应该是 E(D(G(z)) – 1)^2 而不是 E((D(G(z) – 1))^2) 对吗?
我认为不行。
非常感谢您的精彩文章🙂
不客气。
这是一篇非常棒的文章——比阅读调查论文好多了!自发布以来,GAN损失函数方面有没有什么新趋势?我还对用于表格/图/自然语言数据的损失函数感兴趣?
谢谢!
我相信一定有,我只了解图像GAN,抱歉。
我想知道是否可以使用GAN进行文本到文本生成。如果可能,请提供如何操作的指导。
也许你可以。
通常使用语言模型进行文本生成
https://machinelearning.org.cn/start-here/#nlp
非常感谢Jason!已经提出了许多“新GAN”,您能否写一篇关于这些“新GAN”的新主题?
是的,我希望如此。谢谢!
你好,
感谢您对深度学习主题的清晰解释。您是一位真正的英雄。我对WGAN损失感到困惑。我生成了critic损失和generator损失,然后打印出来。我的问题是,如何通过查看这些损失来知道我的生成器是否好?例如,生成器损失为-2,critic损失为0.5,我认为我的生成器不好。另一方面,我的生成器是-500,critic损失是1000,我认为我的生成器很好,但当我检查结果时,生成器却不好。
不客气。
通常我们无法通过查看损失来评估GAN,您必须查看模型生成的图像。
评估GAN是一个庞大的话题,我建议从这里开始
https://machinelearning.org.cn/how-to-evaluate-generative-adversarial-networks/
嗨,Jason,
您推荐使用哪些计算资源来训练GAN模型?
我尝试使用您的教程在Colab中生成人脸,但我的模型无法训练,因为会话在几小时后崩溃。Colab Pro在我的国家不可用,而Paperspace和Sagemaker的价格又比较贵……
如果您能给我一些建议,我将不胜感激。
对于一个非常大的模型,您需要专门的硬件。您可以设置自己的计算机,或在其他地方获取。如果您想要免费资源,可以尝试Kaggle?他们应该允许运行比Colab更大的模型。
你好