生成对抗网络(Generative Adversarial Nets)

文章目录
  1. 1. 背景
  2. 2. 基本框架
  3. 3. 数学原理
  4. 4. 算法流程

背景

生成对抗网络(Generative Adversarial Nets, GANs)是由 Ian Goodfellow 等人于2014年6月提出的一种生成模型,至今仍是非常热门的研究方向。深度学习领域泰斗级人物 Yann LeCun 曾如此评价道:“GANs and the variations that are now being proposed is the most interesting idea in the last 10 years in ML, in my opinion.”,从中可见GAN的强大之处!


基本框架

生成对抗网络的主要框架基于博弈论中的二人零和博弈游戏(zero-sum game)

在该游戏中,两位博弈方的利益之和为零或一个常数,即一方有所得,另一方必有所失。而在生成对抗网络中,这两个博弈的角色分别为:生成器(generator)和判别器(discriminator),作用如下:

生成器 $G$:接受随机噪声(noise)输入,生成尽可能真实的样本
判别器 $D$:接受任意样本 $x$,输出 $D(x)$ 代表 $x$ 为真实样本的概率

在训练过程中,生成器 $G$ 的目标就是尽量生成真实的样本去欺骗判别器$D$,而判别器 $D$ 的目标就是尽量把生成器$G$生成的假样本和真实的样本区分开来。如此一来,生成器 $G$ 和判别器 $D$ 就构成了一个动态的“博弈过程”

在理想的情况下,博弈的结果是:生成器 $G$ 所拟合的分布 $p_\it{g}$ 可以无限接近于真实样本中的分布 $p_\it{data}$ ,足以生成以假乱真的样本。而判别器 $D$ 无法再区分出样本的真假,因此对任意样本 $x$ ,都有 $D(x)=\frac{1}{2}$

最终,我们得到了一个生成模型 $G$!

GAN的基本框架

数学原理

GAN的优化目标函数如下:

其中,

  • $x$:真实样本
  • $p_{data}(x)$:真实样本的分布
  • $z$:随机噪声
  • $p_{z}(z)$:随机噪声的分布,一般采用高斯分布
  • $G(z)$:生成器根据随机噪声 $z$ 生成的假样本
  • $D(x)$:样本 $x$ 为真实样本的概率

上述目标函数是一个极小化极大的过程。对于判别器 $D$ 来说,它的目标是极大化 $V(D, G)$,那么必然导致 $D(x) \to 1$ 且 $D(G(z)) \to 0$,也就是前面提到的尽可能把生成的假样本和真样本正确地区分开来。而对于生成器 $G$ 来说,它的目标是极小化最优的判别器,同样地,有 $D(G(z)) \to 1$,即生成器尽量生成真实的样本去欺骗判别器


那么,对于固定的生成器 $G$,最优的判别器 $D^*$ 是多少呢?

想要极大化 $V(D, G)$,那么对每一个样本 $x$,都令 $P_{data}(x) \log D(x)+ P_{G}(x) \log (1-D(x))$ 取到极大值即可。

由于给定了 $x$, 那么 $P_{data}(x)$ 和 $P_{G}(x)$ 都为定值,分别记作 $a$ 和 $b$
对于函数 $f(D)=a\log D + b\log (1-D)$,令 $\frac{df(D)}{dD} = a \cdot \frac{1}{D}-b \cdot \frac{1}{1-D} = 0 $,解得 $D^* = \frac{a}{a + b} = \frac{P_{data}(x)}{P_{data}(x) + P_{G}(x)}$

即对于固定的生成器 $G$,最优的判别器为


现在,考虑生成器 $G$ 的目标,极小化最优的判别器,得到最优生成器 $G^*$

其中,$KL$表示Kullback–Leibler divergence,$JS$表示Jensen–Shannon divergence,都是用来度量两个分布的相似性
对于$JS$散度来说,其取值范围为$[0, \log2]$,当且仅当两个分布相等时取到最小值0

因此,最优生成器 $G^* = \min_G 2JS(P_{data}||P_{G}) - 2\log 2$ ,当且仅当 $P_{data} = P_{G}$ 时,取到最小值 $-2\log2$


由上述分析可知,该极小化极大的博弈对抗过程确实可以让生成器学习到真实的数据分布!


算法流程

根据前面 $V(D,G)$ 的定义,我们需要求两个数学期望,即 $\mathbb{E}_{x \sim p_{data}(x)}[\log D(x)]$ 和 $\mathbb{E}_{z \sim p_{z}(z)}[\log (1 - D(G(z)))]$。但在实践中,我们是没办法利用积分来求这两个数学期望的,所以一般只能从数据集中做采样以逼近真实的数学期望

GAN的算法流程


训练判别器 $D$ (训练 $k$ 次):
每次采样一组噪声变量 $\{z^1,z^2, \dots,z^m\}$ 和 一组真实数据 $\{x^1,x^2, \dots,x^m\}$,计算 $\theta_d$ 的梯度:

然后使用梯度上升算法更新$\theta_d$

训练生成器 $G$ (训练 $1$ 次):
每次采样一组噪声变量 $\{z^1,z^2, \dots,z^m\}$,计算 $\theta_g$ 的梯度:

然后使用梯度下降算法更新$\theta_g$


Q:为什么判别器要训练k次,而生成器才训练1次?
A:因为优化生成器D的前提是判别器G要达到最优的状态。如果判别器比较弱的话,那么它将给生成器错误的引导,使得生成器的优化方向不对

Q:为什么生成器的梯度只有后一项?
A:因为 $\tilde{V}$ 的前一项与参数 $\theta_g$ 无关


此外在论文中,作者针对生成器的训练提出了一个 “$-\log(D)$ trick“:
将最小化 $\log (1-D(G(z)))$ 改为 最小化 $-\log D(G(z))$

我们先来观察一下二者的函数图像

log(1-D(x))和-log(x)函数图像

作者指出,在训练的早期,判别器 $G$ 可以轻易地区分出假样本,使得$D(G(z)) \to 0$。观察图像发现,$\log (1-D(x))$这个函数在 $x \to 0$ 时比较平滑,梯度也比较小,这就会导致生成器 $G$ 的训练变得十分地缓慢。而改为优化 $-\log(D(x))$ 后,在训练的早期能提供比较高的梯度,从而提高了训练速度。

分享到 评论