生成对抗网络-理论部分|深度学习(李宏毅)(二十三)

视频地址:
①B站:https://www.bilibili.com/video/BV15W411i7uP
②油管:https://www.youtube.com/watch?v=0CKeqXl5IY0

之前的博客地址:生成对抗网络-基本概念|深度学习(李宏毅)(二十二)

一、极大似然估计

  1. 极大似然估计

在GAN中,对于真实的训练样本的分布,记作 P d a t a ( x ) P_{data}(x) Pdata(x),这个分布也就是GAN试图去拟合、逼近的分布。另外有一个由参数 θ \theta θ控制的分布记作 P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ),其实也就是GAN或者说Generator生成的对象的分布。简单来说我们的目标就是让 P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ) P d a t a ( x ) P_{data}(x) Pdata(x)越接近越好。

举例来说, P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ)可以是一个高斯混合模型(Gaussian Maxture Model,GMM),那么此时参数 θ \theta θ就是GMM中高斯分布的均值和方差或者其他参数,我们的目的也就是求解最优的参数 θ \theta θ来让 P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ)尽可能地接近 P d a t a ( x ) P_{data}(x) Pdata(x)。从 P d a t a ( x ) P_{data}(x) Pdata(x)中采样 { x 1 , x 2 , ⋯   , x m } \left \{x^{1},x^{2},\cdots ,x^{m}\right \} {x1,x2,,xm},对于 x i x^i xi我们可以计算 P G ( x i ; θ ) P_{G}(x^{i};\theta ) PG(xi;θ),然后就可以计算样本的似然:

L = ∏ i = 1 m P G ( x i ; θ ) L=\prod_{i=1}^{m}P_{G}(x^{i};\theta ) L=i=1mPG(xi;θ)

寻找最优化的参数 θ ∗ \theta ^{*} θ的方法也就是极大似然估计的方法,即寻找一个参数 θ ∗ \theta ^{*} θ来最大化 L L L。我们可以对这个过程做以下变换:

θ ∗ = a r g m a x θ ∏ i = 1 m P G ( x i ; θ ) = a r g m a x θ    l o g ∏ i = 1 m P G ( x i ; θ ) = a r g m a x θ ∑ i = 1 m l o g P G ( x i ; θ ) ≈ a r g m a x θ E x ∼ P d a t a [ l o g P G ( x i ; θ ) ] = a r g m a x θ ∫ x P d a t a ( x ) l o g P G ( x ; θ ) d x = a r g m a x θ ( ∫ x P d a t a ( x ) l o g P G ( x ; θ ) d x − ∫ x P d a t a ( x ) l o g P d a t a ( x ) d x ) = a r g m i n θ    K L ( P d a t a ( x ) ∣ ∣ P G ( x ; θ ) ) \theta ^{*}=\underset{\theta }{argmax}\prod_{i=1}^{m}P_{G}(x^{i};\theta )\\ =\underset{\theta }{argmax}\; log\prod_{i=1}^{m}P_{G}(x^{i};\theta )\\ =\underset{\theta }{argmax}\sum_{i=1}^{m}logP_{G}(x^{i};\theta )\\ \approx \underset{\theta }{argmax}E_{x\sim P_{data}}[logP_{G}(x^{i};\theta )]\\ =\underset{\theta }{argmax}\int _{x}P_{data}(x)logP_{G}(x;\theta )\mathrm{d}x\\ =\underset{\theta }{argmax}(\int _{x}P_{data}(x)logP_{G}(x;\theta )\mathrm{d}x-\int _{x}P_{data}(x)logP_{data}(x)\mathrm{d}x)\\ =\underset{\theta }{argmin}\; KL(P_{data}(x)||P_{G}(x;\theta )) θ=θargmaxi=1mPG(xi;θ)=θargmaxlogi=1mPG(xi;θ)=θargmaxi=1mlogPG(xi;θ)θargmaxExPdata[logPG(xi;θ)]=θargmaxxPdata(x)logPG(x;θ)dx=θargmax(xPdata(x)logPG(x;θ)dxxPdata(x)logPdata(x)dx)=θargminKL(Pdata(x)PG(x;θ))

上面的式子中,由于 { x 1 , x 2 , ⋯   , x m } \left \{x^{1},x^{2},\cdots ,x^{m}\right \} {x1,x2,,xm}是从 P d a t a ( x ) P_{data}(x) Pdata(x)采样得到的样本,因此似然就近似于上式中关于 P d a t a ( x ) P_{data}(x) Pdata(x)的期望值,这个期望值写成积分的形式后可以减去一个与 θ \theta θ无关的项,最终得到 P d a t a ( x ) P_{data}(x) Pdata(x) P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ)的KL散度。也就是说,求解参数 θ \theta θ的过程,也就是最小化分布 P d a t a ( x ) P_{data}(x) Pdata(x) P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ)的KL散度的过程,使得这两个分布能够不断地逼近。KL散度能够用来衡量两个分布的接近程度(越小越接近),其公式如下:

K L ( P ( x ) ∣ ∣ Q ( x ) ) = ∫ x P ( x ) l o g P ( x ) Q ( x ) d x KL(P(x)||Q(x))=\int _{x}P(x)log\frac{P(x)}{Q(x)}\mathrm{d}x KL(P(x)Q(x))=xP(x)logQ(x)P(x)dx

  1. 存在的问题

使用GMM的话会限制模型的拟合能力,而对于要拟合的分布 P d a t a ( x ) P_{data}(x) Pdata(x)来说,其往往是图片、文字一类复杂的结构,因此我们期待使用一个神经网络,也就是一个比较复杂的、拟合能力较强的、一般化的 P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ)。现在我们尝试使用一个神经网络来替代GMM,现在的 θ \theta θ也就相当于神经网络的参数,具体地,我们有一个Generator,它的输入是一个随机变量 z z z z z z服从高斯分布或者均匀分布 P p r i o r ( z ) P_{prior}(z) Pprior(z),而它的输出就是 G ( z ) = x G(z)=x G(z)=x,可以理解为生成的图片。也就是说现在我们的目标就是学习一个最优化的Generator的参数 θ \theta θ,来让 z z z通过Generator产生的 x x x的分布 P G ( x ; θ ) P_{G}(x;\theta ) PG(x;θ) P d a t a ( x ) P_{data}(x) Pdata(x)越接近越好:

Generator

由于 z z z是一个服从高斯分布或者均匀分布的随机变量,因此通过Generator以后得到的 x x x也会服从一个分布,虽然 z z z服从一个简单的分布,但是由于神经网络可以是很庞大的,因此 x x x的分布可以是很复杂的。计算 x x x出现的概率可以使用以下公式:

P G ( x ) = ∫ z P p r i o r ( z ) I [ G ( z ) = x ] d z P_{G}(x)=\int _{z}P_{prior}(z)I_{[G(z)=x]}\mathrm{d}z PG(x)=zPprior(z)I[G(z)=x]dz

对于上面的概率公式,这个概率是很难计算的,显然不能用它来做极大似然估计,因此问题也就出在这里。类比GMM,在GMM中生成的过程是先从几个高斯分布中按照一定概率来抽取一个高斯分布,然后从这个高斯分布中抽取一个 x x x,而在Generator中生成的过程是从 P p r i o r ( z ) P_{prior}(z) Pprior(z)抽取一个 z z z,然后 z z z通过 G ( z ) G(z) G(z)得到 x x x,不一样的是对于一个给定的 x x x,GMM可以轻易地计算 x x x出现的概率,而Generator的对于一个给定的 x x x很难计算其概率,并且概率公式中还包含指示函数,使得进行极大似然估计时没办法做微分,也就出现了问题,而GAN的优势就在于它解决了这个问题,这就是GAN最大的贡献。

二、GAN的原理

  1. GAN的基本理念

在GAN中Generator是一个函数 G G G,输入是 z z z,输出是 x x x,给定一个 z z z的分布 P p r i o r ( z ) P_{prior}(z) Pprior(z),函数 G G G也就定义了分布 P G ( x ) P_{G}(x) PG(x),然而单纯利用Generator无法使用极大似然估计。另外有一个Discriminator记作函数 D D D,它的输入是 x x x,输出是一个标量,它能够衡量 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)之间的差异,不过它计算的不是KL散度,而是另一种散度。如何利用GAN来求解最优化的Generator呢?只需要求解下面这个式子:

G ∗ = a r g m i n G    m a x D    V ( G , D ) G^{*}=\underset{G}{argmin}\; \underset{D}{max}\; V(G,D) G=GargminDmaxV(G,D)

直观地来看,如下图,对于上面的式子,如果对于特定的 G G G,比如 G 1 G_1 G1 G 2 G_2 G2 G 3 G_3 G3,令 V ( G , D ) V(G,D) V(G,D)最大的 D D D就是红点对应的 D D D,然后求解使 m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)最小的 G G G,就能解得最优化的 G 3 G_3 G3

求解

V V V也就是目标函数,可以使用这个式子:

V = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_{G}}[log(1-D(x))] V=ExPdata[logD(x)]+ExPG[log(1D(x))]

对于一个给定的 G G G m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)的值就相当于 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)之间差异的程度,其实这个值就等于 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)的某种散度,然后再求解一个能使 m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)最小的 G G G,就能找到一个能使 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)最接近的 G G G了。

  1. GAN的原理

接下来就解释一下为什么按照上面的方式求解就能得到最优化的结果。首先对于一个给定的 G G G,寻找需要寻找一个 D ∗ D^* D来使 V ( G , D ) V(G,D) V(G,D)最大,我们先来将 V ( G , D ) V(G,D) V(G,D)的式子展开:

V = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] = ∫ x P d a t a ( x ) l o g D ( x ) d x + ∫ x P G ( x ) l o g ( 1 − D ( x ) ) d x = ∫ x [ P d a t a ( x ) l o g D ( x ) + P G ( x ) l o g ( 1 − D ( x ) ) ] d x V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_{G}}[log(1-D(x))]\\ =\int _{x}P_{data}(x)logD(x)\mathrm{d}x+\int _{x}P_{G}(x)log(1-D(x))\mathrm{d}x\\ =\int _{x}[P_{data}(x)logD(x)+P_{G}(x)log(1-D(x))]\mathrm{d}x V=ExPdata[logD(x)]+ExPG[log(1D(x))]=xPdata(x)logD(x)dx+xPG(x)log(1D(x))dx=x[Pdata(x)logD(x)+PG(x)log(1D(x))]dx

对于上面的式子,我们想让 V ( G , D ) V(G,D) V(G,D)最大,自然希望对于每一个 x x x,积分号里面的式子都能最大,因此我们只看积分号里面的部分:

P d a t a ( x ) l o g D ( x ) + P G ( x ) l o g ( 1 − D ( x ) ) P_{data}(x)logD(x)+P_{G}(x)log(1-D(x)) Pdata(x)logD(x)+PG(x)log(1D(x))

上面的式子中, P d a t a ( x ) P_{data}(x) Pdata(x)作为客观存在的分布,因此看做常数,而 P G ( x ) P_{G}(x) PG(x)由于是给定的,因此也看做常数,而 D ( x ) D(x) D(x)作为变量,也就是:

P d a t a ( x ) a l o g D ( x ) D + P G ( x ) b l o g ( 1 − D ( x ) D ) \underset{a}{P_{data}(x)}log\underset{D}{D(x)}+\underset{b}{P_{G}(x)}log(1-\underset{D}{D(x)}) aPdata(x)logDD(x)+bPG(x)log(1DD(x))

那这个问题就成了求解 D ∗ D^* D来使得下面这个式子最大的问题:

f ( D ) = a l o g D + b l o g ( 1 − D ) f(D)=alogD+blog(1-D) f(D)=alogD+blog(1D)

直接微分然后令其等于 0 0 0即可:

d f ( D ) d D = a × 1 D − b × 1 1 − D ⇒ a × 1 D ∗ − b × 1 1 − D ∗ = 0 ⇒ D ∗ = a a + b \frac{\mathrm{d}f(D)}{\mathrm{d}D}=a\times \frac{1}{D}-b\times\frac{1}{1-D}\\ \Rightarrow a\times \frac{1}{D^{*}}-b\times\frac{1}{1-D^{*}}=0\\ \Rightarrow D^{*}=\frac{a}{a+b} dDdf(D)=a×D1b×1D1a×D1b×1D1=0D=a+ba

也就是说:

D ∗ ( x ) = P d a t a ( x ) P d a t a ( x ) + P G ( x ) D^{*}(x)=\frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)} D(x)=Pdata(x)+PG(x)Pdata(x)

最优的 D ∗ ( x ) D^{*}(x) D(x)显然位于 0 0 0 1 1 1之间,因此在实际实现GAN时可以给Discriminator最后设置一个sigmoid函数。

在下图中,不同的 G G G的图像的最高点对应的 D ( x ) D(x) D(x)就对应着由上面的式子解出来的 D ∗ ( x ) D^*(x) D(x),而将 D ∗ ( x ) D^*(x) D(x)代入 V ( G , D ) V(G,D) V(G,D)中得到的 V ( G , D ∗ ) V(G,D^*) V(G,D)就表示了在给定的当前 G G G的情况下 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)的某种散度,在图中也就是红点到横轴的距离:

代入

接下来说明为什么 m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)能够代表 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)之间的差异程度。将 D ∗ ( x ) D^{*}(x) D(x)代入 V ( G , D ) V(G,D) V(G,D)中并做一些变换:

m a x D    V ( G , D ) = V ( G , D ∗ ) = E x ∼ P d a t a [ l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) ] + E x ∼ P G [ l o g P G ( x ) P d a t a ( x ) + P G ( x ) ] = ∫ x P d a t a ( x ) l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) d x = ∫ x P d a t a ( x ) l o g P d a t a ( x ) / 2 ( P d a t a ( x ) + P G ( x ) ) / 2 d x + ∫ x P G ( x ) l o g P G ( x ) / 2 ( P d a t a ( x ) + P G ( x ) ) / 2 d x = ∫ x P d a t a ( x ) ( l o g 1 2 + l o g P d a t a ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 ) d x + ∫ x P G ( x ) ( l o g 1 2 + l o g P G ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 ) d x = − 2 l o g 2 + ∫ x P d a t a ( x ) l o g P d a t a ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 d x + ∫ x P G ( x ) l o g P G ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 d x = − 2 l o g 2 + K L ( P d a t a ( x ) ∣ ∣ P d a t a ( x ) + P G ( x ) 2 ) + K L ( P G ( x ) ∣ ∣ P d a t a ( x ) + P G ( x ) 2 ) = − 2 l o g 2 + 2 J S ( P d a t a ( x ) ∣ ∣ P G ( x ) ) \underset{D}{max}\; V(G,D)=V(G,D^{*})\\ =E_{x\sim P_{data}}[log\frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)}]+E_{x\sim P_{G}}[log\frac{P_{G}(x)}{P_{data}(x)+P_{G}(x)}]\\ =\int _{x}P_{data}(x)log\frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)}\mathrm{d}x+\int _{x}P_{G}(x)log\frac{P_{G}(x)}{P_{data}(x)+P_{G}(x)}\mathrm{d}x\\ =\int _{x}P_{data}(x)log\frac{P_{data}(x){\color{Red}{/2}}}{(P_{data}(x)+P_{G}(x)){\color{Red}{/2}}}\mathrm{d}x+\int _{x}P_{G}(x)log\frac{P_{G}(x){\color{Red}{/2}}}{(P_{data}(x)+P_{G}(x)){\color{Red}{/2}}}\mathrm{d}x\\ =\int _{x}P_{data}(x)\left ({\color{Red}{log\frac{1}{2}}}+log\frac{P_{data}(x)}{(P_{data}(x)+P_{G}(x)){\color{Red}{/2}}}\right )\mathrm{d}x+\int _{x}P_{G}(x)\left ({\color{Red}{log\frac{1}{2}}}+log\frac{P_{G}(x)}{(P_{data}(x)+P_{G}(x)){\color{Red}{/2}}}\right )\mathrm{d}x\\ ={\color{Red}{-2log2}}+\int _{x}P_{data}(x)log\frac{P_{data}(x)}{(P_{data}(x)+P_{G}(x))/2}\mathrm{d}x+\int _{x}P_{G}(x)log\frac{P_{G}(x)}{(P_{data}(x)+P_{G}(x))/2}\mathrm{d}x\\ =-2log2+{\color{Red}{KL\left (P_{data}(x)||\frac{P_{data}(x)+P_{G}(x)}{2} \right )}}+{\color{Red}{KL\left (P_{G}(x)||\frac{P_{data}(x)+P_{G}(x)}{2} \right )}}\\ =-2log2+{\color{Red}{2JS(P_{data}(x)||P_{G}(x))}} DmaxV(G,D)=V(G,D)=ExPdata[logPdata(x)+PG(x)Pdata(x)]+ExPG[logPdata(x)+PG(x)PG(x)]=xPdata(x)logPdata(x)+PG(x)Pdata(x)dx+xPG(x)logPdata(x)+PG(x)PG(x)dx=xPdata(x)log(Pdata(x)+PG(x))/2Pdata(x)/2dx+xPG(x)log(Pdata(x)+PG(x))/2PG(x)/2dx=xPdata(x)(log21+log(Pdata(x)+PG(x))/2Pdata(x))dx+xPG(x)(log21+log(Pdata(x)+PG(x))/2PG(x))dx=2log2+xPdata(x)log(Pdata(x)+PG(x))/2Pdata(x)dx+xPG(x)log(Pdata(x)+PG(x))/2PG(x)dx=2log2+KL(Pdata(x)2Pdata(x)+PG(x))+KL(PG(x)2Pdata(x)+PG(x))=2log2+2JS(Pdata(x)PG(x))

这里我们定义另一种衡量分布差异程度的散度,叫做JS散度(Jensen–Shannon Divergence,JSD)。不同于KL散度的是,JS散度是对称的,也就是 J S ( P ∣ ∣ Q ) = J S ( Q ∣ ∣ P ) JS(P||Q)=JS(Q||P) JS(PQ)=JS(QP)。它的定义如下:

J S ( P ( x ) ∣ ∣ Q ( x ) ) = 1 2 K L ( P ( x ) ∣ ∣ M ( x ) ) + 1 2 K L ( Q ( x ) ∣ ∣ M ( x ) ) ,    其 中 M ( x ) = 1 2 ( P ( x ) + Q ( x ) ) JS(P(x)||Q(x))=\frac{1}{2}KL(P(x)||M(x))+\frac{1}{2}KL(Q(x)||M(x)),\; 其中M(x)=\frac{1}{2}(P(x)+Q(x)) JS(P(x)Q(x))=21KL(P(x)M(x))+21KL(Q(x)M(x)),M(x)=21(P(x)+Q(x))

因此将 m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)也就相当于在衡量 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)的JS散度,JS散度的值介于 0 0 0 l o g 2 log2 log2之间,如果两个分布完全一致那么其JS散度就是 0 0 0,如果两个分布完全没有交集,那么其JS散度就是 l o g 2 log2 log2。当然也可以识别别的 V V V来让它衡量别的散度。

总结一下:

①首先我们有一个Generator G G G和一个Discriminator D D D
②我们需要通过下面这一个式子寻找一个 G ∗ G^* G
G ∗ = a r g m i n G    m a x D    V ( G , D ) G^{*}=\underset{G}{argmin}\; \underset{D}{max}\; V(G,D) G=GargminDmaxV(G,D)
③对于给定的 G G G,有:
m a x D    V ( G , D ) = − 2 l o g 2 + 2 J S ( P d a t a ( x ) ∣ ∣ P G ( x ) ) \underset{D}{max}\; V(G,D)=-2log2+2JS(P_{data}(x)||P_{G}(x)) DmaxV(G,D)=2log2+2JS(Pdata(x)PG(x))
④然后需要求解最优的 G G G,满足 P G ( x ) = P d a t a ( x ) P_{G}(x)=P_{data}(x) PG(x)=Pdata(x)时才会得到最小的 V ( G , D ) V(G,D) V(G,D)

  1. 算法

接下来要做的就是求解求解 G ∗ G^* G,我们把 m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)记作 L ( G ) L(G) L(G),那么求解 G ∗ G^* G的方法按照梯度下降的方法就好:

θ G ← θ G − η ∂ L ( G ) ∂ θ G \theta _{G}\leftarrow \theta _{G}-\eta \frac{\partial L(G)}{\partial \theta _{G}} θGθGηθGL(G)

那么对于 L ( G ) L(G) L(G)这样这种带 m a x max max的式子要怎么做微分呢?我们可以把带 m a x max max的问题以下面这个问题来看,对于函数 f ( x ) f(x) f(x),其公式为:

f ( x ) = m a x { f 1 ( x ) , f 2 ( x ) , f 3 ( x ) } f(x)=max\left \{f_{1}(x),f_{2}(x),f_{3}(x)\right \} f(x)=max{f1(x),f2(x),f3(x)}

现在要求解 d f ( x ) d x \frac{\mathrm{d}f(x)}{\mathrm{d}x} dxdf(x),那么假设 f ( x ) f(x) f(x)的图像如下:

f(x)

那么在求解时 x x x所在的位置对应的哪一个 f i ( x ) f_{i}(x) fi(x)最大,那么对 x x x的微分也就是 d f i ( x ) d x \frac{\mathrm{d}f_{i}(x)}{\mathrm{d}x} dxdfi(x)

微分

在求解这个问题时就按照对当前 x x x对应的最大的 f i ( x ) f_i(x) fi(x)微分的方式进行梯度下降即可:

梯度下降

上面的问题类比到求解 G ∗ G^* G上就是 f ( x ) f(x) f(x)相当于 L ( G ) L(G) L(G) x x x相当于 G G G f i ( x ) f_i(x) fi(x)也就相当于不同的 D D D,只不过 f i ( x ) f_i(x) fi(x)是有限个, D D D有无限多个,不同的 G G G也就对应了不同的能使 V V V最大的 D ∗ D^* D。因此我们的求解方式是按照梯度下降的方法来求解 G ∗ G^* G,每次更新 θ G \theta _{G} θG以后要计算当前 G G G对应的 D ∗ D^* D,然后再一次地更新 θ G \theta _{G} θG。该流程如下:

  • 初始化 G 0 G_0 G0
  • 求解 D 0 ∗ D_0^* D0来最大化 V ( G 0 , D ) V(G_0,D) V(G0,D) V ( G 0 , D 0 ∗ ) V(G_0,D_0^*) V(G0,D0)就是 P G 0 ( x ) P_{G_0}(x) PG0(x) P d a t a ( x ) P_{data}(x) Pdata(x)的JS散度
  • 更新 θ G \theta _{G} θG来获得 G 1 G_1 G1
    θ G ← θ G − η ∂ V ( G 0 , D 0 ∗ ) ∂ θ G \theta _{G}\leftarrow \theta _{G}-\eta \frac{\partial V(G_{0},D_0^{*})}{\partial \theta _{G}} θGθGηθGV(G0,D0)
  • 求解 D 1 ∗ D_1^* D1来最大化 V ( G 1 , D ) V(G_1,D) V(G1,D) V ( G 0 , D 1 ∗ ) V(G_0,D_1^*) V(G0,D1)就是 P G 1 ( x ) P_{G_1}(x) PG1(x) P d a t a ( x ) P_{data}(x) Pdata(x)的JS散度
  • 更新 θ G \theta _{G} θG来获得 G 2 G_2 G2
    θ G ← θ G − η ∂ V ( G 0 , D 1 ∗ ) ∂ θ G \theta _{G}\leftarrow \theta _{G}-\eta \frac{\partial V(G_{0},D_1^{*})}{\partial \theta _{G}} θGθGηθGV(G0,D1)
  • ……

这里有个小问题就是在使用梯度下降更新过 G G G以后可能会使得 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)的JS散度不减反增,比如下图这个例子,横轴表示 D D D,在更新过 G G G的参数后有可能 m a x D    V ( G , D ) \underset{D}{max}\; V(G,D) DmaxV(G,D)会比原来更大,对于这样的问题我们就只能假设 D 0 ∗ ≈ D 1 ∗ D_0^*\approx D_1^* D0D1,在更新参数 θ G \theta _G θG时一次不能更新太多:

issue

在实际操作的时候因为无法积分所以我们并不能真正地计算 V V V中的两个期望,因此采用采样的方法。对于给定的 G G G,求解使 V ( G , D ) V(G,D) V(G,D)最大化的 D ∗ D^* D时,从 P d a t a ( x ) P_{data}(x) Pdata(x)中采样 { x 1 , x 2 , ⋯   , x m } \left \{x^{1},x^{2},\cdots ,x^{m}\right \} {x1,x2,,xm},从Generator P G ( x ) P_{G}(x) PG(x)中采样 { x ~ 1 , x ~ 2 , ⋯   , x ~ m } \left \{\tilde{x}^{1},\tilde{x}^{2},\cdots ,\tilde{x}^{m}\right \} {x~1,x~2,,x~m},然后最大化:

V ~ = 1 m ∑ i = 1 m l o g    D ( x i ) + 1 m ∑ i = 1 m l o g    ( 1 − D ( x ~ i ) ) \tilde{V}=\frac{1}{m}\sum_{i=1}^{m}log\; D(x^{i})+\frac{1}{m}\sum_{i=1}^{m}log\; \left (1-D(\tilde{x}^{i})\right ) V~=m1i=1mlogD(xi)+m1i=1mlog(1D(x~i))

上面这个式子非常类似与一个二分类器的损失函数,也就是二分类的交叉熵,在二分类中,如果 x x x是个positive的样本,我们要尽可能地极小化 − l o g D ( x ) -logD(x) logD(x),如果 x x x是个negative的样本,我们要尽可能地极小化 − l o g ( 1 − D ( x ) ) -log(1-D(x)) log(1D(x))。因此极大化 V ~ \tilde{V} V~也就相当于二分类问题中极小化交叉熵损失函数,也就是说,我们真正在求解 D ∗ D^* D时只需要当做一个二分类问题来做就好了,具体地:

{ x 1 , x 2 , ⋯   , x m }    f r o m    P d a t a ( x ) ⇒ p o s i t i v e    e x a m p l e s { x ~ 1 , x ~ 2 , ⋯   , x ~ m }    f r o m    P G ( x ) ⇒ n e g a t i v e    e x a m p l e s l o s s f u n c t i o n : L = − V ~ = − ( 1 m ∑ i = 1 m l o g    D ( x i ) + 1 m ∑ i = 1 m l o g    ( 1 − D ( x ~ i ) ) ) \left \{x^{1},x^{2},\cdots ,x^{m}\right \}\; from\; P_{data}(x)\Rightarrow positive\; examples\\ \left \{\tilde{x}^{1},\tilde{x}^{2},\cdots ,\tilde{x}^{m}\right \}\; from\; P_{G}(x)\Rightarrow negative\; examples\\ loss function:L=-\tilde{V}=-\left (\frac{1}{m}\sum_{i=1}^{m}log\; D(x^{i})+\frac{1}{m}\sum_{i=1}^{m}log\; \left (1-D(\tilde{x}^{i})\right )\right ) {x1,x2,,xm}fromPdata(x)positiveexamples{x~1,x~2,,x~m}fromPG(x)negativeexampleslossfunction:L=V~=(m1i=1mlogD(xi)+m1i=1mlog(1D(x~i)))

这一点直观上也是可以理解的,如果这个二分类器的loss很小,就代表它可以很容易地分辨真实的样本和生成的样本, P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)的JS散度就很大,而如果这个二分类器的loss很大,就代表它分辨不出真实的样本和生成的样本, P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)的JS散度就很小。

现在我们就可以更加清晰地来理解上一篇文章中的训练的算法:

Initialize:
  初始化 D D D的参数 θ d \theta _{d} θd G G G的参数 θ g \theta _{g} θg


Step1 学习 D D D
  ①从数据库中随机抽样 m m m个样本 { x 1 , x 2 , ⋯   , x m } \left \{x^{1},x^{2},\cdots ,x^{m}\right \} {x1,x2,,xm}
  ②从一个分布(比如高斯分布或者均匀分布)中采样 m m m个噪声样本(noise sample) { z 1 , z 2 , ⋯   , z m } \left \{z^{1},z^{2},\cdots ,z^{m}\right \} {z1,z2,,zm}
  ③获得 G G G生成的数据 { x ~ 1 , x ~ 2 , ⋯   , x ~ m } \left \{\tilde{x}^{1},\tilde{x}^{2},\cdots ,\tilde{x}^{m}\right \} {x~1,x~2,,x~m},其中 x ~ i = G ( z i ) \tilde{x}^{i}=G(z^{i}) x~i=G(zi)
  ④目标函数记作 V ~ \tilde{V} V~,通过最大化(梯度上升) V ~ \tilde{V} V~来更新 θ d \theta _{d} θd,也就是 θ d ← θ d + η ∇ V ~ ( θ d ) \theta _{d}\leftarrow \theta _{d}+\eta \nabla \tilde{V}(\theta _{d}) θdθd+ηV~(θd),目标函数 V ~ \tilde{V} V~为:
V ~ = 1 m ∑ i = 1 m l o g    D ( x i ) + 1 m ∑ i = 1 m l o g    ( 1 − D ( x ~ i ) ) \tilde{V}=\frac{1}{m}\sum_{i=1}^{m}log\; D(x^{i})+\frac{1}{m}\sum_{i=1}^{m}log\; (1-D(\tilde{x}^{i})) V~=m1i=1mlogD(xi)+m1i=1mlog(1D(x~i))


Step2 学习 G G G
  ①同样从一个分布(比如高斯分布或者均匀分布)中采样 m m m个噪声样本(noise sample) { z 1 , z 2 , ⋯   , z m } \left \{z^{1},z^{2},\cdots ,z^{m}\right \} {z1,z2,,zm}
  ②目标函数同样记作 V ~ \tilde{V} V~,通过最大化(梯度上升) V ~ \tilde{V} V~来更新 θ g \theta _{g} θg,也就是 θ g ← θ g + η ∇ V ~ ( θ g ) \theta _{g}\leftarrow \theta _{g}+\eta \nabla \tilde{V}(\theta _{g}) θgθg+ηV~(θg),目标函数 V ~ \tilde{V} V~为:
V ~ = 1 m ∑ i = 1 m l o g    D ( G ( z i ) ) \tilde{V}=\frac{1}{m}\sum_{i=1}^{m}log\; D(G(z^{i})) V~=m1i=1mlogD(G(zi))

上面的算法中Step1和Step2是交替进行的,但是在每一次迭代中应该将学习 D D D的步骤重复多次,不过即使这样也不能学习到 D D D的全局最优点,学习到的也只是 D D D的lower bound,而对于学习 G G G的步骤只需要进行一次,这是因为之前说过的原因,即 G G G不能一次更新太多。

三、实践中的一些issue

  1. 实作中Generator目标函数的问题

在训练Generator时,我们实际上在极小化这个式子:

V = E x ∼ P G [ l o g ( 1 − D ( x ) ) ] V=E_{x\sim P_{G}}[log(1-D(x))] V=ExPG[log(1D(x))]

D ( x ) D(x) D(x)为横轴,画出 l o g ( 1 − D ( x ) ) log(1-D(x)) log(1D(x)) − l o g D ( x ) -logD(x) logD(x)的图像如图所示:

图像

在训练一开始, D ( x ) D(x) D(x)接近 0 0 0,但是 l o g ( 1 − D ( x ) ) log(1-D(x)) log(1D(x))的梯度比较小,在趋近于 1 1 1的地方 l o g ( 1 − D ( x ) ) log(1-D(x)) log(1D(x))的梯度反而比较大,这与我们的期待是不一致的,我们期望模型在训练初始时梯度应该大一些,在接近收敛时梯度应该小一些。因此,在实际操作中,我们真正优化的式子是:

V = E x ∼ P G [ − l o g D ( x ) ] V=E_{x\sim P_{G}}[-logD(x)] V=ExPG[logD(x)]

这个式子的梯度就符合我们的期望,不过这样就不是在极小化JS散度,而是在极小化另外一个奇怪的散度。

  1. 评估JS散度

在训练Discriminator时,理论上Discriminator的loss就代表JS散度的大小,但是在实际操作时Discriminator的loss几乎趋近于 0 0 0,也就是说Discriminator总是有办法把生成的图片与真实的图片分开。举例来说,在下面的实验中,Generator采用了训练1、10、25个epoch的三种,其中训练越多epoch的Generator产生的图片越接近真实,但是从图中看到无论哪一种Generator它们的Discriminator的loss总是能够趋近于 0 0 0,并且Discriminator也总能训练到100%的准确率,Discriminator的loss并不能反映JS散度的大小:

实验

另外一个例子如下,使用一个较强和一个较弱的Generator,可以看到强的Generator生成的图片已经很真实了,但是它们的Discriminator的loss缺失差不多的,这表明Discriminator的loss并没有反映JS散度:

实验

Discriminator的loss接近于 0 0 0,表明JS散度最大,也就是 l o g 2 log2 log2 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)完全没有交集。原因有以下两点:

  • Reason1:通过采样的方式来训练

由于我们始终没有办法直接计算损失函数中的期望,因此只能通过采样的方法来进行训练,那么有可能如下图所示,对于采样出的样本,由于Discriminator过于powerful,那么它总有办法寻找一个边界来分开样本,类似过拟合:

过拟合

解决这种问题我们考虑让Discriminator变得弱一点,要么迭代次数少一点要么加dropout,不过要将Discriminator变弱到什么程度,这又是很难把握的,而且这与我们最初的设想又出现了矛盾,Discriminator能够衡量JS散度的一个前提就是Discriminator要足够地powerful,因此这里就出现了一些矛盾。

  • Reason2:数据的本质

GAN要拟合的数据和Generator生成的数据实际上是高维空间中的流形(manifold)。拿二维空间中的一维流形来说,可能 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)很少有交集,或者交集很少,像图中这样的数据的JS散度就会很小:

流形

我们之前有说过GAN的训练和生物进化很类似,比如下面图中生物进化出眼睛的过程,只要从左到右的进化对生物的繁衍是有利的,这个进化的过程才能持续下去:

眼睛的进化

GAN的训练也类似,比如下图中 P G ( x ) P_{G}(x) PG(x) P d a t a ( x ) P_{data}(x) Pdata(x)越来越接近,最终数据分布趋于一致,我们期待模型能够以这样的过程逐步迭代达到最佳效果,但是可以看出在达到最佳效果(JS散度为 0 0 0)之前,每一步的JS散度都是 l o g 2 log2 log2,也就是说目前的GAN没有动力一致演化下去:

GAN的训练

解决这个问题的方法是可以给Discriminator的输入添加一些噪声或者给标签添加一些噪声(随机标记一些正样本为负样本,负样本为正样本),这样会使数据产生下图中的效果,因而重叠的部分就有可能变大:

加噪

不过要将加入的噪声随着训练而减弱,否则会影响机器对真实的数据分布的判断。

另一种方式是使用别的度量差异度的方式,比如WGAN这方法,这一类方法下一篇中再具体介绍。

  1. Mode Collapse

GAN还容易产生Mode Collapse的问题,以高斯分布为例,如果 P d a t a ( x ) P_{data}(x) Pdata(x)有两个高斯分布,而 P G ( x ) P_{G}(x) PG(x)只产生了一个:

Mode Collapse

举例来说,在下面的二次元人物头像生成的图片中就有许多图片是重复的,这就是Mode Collapse的问题:

Mode Collapse

再举一个例子来说,比如要拟合的数据如下图:

真实数据

我们期待GAN能够按照下面的方式来逐步学习到数据的真实分布:

期待的结果

而实际的结果可能只会像下面这样,这就是Mode Collapse的问题:

实际的结果

出现Mode Collapse的原因可能如下图所示。在 P d a t a P_{data} Pdata有两个高斯分布而 P G P_{G} PG只能产生一个高斯分布的情况下,对于KL散度,通过它的式子可以看出,在 P G P_G PG没有值,而 P d a t a P_{data} Pdata有值的地方就会产生无穷大的值,因此为了让KL散度尽可能地小, P G P_{G} PG就会尽可能地覆盖所有 P d a t a P_{data} Pdata有值的地方,即使有些 P d a t a P_{data} Pdata没有值的地方被覆盖到也在所不惜。而对于Reverse KL散度来说正好相反,在 P d a t a P_{data} Pdata没有值,而 P G P_{G} PG有值的地方就会产生无穷大的值,因此为了让Reverse KL散度小, P G P_{G} PG就不会冒险去覆盖 P d a t a P_{data} Pdata没有值的地方,因此就可能会固守在一个高斯分布上:

原因分析

但是因为 V V V是可以由我们自己来设计的,因此我们可以设计目标函数 V V V来让GAN最小化KL散度,然而Mode Collapse的问题还是存在。具体的有关Mode Collapse的问题之后再介绍,这里就不再赘述。

最后列一个Ian Goodfellow的有关GAN的Tutorial:https://arxiv.org/abs/1701.00160

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值