课程主页:提供作业相关
PS: 这里只是课程相关笔记
前面三节我们直观滴感受了下 GAN 是什么,训练流程是咋样的。这一节我们要学习下 GAN 背后的理论。
1. Basic Idea
GAN 的目的是找到一个 Generator 使得生成的数据的分布 $P_G(x)$ 和真实数据的分布 $P_{data}(x)$ 的散度尽可能解决。但是我们不知道 $P_{data}(x)$ 和 $P_G(x)$ 的分布。。。
GAN 通过 Discriminator 来衡量上面两个 distribution 的 divergence sampled $P_{data}$ and $P_G$
这个 Discriminator 所做的事情其实就和一个 binary classifier 所做的事情是一模一样的,Loss Function 其实就是个 BCE Loss。
直观来理解就是:当采样的 $P_{data}$ 和 $P_G$ 分布接近时,Discriminator 很难区分二者,意味着这两个 distribution 的 divergence 是小的;当采样的 $P_{data}$ 和 $P_G$ 分布差距很大时,Discriminator 很容易区分二者,意味着这两个 distribution 的 divergence 是大的。这样的话,衡量 $P_G(x)$ 和 $P_{data}(x)$ 的 divergence,其实就等价于衡量 $V(D, G)$.
接下来一顿推导,其实是为了证明 $G^* = arg mathop{min}limits_{G} DIV(P_G, P_{data})$ 等价于 $G^* = arg mathop{min}limits_{G} mathop{max}limits_{D} V(D, G)$
接下来我们只需要求解下面这个式子就好了:
egin{equation}
label{a}
mathop{min}limits_{G} mathop{max}limits_{D} V(D, G) \
V(D, G) = E_{x sim p_{data}(x)} [logD(x)] + E_{z sim p_{z}(z)} [log(1-D(G(z))]
end{equation}
让我们来看图说话看看这个式子要怎么个解
如左图所示,我们首先固定 G, 然后找一个 D 使得 $mathop{max}limits_{D} V(D, G)$,也就是图中的红色点位置;随后我们固定 D, 找一个 G 使得 $mathop{min}limits_{G} mathop{max}limits_{D} V(D, G)$。第一节课中说的训练 GAN 的流程就是在解这个 $min max$ problem。
而由于我们一般使用 mini-batch gradient descent 方式来求解问题,那么一旦我们更新了 G, 那么原来的 D 是否还能代表 divergence between $P_G(x)$ 和 $P_{data}(x)$:
因此,我们这里假设更新后的 G 和原来的差别不是很大,这就要求我们在训练 GAN 的时候,更新 G 的程度要小一点,更新 D 的程度要大一点!
也有人会拿过去训练产生的 D 和现在产生的 D 一起生成样本来训练 G,而且这种方式训练的效果比正常训练要好!
因此,最终的算法流程如下:
而在训练 Generator 的时候,Goodfellow 考虑到模型初期 $D(x)$ 梯度较小,不方便优化,因此替换成求解下图下面那个式子,也就是把 $P_G$ 当成正样本来训练:
当然,有好事者比较了上面两种训练方式,发现二者都可以 train 得起来,而且 performance 也是差不多。
https://www.youtube.com/watch?v=ebMei6bYeWw
上面这个动态图(需要翻墙),展示了 Discriminator 是如何指导 Generator 的训练的。
2. Problem
2.1 Model Collapse
Model Collapse 现象是,你训练时时 real data 的 distribution 是比较大的,但是你 generate 出来的 example 的 distribution 是非常小的,举例来说,如果你训练次数较多时,生成的数据可能是下图这样的,会生成很多相似的图片:
2.2 Model Dropping
还有一种现象叫 Model Dropping, 现象是你的 real data 有多重分布,但生成的 example 每次只是一种分布: