最优传输论文(十四):Generative Adversarial Nets论文原理

目录

  • 前言
  • Introduction
  • Related work
  • Adversarial nets
  • Theoretical Results
    • Global Optimality of p g = p d a t a p_g= p_{data} pg=pdata
    • Convergence of Algorithm 1
  • 论文后面的实验等内容请阅读原文。
  • 代码

前言

  • 这篇文章的影响力就不用我说了,之前对它的大致内容也有所了解,但是这里想深入回顾一遍。
  • 发表于2014年的NIPS,作者是熟悉的名字:Goodfellow等人。
  • 它的大致原理我简要说一下,我觉得几乎所有来看这篇论文的人都是听说了它的原理之后慕名而来。
  • 捕获数据分布的生成模型G和估计样本来自训练数据而不是G的概率的判别模型D。G的训练过程是最大化D出错的概率。这个框架对应的是一个minimax双人游戏。在任意函数G和D的空间中,存在唯一解,G恢复训练数据分布,D处处等于1/2。

Introduction

  • 作者举了个形象的例子:生成模型可以被认为类似于一群伪造者,试图生产假币并在没有被发现的情况下使用它,而鉴别模型类似于警察,试图检测假币。这场比赛中的竞争促使两队改进他们的方法,直到伪造品与真品无法区分。
  • 在本文中,作者探讨了生成模型通过多层感知器传递随机噪声来生成样本的特殊情况,而判别模型也是一个多层感知器。称这种特殊情况为对抗网(Adversarial nets)。在这种情况下,可以仅使用非常成功的反向传播和dropout算法来训练两个模型,并且仅使用正向传播来从生成模型中采样。

Related work

  • 这一部分我就跳过了。

Adversarial nets

  • 生成器产生的分布是 p g p_g pg,它是先在一个噪声空间采样(比如均匀分布空间、球形高斯分布空间),它的分布是 p z p_z pz,然后通过生成器的多层神经网络映射到 G ( z ; θ g ) G(z;θ_g) G(z;θg)空间,对应的分布就是 p g p_g pg,然后鉴别器 D D D输出一个标量,来判断数据是真实数据还是生成数据的概率。训练D来最大化为训练样本和来自G的样本分配正确标签的概率。我们同时训练G来最小化 l o g ( 1 − D ( G ( z ) ) ) log(1-D(G(z))) log(1D(G(z))):
    在这里插入图片描述
    我认为这个式子作者写的非常模糊,min和max是指最大化鉴别器的分类能力(最小化鉴别器损失),最小化生成器的损失,从而形成了对抗。可恶的是作者将不相干的能力和损失放在了一起且使用了相关的min和max来表示。
    对应算法流程流程如下:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第1张图片
  • 这个地方有必要说一下:这里说梯度上升来优化鉴别器,其实就是最大化鉴别器损失,由于这是算法步骤图,相当于伪代码,所以我认为应该使用真实场景下的伪代码,而不是思想,所以我认为第一个式子(即针对鉴别器的优化目标)应该改写成最小化以下损失
    m i n L ( D ( x ) , 1 ) + L ( D ( G ( z ) ) , 0 ) min L(D(x),1)+L(D(G(z)),0) minL(D(x),1)+L(D(G(z)),0) L L L代表交叉熵损失。
  • 当然作者的写法也是对的,我只是想用程序化的语言来说明,方便直接应用到代码中。作者的写法是指, D ( ) D() D()输出的是数据为真实数据的概率,所以如果鉴别器训练的好的话,则 D ( x ) D(x) D(x)尽可能大, D ( G ( z ) ) D(G(z)) D(G(z))尽可能小,所以上图中的第一个式子尽可能大。
  • 第二个式子(即针对生成器的优化目标)同样的道理,按照程序语言应该改写成:
    m i n L ( D ( G ( z ) ) , 1 ) min L(D(G(z)),1) minL(D(G(z)),1) L L L代表交叉熵损失。
    当然作者的写法也是对的,一个好的生成器的目标自然是 D ( G ( z ) ) D(G(z)) D(G(z))尽可能大,那么对应的就是上图第二个式子尽可能小。可以很明显看出二者的对抗关系。
  • 这里我之所以大费口舌解释公式,只是因为作者所做的与我的认知相悖,我觉得这种算法步骤图应该写伪代码一样的程序化的语言,而不是这种数学式子。这是因为平白无故多出来的数学式子应当是有代码基础的,上面作者提到的式子应该是由交叉熵转化过来的,作者没有提前铺述一下,导致一下子很蒙,导致我纠结了很久正负号的问题……
  • 下面看一下图1:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第2张图片
    黑色是数据真实分布 p x p_x px,绿色是生成器数据分布 p g p_g pg,这一块不太重要,详细可以看下图:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第3张图片
  • 这里是重点,作者说,公式(1)可能无法为生成器提供足够的梯度去学习。因为在训练的早起生成器G是比较弱的,鉴别器D可以轻而易举地区分数据。这种情况下,对于生成器的训练(即算法1中的第二部分公式),不采用最小化 l o g ( 1 − D ( G ( z ) ) ) log(1-D(G(z))) log(1D(G(z)))。作者的办法是使用最大化 l o g D ( G ( z ) ) logD(G(z)) logD(G(z))即最小化 − l o g D ( G ( z ) ) = l o g 1 / D ( G ( z ) ) -logD(G(z))=log1/D(G(z)) logD(G(z))=log1/D(G(z))
    即将原来的:
    m i n L ( D ( G ( z ) ) , 1 ) min L(D(G(z)),1) minL(D(G(z)),1) L L L代表交叉熵损失。
    改为
    m i n L ( 1 / D ( G ( z ) ) , 0 ) min L(1/D(G(z)),0) minL(1/D(G(z)),0) L L L代表交叉熵损失。

Theoretical Results

Global Optimality of p g = p d a t a p_g= p_{data} pg=pdata

  • 固定生成器G不变,考虑最优化判别器D,按照算法1的第一个公式,我们将最大化改为最小化,只不过多加两个负号而已:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第4张图片
    我们要最小化上式
    最优传输论文(十四):Generative Adversarial Nets论文原理_第5张图片
    当然,由于负负得正,这并不影响最优判别器公式,也就是上图的第一个公式。我们可以看个例子:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第6张图片
    可以看出最小点在0.5处取得。
    公式(1)中的最大化问题可以定义为:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第7张图片
    然后我们假设鉴别器已经训练到使得 V ( G , D ) V(G,D) V(G,D)最大了,前一张图片已经得到结果了,即:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第8张图片
    所以我们带入到公式中,得到:
    在这里插入图片描述
    执行完了max,我们要执行最小化min操作,即怎么设置上述公式中的 p d a t a p_{data} pdata p g p_g pg才能使得上式最小化。
    这其实就是在优化生成器G了,也就是min G操作。见下面的定理和证明:
    最优传输论文(十四):Generative Adversarial Nets论文原理_第9张图片
    上面整个部分讲的都是GAN优化目标与JS散度的关系,这一部分公式繁多,我不想赘述,有一位学者做出了非常详细、非常棒的总结,请大家移步:https://zhuanlan.zhihu.com/p/74075915

Convergence of Algorithm 1

  • 收敛性证明。
    最优传输论文(十四):Generative Adversarial Nets论文原理_第10张图片

论文后面的实验等内容请阅读原文。

代码

  • https://github.com/CtrlZ1/Domain-Adaptation-Algorithms/tree/main/pytorch-GAN
  • 如果可以,请您动一下勤劳的小手,在github上给个Star哦~

你可能感兴趣的:(迁移学习论文复现,GAN,生成对抗,神经网络)