Ref: https://lilianweng.github.io/posts/2017-08-20-gan/
一些背景知识
对于两个分布\(P_1\)和\(P_2\),其KL散度(Kullback-Leibler divergence)和JS散度(Jensen-Shannon divergence)可用于描述两个分布之间的差异,具体表示如下:
\[ \begin{aligned} D_{KL}(P_1 \vert\vert P_2) &= \mathbb{E}_{x\sim P_1}\left[\log\frac{P_1}{P_2}\right] = \int_x P_1\log\frac{P_1}{P_2}dx \\ D_{JS}(P_1 \vert\vert P_2) &= \frac{1}{2}D_{KL}\left(P_1\vert\vert\frac{P_1+P_2}{2}\right) + \frac{1}{2}D_{KL}\left(P_2\vert\vert\frac{P_1+P_2}{P_2}\right) \end{aligned} \]
GAN通常包含有两个模型:判别器\(D\)(discriminator)和生成器\(G\)(generator)。判别器输出是样本来自于真实数据的概率,即目的是分辨出真实数据和生成数据,而生成器的目的是让生成的数据尽可能接近真实数据分布,即让判别器难以分辨。
上面这一过程是通过交叉训练\(D\)和\(G\)实现的。实际中一般会先训练判别器,在训练生成器,反复训练直至两个模型达到平衡(纳什平衡)。
进入正文前,先定义一些变量:
- \(p_z\):噪声输入\(z\)的数据分布,一般为高斯分布
- \(p_g\):生成器生成数据分布
- \(p_r\):真实数据分布
Original GAN
在原始GAN中,对于\(D\),我们希望对于真实数据,判别器的得分越高越好,即最大化\(\mathbb{E}_{x\sim p_r(x)}[\log D(x)]\),而对于虚假数据,判别器的得分越小越好(接近0),即最大化\(\mathbb{E}_{z\sim p_z(z)}[\log(1-D(G(z)))]\)。对于\(G\),我们希望生成的数据越接近真实数据越好(接近1),反映出来就是最小化\(\mathbb{E}_{z\sim p_z(z)}[\log(1-D(G(z)))]\)。
总上可以得到原始GAN的损失函数:
\[ \begin{aligned} &\min_G \max_D L(D,G) \\ & \begin{aligned} L(D,G) &= \mathbb{E}_{x\sim p_r(x)}[\log D(x)] + \mathbb{E}_{z\sim p_z(z)}[\log(1-D(G(z)))] \\ &= \mathbb{E}_{x\sim p_r(x)}[\log D(x)] + \mathbb{E}_{x\sim p_g(x)}[\log(1-D(x))] \end{aligned} \end{aligned} \]
\(L(D,G)\)对\(D\)进行求导,可以得到最优判别器\(D\)为:
\[ D^\star(x) = \frac{p_r(x)}{p_r(x)+p_g(x)} \in [0, 1] \]
生成器达到最优时,此时\(p_r = p_g\),即判别器为\(\frac{1}{2}\)。
当判别器与生成器都达到最优时,即\(D^\star(x)=\frac{1}{2}\),代入\(L(G,D)\)中,可得全局最优下损失函数的值为:
\[ \begin{aligned} L(G^\star,D^\star) &= \mathbb{E}_{x\sim p_r(x)}[\log D(x)] + \mathbb{E}_{x\sim p_g(x)}[\log(1-D(x))] \\ &= \int_x \bigg(p_r(x)\log(D^\star(x)) + p_g(x)\log(1-D^\star(x))\bigg)dx \\ &= \log\frac{1}{2}\int_x p_r(x)dx + \log\frac{1}{2}\int_x p_g(x)dx \\ &= -2\log2 \end{aligned} \]
假设判别器达到最优,则通过对JS散度做变换,可以得到:
\[ \begin{aligned} D_{JS}(p_{r} \| p_g) =& \frac{1}{2} D_{KL}(p_{r} || \frac{p_{r} + p_g}{2}) + \frac{1}{2} D_{KL}(p_{g} || \frac{p_{r} + p_g}{2}) \\ =& \frac{1}{2} \bigg( \log2 + \int_x p_{r}(x) \log \frac{p_{r}(x)}{p_{r} + p_g(x)} dx \bigg) + \\& \frac{1}{2} \bigg( \log2 + \int_x p_g(x) \log \frac{p_g(x)}{p_{r} + p_g(x)} dx \bigg) \\ =& \frac{1}{2} \bigg( \log4 + L(G, D^*) \bigg) \end{aligned} \]
即\(L(G,D^\star) = 2D_{JS}(p_r\vert\vert p_g) - 2\log2\)。
当判别器能够准确划分真实数据和虚假数据时,有\(\forall x \in p_r, D(x) = 1\)和\(\forall x \in p_g, D(x) = 0\),代入\(L(G,D)\)中可得为0,即有梯度为0。
这里我们可以得到原始GAN训练困难的主要原因:判别器收敛得很好的时候,生成器梯度消失,loss无法下降。判别器收敛不好时,生成器梯度没有指导作用。只有当判别器收敛到某一程度时,生成器梯度才是有效且具有指导作用的,而这个程度很难掌握。
后续作者针对生成器提出了一个改进的损失函数:\(\mathbb{E}_{x\sim p_g}[-\log D(x)]\)。
对KL散度做变换有:
\[ \begin{aligned} D_{KL}(p_g\vert\vert p_r) &= \mathbb{E}_{x\sim p_g}\bigg[\log\frac{p_g}{p_r}\bigg] \\ &= \mathbb{E}_{x\sim p_g}\bigg[\log\frac{p_g/(p_r+p_g)}{p_r/(p_r+p_g)}\bigg] \\ &= \mathbb{E}_{x\sim p_g}\bigg[\log\frac{1-D^\star(x)}{D^\star(x)}\bigg] \\ &= \mathbb{E}_{x\sim p_g}\log[1-D^\star(x)] - \mathbb{E}_{x\sim p_g}[\log D^\star(x)] \end{aligned} \]
结合上面的\(L(G, D^\star)\)有:
\[ \begin{aligned} \mathbb{E}_{x\sim p_g}[-\log D(x)] &= D_{KL}(p_g\vert\vert p_r) - \mathbb{E}_{x\sim p_g}[\log(1-D^\star(x))] \\ &= D_{KL}(p_g\vert\vert p_r) - 2D_{JS}(p_r\vert\vert p_g) + 2\log2 + \mathbb{E}_{x\sim p_r}[\log D^\star(x)] \end{aligned} \]
由于上式中后两项不依赖于生成器,所以最终最小化\(\mathbb{E}_{x\sim p_g}[-\log D(x)]\)可以等价为最小化\(D_{KL}(p_g\vert\vert p_r) - 2D_{JS}(p_r\vert\vert p_g)\)。
这个式子一边要最小化生成分布和真实分布之间的KL散度,同时又要最大化它们之间的JS散度,属于自相矛盾。而且JS散度那一项会让模型训练不稳定。
对于KL散度项\(D_{KL}(p_g\vert\vert p_r)\),有:
- 当\(p_g(x) \rightarrow 0\)而\(p_r(x)\rightarrow 1\)时,\(p_g(x)\log\frac{p_g(x)}{p_r(x)}\rightarrow 0\),即对\(D_{KL}(p_g\vert\vert p_r)\)的贡献趋于零
- 当\(p_g(x) \rightarrow 1\)而\(p_r(x)\rightarrow 0\)时,\(p_g(x)\log\frac{p_g(x)}{p_r(x)}\rightarrow +\infty\),即对\(D_{KL}(p_g\vert\vert p_r)\)的贡献趋于正无穷
所以模型对上面两种错误的惩罚是不一样的。第一种错误对应于生成器没有生成真实的样本,惩罚微小。第二种错误对应于生成器生成了不真实的样本,惩罚巨大。这样的操作下,模型会趋向于生成一些重复但接近真实分布的样本,导致模型生成的数据缺乏多样性,即模式坍塌(mode collapse)问题。
WGAN
Wasserstein GAN: https://zhuanlan.zhihu.com/p/25071913
支撑集(support):函数中的非零部分子集,一个概率分布的支撑集就是所有概率密度非零部分集合。
流形(manifold):是高维空间中曲线、曲面概念的拓广,我们可以在低维上直观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。
测度(measure):是高维空间中长度、面积、体积概念的拓广,可以理解为超体积。
WGAN针对GAN难训练的问题提出了一些解决方案,其中最主要的就是使用Wasserstein距离替换KL散度和JS散度。
跟原始GAN相比,做了如下更改:
- 判别器最后一层去掉sigmoid
- 生成器和判别器的loss不取log
- 每次更新判别器的参数之后将它们的绝对值截断到不超过一个固定常数
- 不使用基于动量的优化算法(如momentum和Adam等),推荐使用SGD,RMSProp之类的
但实际上WGAN依然会有训练困难的问题,主要原因是强行通过weight clipping的方法来实现判别器的梯度符合Lipschitz限制。所以又提出了WGAN-GP。