GAN思想分析+代码
GAN背后的思想其实非常朴素和直观,就是生成器和判别器两个极大极小的博弈。下面我们进一步了解该理论背后的证明与推导。
一、基本概念
1.1 符号定义
data→真实数据(groundtruth)data→真实数据(groundtruth)data\rightarrow 真实数据(groundtruth)
pdata→真实数据的分布pdata→真实数据的分布p_{data}\rightarrow 真实数据的分布
z→噪音(输入数据)z→噪音(输入数据)z \rightarrow 噪音(输入数据)
pz→原始噪音的分布pz→原始噪音的分布p_{z}\rightarrow 原始噪音的分布
pg→经过生成器后的数据分布pg→经过生成器后的数据分布p_{g}\rightarrow 经过生成器后的数据分布
G()→生成映射函数G()→生成映射函数G()\rightarrow 生成映射函数
D()→判别映射函数D()→判别映射函数D()\rightarrow 判别映射函数
GGG 是生成器,结构为一个多层感知机,参数为 θgθg\theta _{g},G(z;θg)G(z;θg)G(z;\theta _{g}) 为生成映射函数,将噪音 zzz 映射到新的数据空间。DDD 是判别器,也是一个多层感知机,参数为 θdθd\theta _{d},D(x;θd)D(x;θd)D(x;\theta _{d}) 输出为一个标量,表示 xxx 来自真实数据data而不是生成数据的概率。
1.2 目标函数
GAN的目标函数:
image从判别器 DDD 的角度看,它希望自己能尽可能区分真实样本和虚假样本,因此希望 D(x)D(x)D(x) 尽可能大,D(G(z))D(G(z)) D(G(z)) 尽可能小, 即 V(D,G)V(D,G)V(D,G) 尽可能大。从生成器 GGG 的角度看,它希望自己尽可能骗过 DDD,也就是希望 D(G(z))D(G(z))D(G(z)) 尽可能大,即 V(D,G)V(D,G)V(D,G) 尽可能小。两个模型相对抗,最后达到全局最优。
image图中,黑色曲线是真实样本的概率分布函数,绿色曲线是虚假样本的概率分布函数,蓝色曲线是判别器D的输出,它的值越大表示这个样本越有可能是真实样本。最下方的平行线是噪声z,它映射到了x。
我们可以看到,一开始, 虽然 G(z)G(z)G(z) 和 xxx 是在同一个特征空间里的,但它们分布的差异很大,这时,虽然鉴别真实样本和虚假样本的模型 DDD 性能也不强,但它很容易就能把两者区分开来,而随着训练的推进,虚假样本的分布逐渐与真实样本重合,DDD 虽然也在不断更新,但也已经力不从心了。
最后,黑线和绿线最后几乎重合,模型达到了最优状态,这时 DDD 的输出对于任意样本都是 0.50.50.5。
二、最优化问题表达
定义最优化问题的方法由两部分组成。首先我们需要定义一个判别器 D 以判别样本是不是从 Pdata(x)Pdata(x)P_{data}(x) 分布中取出来的,因此有:
image其中 E 指代取期望。这一项是根据「正类」(即辨别出 x 属于真实数据 data)的对数损失函数而构建的。最大化这一项相当于令判别器 D 在 x 服从于 data 的概率密度时能准确地预测 D(x)=1,即:
image另外一项是企图欺骗判别器的生成器 G。该项根据「负类」的对数损失函数而构建,即:
image我们定义目标函数为:
image对于 D 而言要尽量使公式最大化(识别能力强),而对于 G 又想使之最小(生成的数据接近实际数据)。整个训练是一个迭代过程。其实极小极大化博弈可以分开理解,即在给定 G 的情况下先最大化 V(D,G)V(D,G)V(D,G) 而取 D,然后固定 D,并最小化 V(D,G)V(D,G)V(D,G) 而得到 G。其中,给定 G,最大化 V(D,G)V(D,G)V(D,G) 评估了 PgPgP_{g} 和 PdataPdataP_{data} 之间的差异或距离。
最后,我们可以将最优化问题表达为:
image上文给出了 GAN 概念和优化过程的形式化表达。通过这些表达,我们可以理解整个生成对抗网络的基本过程与优化方法。当然,有了这些概念我们完全可以直接在 GitHub 上找一段 GAN 代码稍加修改并很好地运行它。但如果我们希望更加透彻地理解 GAN,更加全面地理解实现代码,那么我们还需要知道很多推导过程。比如什么时候 D 能令价值函数 V(D,G)V(D,G)V(D,G) 取最大值、G 能令 V(D,G)V(D,G)V(D,G) 取最小值,而 D 和 G 该用什么样的神经网络(或函数),它们的损失函数又需要用什么等等。总之,还有很多理论细节与推导过程需要我们进一步挖掘。
三、理论推导
3.1 知识预备——KL散度
要进行接下来的理论推导,我们首先需要一点预备知识,KL散度(KL divergence),这是统计中的一个概念,是衡量两种概率分布的相似程度,其越小,表示两种概率分布越接近。
对于离散的概率分布,定义如下:
对于连续的概率分布,定义如下:
image我们想要将一个随机高斯噪声z通过一个生成网络G得到一个和真的数据分布 Pdata(x)Pdata(x)P_{data}(x) 差不多的生成分布 PG(x;θ)PG(x;θ)P_{G}(x;θ) ,其中的参数 θθ\theta 是网络的参数决定的,我们希望找到 θθ\theta 使得 PG(x;θ)PG(x;θ)P_{G}(x;θ) 和Pdata(x)Pdata(x)P_{data}(x) 尽可能接近。
Maximun Likelihood Estimation
我们从真实数据分布 Pdata(x)Pdata(x)P_{data}(x) 里面取样 mmm 个点,x1,x2,⋯,xmx1,x2,⋯,xmx{1},x{2},\cdots ,x^{m},根据给定的参数 θθ\theta 我们可以计算如下的概率 PG(xi;θ)PG(xi;θ)P_{G}(x^{i};θ) ,那么生成这 mmm 个样本数据的似然(likelihood)就是:
我们想要做的事情就是找到 θ∗θ∗\theta ^{*} 来最大化这个似然估计:
image在上面的推导中,我们希望最大化似然函数 LLL。若对似然函数取对数,那么累乘 ∏∏\prod 就能转化为累加 ∑∑\sum ,并且这一过程并不会改变最优化的结果。因此我们可以将极大似然估计化为求令 logPG(x;θ)logPG(x;θ)\log P_{G}(x;θ) 期望最大化的 θθ\theta ,而期望 ElogPG(x;θ)ElogPG(x;θ)E\log P_{G}(x;θ) 可以展开为在 xxx 上的积分形式 ∫Pdata(x)logPG(x;θ)dx∫Pdata(x)logPG(x;θ)dx\int P_{data}(x)\log P_{G}(x;\theta )dx。
又因为该最优化过程是针对 θθ\theta 的,所以我们添加一项不含 θθ\theta 的积分并不影响最优化效果,即可添加 ∫Pdata(x)logPdata(x)dx∫Pdata(x)logPdata(x)dx\int P_{data}(x)\log P_{data}(x)dx。添加该积分后,我们可以合并这两个积分并构建类似 KL 散度的形式。该过程如下:
image这里在前面添加一个负号,将 log 里面的分数倒一下,就变成了KL 散度:
而 PG(x;θ)PG(x;θ)P_{G}(x;θ) 如何算出来呢?
image里面的I表示示性函数,也就是:
image这样我们其实根本没办法求出这个 PG(x)PG(x)P_{G}(x) 出来,这就是生成模型的基本想法。
3.2 Global Optimality of pg=pdatapg=pdatap_{g}=p_{data}
下面,我们需要证明:该最优化问题有唯一解 G∗G∗G^{*},并且该唯一解满足 PG=PdataPG=PdataP_{G}=P_{data}。
Basic Idea of GAN
- 生成器 G:
G 是一个生成器,给定先验分布 Pprior(z)Pprior(z)P_{prior}(z) 我们希望得到生成分布 PG(x)PG(x)P_{G}(x),这里很难通过极大似然估计得到结果。- 判别器 D:
D 是一个函数,来衡量 PG(x)PG(x)P_{G}(x) 与 Pdata(x)Pdata(x)P_{data}(x) 之间的差距,这是用来取代极大似然估计
最优判别器
在极小极大博弈的第一步中,给定生成器 G,最大化 V(D,G)V(D,G)V(D,G) 而得出最优判别器 D。其中,最大化 V(D,G)V(D,G)V(D,G) 评估了 PGPGP_{G} 和 PdataPdataP_{data} 之间的差异或距离。因为在原论文中价值函数可写为在 xxx 上的积分,即将数学期望展开为积分形式:
关于上面积分式的证明
在 GAN 原论文中,有一个思想和其它很多方法都不同,即生成器 G 不需要满足可逆条件。Scott Rome 认为这一点非常重要,因为实践中 G 就是不可逆的。而很多证明笔记都忽略了这一点,他们在证明时错误地使用了积分换元公式,而积分换元却又恰好基于 G 的可逆条件。Scott 认为证明只能基于以下等式的成立性:Ez∼pz(z)log(1−D(G(z)))=Ex∼pG(x)log(1−D(x))Ez∼pz(z)log(1−D(G(z)))=Ex∼pG(x)log(1−D(x))E_{z\sim p_{z}(z)}\log(1-D(G(z)))=E_{x\sim p_{G(x)}}\log (1-D(x))
该等式来源于测度论中的 Radon-Nikodym 定理。
有一些证明过程使用了积分换元公式,但进行积分换元就必须计算 G(−1)G(−1)G^{(-1)},而 G 的逆却并没有假定为存在。并且在神经网络的实践中,它也并不存在。可能这个方法在机器学习和统计学文献中太常见了,因此我们忽略了它。
在数据给定,G 给定的前提下, Pdata(x)Pdata(x)P_{data}(x) 与 PG(x)PG(x)P_{G}(x) 都可以看作是常数,我们可以分别用 a,ba,ba,b 来表示他们,这样我们就可以得到如下的式子:
image由此,我们得到论文中的第一个推论:
image其实该最优的 D 在实践中并不是可计算的,但在数学上十分重要。我们并不知道先验的 Pdata(x)Pdata(x)P_{data}(x),所以我们在训练中永远不会用到它。另一方面,它的存在令我们可以证明最优的 G 是存在的,并且在训练中我们只需要逼近 D。
最优生成器
当然 GAN 过程的目标是令 PG=PdataPG=PdataP_{G}=P_{data}。这对最优的 D 意味着什么呢?我们可以将这一等式代入 DG∗DG∗D_{G*} 的表达式中:
这意味着判别器已经完全困惑了,它完全分辨不出 PdataPdataP_{data} 和 PGPGP_{G} 的区别,即判断样本来自 PdataPdataP_{data} 和 PGPGP_{G} 的概率都为 1212 \frac{1}{2} 。基于这一观点,GAN 作者证明了 G 就是极小极大博弈的解。该定理如下:
image即当且仅当 PG=PdataPG=PdataP_{G}=P_{data},训练标准 C(G)=maxV(G,D)C(G)=maxV(G,D)C(G)=\max V(G,D) 的可以达到全局最优。
以上定理即极大极小博弈的第二步,求令 V(G,D∗)V(G,D∗)V(G,D^{}) 最小的生成器 G(其中 D∗D∗D^{} 代表最优的判别器)。之所以当 PG=PdataPG=PdataP_{G}=P_{data} 可以令价值函数最小化,是因为这时候两个分布的 JS 散度 JSD(Pdata(x)||PG(x))JSD(Pdata(x)||PG(x))JSD (P_{data}(x) || P_{G}(x)) 等于零,这一过程的详细解释如下。
原论文中的这一定理是「当且仅当」声明,所以我们需要从两个方向证明。首先我们先从反向逼近并证明 C(G)C(G)C(G) 的取值,然后再利用由反向获得的新知识从正向证明。设 PG=PdataPG=PdataP_{G}=P_{data}(反向指预先知道最优条件并做推导),我们可以反向推出:
image该值是全局最小值的候选,因为它只有在 PG=PdataPG=PdataP_{G}=P_{data} 的时候才出现。我们现在需要从正向证明这一个值常常为最小值,也就是同时满足「当」和「仅当」的条件。现在放弃 PG=PdataPG=PdataP_{G}=P_{data} 的假设,对任意一个 G,我们可以将上一步求出的最优判别器 D∗D∗D^{*} 代入到 C(G)=maxV(G,D)C(G)=maxV(G,D)C(G)=\max V(G,D) 中:
image因为已知 -log4 为全局最小候选值,所以我们希望构造某个值以使方程式中出现 log2。因此我们可以在每个积分中加上或减去 log2,并乘上概率密度。这是一个十分常见并且不会改变等式的数学证明技巧,因为本质上我们只是在方程加上了 0。
image采用该技巧主要是希望能够构建成含 log2 和 JS 散度的形式,上式化简后可以得到以下表达式:
image因为概率密度的定义,PGPGP_{G} 和 PdataPdataP_{data} 在它们积分域上的积分等于 111,即:
image此外,根据对数的定义,我们有:
image因此代入该等式,我们可以写为:
image现在,如果读者阅读了前文的 KL 散度,那么我们就会发现每一个积分正好就是它。具体来说:
imageKL 散度是非负的,所以我们马上就能看出来 -log4 为 C(G)C(G)C(G) 的全局最小值。
如果我们进一步证明只有一个 G 能达到这一个值,因为 PG=PdataPG=PdataP_{G}=P_{data} 将会成为令 C(G)=−log4C(G)=−log4C(G)=−\log 4 的唯一点,所以整个证明就能完成了。
从前文可知 KL 散度是非对称的,所以 C(G)C(G)C(G) 中的 KL(Pdata||(Pdata+PG)/2)KL(Pdata||(Pdata+PG)/2)KL(P_{data} || (P_{data}+P_{G})/2) 左右两项是不能交换的,但如果同时加上另一项 KL(Pdata||(Pdata+PG)/2)KL(Pdata||(Pdata+PG)/2)KL(P_{data} || (P_{data}+P_{G})/2),它们的和就能变成对称项。这两项 KL 散度的和即可以表示为 JS 散度(Jenson-Shannon divergence):
image假设存在两个分布 P 和 Q,且这两个分布的平均分布 M=(P+Q)/2M=(P+Q)/2M=(P+Q)/2,那么这两个分布之间的 JS 散度为 P 与 M 之间的 KL 散度加上 Q 与 M 之间的 KL 散度再除以 2。
JS 散度的取值为 0 到 log2。若两个分布完全没有交集,那么 JS 散度取最大值 log2;若两个分布完全一样,那么 JS 散度取最小值 0。
因此 C(G)C(G)C(G) 可以根据 JS 散度的定义改写为:
image这一散度其实就是 Jenson-Shannon 距离度量的平方。根据它的属性:当 PG=PdataPG=PdataP_{G}=P_{data} 时,JSD(Pdata(x)||PG(x))JSD(Pdata(x)||PG(x))JSD (P_{data}(x) || P_{G}(x)) 为 0。综上所述,生成分布当且仅当等于真实数据分布式时,我们可以取得最优生成器。
3.3 收敛
现在,该论文的主要部分已经得到了证明:即 PG=PdataPG=PdataP_{G}=P_{data} 为 maxV(G,D)maxV(G,D)\max V(G,D) 的最优点。此外,原论文还有额外的证明白表示:给定足够的训练数据和正确的环境,训练过程将收敛到最优 G,我们并不详细讨论这一块。
四、训练方法
image五、GAN的优势与缺陷
与其他生成式模型相比较,生成式对抗网络有以下四个优势【OpenAI Ian Goodfellow的Quora问答】:
- 根据实际的结果,它们看上去可以比其它模型产生了更好的样本(图像更锐利、清晰)。
- 生成对抗式网络框架能训练任何一种生成器网络(理论上-实践中,用 REINFORCE 来训练带有离散输出的生成网络非常困难)。大部分其他的框架需要该生成器网络有一些特定的函数形式,比如输出层是高斯的。重要的是所有其他的框架需要生成器网络遍布非零质量(non-zero mass)。生成对抗式网络能学习可以仅在与数据接近的细流形(thin manifold)上生成点。
- 不需要设计遵循任何种类的因式分解的模型,任何生成器网络和任何鉴别器都会有用。
- 无需利用马尔科夫链反复采样,无需在学习过程中进行推断(Inference),回避了近似计算棘手的概率的难题。
与PixelRNN相比,生成一个样本的运行时间更小。GAN 每次能产生一个样本,而 PixelRNN 需要一次产生一个像素来生成样本。
与VAE 相比,它没有变化的下限。如果鉴别器网络能完美适合,那么这个生成器网络会完美地恢复训练分布。换句话说,各种对抗式生成网络会渐进一致(asymptotically consistent),而 VAE 有一定偏置。
与深度玻尔兹曼机相比,既没有一个变化的下限,也没有棘手的分区函数。它的样本可以一次性生成,而不是通过反复应用马尔可夫链运算器(Markov chain operator)。
与 GSN 相比,它的样本可以一次生成,而不是通过反复应用马尔可夫链运算器。
与NICE 和 Real NVE 相比,在 latent code 的大小上没有限制。
GAN目前存在的主要问题:
-
解决不收敛(non-convergence)的问题。
目前面临的基本问题是:所有的理论都认为 GAN 应该在纳什均衡(Nash equilibrium)上有卓越的表现,但梯度下降只有在凸函数的情况下才能保证实现纳什均衡。当博弈双方都由神经网络表示时,在没有实际达到均衡的情况下,让它们永远保持对自己策略的调整是可能的【OpenAI Ian Goodfellow的Quora】。 -
难以训练:崩溃问题(collapse problem)
GAN模型被定义为极小极大问题,没有损失函数,在训练过程中很难区分是否正在取得进展。GAN的学习过程可能发生崩溃问题(collapse problem),生成器开始退化,总是生成同样的样本点,无法继续学习。当生成模型崩溃时,判别模型也会对相似的样本点指向相似的方向,训练无法继续。【Improved Techniques for Training GANs】 -
无需预先建模,模型过于自由不可控。
与其他生成式模型相比,GAN这种竞争的方式不再要求一个假设的数据分布,即不需要formulate p(x),而是使用一种分布直接进行采样sampling,从而真正达到理论上可以完全逼近真实数据,这也是GAN最大的优势。然而,这种不需要预先建模的方法缺点是太过自由了,对于较大的图片,较多的 pixel的情形,基于简单 GAN 的方式就不太可控了(超高维)。在GAN[Goodfellow Ian, Pouget-Abadie J] 中,每次学习参数的更新过程,被设为D更新k回,G才更新1回,也是出于类似的考虑。
参考资料:http://blog.csdn.net/sallyxyl1993/article/details/64123922
https://baijiahao.baidu.com/s?id=1580024390078548003&wfr=spider&for=pc
https://sherlockliao.github.io/2017/06/20/gan_math/
http://blog.csdn.net/u011534057/article/details/52840788