【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN

我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。

这是我的李宏毅老师 GAN 系列第6篇笔记,GAN 系列:

本节内容综述

  1. 之前已经讲到说,最原始的 GAN 使用的是 JS Divergence 测量生成数据分布与原始数据分布的距离;但是这面临一个数据维度的问题。见 JS divergence is not suitable
  2. 因此,有人考虑把 sigmoid 换成 linear 。这是 Least Square GAN (LSGAN) 。
  3. 使用 Earth Mover’s Distance 代替 JS divergence 。这是 Wassertein GAN (WGAN) 。最后总结了改为 WGAN 的算法需要做哪些。
  4. 还介绍了用autocoder 作为 discriminator 的 Energy-based GAN (EBGAN) 。
  5. 此外,介绍了一下 Loss-sensitive GAN (LSGAN) 。

小细节

JS divergence is not suitable

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上图,我们的数据实际上是将高维的数据描述成了低维数据。

我们采样的数据对于数据分布来说太少了,很难有数据的重叠 overlap

What is the problem of JS divergence?
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
JS 散度存在一个问题,如果两个分布没有重合,其距离就是 log2 。如上图,两个数据分布接近时,其指标应该越来越好,但是其在逐渐接近的过程中,指标并没有变化。

Least Square GAN (LSGAN)

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,我们同时让分类问题变成一个回归问题。希望真实值接近1,假的数据接近 0 。

Wassertein GAN (WGAN)

使用 Earth Mover’s Distance 代替 JS divergence 。

Earth Mover’s Distance

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
假设我们开了一台推土机,把 P 地方的土推到 Q 地方,推土机平均走的距离就是 Earth Mover’s Distance 。【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如山,把土推到另一个分布,有好多不同的“推土”方法。因此,Earth Mover’s Distance 要求穷举所有的铲土的计划,取总距离最小的那个。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
“推土方法”英文“moving plan”,可以用一个矩阵表示。

Why Earth Mover’s Distance?

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,相比 JS Divergence ,使用 Earth Mover’s Distance ,可以时刻衡量两分布见距离。

WGAN

具体的推导李老师省去了。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,WGAN使用 V(G,D)V(G, D) 。这里要求 DD 必须平滑,这样防止两个分布一直上升趋近于无穷。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
而 Lipschitz Function 如上,1 - Lipschitz 表示输入变化总是大于输出。那参数有了这么多约束,如何解呢?如上,可以使用 Weight Clipping 训练

Improved WGAN (WGAN-GP)

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,通过限制 D(x)D(x) 的梯度小于等于 1 ,来限制 D1LipschitzD \in 1 - Lipschitz

因此目标函数可以做如上改进。此外,假设 xPpenaltyx\sim P_{penalty},因为我们很难限制所有的xx 都满足 xD(x)1|\nabla_x D(x) ||\le 1

那么 PpenaltyP_{penalty} 长什么样呢?

如上,真实数据与生成数据见的数据,就是PpenaltyP_{penalty}。尽管难以证明,但是这是有用且符合直觉的。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
我们要求 PGP_G 慢慢移动到 PdataP_{data} ,因此只有其二者间的数据,才是值得采样的。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
此外,在实际上,我们希望xD(x)||\nabla_x D(x)|| 越接近1越好。如上。

Spectrum Norm

还有一招 Spectrum Norm ,可以做到 WGAN 中的“每一处梯度都小于1”。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,李老师不准备讲细节,但是其“效果很强”。

Algorithm of WGAN

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN

Energy-based GAN (EBGAN)

如上,使用 autoencoder 作为 Discriminator 。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,我们希望 reconstruction 后与真实值做差,为 0 为最好(为真实数据)。0 for the best.

好处是:不需要 generator ,discriminator 可以使用真实数据预训练。
【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN

如上,我们希望真是数据对应分数接近于 0 ,但是其他地方的数据不必很负。设一个阈值就好。

Outlook: Loss-sensitive GAN (LSGAN)

【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
如上,在训练时对 Loss 敏感一些,如果 Loss 小一些,则分数也稍微高一些,不需要压得太低。