首页 > 人工智能(Artificial Intelligence) > 生成对抗网络

生成对抗网络(GAN)优点与缺点

优点

GNs是一种以半监督方式训练分类器的方法。

G的参数更新不是直接来自数据样本,而是使用来自D的反向传播

理论上,只要是可微分函数都可以用于构建D和G,因为能够与深度神经网络结合做深度生成式模型

GANs可以比完全明显的信念网络(NADE,PixelRNN,WaveNet等)更快的产生样本,因为它不需要在采样序列生成不同的数据.

模型只用到了反向传播,而不需要马尔科夫链

相比于变分自编码器, GANs没有引入任何决定性偏置( deterministic bias),变分方法引入决定性偏置,因为他们优化对数似然的下界,而不是似然度本身,这看起来导致了VAEs生成的实例比GANs更模糊.

相比非线性ICA(NICE, Real NVE等,),GANs不要求生成器输入的潜在变量有任何特定的维度或者要求生成器是可逆的.

相比玻尔兹曼机和GSNs,GANs生成实例的过程只需要模型运行一次,而不是以马尔科夫链的形式迭代很多次.

缺点

训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.我们还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但我认为在实践中它还是比训练玻尔兹曼机稳定的多.

它很难去学习生成离散的数据,就像文本

相比玻尔兹曼机,GANs很难根据一个像素值去猜测另外一个像素值,GANs天生就是做一件事的,那就是一次产生所有像素, 你可以用BiGAN来修正这个特性,它能让你像使用玻尔兹曼机一样去使用Gibbs采样来猜测缺失值, 我在伯克利大学的课堂上前二十分钟讲到了这个问题.课程链接,油管视频,请自带梯子~

可解释性差,生成模型的分布 Pg(G)没有显式的表达

训练不稳定,G 和 D 很难收敛

训练还会遭遇梯度消失、模式崩溃的问题

缺乏比较有效的直接可观的评估模型生成效果的方法

梯度消失和模式奔溃

GAN 的本质就是 G 和 D 互相博弈并最终达到一个纳什平衡点,但这只是一个理想的情况,正常情况是容易出现一方强大另一方弱小,并且一旦这个关系形成,而没有及时找到方法平衡,那么就会出现问题了。而梯度消失和模式奔溃其实就是这种情况下的两个结果,分别对应 D 和 G 是强大的一方的结果。

梯度消失的情况是D 越好,G 的梯度消失越严重,因为 G 的梯度更新来自 D,而在训练初始阶段,G 的输入是随机生成的噪声,肯定不会生成很好的图片,D 会很容易就判断出来真假样本,也就是 D 的训练几乎没有损失,也就没有有效的梯度信息回传给 G 让 G 去优化自己。这样的现象叫做 gradient vanishing,梯度消失问题。

模式奔溃(mode collapse)问题,主要就是 G 比较强,导致 D 不能很好区分出真实图片和 G 生成的假图片,而如果此时 G 其实还不能完全生成足够真实的图片的时候,但 D 却分辨不出来,并且给出了正确的评价,那么 G 就会认为这张图片是正确的,接下来就继续这么输出这张或者这些图片,然后 D 还是给出正确的评价,于是两者就是这么相互欺骗,这样 G 其实就只会输出固定的一些图片,导致的结果除了生成图片不够真实,还有就是多样性不足的问题。

训练技巧

1. 对输入进行规范化

将输入规范化到 -1 和 1 之间,G 的输出层采用Tanh激活函数

2. 采用修正的损失函数

在原始 GAN 论文中,损失函数 G 是min(log(1-D)) , 但实际使用的时候是采用max(log(D)) ,作者给出的原因是前者会导致梯度消失问题。在接下来提出的 GAN 相关的论文中,就有不少论文是针对这个问题进行改进的,如 WGAN 模型就提出一种新的损失函数。

3. 从球体上采样噪声

不要采用均匀分布来采样

从高斯分布中采样得到随机噪声

当进行插值操作的时候,从大圆进行该操作,而不要直接从点 A 到 点 B 直线操作

更多细节可以参考 Tom White's 的论文 Sampling Generative Networks(https://arxiv.org/abs/1609.04468) 以及代码 https://github.com/dribnet/plat

4. BatchNorm

采用 mini-batch BatchNorm,要保证每个 mini-batch 都是同样的真实图片或者是生成图片

不采用 BatchNorm 的时候,可以采用 instance normalization(对每个样本的规范化操作)

可以使用虚拟批量归一化(virtural batch normalization):开始训练之前预定义一个 batch R,对每一个新的 batch X,都使用 R+X 的级联来计算归一化参数

5. 避免稀疏的梯度:Relus、MaxPool

稀疏梯度会影响 GAN 的稳定性

在 G 和 D 中采用 LeakyReLU 代替 Relu 激活函数

对于下采样操作,可以采用平均池化(Average Pooling) 和 Conv2d+stride 的替代方案

对于上采样操作,可以使用 PixelShuffle(https://arxiv.org/abs/1609.05158), ConvTranspose2d + stride

6. 标签的使用

标签平滑。也就是如果有两个目标标签,假设真实图片标签是 1,生成图片标签是 0,那么对每个输入例子,如果是真实图片,采用 0.7 到 1.2 之间的一个随机数字来作为标签,而不是 1;一般是采用单边标签平滑

在训练 D 的时候,偶尔翻转标签

有标签数据就尽量使用标签

7. 使用 Adam 优化器

8. 尽早追踪失败的原因

D 的 loss 变成 0,那么这就是训练失败了

检查规范的梯度:如果超过 100,那出问题了

如果训练正常,那么 D loss 有低方差并且随着时间降低

如果 g loss 稳定下降,那么它是用糟糕的生成样本欺骗了 D

9. 不要通过统计学来平衡 loss

10. 给输入添加噪声

给 D 的输入添加人为的噪声

http://www.inference.vc/instance-noise-a-trick-for-stabilising-gan-training/

https://openreview.net/forum?id=Hk4_qw5xe

给 G 的每层都添加高斯噪声

11. 对于 Conditional GANs 的离散变量

使用一个 Embedding 层

对输入图片添加一个额外的通道

保持 embedding 低维并通过上采样操作来匹配图像的通道大小

12 在 G 的训练和测试阶段使用 Dropouts

以 dropout 的形式提供噪声(50%的概率)

训练和测试阶段,在 G 的几层使用

https://arxiv.org/pdf/1611.07004v1.pdf

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。