生成对抗网络 loss 生成对抗网络的原理_概率分布


不小心删掉的,补上。


生成对抗网络(Generative Adversarial Network,GAN)的原理是什么?以生成图片为例,比较容易说明。假设有两个网络,生成网络G(Generator)和鉴别网络D(Discriminator)。那么:

  1. G是一个图片的生成网络,输入一个随机的噪声z,通过它生成图片,记做G(z);
  2. D是一个图片的鉴别网络,确认一张图片是不是“真实”。它的输入参数是x,代表一张图片,输出D(x)代表x为真实图片的概率,如果为1, 100%是真实的图片,反之输出为0,完全不是真实的图片。

在训练过程中,生成网络G尽量生成真实的图片去欺骗鉴别网络D,而鉴别网络D尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈(gaming)过程”。最后博弈的结果, G可以生成足以“以假乱真”的图片G(z),而对D来说,它难以判定G生成的图片究竟是不是真实的,故D(G(z)) = 0.5。如图是GAN的直观表示。


生成对抗网络 loss 生成对抗网络的原理_生成对抗网络 loss_02

GAN


数学上,GAN需要优化的目标函数如下


生成对抗网络 loss 生成对抗网络的原理_生成对抗网络 loss_03


其中pdata(x)和pz(z)分别表示在数据空间X中定义的真实数据概率分布和潜在空间Z上定义的潜在变量z概率分布,而V(G,D)是二元交叉熵函数,通常用于二元分类问题。

由于D想要对真实或虚假样本进行分类,因此V(G,D)是分类问题目标函数的自然选择。 从D的角度来看,如果样本来自真实数据,D将最大化其输出;而如果样本来自G,D将最小化其输出。同时,G想要欺骗D,因此当虚假样本呈现给D时,它试图最大化D的输出。通过对V(G,D)求导,可计算出最优的鉴别器


生成对抗网络 loss 生成对抗网络的原理_生成器_04


把这个最优鉴别器带入前面的目标函数,则等式变为pdata(x)和pg(x)之间的Jensen Shannon Divergence(JSD)。 因此,最小化JSD(pdata || pg)的最优生成器是数据分布pdata(x),并且将最优生成器代入最优鉴别器,D变为0.5,意思是二者难以区分。

f-散度Df(pdata || pg)是一种通过特定凸函数f测量两个分布之间差异的手段。在f是凸函数并且满足f(1)= 0的条件下,Df(pdata || pg)可以充当两个分布之间的散度。 由于条件f(1)= 0,如果两个分布是等价的,它们的比率变为1并且它们的散度变为0。虽然f一般被称为生成函数,称它为f-散度函数避免与生成器G混淆。Kullback-Leibler Divergence(KLD)、逆KLD、JSD以及其他散度函数可以用特定生成函数f的f-GAN框架导出。


Wasserstein GAN(WGAN)提出了关于pdata(x)和pg(x)之间距离的重要研究。 GAN学习将潜在变量z变换为pg(x)的生成函数gθ,而不是直接学习概率分布pdata(x)本身。 因此,需要pg(x)和pdata(x)之间的测度来训练gθ。 WGAN建议将推土机距离(Earth Mover distance,EMD)称为Wasserstein距离,作为两种分布之间差异的度量。Wasserstein距离定义如下:


生成对抗网络 loss 生成对抗网络的原理_概率分布_05


其中


生成对抗网络 loss 生成对抗网络的原理_生成对抗网络 loss_06


表示所有联合分布的集合,γ(x,y)的边缘发布分别是pdata(x)和pg(x)。

深度卷积生成对抗器(Deep Convolutional GAN,DCGAN)为GAN提供了重要贡献,因为其建议的卷积神经网络(CNN)架构极大地稳定了GAN训练。DCGAN提出几点很有用的架构建议:

  1. 鉴别器D用步幅(strided)卷积取代池化,生成器G则用分数步幅(fractional-strided)卷积取代池化;
  2. 在D和G同时用批处理归一化(Batch Normalization);
  3. 去除全连接的隐含层;
  4. 在G中,除了输出层以外,均采用ReLU,采用Tanh函数;
  5. 在D中,全部层采用Leaky ReLU发生器。

由于DCGAN解决了训练GAN的不稳定性,成为各种GAN建模的基准。如图是DCGAN的生成器架构图。


生成对抗网络 loss 生成对抗网络的原理_生成器_07

DCGAN的一个生成器架构

如果生成器和鉴别器都以某些额外信息y为条件,例如类标签或来自其他模态的数据,则GAN扩展到条件模型,即y作为附加输入层进入鉴别器和发生器来进行调节。这个网络称为条件生成对抗网络(Conditional Generative Adversarial Nets, C-GAN ),下图给出其直观的表示。


生成对抗网络 loss 生成对抗网络的原理_生成对抗网络 loss_08

C-GAN(条件生成对抗网络)


GAN现在已经在很多领域得到应用,比如图像翻译、超分辨率、目标检测、目标改变形象、图像生成和视频生成,还有那些串行数据的生成,如音乐、语言和语音等。

GAN训练的挑战性要大于CNN,一些要注意的技巧:

  1. 归一化输入;
  2. 修改的损失函数;
  3. 使用球形噪声分布(不是均匀分布,而是高斯分布);
  4. 批量归一化;
  5. 避免稀疏梯度:
  1. ReLU和Max Pooling;
  1. 使用软且噪声标签;
  2. 推荐DCGAN或者混合模型;
  1. KL 散度 + GAN,或VAE(Variational Autoencoder)+ GAN;
  1. 使用强化学习的稳定性方法;
  2. 将Adam 优化器用于生成器G,而随机梯度下降(SGD)用于鉴别器D;
  3. 尽早跟踪故障;
  1. 检查梯度的模;
  1. 不要通过统计平衡损失(除非你有充分的理由);
  2. 如果你有标签,最好用它们;
  1. 辅助(Auxillary )GAN;
  1. 向输入添加噪声,并随时间逐渐衰减;
  2. (不确定)训练鉴别器更多些,(有时候)特别是有噪音的时候;
  3. (不确定)批量鉴定(Batch Discrimination);
  4. 采用C-GAN中的离散变量;
  5. 在训练/测试阶段,在G中使用放弃(Dropout)。