基本概念

首先,GAN 的模型示意图如下所示:

GAN

我们有随机噪声 $\boldsymbol{z}$ 服从先验分布 $p_{\boldsymbol{z}}$(通常为高斯分布),数据 $\boldsymbol{x}$ 服从先验分布 $p_\text{data}$(通常是真实数据的分布):

$$ \begin{aligned} &\boldsymbol{z} \sim p_\boldsymbol{z} \\ &\boldsymbol{x} \sim p_\text{data} \\ \end{aligned} $$

我们的目标是解决以下 minimax 问题

$$ \min_{G} \max_{D} V(D, G)= \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}}[\log D(\boldsymbol{x})] + \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}} [\log (1-D(G(\boldsymbol{z})))] $$

也可以写成: $$ \min_{G} \max_{D} V(D, G)= \mathbb{E}_{\boldsymbol{x} \sim p_\text{data}}[\log D(\boldsymbol{x})] + \mathbb{E}_{\boldsymbol{x} \sim p_g} [\log (1-D(\boldsymbol{x}))] $$ 其中 $G$ 为 生成器(Generator),$D$ 为 判别器(Discriminator),$V(D,G)$ 为 价值函数(Value Function)。

我们观察价值函数 $V(D, G)$,其实可以当成使用 交叉熵损失的二分类问题

对于判别器 $D$ 来说,

  • 目标:将 $G$ 在 $p_\boldsymbol{z}$ 上生成的样本分为 负类,将 $p_ {\text{data}}$ 的样本分为正类。
  • 损失函数:$- \mathbb{E}_{\boldsymbol{x} \sim p_\text{data}}[\log D(\boldsymbol{x})] - \mathbb{E}_{\boldsymbol{x} \sim p_g} [\log (1-D(\boldsymbol{x}))]$。
  • 训练:固定 $G$,更新 $D$。

对于生成器 $G$ 来说:

  • 目标:将 $G$ 在 $p_\boldsymbol{z}$ 上生成的样本分为 正类,与 $p_{\text{data}}$ 无关。
  • 损失函数:$\mathbb{E}_{\boldsymbol{x} \sim p_g} [\log (1-D(\boldsymbol{x}))]$。
  • 训练:固定 $D$,更新 $G$。

求解 minimax

(PS:求导过程可参考 GAN 原论文)

我们再来看 minimax 问题 的内涵,我们要最小化 $V(G,D)$ 的最大值,外层的 $\min$ 实际上是最优的生成器 $G$,而内层的 $\max$ 则是最优的判别器 $D$,用人话说就是我们在要获得 在判别器 $D$ 最优的情况下最优的生成器 $G$,注意这里的判别器 $D$ 是可变的,判别器 $D$ 始终是当前的生成器 $G$ 所对应的最优判别器

因此,我们计算在给定生成器 $G$ 时的最优判别器 $D^*$,此时的我们的目标就变成:

$$ \begin{aligned} \max_D V(G, D) &=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x})) d x+\int_{\boldsymbol{z}} p_{\boldsymbol{z}}(\boldsymbol{z}) \log (1-D(g(\boldsymbol{z}))) d z \\ &=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x}))+p_{g}(\boldsymbol{x}) \log (1-D(\boldsymbol{x})) d x \end{aligned} $$

又因为对于任意实数 $a$、$b$,函数 $y \rightarrow a \log (y)+b \log (1-y)$ 在 $y=\frac{a}{a+b}$ 时取得最大值(大小在 $[0, 1]$ 之间),因此此时的最优判别器 $D^*$ 为:

$$ D_G^*(\boldsymbol{x}) = \frac{p_\text{data}(\boldsymbol{x})} {p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})} $$

下一步我们将最优判别器 $D^*$ 代入价值函数 $V(G,D)$ 并计算最优生成器 $G$,此时的目标变成:

$$ \begin{aligned} \min_G \max_{D} V(G, D) &= \min_G \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}}[\log D^*(\boldsymbol{x})] + \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}}[\log (1-D^*(G(\boldsymbol{z})))] \\ &= \min_G \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}}[\log D^*(\boldsymbol{x})] + \mathbb{E}_{\boldsymbol{x} \sim p_g}[\log (1-D^*(\boldsymbol{x}))] \\ &= \min_G \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}} \left[ \log\frac{p_\text{data}(\boldsymbol{x})}{p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})} \right] + \mathbb{E}_{\boldsymbol{x} \sim p_g}\left[ \log\frac{p_g(\boldsymbol{x})}{p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})} \right] \\ \end{aligned} $$

仔细品品,有没有似曾相识的感觉?这不就是衡量两个分布差异的 JS 散度 (Jenson Shannon Divergence)吗?JS 散度的定义如下: $$ \begin{aligned} D_{\text{JS}}(P||Q) = \frac{1}{2}D_{\text{KL}}(P||\frac{P+Q}{2}) + \frac{1}{2}D_{\text{KL}}(Q||\frac{P+Q}{2}) \end{aligned} $$ 往上一套,我们的目标就变成了: $$ \begin{aligned} \min_G \max_{D} V(G, D) &= \min_G \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}} \left[ \log\frac{p_\text{data}(\boldsymbol{x})}{p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})} \right] + \mathbb{E}_{\boldsymbol{x} \sim p_g}\left[ \log\frac{p_g(\boldsymbol{x})}{p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})} \right] \\ &= \min_G \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}} \left[ \log\frac{p_\text{data}(\boldsymbol{x})}{\frac{1}{2}[p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})]} \right] + \mathbb{E}_{\boldsymbol{x} \sim p_g}\left[ \log\frac{p_g(\boldsymbol{x})}{\frac{1}{2}[p_\text{data}(\boldsymbol{x}) + p_g(\boldsymbol{x})]} \right] - 2 \log 2\\ &= \min_G 2 \operatorname{JS}(p_{\text{data}} || p_g) - 2 \log 2 \end{aligned} $$ 兜兜转转,我们的 最终目标等价于最小化分布 $p_\text{data}$、$p_g$ 之间的 JS 散度。而我们知道,当这两个分布完全相同时($p_\text{data} = p_g$),它们的 JS 散度最小,这就是我们模型收敛的最终目标。此时,判别器 $D$ 已经完全无法分辨输入样本是来自真实分布 $p_\text{data}$ 还是生成器生成的分布 $p_g$,问题得解。

训练过程

简单示例

GAN 训练过程

上图展示了一个 GAN 的例子,我们先看每幅图中的图样,上方的黑色点表示真实数据的分布 $p_\text{data}$,绿色线表示生成器生成的数据分布 $p_g$,蓝色线表示判别器输出的分布 $D(\boldsymbol{x})$,下方的黑色箭头则表示生成器从噪声分布 $p_\boldsymbol{z}$ 到生成数据分布 $p_g$ 的映射。

下面分别解释四幅子图的含义:

  • (a) 接近收敛的时候。生成器 $G$ 从噪声分布 $p_\boldsymbol{z}$ 中采样,映射生成数据 $p_g$,与真实分布 $p_\text{data}$ 有一定的重合,判别器 $D$ 的输出很大程度上可以分辨出 $p_\text{data}$ 与 $p_g$。
  • (b) 固定生成器 $G$,训练判别器 $D$。可以看到判别器(蓝色线)能够更好地分辨两个数据分布。
  • (c) 固定判别器 $D$,训练生成器 $G$。可以看到生成数据(绿色线)能够更好地拟合真实分布(黑色点)。
  • (d) 最终收敛。此时两个数据分布 $p_g$(绿色线)、$p_\text{data}$(黑色点)完全一致;判别器对于所有输入都输出一样的结果(蓝色点),完全分辨不出这两个数据分布。

训练算法

GAN 训练算法

GAN 的训练算法如上图所示。算法还是比较直接的,以下指出几个要注意的地方:

  1. 在训练过程中判别器 $D$ 与生成器 $G$ 是交替训练的,但是一般 训练一次 $G$ 对应训练 $k$ 次 $D$,目的是为了使得前期训练稳定,让 $D$ 可以「快速成长」起来从而指导 $G$ 的训练。
  2. 为了在训练的开始加大梯度信息,实际上 对生成器 $G$ 的训练会用 $-\log(D(G(\boldsymbol{z})))$ 来代替 $\log(1-D(G(\boldsymbol{z})))$ 作为生成样本的损失。因为,而在训练的开始阶段,$D$ 可以轻易地分辨出两个数据分布,此时的 $(1-D(G(\boldsymbol{z})))$ 会非常接近 1,而负对数函数越接近 0 梯度越大,因此此时梯度饱和,训练缓慢。

GAN 存在的问题

理想很丰满,现实很骨感。GAN 的理论与实践上其实都存在着一些问题:

  • 训练不稳定,难以收敛;
  • 模式坍缩(Mode Collapse);
  • ……

其实后来很多 GAN 的工作就着重于解决这个这些问题,例如:

  • 正则化等手段提高 GAN 收敛稳定性;
  • 对偶学习利用循环一致性,添加源域与重构域的约束,充分利用数据;
  • 改进数据分布的差异度量(如 WGAN);
  • 融合已知条件,控制生成过程和生成结果的特征(如 cGAN);
  • 高分辨率生成(如 BigGAN);
  • 改进衡量 GAN 生成效果的评价指标;
  • ……

此处不展开了。

参考