我正在努力理解理解生成对抗网络(Daniel Seita 撰写的博客文章)中提供的 GAN 损失函数。
在标准交叉熵损失中,我们有一个通过 sigmoid 函数运行的输出和一个生成的二元分类。
锡塔州
因此,对于 [每个] 数据点及其标签,我们得到以下损失函数......
这只是期望的日志,这是有道理的。但是,根据 GAN 损失的这种表述,我们如何在同一迭代中同时处理来自真实分布和生成器的数据?
我正在努力理解理解生成对抗网络(Daniel Seita 撰写的博客文章)中提供的 GAN 损失函数。
在标准交叉熵损失中,我们有一个通过 sigmoid 函数运行的输出和一个生成的二元分类。
锡塔州
因此,对于 [每个] 数据点及其标签,我们得到以下损失函数......
这只是期望的日志,这是有道理的。但是,根据 GAN 损失的这种表述,我们如何在同一迭代中同时处理来自真实分布和生成器的数据?
本题重点
“如何......我们在同一迭代中处理来自真实分布的数据和来自生成模型的数据?
分析基础出版物
在参考页面,Understanding Generative Adversarial Networks (2017)中,博士生 Daniel Sieta 正确地引用了Generative Adversarial Networks, Goodfellow, Pouget-Abadie, Mirza, Xu, Warde-Farley, Ozair, Courville, and Bengio, June 2014。它是抽象的状态,“我们提出了一个通过对抗过程来估计生成模型的新框架,我们同时训练两个模型......”这篇原始论文定义了两个定义为 MLP(多层感知器)的模型。
这两个模型的控制方式是其中一个向另一个提供某种形式的负反馈,因此称为对抗性。
(GAN 系统的示例集有时被称为真实样本,但它们可能并不比生成的样本更真实。两者都是计算机中的数值数组,一组具有内部原点,另一组具有外部原点来源。外部是否来自指向某个物理场景的相机与GAN操作无关。)
从概率上讲,愚弄 D 等同于最大化 D 产生与正确分类一样多的误报和误报的概率,每个概率为 50%。在信息科学中,这就是说当 t 接近无穷大时,G 的信息 D 的极限接近 0。从 D 的角度来看,这是一个最大化 G 的熵的过程,因此称为交叉熵。
如何实现收敛
因为从 Sieta 2017 年的问题中复制的损失函数是 D 的损失函数,旨在最小化两个分布之间的交叉熵(或相关性),当应用于给定训练状态的完整点集时。
G 有一个单独的损失函数,旨在最大化交叉熵。请注意,系统中有两个级别的训练粒度。
这些产生嵌套迭代,外部迭代如下。
当D最终输掉比赛时,我们已经达到了我们的目标。
为什么需要并行培训
如果这两个模型没有来回训练以模拟并发性,那么在 2014 年论文中声称的唯一解决方案上,对抗平面(外部迭代)中的收敛将不会发生。
更多信息
除了这个问题之外,Sieta 论文中的下一个令人感兴趣的内容是“生成器损失函数的糟糕设计”可能导致梯度值不足以指导下降并产生有时称为饱和的情况。饱和度只是将反向传播中引导下降到浮点舍入产生的混沌噪声的反馈信号的减少。该术语来自信号理论。
我建议研究 Goodfellow等人(经验丰富的研究人员)的 2014 年论文来了解 GAN 技术,而不是 2017 年的页面。
让我们从头开始。GAN 是可以学习创建与我们提供的数据相似的数据的模型。
在训练除 GAN 之外的生成模型时,最容易想到的损失函数可能是均方误差 (MSE)。
请允许我举个例子(Trickot L 2017):
现在假设您要生成猫;您可以在照片中给出特定猫的模型示例。您选择的损失函数意味着您的模型必须准确地复制每只猫以避免受到惩罚。
但这不一定是我们想要的!您只希望您的模型生成猫,只要它是一只看似合理的猫,任何猫都可以。所以,你需要改变你的损失函数。
然而,哪个函数可以忽略具体像素并专注于检测照片中的猫?
那是一个神经网络。这就是鉴别器在 GAN 中的作用。鉴别器的工作是评估图像的可信度。
您引用的论文,Understanding Generative Adversarial Networks (Daniel S 2017) 列出了两个主要见解。
Major Insight 1:判别器的损失函数是交叉熵损失函数。
主要见解 2:了解梯度饱和可能或可能不会对训练产生不利影响。当梯度太小(即零)而无法执行任何学习时,梯度饱和是一个普遍问题。
要回答您的问题,我们需要进一步阐述第二个主要见解。
在 GAN 的上下文中,由于生成器的损失函数设计不当,可能会发生梯度饱和,因此这个“主要见解”……是基于对生成器不同损失函数之间的权衡的理解。
论文中实现的设计通过具有非常具体的功能(区分两个类别)解决了损失函数问题。最好的方法是使用交叉熵(洞察 1)。正如博文所说:
交叉熵是一个很好的损失函数,因为它的设计部分是为了加速学习并避免梯度饱和,直到分类器正确为止。
正如博客文章的评论中所阐明的那样:
[在交叉熵函数中]的期望来自总和。如果您查看离散随机变量的期望定义,您会发现您需要对随机变量的不同可能值求和,并通过它们的概率对每个值进行加权。在这里,每个概率只有 1/2,我们可以将它们视为来自生成器或鉴别器。
您可以将z
输入和x
输入的组合视为单个样本,并评估鉴别器对每个样本的分类执行情况。
这就是为什么稍后的帖子将单个y
分为E(p~data)
和E(z)
- 基本上,您对每个鉴别器输入都有不同的期望(y
s),您需要同时测量两者以评估鉴别器的执行情况。
这就是为什么损失函数被认为是真实输入的正分类和负输入的负分类的组合。