生成对抗网络(GAN)

最新的文章从根本上论证了原本的loss function错在哪里,以及如何修改loss function


简单来说,gan包含一个生成器和一个判别器。

生成器用于生成与真实图片同类型的图片

判别器用于判断输入的图片是来自生成器还是真实图片,如果判断概率都是0.5,则说明区分不出,则生成器是好的


保持生成器不变,训练判别器。保持判别器不变,训练生成器。交替训练

我们的最终目的是留下生成器,用于生成一堆很真的假图片 -.-

网络架构如下图所示:

生成对抗网络(GAN)_第1张图片



图片来自

http://www.tuicool.com/articles/6R3UJjQ

-----------------------------------------------

这篇文章找到了原始gan的缺点并对其改进。

https://zhuanlan.zhihu.com/p/25071913?from=timeline&isappinstalled=0

这是wgan的源码实现

https://github.com/martinarjovsky/WassersteinGAN


对原始gan的改进有以下4点,使得训练更为稳定,生成的图片种类更加多样,详细解释参见知乎文章:

  • 判别器最后一层去掉sigmoid
  • 生成器和判别器的loss不取log
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

关于文章中提到的两种loss function,多解释几句:

问题1. 等价优化的距离衡量(KL散度、JS散度)不合理(不合理的方案本来就不对,我们就不讨论解决方案了,因为从根本上,公式就是错的)

问题2. 生成器随机初始化后的生成分布很难与真实分布有不可忽略的重叠。

            解决方案,就是对生成样本和真实样本加噪声,直观上说,使得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在重叠,JS散度就能真正发挥作用,此时如果两个分布越靠近,它们“弥散”出来的部分重叠得越多,JS散度也会越小而不会一直是一个常数,于是(在第一种原始GAN形式下)梯度消失的问题就解决了。在训练过程中,我们可以对所加的噪声进行退火(annealing),慢慢减小其方差,到后面两个低维流形“本体”都已经有重叠时,就算把噪声完全拿掉,JS散度也能照样发挥作用,继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。以上是对原文的直观解释。

最后放一张看知乎上解释wgan的文章的笔记图,防止自己搞丢,以后有空可以看看,写得不好,建议看原文,思路更清晰

wgan文章链接:https://arxiv.org/pdf/1701.07875.pdf
生成对抗网络(GAN)_第2张图片
早知道要上传就好好写了..哭晕T.T

你可能感兴趣的:(深度学习)