一个关于GAN综述的很好的总结
GAN和VAE的对比
- 相同点:都假设隐变量z服从某种分布,然后学习一个映射
X
=
G
(
z
)
X=G(z)
X=G(z),完成隐变量到真实数据的转换。
- 不同点:
- GAN比较粗暴,直接通过判别器度量生成器映射的优劣;
- VAE通过约束隐变量z服从标准正态分布(KL散度)以及重构数据实现了转换映射。
结果:
- VAE的生成结果会oversmooth,GAN的生成会更清晰一些。
GAN
理论存在的问题
- GAN网络训练时往往需要权衡训练的生成器与鉴别器的参数来防止崩溃的发生,从而使得GAN的收敛不稳定,难以训练。
- GAN通常使用的两种判别器loss
训练存在的问题
- GAN的优化是一个极小极大的问题(生成器的时候最小化判别器的adv_loss,判别器的时候最大化fake_loss)。训练的时候是迭代优化的,正常需要迭代很多次。如果只迭代一次判别器,然后迭代一次生成器,如此循环,很容易变成极大极小问题,优化出错。
- 正确的训练过程:生成器先生成一些样本,判别器先判别为错误,惩罚生成器调整生成的概率分布。但是这样会导致mode collapse,即生成器只生成一些简单的、重复的样本,缺乏多样性。
DCGAN:deep conv GAN
self.loss_func = keras.losses.BinaryCrossentropy(from_logits=True)
loss = self.loss_func(label, pred)
- 对应的损失函数曲线和梯度曲线,可以看出,在x极大极小的情况下,模型都会没有梯度。
pixelRNN & pixel CNN是最早的自回归生成模型,像素值逐个生成,WaveNet也是这种原理。
LSGAN:least square GAN
- 通过修改判别器的损失函数使得模型收敛更稳定。传统的GAN网络判别器损失函数是sigmoid CE loss,LSGAN则是引入最小方差损失函数,让模型在训练的过程中更多的关注真实度不高的样本,对于那些训练较好的样本则是花较小的关注度。
- 一般取值
a
=
?
1
,
b
=
1
,
c
=
0
a=-1, b=1, c=0
a=?1,b=1,c=0或者
a
=
?
1
,
b
=
c
=
1
a=-1, b=c=1
a=?1,b=c=1,但是有实验者发现这个参数设置和模型结构似乎有关系。
- 结果:相比于DCGAN,基于minist数据集,可以在更少的step生成比较清晰的图片。
WGAN:WassersteinGAN
WGAN 的提出是旨在解决 GAN 存在的问题,其在 GAN 的基础上做了些许的变动,论文证明了 GAN 的梯度消失和不稳定的问题。改进是对生成样本和真实样本加噪 声,直观上说,使得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠;用 Wasserstein 距离代替 JS 散度,Wasserstein 距离相 比 KL 散度、JS 散度的优越性在于,即便两个分布没有重叠,Wasserstein 距离仍然能够反映它们的远近。WGAN 的实验结果上确实是得到了不小的提高。每次 迭代更新权重后做 weight clipping,把权重限制到一个范围内(例如限定范围[-0.1,+0.1],则超出这个范围的权重都会被修剪到-0.1 或 +0.1)。
|