WGAN|长文警告

深度学习 · 2023-04-11 · 841 人浏览
WGAN|长文警告

相对于原始GAN的改进点:

  • 解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
  • 基本解决了模式坍塌(collapse mode)的问题,确保了生成样本的多样性
  • 训练过程中可以使用WGAN判别器loss函数的值来判断训练效果(近似Wasserstein距离的相反数),这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高
  • 只需要将原始GAN的算法流程改进四点就可以实现以上效果

原始GAN的缺点

对于原始GAN中生成器G的第一种损失函数,由Theory 1./2. 证明其不足.
$$
Loss_{G1} = \mathbb{E}_{x\sim p_{g}[log(1-D(x))]}
$$
对于原始GAN中G的第二种损失函数,由Theory 3. 证明其不足.
$$
Loss_{G2}=\mathbb{E}_{x\sim p_{g}[-log(D(x))]}
$$

Theory 1.两个不重叠分布的JS散度=log2

首先回顾一下GAN的价值函数V(G,D),因为第一项和G无关,所以最小化V(G,D)等效于最小化我们刚刚提到的$Loss_{G1}$.
$$
\mathop{min}\limits_{G}\mathop{max}\limits_{D}V(G,D)=\mathbb{E}_{x\sim p_{r(X)}[logD(x)]} + \mathbb{E}_{z\sim p_{z(z)}log[1-D(G(z))]}
$$
在GAN中证明过:固定G的参数时,最优的D为
$$
D^*_G(x) = \frac{p_{r}(x)}{p_{r}(x)+p_g(X)}
$$
将$D_G^*$带入V(G,D)并进一步化简,可以得到(具体证明见GAN一节)
$$
C(G)=-\log(4)+2\cdot J S D\left(p_{\mathrm{r}}||p_{g}\right)
$$
由此我们可以得到以下结论:*根据原始GAN定义的判别器loss,我们可以得到最优判别器的形式$D_G^$;而在最优判别器下,我们可以把$Loss_{G1}$等价变换为最小化真实分布$P_r$与生成分布$P_g$之间的JS散度。**我们越训练判别器,它就越接近最优,最小化生成器的loss也就会越近似于最小化$P_r$和$P_g$之间的JS散度

上述理论也很好解释,因为我们最终希望G可以生成以假乱真的图片,即尽可能将$P_g$拉向$P_r$.但是直接用JS散度做损失函数容易出现梯度消失的现象,具体证明如下:

首先考虑两个概率分布基本不重叠的情况(实际上$P_r$和$P_g$就属于这种情况),先将JS散度写回KL散度的形式.
$$
JSD(p_{data}||p_g)=\frac 12K L\left(p_{\mathrm{data}}\Big|\Big|\frac{p_{\mathrm{data}}+p_{g}}{2}\right)+\frac 12K L\left(p_{g}\Big|\Big|\frac{p_{\mathrm{data}}+p_{g}}{2}\right)
$$
根据KL散度的定义继续替换($p$为$p_{data}$,$q$为$p_g$)
$$
\begin{align}
JSD(p||q) &= \frac12 \sum p(x)\log(\frac {2p(x)}{p(x)+g(x)})+\frac 12 \sum q(x)\log(\frac {2q(x)}{p(x)+q(x)}) \\
&=\frac12 \sum p(x)\log(\frac {p(x)}{p(x)+g(x)})+\frac 12 \sum q(x)\log(\frac {q(x)}{p(x)+q(x)})+\log(2)
\end{align}
$$
化简到这个式子,可以看出来前两项就是0了.因为对于任意x,p和q就四种情况:

  • p(x)=0,q(x)=0.显然前两项为0
  • p(x)!=0,q(x)!=0.根据假设,两个分布基本不存在重叠,因而log项里面可以认为是1.(例如p(x)足够大时,可以认为p(x)+q(x)≈p(x))所以前两项值为0.
  • p(x)=0,q(x)!=0.第一项为0,第二项log中的值为1,故同样都是0.
  • q(x)=0,p(x)!=0.同上

因此在两个分布基本没有重叠时,他们的JS散度就是常数$\log2$.常数对于随机梯度下降法意味着梯度为0,从而导致生成器G无法训练(或出现梯度消失).

Theory 2. $p_r$和$p_g$的不重叠概率

那么$p_r$和$p_g$有多大的概率基本没有重叠呢?答案是大多数情况下两个分布都没有较大重叠.即训练G时梯度为0/梯度消失的情况是个常态.严谨的说法是:当$p_r$与$p_g$的支撑集(support)是高维空间中的低维流形(manifold)时,两个分布重叠部分测度(measure)为0的概率为1

  • 支撑集(support)其实就是函数的非零部分子集,比如ReLU函数的支撑集就是(0,+∞),一个概率分布的支撑集就是所有概率密度非零部分的集合
  • 流形(manifold)是高维空间中曲线、曲面概念的拓广,我们可以在低维上直观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。(所以可以理解成高维空间中某个形状上的自由度?)
  • 测度(measure)是高维空间中长度、面积、体积概念的拓广,可以理解为“超体积”

对于“当$p_r$与$p_g$的支撑集是高维空间中的低维流形时”这句话,原因是GAN中的生成器一般是从某个低维(比如100维)的随机分布中采样出一个编码向量,再经过一个神经网络生成出一个高维样本(比如64x64的图片就有4096维)。当生成器的参数固定时,生成样本的概率分布虽然是定义在4096维的空间上,但它本身所有可能产生的变化已经被那个100维的随机分布限定了,其本质维度就是100,再考虑到神经网络带来的映射降维,最终可能比100还小,所以生成样本分布的支撑集就在4096维空间中构成一个最多100维的低维流形,“撑不满”整个高维空间。

那么当$p_g$的支撑集"撑不满"整个高维空间时,$p_r$和$p_g$就很难重叠.例如在二维空间中随意取两条曲线,它们正好存在重叠线段的概率是0.(?)虽然它们很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低一个维度,长度(测度)为0,可以忽略.从低维空间拓展到高维空间,就有了如下逻辑:因为一开始生成器随机初始化,所以$p_g$几乎不可能与$p_r$有什么关联,所以它们的支撑集之间的重叠部分要么不存在,要么就比它们两个的最小维度还要低至少一个维度,故而测度为0。所谓“重叠部分测度为0”,就是上文所言“不重叠或者重叠部分可忽略”的意思。

综上,我们可以做以下总结:

  • $p_r$与$p_g$之间几乎不可能有不可忽略的重叠,所以无论它们之间的“缝隙”多狭小,都肯定存在一个最优分割曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。
  • 由于判别器作为一个神经网络可以无限拟合这个分隔曲面,所以存在一个最优判别器,对几乎所有真实样本给出概率1,对几乎所有生成样本给出概率0,而那些隔不开的部分就是难以被最优判别器分类的样本,但是它们的测度为0,可忽略。
  • 最优判别器情况下,生成器G的loss值为常数,造成梯度为0或梯度消失的情况。

有了以上理论分析,可以解释GAN训练不稳定的原因:如果判别器D训练得太好,生成器G梯度消失,G无法继续训练;D训练得不好,G梯度不准,无法收敛。只有D训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练.

以下图例测试了G梯度消失的现象.先分别将DCGAN训练1,20,25个epoch,然后固定G不动,判别器重新随机初始化从头开始训练,根据$Loss_{G1}$可以打印出其尺度的变化曲线,可以看到随着判别器的训练,生成器的梯度均迅速衰减。注意y轴是对数坐标轴。

v2-8715a60c1a8993953f125e03938125d7_1440w

Theory 3. $Loss_{G2}$的矛盾之处

我们刚刚推得在$D^*$下,V(G,D)可以写成
$$
V(G,D)=\mathbb{E}_{x\sim p_{r(X)}[logD(x)]} + \mathbb{E}_{x\sim p_{g}log(1-D(x))}
= -2\log(2)+2\cdot J S D\left(p_{\mathrm{r}}||p_{g}\right)\\
$$
我们发现$KL(p_g||p_r)$可以写成含$D^*$的形式

image-20230411163743206

从而得到

image-20230411163858498

其中后两项与G无关,所以最小化上式意味着最小化前两项
$$
KL(p_g||p_r)-2JS(p_r||p_g)
$$
这个等价的最小化目标代表它同时要最小化生成分布与真实分布的KL散度,却又要最大化两者的JS散度,这是前后矛盾的.其次,KL散度是不对称的,这也导致了模式坍塌的问题.(详见令人拍案叫绝的Wasserstein GAN - 知乎 (zhihu.com))

下图测试了G使用$Loss_{G2}$时出现的梯度不稳定现象.先分别将DCGAN训练1,20,25个epoch,然后固定G不动,判别器重新随机初始化从头开始训练,对于$Loss_{G2}$产生的梯度可以打印出其尺度的变化曲线,可以看到随着判别器的训练,蓝色和绿色曲线中生成器的梯度迅速增长,说明梯度不稳定,红线对应的是DCGAN相对收敛的状态,梯度才比较稳定

v2-b85cdb4d79d7618213c320cfb3a6d4bf_1440w

总结

在原始GAN的(近似)最优判别器$D^*$下,$Loss_{G1}$面临梯度消失问题,$Loss_{G2}$面临优化目标荒谬、梯度不稳定、对多样性与准确性惩罚不平衡导致模式坍塌这几个问题。

WGAN的解决方案

Plan 1. Epsilon

方案1思想比较简单,即对生成样本和真实样本加噪声.直观上说,加完噪声后使得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在重叠,JS散度就能真正发挥作用,此时如果两个分布越靠近,它们“弥散”出来的部分重叠得越多,JS散度也会越小而不会一直是一个常数,于是(在第一种原始GAN形式下)梯度消失的问题就解决了。在训练过程中,可以对所加的噪声进行退火(annealing),慢慢减小其方差,到后面两个低维流形“本体”都已经有重叠时,就算把噪声完全拿掉,JS散度也能照样发挥作用,继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。

在这个解决方案下可以放心地把D训练到接近最优,不必担心梯度消失的问题。而当判别器最优时,D的损失函数可以表示为
$$
Loss_D = 2\log2 - 2JS(p_{r+\epsilon}||p_{g+\epsilon})
$$
按照此式我们可以反推出两个分布的JS散度,从而得到两个分布的距离度量----------可惜答案是不行,因为每次训练$\epsilon$即噪声并非固定的,随着噪声的退火,前后的JS散度无法做数值比较.

Plan 2. Earth-Mover

方案2也是WGAN最后的解决方案.它将JS散度替换成了Earth-Mover(EM)距离.
$$
W(P_{r},P_{g})=\mathrm{inf}_{\gamma\sim\Pi(P_{r},P_{g})} \mathbb{E}_{(x,y)\sim\gamma}||x-y||
$$
解释如下:是$p_r$和$p_g$组合起来的所有可能的联合分布的集合,反过来说,中每一个分布的边缘分布都是$p_r$和$p_g$。对于每一个可能的联合分布$\gamma$而言,可以从中采样(x,y)∼$\gamma$得到一个真实样本x和一个生成样本y,并算出这对样本的距离$||x−y||$,所以可以计算该联合分布$\gamma$下样本对距离的期望值。在所有可能的联合分布中能够对这个期望值取到的下界,就定义为Wasserstein距离.换句话说就是找到一个最理想的分布$\gamma$使从中采样到的x,y期望距离最小,即“最优路径规划”下的“最小消耗”.

Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。

考虑如下二维空间中的两个分布$p1$和$p2$,$p1$在线段AB上均匀分布,$p2$在线段CD上均匀分布,通过控制参数$\theta$可以控制着两个分布的距离远近。

v2-c9cc9f8c879e7fe93d6e3bfafd41bd8a_1440w

可以得到
$$
K L(P_{1}||P_{2})=K L(P_{1}||P_{2})=\left\{\begin{array}{l l}{{+\infty}}&{{\mathrm{if}\theta\not=0}}\\ {{0}}&{{\mathrm{if}\theta=0}}\end{array}\right.\\
J S(P_{1}||P_{2})=\left\{\begin{array}{l l}{{\log2}}&{{\mathrm{if}\theta\not=0}}\\ {{0}}&{{\mathrm{if}\theta=0}}\end{array}\right.\\
W(P_1||P_2)=|\theta|
$$
KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化$\theta$这个参数,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。整个指标也可以反应GAN网络的训练效果.

接下来将Wasserstein距离应用到生成器G的损失函数中,因为$\mathrm{inf}_{\gamma\sim\Pi(P_{r},P_{g})}$无法直接求解,所以需要先将其转换成如下形式
$$
W(P_{r},P_{g})=\frac{1}{K}\,\mathrm{Sup}_{||f||_{L}\leq K}\,{\mathbb{E}}_{x\sim P_{r}}\,[f(x)]-\mathbb{E}_{x \sim P_{g}}\,[f(x)]
$$
其中的K是某个常数,$||f||_L$是函数$f$的Lipschitz常数.

Lipschitz常数是指:一个连续函数f如果存在一个常数K使定义域内的任意两个元素x1,x2都满足$|f(x1)-f(x2)|\leqslant K|x1-x2|$,那么函数f是Lipschitz连续的,且Lipschitz常数为K.有一个更强的限制就是f处处导数的绝对值都小于K.(之后近似会用到)

对于函数$f$我们可以使用神经网络来拟合,需要满足$f$的Lipschitz常数小于K.这个条件我们可以直接限制函数$f$的参数$w$来实现,如果将$w$都限制在[-c,c]之间,那么关于输入x的导数$\frac {\partial f_w}{\partial x}$也被限制在了某个范围内,从而存在常数K肯定大于$f$的Lipschitz常数.满足上式.具体实现就是每次更新完$w$后对其进行clip操作即可.

综上,我们可以构造一个含参数$w$、最后一层不是非线性激活层的判别器网络D($f_w$),在限制$w$不超过某个范围的条件下,使得
$$
L=\mathbb{E}_{x\sim P_{r}}\left[f_{w}\left(\mathcal{x}\right)\right]\,-\,\mathbb{E}_{x\sim P_{g}}\left[\mathcal{f}_{w}\left(\mathcal{x}\right)\right]
$$
尽可能取到最大,此时L就会近似真实分布与生成分布之间的Wasserstein距离(忽略常数倍数K).

注意原始GAN的判别器做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的D($f_w$)做的是近似拟合Wasserstein距离,属于回归任务,所以要把最后一层的sigmoid拿掉。

接下来生成器要近似地最小化Wasserstein距离,可以最小化L,由于Wasserstein距离的优良性质,我们不需要担心生成器梯度消失的问题。再考虑到L的第一项与G无关,就可以得到了WGAN中G和D的Loss
$$
Loss_G = -\,\mathbb{E}_{x\sim P_{g}}\left[\mathcal{f}_{w}\left(\mathcal{x}\right)\right]\\
Loss_D=-\mathbb{E}_{x\sim P_{r}}\left[f_{w}\left(\mathcal{x}\right)\right]\,+\,\mathbb{E}_{x\sim P_{g}}\left[\mathcal{f}_{w}\left(\mathcal{x}\right)\right]
$$
最后贴一个算法流程,使用的优化器是RMSProp

v2-6be6e2ef3d15c4b10c2a943e9bf4db70_1440w

总结

至此,我们终于可以总结WGAN算法和GAN算法的4点不同了.

  • 判别器最后一层去掉sigmoid(从二分类->回归)
  • 生成器和判别器的loss不取$log$(EM距离)
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c(使D满足Lipschitz连续)
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp/SGD(经验所谈)
WGAN
  1. YYYYYYYYYYYJJJY 2023-11-05

    写的很好 下次不要再写了

    1. Axuanz (作者)  2023-11-11
      @YYYYYYYYYYYJJJY

      赫赫

Theme Jasmine by Kent Liao