不小心删掉的,补上。
生成对抗网络(Generative Adversarial Network,GAN)的原理是什么?以生成图片为例,比较容易说明。假设有两个网络,生成网络G(Generator)和鉴别网络D(Discriminator)。那么:
- G是一个图片的生成网络,输入一个随机的噪声z,通过它生成图片,记做G(z);
- 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的直观表示。
GAN
数学上,GAN需要优化的目标函数如下
其中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)求导,可计算出最优的鉴别器
把这个最优鉴别器带入前面的目标函数,则等式变为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距离定义如下:
其中
表示所有联合分布的集合,γ(x,y)的边缘发布分别是pdata(x)和pg(x)。
深度卷积生成对抗器(Deep Convolutional GAN,DCGAN)为GAN提供了重要贡献,因为其建议的卷积神经网络(CNN)架构极大地稳定了GAN训练。DCGAN提出几点很有用的架构建议:
- 鉴别器D用步幅(strided)卷积取代池化,生成器G则用分数步幅(fractional-strided)卷积取代池化;
- 在D和G同时用批处理归一化(Batch Normalization);
- 去除全连接的隐含层;
- 在G中,除了输出层以外,均采用ReLU,采用Tanh函数;
- 在D中,全部层采用Leaky ReLU发生器。
由于DCGAN解决了训练GAN的不稳定性,成为各种GAN建模的基准。如图是DCGAN的生成器架构图。
DCGAN的一个生成器架构
如果生成器和鉴别器都以某些额外信息y为条件,例如类标签或来自其他模态的数据,则GAN扩展到条件模型,即y作为附加输入层进入鉴别器和发生器来进行调节。这个网络称为条件生成对抗网络(Conditional Generative Adversarial Nets, C-GAN ),下图给出其直观的表示。
C-GAN(条件生成对抗网络)
GAN现在已经在很多领域得到应用,比如图像翻译、超分辨率、目标检测、目标改变形象、图像生成和视频生成,还有那些串行数据的生成,如音乐、语言和语音等。
GAN训练的挑战性要大于CNN,一些要注意的技巧:
- 归一化输入;
- 修改的损失函数;
- 使用球形噪声分布(不是均匀分布,而是高斯分布);
- 批量归一化;
- 避免稀疏梯度:
- ReLU和Max Pooling;
- 使用软且噪声标签;
- 推荐DCGAN或者混合模型;
- KL 散度 + GAN,或VAE(Variational Autoencoder)+ GAN;
- 使用强化学习的稳定性方法;
- 将Adam 优化器用于生成器G,而随机梯度下降(SGD)用于鉴别器D;
- 尽早跟踪故障;
- 检查梯度的模;
- 不要通过统计平衡损失(除非你有充分的理由);
- 如果你有标签,最好用它们;
- 辅助(Auxillary )GAN;
- 向输入添加噪声,并随时间逐渐衰减;
- (不确定)训练鉴别器更多些,(有时候)特别是有噪音的时候;
- (不确定)批量鉴定(Batch Discrimination);
- 采用C-GAN中的离散变量;
- 在训练/测试阶段,在G中使用放弃(Dropout)。