计算机视觉(CV)-生成模型:WGAN【Lipschitz:Weight Clipping】--> WGAN-GP【Lipschitz:Gradient Penalty】

  • 自从2014年Ian Goodfellow提出以来,GAN就存在着训练困难、【生成器】和【判别器】的loss无法指示训练进程、生成样本缺乏多样性等问题。
  • 从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN依靠的是对【判别器】和【生成器】的架构进行实验枚举,最终找到一组比较好的网络架构设置,但是实际上是治标不治本,没有彻底解决问题。

一、WGAN相比较GAN的改进点

在这里插入图片描述

  • Wasserstein GAN(下面简称WGAN)成功地做到了以下爆炸性的几点:
    1. 彻底解决GAN训练不稳定的问题,不再需要小心平衡【生成器】和【判别器】的训练程度
    2. 基本解决了Mode Collapse的问题,确保了生成样本的多样性
    3. 训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表【生成器】产生的图像质量越高(如题图所示)
    4. 以上一切好处不需要精心设计的网络架构,最简单的多层全连接网络就可以做到
  • 那以上好处来自哪里?这就是令人拍案叫绝的部分了——实际上作者整整花了两篇论文,在第一篇《Towards Principled Methods for Training Generative Adversarial Networks》里面推了一堆公式定理,从理论上分析了原始GAN的问题所在,从而针对性地给出了改进要点;在这第二篇《Wasserstein GAN》里面,又再从这个改进点出发推了一堆公式定理,最终给出了改进的算法实现流程,而改进后的WGAN相比原始GAN的算法实现流程却只改了四点:
    1. 【判别器】最后一层去掉sigmoid
    2. 改变【生成器】和【判别器】的损失函数:【生成器】和【判别器】的loss不取log
    3. 使用 “Weight Clipping” 技巧来模拟 Lipschitz限制要求:每次更新【判别器】的参数之后把它们的绝对值截断到不超过一个固定常数c(注:实际上“Weight Clipping” 技巧的效果不太好)。
    4. 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
      在这里插入图片描述
  • 改动是如此简单,效果却惊人地好,以至于Reddit上不少人在感叹:就这样?没有别的了? 太简单了吧!这些反应让我想起了一个颇有年头的鸡汤段子,说是一个工程师在电机外壳上用粉笔划了一条线排除了故障,要价一万美元——画一条线,1美元;知道在哪画线,9999美元。上面这四点改进就是作者Martin Arjovsky划的简简单单四条线,对于工程实现便已足够,但是知道在哪划线,背后却是精巧的数学分析。

二、原始GAN究竟出了什么问题

1、原始GAN的损失函数

1.1 【判别器】的损失函数

  • 原始GAN中【判别器】要最小化如下损失函数,尽可能把真实样本分为正例,生成样本分为负例,所以【判别器】的损失函数由两部分组成
    − E x ∼ P d a t a ( x ) [ l o g D ( x ) ] − E x ∼ P G ( x ) [ l o g ( 1 − D ( x ) ) ] (公式1) -\mathbb{E}_{\textbf{x}\sim P_{data}(\textbf{x})}[logD(\textbf{x})]-\mathbb{E}_{\textbf{x}\sim P_G(\textbf{x})}[log(1-D(\textbf{x}))] \qquad \text{(公式1)} ExPdata(x)[logD(x)]ExPG(x)[log(1D(x))](公式1)
    其中: P d a t a P_{data} Pdata 是真实样本分布; P G P_G PG 是生产器生产的样本的样本分布;

1.2 生产器的损失函数

  • 对于【生成器】,Goodfellow一开始提出来一个损失函数:
    E x ∼ P G ( x ) [ l o g ( 1 − D ( x ) ) ] (公式2) \mathbb{E}_{\textbf{x}\sim P_G(\textbf{x})}[log(1-D(\textbf{x}))] \qquad \text{(公式2)} ExPG(x)[log(1D(x))](公式2)
  • 后来又提出了一个改进的【生成器】损失函数:
    E x ∼ P G ( x ) [ l o g ( − D ( x ) ) ] (公式3) \mathbb{E}_{\textbf{x}\sim P_G(\textbf{x})}[log(-D(\textbf{x}))] \qquad \text{(公式3)} ExPG(x)[log(D(x))](公式3)

2、第一种原始GAN形式的问题

  • 一句话概括:【判别器】越好,【生成器】梯度消失越严重。WGAN前作从两个角度进行了论证,第一个角度是从【生成器】的等价损失函数切入的。
  • 首先从公式1可以得到,在【生成器】G固定参数时最优的【判别器】D应该是什么。对于一个具体的样本 x \textbf{x} x,它可能来自真实分布也可能来自生成分布,它对公式1损失函数的贡献是
    − P d a t a ( x ) l o g D ( x ) − P G ( x ) l o g ( 1 − D ( x ) ) -P_{data}(\textbf{x})logD(\textbf{x})-P_G(\textbf{x})log(1-D(\textbf{x})) Pdata(x)logD(x)PG(x)log(1D(x))
  • 令其关于 D ( x ) D(x) D(x) 的导数为0,得
    P d a t a ( x ) D ( x ) + P G ( x ) 1 − D ( x ) = 0 \cfrac{P_{data}(x)}{D(x)} + \cfrac{P_G(x)}{1 - D(x)} = 0 D(x)Pdata(x)+1D(x)PG(x)=0
  • 化简得最优【判别器】为:
    D ∗ ( x ) = P d a t a ( x ) P d a t a ( x ) + P G ( x ) ( 公 式 4 ) D^*(x) = \cfrac{P_{data}(x)}{P_{data}(x) + P_G(x)}(公式4) D(x)=Pdata(x)+PG(x)Pdata(x)4
  • 这个结果从直观上很容易理解,就是看一个样本 x x x 来自真实分布和生成分布的可能性的相对比例。如果 P d a t a ( x ) = 0 P_{data}(x) = 0 Pdata(x)=0 P G ( x ) ≠ 0 P_G(x)≠0 PG(x)=0,最优【判别器】就应该非常自信地给出概率0;如果 P d a t a ( x ) = P G ( x ) P_{data}(x) = P_G(x) Pdata(x)=PG(x),说明该样本是真是假的可能性刚好一半一半,此时最优【判别器】也应该给出概率0.5。
  • 然而GAN训练有一个trick,就是别把【判别器】训练得太好,否则在实验中【生成器】会完全学不动(loss降不下去),为了探究背后的原因,我们就可以看看在极端情况——【判别器】最优时,【生成器】的损失函数变成什么。给【生成器】的损失函数(公式2)加上一个不依赖于【生成器】的项,使之变成
    E x ∼ P d a t a [ log ⁡ D ( x ) ] + E x ∼ P G [ log ⁡ ( 1 − D ( x ) ) ] \mathbb{E}_{x\sim P_{data}}[\log D(x)] + \mathbb{E}_{x\sim P_G}[\log(1-D(x))] ExPdata[logD(x)]+ExPG[log(1D(x))]
  • 注意,最小化这个函数等价于最小化【生成器】的损失函数(公式2),而且它刚好是【判别器】损失函数的反。代入最优【判别器】即公式4,再进行简单的变换可以得到【生成器】的损失函数为:
    E x ∼ P d a t a log ⁡ P d a t a ( x ) 1 2 [ P d a t a ( x ) + P G ( x ) ] + E x ∼ P G log ⁡ P G ( x ) 1 2 [ P d a t a ( x ) + P G ( x ) ] − 2 log ⁡ 2 ( 公 式 5 ) \mathbb{E}_{x \sim P_{data}} \log \cfrac{P_{data}(x)}{\cfrac{1}{2}[P_{data}(x) + P_G(x)]} + \mathbb{E}_{x \sim P_G} \log \cfrac{P_G(x)}{\cfrac{1}{2}[P_{data}(x) + P_G(x)]} - 2\log 2(公式5) ExPdatalog21[Pdata(x)+PG(x)]Pdata(x)+ExPGlog21[Pdata(x)+PG(x)]PG(x)2log25)
  • 变换成这个样子是为了引入Kullback–Leibler divergence(简称KL散度)和Jensen-Shannon divergence(简称JS散度)这两个重要的相似度衡量指标,后面的主角之一Wasserstein距离,就是要来吊打它们两个的。所以接下来介绍这两个重要的配角——KL散度和JS散度:
    K L ( P 1 ∣ ∣ P 2 ) = E x ∼ P 1 log ⁡ P 1 P 2 ( 公 式 6 ) KL(P_1||P_2) = \mathbb{E}_{x \sim P_1} \log \cfrac{P_1}{P_2}(公式6) KL(P1P2)=ExP1logP2P16
    J S ( P 1 ∣ ∣ P 2 ) = 1 2 K L ( P 1 ∣ ∣ P 1 + P 2 2 ) + 1 2 K L ( P 2 ∣ ∣ P 1 + P 2 2 ) ( 公 式 7 ) JS(P_1 || P_2) = \cfrac{1}{2}KL(P_1||\cfrac{P_1 + P_2}{2}) + \cfrac{1}{2}KL(P_2||\cfrac{P_1 + P_2}{2})(公式7) JS(P1P2)=21KL(P12P1+P2)+21KL(P22P1+P2)7
  • 于是【生成器】的损失函数(公式5)就可以继续写成
    2 J S ( P d a t a ∣ ∣ P G ) − 2 log ⁡ 2 ( 公 式 8 ) 2JS(P_{data} || P_G) - 2\log 2(公式8) 2JS(PdataPG)2log28
  • 到这里读者可以先喘一口气,看看目前得到了什么结论:根据原始GAN定义的【判别器】loss,我们可以得到最优【判别器】的形式;而在最优【判别器】的下,我们可以把原始GAN定义的【生成器】loss等价变换为最小化真实分布 P d a t a P_{data} Pdata 与生成分布 P G P_G PG 之间的JS散度。我们越训练【判别器】,它就越接近最优,最小化【生成器】的loss也就会越近似于最小化 P d a t a P_{data} Pdata P G P_G PG 之间的JS散度。
  • 问题就出在这个JS散度上。我们会希望如果两个分布之间越接近它们的JS散度越小,我们通过优化JS散度就能将 P G P_G PG “拉向” P d a t a P_{data} Pdata,最终以假乱真。这个希望在两个分布有所重叠的时候是成立的,但是如果两个分布完全没有重叠的部分,或者它们重叠的部分可忽略(下面解释什么叫可忽略),它们的JS散度是多少呢?
  • 答案是 log ⁡ 2 \log 2 log2,因为对于任意一个 x x x 只有四种可能:
    P 1 ( x ) = 0 且 P 2 ( x ) = 0 P_1(x) = 0且P_2(x) = 0 P1(x)=0P2(x)=0
    P 1 ( x ) ≠ 0 且 P 2 ( x ) ≠ 0 P_1(x) \neq 0且P_2(x) \neq 0 P1(x)=0P2(x)=0
    P 1 ( x ) = 0 且 P 2 ( x ) ≠ 0 P_1(x) = 0且P_2(x) \neq 0 P1(x)=0P2(x)=0
    P 1 ( x ) ≠ 0 且 P 2 ( x ) = 0 P_1(x) \neq 0且P_2(x) = 0 P1(x)=0P2(x)=0
  • 第一种对计算JS散度无贡献,第二种情况由于重叠部分可忽略所以贡献也为0,第三种情况对公式7右边第一个项的贡献是 log ⁡ P 2 1 2 ( P 2 + 0 ) = log ⁡ 2 \log \cfrac{P_2}{\cfrac{1}{2}(P_2 + 0)} = \log 2 log21(P2+0)P2=log2,第四种情况与之类似,所以最终 J S ( P 1 ∣ ∣ P 2 ) = log ⁡ 2 JS(P_1||P_2) = \log 2 JS(P1P2)=log2
  • 换句话说,无论 P d a t a P_{data} Pdata P G P_G PG 是远在天边,还是近在眼前,只要它们俩没有一点重叠或者重叠部分可忽略,JS散度就固定是常数 log ⁡ 2 \log 2 log2,而这对于梯度下降方法意味着——梯度为0!此时对于最优【判别器】来说,【生成器】肯定是得不到一丁点梯度信息的;即使对于接近最优的【判别器】来说,【生成器】也有很大机会面临梯度消失的问题。
  • 但是 P d a t a P_{data} Pdata P G P_G PG 不重叠或重叠部分可忽略的可能性有多大?不严谨的答案是:非常大。比较严谨的答案是:当 P d a t a P_{data} Pdata P G P_G PG 的支撑集(support)是高维空间中的低维流形(manifold)时, P d a t a P_{data} Pdata P G P_G PG 重叠部分测度(measure)为0的概率为1。
  • 不用被奇怪的术语吓得关掉页面,虽然论文给出的是严格的数学表述,但是直观上其实很容易理解。首先简单介绍一下这几个概念:
    • 支撑集(support)其实就是函数的非零部分子集,比如ReLU函数的支撑集就是(0, + ∞ +\infty +),一个概率分布的支撑集就是所有概率密度非零部分的集合。
    • 流形(manifold)是高维空间中曲线、曲面概念的拓广,我们可以在低维上直观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。
    • 测度(measure)是高维空间中长度、面积、体积概念的拓广,可以理解为“超体积”。
  • 回过头来看第一句话,“当 P d a t a P_{data} Pdata P G P_G PG 的支撑集是高维空间中的低维流形时”,基本上是成立的。原因是GAN中的【生成器】一般是从某个低维(比如100维)的随机分布中采样出一个编码向量,再经过一个神经网络生成出一个高维样本(比如64x64的图片就有4096维)。当【生成器】的参数固定时,生成样本的概率分布虽然是定义在4096维的空间上,但它本身所有可能产生的变化已经被那个100维的随机分布限定了,其本质维度就是100,再考虑到神经网络带来的映射降维,最终可能比100还小,所以生成样本分布的支撑集就在4096维空间中构成一个最多100维的低维流形,“撑不满”整个高维空间。
  • “撑不满”就会导致真实分布与生成分布难以“碰到面”,这很容易在二维空间中理解:
    在这里插入图片描述
    一方面,二维平面中随机取两条曲线,它们之间刚好存在重叠线段的概率为0;另一方面,虽然它们很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低一个维度,长度(测度)为0,可忽略。三维空间中也是类似的,随机取两个曲面,它们之间最多就是比较有可能存在交叉线,但是交叉线比曲面低一个维度,面积(测度)是0,可忽略。从低维空间拓展到高维空间,就有了如下逻辑:因为一开始【生成器】随机初始化,所以 P G P_G PG几乎不可能与 P d a t a P_{data} Pdata有什么关联,所以它们的支撑集之间的重叠部分要么不存在,要么就比 P d a t a P_{data} Pdata P G P_G PG的最小维度还要低至少一个维度,故而测度为0。所谓“重叠部分测度为0”,就是上文所言“不重叠或者重叠部分可忽略”的意思。
  • 我们就得到了WGAN前作中关于【生成器】梯度消失的第一个论证:在(近似)最优【判别器】下,最小化【生成器】的loss等价于最小化 P d a t a P_{data} Pdata P G P_G PG之间的JS散度,而由于 P d a t a P_{data} Pdata P G P_G PG 几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数 log ⁡ 2 \log 2 log2,最终导致【生成器】的梯度(近似)为0,梯度消失。
  • 接着作者写了很多公式定理从第二个角度进行论证,但是背后的思想也可以直观地解释:
    • 首先, P d a t a P_{data} Pdata P G P_G PG 之间几乎不可能有不可忽略的重叠,所以无论它们之间的“缝隙”多狭小,都肯定存在一个最优分割曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。
    • 由于【判别器】作为一个神经网络可以无限拟合这个分隔曲面,所以存在一个最优【判别器】,对几乎所有真实样本给出概率1,对几乎所有生成样本给出概率0,而那些隔不开的部分就是难以被最优【判别器】分类的样本,但是它们的测度为0,可忽略。
    • 最优【判别器】在真实分布和生成分布的支撑集上给出的概率都是常数(1和0),导致【生成器】的loss梯度为0,梯度消失。
  • 有了这些理论分析,原始GAN不稳定的原因就彻底清楚了:【判别器】训练得太好,【生成器】梯度消失,【生成器】loss降不下去;【判别器】训练得不好,【生成器】梯度不准,四处乱跑。只有【判别器】训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练。
  • 实验辅证如下图,WGAN前作Figure 2。先分别将DCGAN训练1,20,25个epoch,然后固定【生成器】不动,【判别器】重新随机初始化从头开始训练,对于第一种形式的【生成器】loss产生的梯度可以打印出其尺度的变化曲线,可以看到随着【判别器】的训练,【生成器】的梯度均迅速衰减。注意y轴是对数坐标轴。
    在这里插入图片描述

3、第二种原始GAN形式的问题

  • 一句话概括:最小化第二种【生成器】loss函数,会等价于最小化一个不合理的距离衡量,导致两个问题,一是梯度不稳定,二是collapse mode即多样性不足。WGAN前作又是从两个角度进行了论证,下面只说第一个角度,因为对于第二个角度我难以找到一个直观的解释方式,感兴趣的读者还是去看论文。
  • 如前文所说,Ian Goodfellow提出的“- log D trick”是把【生成器】loss改成
    E x ∼ P G [ − log ⁡ D ( x ) ] ( 公 式 3 ) \mathbb{E}_{x\sim P_G}[- \log D(x)](公式3) ExPG[logD(x)]3
  • 上文推导已经得到在最优【判别器】 D ∗ D^* D
    E x ∼ P d a t a [ log ⁡ D ∗ ( x ) ] + E x ∼ P G [ log ⁡ ( 1 − D ∗ ( x ) ) ] = 2 J S ( P d a t a ∣ ∣ P G ) − 2 log ⁡ 2 ( 公 式 9 ) \mathbb{E}_{x\sim P_{data}}[\log D^*(x)] + \mathbb{E}_{x\sim P_G}[\log(1-D^*(x))] = 2JS(P_{data} || P_G) - 2\log 2(公式9) ExPdata[logD(x)]+ExPG[log(1D(x))]=2JS(PdataPG)2log29
  • 我们可以把KL散度(注意下面是先G后data)变换成含 D ∗ D^* D 的形式:
    K L ( P G ∣ ∣ P d a t a ) = E x ∼ P G [ log ⁡ P G ( x ) P d a t a ( x ) ] = E x ∼ P G [ log ⁡ P G ( x ) / ( P d a t a ( x ) + P G ( x ) ) P d a t a ( x ) / ( P d a t a ( x ) + P G ( x ) ) ] ( 公 式 10 ) = E x ∼ P G [ log ⁡ 1 − D ∗ ( x ) D ∗ ( x ) ] = E x ∼ P G log ⁡ [ 1 − D ∗ ( x ) ] − E x ∼ P G log ⁡ D ∗ ( x ) \begin{aligned} KL(P_G || P_{data}) &= \mathbb{E}_{x \sim P_G} [\log \cfrac{P_G(x)}{P_{data}(x)}] \\ &= \mathbb{E}_{x \sim P_G} [\log \cfrac{P_G(x) / (P_{data}(x) + P_G(x))}{P_{data}(x) / (P_{data}(x) + P_G(x))}] \quad(公式10)\\ &= \mathbb{E}_{x \sim P_G} [\log \cfrac{1 - D^*(x)}{D^*(x)}] \\ &= \mathbb{E}_{x \sim P_G} \log [1 - D^*(x)] - \mathbb{E}_{x \sim P_G} \log D^*(x) \end{aligned} KL(PGPdata)=ExPG[logPdata(x)PG(x)]=ExPG[logPdata(x)/(Pdata(x)+PG(x))PG(x)/(Pdata(x)+PG(x))]10=ExPG[logD(x)1D(x)]=ExPGlog[1D(x)]ExPGlogD(x)
  • 由公式3,9,10可得最小化目标的等价变形
    E x ∼ P G [ − log ⁡ D ∗ ( x ) ] = K L ( P G ∣ ∣ P d a t a ) − E x ∼ P G log ⁡ [ 1 − D ∗ ( x ) ] = K L ( P G ∣ ∣ P d a t a ) − 2 J S ( P d a t a ∣ ∣ P G ) + 2 log ⁡ 2 + E x ∼ P d a t a [ log ⁡ D ∗ ( x ) ] \begin{aligned} \mathbb{E}_{x \sim P_G} [-\log D^*(x)] &= KL(P_G || P_{data}) - \mathbb{E}_{x \sim P_G} \log [1 - D^*(x)] \\ &= KL(P_G || P_{data}) - 2JS(P_{data} || P_G) + 2\log 2 + \mathbb{E}_{x\sim P_{data}}[\log D^*(x)] \end{aligned} ExPG[logD(x)]=KL(PGPdata)ExPGlog[1D(x)]=KL(PGPdata)2JS(PdataPG)+2log2+ExPdata[logD(x)]
  • 注意上式最后两项不依赖于【生成器】G,最终得到最小化公式3等价于最小化
    K L ( P G ∣ ∣ P d a t a ) − 2 J S ( P d a t a ∣ ∣ P G ) ( 公 式 11 ) KL(P_G || P_{data}) - 2JS(P_{data} || P_G)(公式11) KL(PGPdata)2JS(PdataPG)11
  • 这个等价最小化目标存在两个严重的问题。第一是它同时要最小化生成分布与真实分布的KL散度,却又要最大化两者的JS散度,一个要拉近,一个却要推远!这在直观上非常荒谬,在数值上则会导致梯度不稳定,这是后面那个JS散度项的毛病。
  • 第二,即便是前面那个正常的KL散度项也有毛病。因为KL散度不是一个对称的衡量, K L ( P G ∣ ∣ P d a t a ) KL(P_G || P_{data}) KL(PGPdata) K L ( P d a t a ∣ ∣ P G ) KL(P_{data} || P_G) KL(PdataPG) 是有差别的。以前者为例
    • P G ( x ) → 0 P_G(x)\rightarrow 0 PG(x)0 P d a t a ( x ) → 1 P_{data}(x)\rightarrow 1 Pdata(x)1 时, P G ( x ) log ⁡ P G ( x ) P d a t a ( x ) → 0 P_G(x) \log \cfrac{P_G(x)}{P_{data}(x)} \rightarrow 0 PG(x)logPdata(x)PG(x)0,对 K L ( P G ∣ ∣ P d a t a ) KL(P_G || P_{data}) KL(PGPdata) 贡献趋近0
    • P G ( x ) → 1 P_G(x)\rightarrow 1 PG(x)1 P d a t a ( x ) → 0 P_{data}(x)\rightarrow 0 Pdata(x)0 时, P G ( x ) log ⁡ P G ( x ) P d a t a ( x ) → + ∞ P_G(x) \log \cfrac{P_G(x)}{P_{data}(x)} \rightarrow +\infty PG(x)logPdata(x)PG(x)+,对 K L ( P G ∣ ∣ P d a t a ) KL(P_G || P_{data}) KL(PGPdata) 贡献趋近正无穷
  • 换言之, K L ( P G ∣ ∣ P d a t a ) KL(P_G || P_{data}) KL(PGPdata) 对于上面两种错误的惩罚是不一样的,第一种错误对应的是“【生成器】没能生成真实的样本”,惩罚微小;第二种错误对应的是“【生成器】生成了不真实的样本” ,惩罚巨大。第一种错误对应的是缺乏多样性,第二种错误对应的是缺乏准确性。这一放一打之下,【生成器】宁可多生成一些重复但是很“安全”的样本,也不愿意去生成多样性的样本,因为那样一不小心就会产生第二种错误,得不偿失。这种现象就是大家常说的collapse mode。

4、原始GAN问题小结

  • 在原始GAN的(近似)最优【判别器】下,第一种【生成器】loss面临梯度消失问题,第二种【生成器】loss面临优化目标荒谬、梯度不稳定、对多样性与准确性惩罚不平衡导致mode collapse这几个问题。
  • 实验辅证如下图,WGAN前作Figure 3。先分别将DCGAN训练1,20,25个epoch,然后固定【生成器】不动,【判别器】重新随机初始化从头开始训练,对于第二种形式的【生成器】loss产生的梯度可以打印出其尺度的变化曲线,可以看到随着【判别器】的训练,蓝色和绿色曲线中【生成器】的梯度迅速增长,说明梯度不稳定,红线对应的是DCGAN相对收敛的状态,梯度才比较稳定。
    在这里插入图片描述

三、WGAN之前的一个过渡解决方案

  • 原始GAN问题的根源可以归结为两点,一是等价优化的距离衡量(KL散度、JS散度)不合理,二是【生成器】随机初始化后的生成分布很难与真实分布有不可忽略的重叠。
  • WGAN前作其实已经针对第二点提出了一个解决方案,就是对生成样本和真实样本加噪声,直观上说,使得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在重叠,JS散度就能真正发挥作用,此时如果两个分布越靠近,它们“弥散”出来的部分重叠得越多,JS散度也会越小而不会一直是一个常数,于是(在第一种原始GAN形式下)梯度消失的问题就解决了。在训练过程中,我们可以对所加的噪声进行退火(annealing),慢慢减小其方差,到后面两个低维流形“本体”都已经有重叠时,就算把噪声完全拿掉,JS散度也能照样发挥作用,继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。以上是对原文的直观解释。
  • 在这个解决方案下我们可以放心地把【判别器】训练到接近最优,不必担心梯度消失的问题。而当【判别器】最优时,对公式9取反可得【判别器】的最小loss为
    min ⁡ L D ( P d a t a + ϵ , P G + ϵ ) = − E x ∼ P d a t a + ϵ [ log ⁡ D ∗ ( x ) ] − E x ∼ P g + ϵ [ log ⁡ ( 1 − D ∗ ( x ) ) ] = 2 log ⁡ 2 − 2 J S ( P d a t a + ϵ ∣ ∣ P G + ϵ ) \begin{aligned} \min L_D(P_{data+\epsilon}, P_{G+\epsilon}) &= - \mathbb{E}_{x\sim P_{data+\epsilon}}[\log D^*(x)] - \mathbb{E}_{x\sim P_{g+\epsilon}}[\log(1-D^*(x))] \\ &= 2\log 2 - 2JS(P_{data+\epsilon} || P_{G+\epsilon}) \end{aligned} minLD(Pdata+ϵ,PG+ϵ)=ExPdata+ϵ[logD(x)]ExPg+ϵ[log(1D(x))]=2log22JS(Pdata+ϵPG+ϵ)
  • 其中 P d a t a + ϵ P_{data+\epsilon} Pdata+ϵ P G + ϵ P_{G+\epsilon} PG+ϵ 分别是加噪后的真实分布与生成分布。反过来说,从最优【判别器】的loss可以反推出当前两个加噪分布的JS散度。两个加噪分布的JS散度可以在某种程度上代表两个原本分布的距离,也就是说可以通过最优【判别器】的loss反映训练进程!……真的有这样的好事吗?
  • 并没有,因为加噪JS散度的具体数值受到噪声的方差影响,随着噪声的退火,前后的数值就没法比较了,所以它不能成为 P d a t a P_{data} Pdata P G P_G PG 距离的本质性衡量。
  • 因为本文的重点是WGAN本身,所以WGAN前作的加噪方案简单介绍到这里,感兴趣的读者可以阅读原文了解更多细节。加噪方案是针对原始GAN问题的第二点根源提出的,解决了训练不稳定的问题,不需要小心平衡【判别器】训练的火候,可以放心地把【判别器】训练到接近最优,但是仍然没能够提供一个衡量训练进程的数值指标。但是WGAN本作就从第一点根源出发,用Wasserstein距离代替JS散度,同时完成了稳定训练和进程指标的问题!

四、 Wasserstein Distance/Wasserstein距离 \text{Wasserstein Distance/Wasserstein距离} Wasserstein Distance/Wasserstein距离

  • KL散度和JS散度度量的问题:如果两个分配P,Q离得很远,完全没有重叠的时候,那么KL散度值是没有意义的,而JS散度值是一个常数。这在学习算法中是比较致命的,这就意味这这一点的梯度为0。梯度消失了。
    在这里插入图片描述
  • Wasserstein距离度量两个概率分布之间的距离,定义如下
    W ( P d a t a , P G ) = inf ⁡ γ ∼ Π ( P d a t a , P G ) E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] ( 公 式 12 ) W(P_{data}, P_G) = \inf_{\gamma \sim \Pi (P_{data}, P_G)} \mathbb{E}_{(x, y) \sim \gamma} [||x - y||](公式12) W(Pdata,PG)=γΠ(Pdata,PG)infE(x,y)γ[xy]12
  • Π ( P d a t a , P G ) \Pi (P_{data}, P_G) Π(Pdata,PG) P d a t a P_{data} Pdata P G P_G PG 组合起来的所有可能的联合分布的集合,反过来说, Π ( P d a t a , P G ) \Pi (P_{data}, P_G) Π(Pdata,PG) 中每一个分布的边缘分布都是 P d a t a P_{data} Pdata P G P_G PG
  • 对于每一个可能的联合分布 γ \gamma γ 而言,可以从中采样 ( x , y ) ∼ γ (x, y) \sim \gamma (x,y)γ 得到一个真实样本 x x x 和一个生成样本 y y y,并算出这对样本的距离 ∣ ∣ x − y ∣ ∣ ||x-y|| xy,所以可以计算该联合分布 γ \gamma γ 下样本对距离的期望值 E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \mathbb{E}_{(x, y) \sim \gamma} [||x - y||] E(x,y)γ[xy]
  • 在所有可能的联合分布中能够对这个期望值取到的下界 inf ⁡ γ ∼ Π ( P d a t a , P G ) E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \inf_{\gamma \sim \Pi (P_{data}, P_G)} \mathbb{E}_{(x, y) \sim \gamma} [||x - y||] infγΠ(Pdata,PG)E(x,y)γ[xy],就定义为Wasserstein距离。
  • 直观上可以把 E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] \mathbb{E}_{(x, y) \sim \gamma} [||x - y||] E(x,y)γ[xy] 理解为在 γ \gamma γ 这个“路径规划”下把 P d a t a P_{data} Pdata 这堆“沙土”挪到 P G P_G PG “位置”所需的“消耗”,而 W ( P d a t a , P G ) W(P_{data}, P_G) W(Pdata,PG) 就是“最优路径规划”下的“最小消耗”,所以才叫Earth-Mover(推土机)距离。
  • Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。WGAN本作通过简单的例子展示了这一点。考虑如下二维空间中的两个分布 P 1 P_1 P1 P 2 P_2 P2 P 1 P_1 P1在线段AB上均匀分布, P 2 P_2 P2在线段CD上均匀分布,通过控制参数 θ \theta θ 可以控制着两个分布的距离远近。
    在这里插入图片描述
  • 此时容易得到(读者可自行验证)
    K L ( P 1 ∣ ∣ P 2 ) = K L ( P 1 ∣ ∣ P 2 ) = { + ∞ if  θ ≠ 0 0 if  θ = 0 ( 突 变 ) J S ( P 1 ∣ ∣ P 2 ) = { log ⁡ 2 if  θ ≠ 0 0 if  θ − 0 ( 突 变 ) W ( P 0 , P 1 ) = ∣ θ ∣ ( 平 滑 ) KL(P_1 || P_2) = KL(P_1 || P_2) = \begin{cases} +\infty & \text{if $\theta \neq 0$} \\ 0 & \text{if $\theta = 0$} \end{cases}(突变)\\[2ex] JS(P_1||P_2)= \begin{cases} \log 2 & \text{if $\theta \neq 0$} \\ 0 & \text{if $\theta - 0$} \end{cases}(突变)\\[2ex] W(P_0, P_1) = |\theta|(平滑) KL(P1P2)=KL(P1P2)={+0if θ=0if θ=0JS(P1P2)={log20if θ=0if θ0W(P0,P1)=θ
  • KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化 θ \theta θ 这个参数,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。

五、从Wasserstein距离到WGAN

  • 既然Wasserstein距离有如此优越的性质,如果我们能够把它定义为【生成器】的loss,不就可以产生有意义的梯度来更新【生成器】,使得生成分布被拉向真实分布吗?
  • 没那么简单,因为Wasserstein距离定义(公式12)中的 inf ⁡ γ ∼ Π ( P d a t a , P G ) \inf_{\gamma \sim \Pi (P_{data}, P_G)} infγΠ(Pdata,PG) 没法直接求解,不过没关系,作者用了一个已有的定理把它变换为如下形式
    W ( P d a t a , P G ) = 1 K sup ⁡ ∣ ∣ D ∣ ∣ L ≤ K E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] ( 公 式 13 ) W(P_{data}, P_G) = \cfrac{1}{K} \sup_{||D||_L \leq K} \mathbb{E}_{x \sim P_{data}} [D(x)] - \mathbb{E}_{x \sim P_G} [D(x)](公式13) W(Pdata,PG)=K1DLKsupExPdata[D(x)]ExPG[D(x)]13
    • 公式13必须满足 D ( x ) ∈ L i p s c h i t z 连 续 函 数 D(x)∈Lipschitz连续函数 D(x)Lipschitz
      ∣ D ( x 1 ) − D ( x 2 ) ∣ ≤ K ∣ x 1 − x 2 ∣ \color{violet}{|D(x_1) - D(x_2)| \leq K |x_1 - x_2|} D(x1)D(x2)Kx1x2
    • Lipschitz连续性限制其实就是在一个连续函数 D D D 上面额外施加了一个限制,要求存在一个常数 K ≥ 0 K\geq 0 K0 使得定义域内的任意两个元素 x 1 x_1 x1 x 2 x_2 x2 都满足
    • 此时称函数 D D D 的Lipschitz常数为 K K K。当 K = 1 K=1 K=1 时,为“1-Lipschitz”。
      在这里插入图片描述
    • 简单理解,比如说 D D D 的定义域是实数集合,那上面的要求就等价于 D D D 的导函数绝对值不超过 K K K
      在这里插入图片描述
    • 再比如说 log ⁡ ( x ) \log (x) log(x) 就不是Lipschitz连续,因为它的导函数没有上界。Lipschitz连续条件限制了一个连续函数的最大局部变动幅度
    • 在实践中,使用 “Weight Clipping” 的技巧来实现 Lipschitz限制要求:Force the parameters w between c and -c. After parameter update, if w > c, w = c; if w < -c, w = -c
  • 公式13的意思就是在要求函数 D D D 的Lipschitz常数 ∣ ∣ D ∣ ∣ L ||D||_L DL不超过 K K K 的条件下,对所有可能满足条件的 D D D 取到 E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] \mathbb{E}_{x \sim P_{data}} [D(x)] - \mathbb{E}_{x \sim P_G} [D(x)] ExPdata[D(x)]ExPG[D(x)]的上界,然后再除以 K K K
  • 特别地,我们可以用一组参数 w w w 来定义一系列可能的函数 D w D_w Dw,此时求解公式13可以近似变成求解如下形式
    K ⋅ W ( P d a t a , P G ) ≈ max ⁡ w : ∣ D w ∣ L ≤ K E x ∼ P d a t a [ D w ( x ) ] − E x ∼ P G [ D w ( x ) ] ( 公 式 14 ) K \cdot W(P_{data}, P_G) \approx \max_{w: |D_w|_L \leq K} \mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)](公式14) KW(Pdata,PG)w:DwLKmaxExPdata[Dw(x)]ExPG[Dw(x)]14
  • 再用上我们搞深度学习的人最熟悉的那一套,不就可以把 D D D 用一个带参数 w w w 的神经网络来表示嘛!由于神经网络的拟合能力足够强大,我们有理由相信,这样定义出来的一系列 D w D_w Dw 虽然无法囊括所有可能,但是也足以高度近似公式13要求的那个 s u p ∣ ∣ D ∣ ∣ L ≤ K sup_{||D||_L \leq K} supDLK了。
  • 最后,还不能忘了满足公式14中 ∣ ∣ D w ∣ ∣ L ≤ K ||D_w||_L \leq K DwLK 这个限制。我们其实不关心具体的 K K K 是多少,只要它不是正无穷就行,因为 K K K 只是会使得梯度变大 K K K 倍,并不会影响梯度的方向。所以作者采取了一个非常简单的做法,就是限制神经网络 D θ D_\theta Dθ 的所有参数 w i w_i wi 的不超过某个范围 [ − c , c ] [-c, c] [c,c],比如 w i ∈ [ − 0.01 , 0.01 ] w_i \in [- 0.01, 0.01] wi[0.01,0.01],此时关于输入样本 x x x 的导数 ∂ D w ∂ x \cfrac{\partial D_w}{\partial x} xDw 也不会超过某个范围,所以一定存在某个不知道的常数 K K K 使得 D w D_w Dw 的局部变动幅度不会超过它,Lipschitz连续条件得以满足。具体在算法实现中,只需要每次更新完 w w w后把它clip回这个范围就可以了。
  • 到此为止,我们可以构造一个含参数 w w w、最后一层不是非线性激活层的【判别器】网络 D w D_w Dw,在限制 w w w 不超过某个范围的条件下,使得 L = E x ∼ P d a t a [ D w ( x ) ] − E x ∼ P G [ D w ( x ) ] L = \mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)] L=ExPdata[Dw(x)]ExPG[Dw(x)] 尽可能取到最大,此时 L L L 就会近似真实分布与生成分布之间的Wasserstein距离(常数倍数 K = 1 K=1 K=1)。
    L = max ⁡ D w ∈ 1 − L i p s c h i t z { E x ∼ P d a t a [ D w ( x ) ] − E x ∼ P G [ D w ( x ) ] } ( 公 式 15 ) \color{red}{L = \max_{D_w∈1-Lipschitz} \{\mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)]\}}(公式15) L=Dw1Lipschitzmax{ExPdata[Dw(x)]ExPG[Dw(x)]}15
    注意原始GAN的【判别器】做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的【判别器】 D w D_w Dw 做的是近似拟合Wasserstein距离,属于回归任务,所以WGAN要把最后一层的sigmoid拿掉
  • 接下来【生成器】要近似地最小化Wasserstein距离,可以最小化 L L L,由于Wasserstein距离的优良性质,我们不需要担心【生成器】梯度消失的问题。再考虑到 L L L 的第一项与【生成器】无关,就得到了WGAN的两个Loss。
    1. WGAN【生成器】Loss函数: − E x ∼ P G [ D w ( x ) ] (公式16) - \mathbb{E}_{x \sim P_G} [D_w(x)] \quad \text{(公式16)} ExPG[Dw(x)](公式16)
    2. WGAN【判别器】Loss函数: E x ∼ P G [ D w ( x ) ] − E x ∼ P d a t a [ D w ( x ) ] (公式17) \mathbb{E}_{x \sim P_G} [D_w(x)]- \mathbb{E}_{x \sim P_{data}} [D_w(x)] \quad \text{(公式17)} ExPG[Dw(x)]ExPdata[Dw(x)](公式17)
  • 公式15是公式17的反,可以指示训练进程,其数值越小,表示真实分布与生成分布的Wasserstein距离越小,GAN训练得越好。
  • WGAN完整的算法流程
    在这里插入图片描述
    在这里插入图片描述
  • 上文说过,WGAN与原始GAN第一种形式相比,只改了四点:
    1. 【判别器】最后一层去掉sigmoid
    2. 【生成器】和【判别器】的loss不取log
    3. 使用 “Weight Clipping” 技巧来模拟 Lipschitz限制要求:每次更新【判别器】的参数之后把它们的绝对值截断到不超过一个固定常数c(注:实际上“Weight Clipping” 技巧的效果不太好)。
    4. 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
  • 前三点都是从理论分析中得到的,已经介绍完毕;第四点却是作者从实验中发现的,属于trick,相对比较“玄”。作者发现如果使用Adam,【判别器】的loss有时候会崩掉,当它崩掉时,Adam给出的更新方向与梯度方向夹角的cos值就变成负数,更新方向与梯度方向南辕北辙,这意味着【判别器】的loss梯度是不稳定的,所以不适合用Adam这类基于动量的优化算法。作者改用RMSProp之后,问题就解决了,因为RMSProp适合梯度不稳定的情况。
  • 对WGAN作者做了不少实验验证,本文只提比较重要的三点。
  • 第一,【判别器】所近似的Wasserstein距离与【生成器】的生成图片质量高度相关,如下所示(此即题图):
    在这里插入图片描述
  • 第二,WGAN如果用类似DCGAN架构,生成图片的效果与DCGAN差不多:
    在这里插入图片描述
    但是厉害的地方在于WGAN不用DCGAN各种特殊的架构设计也能做到不错的效果,比如如果大家一起拿掉Batch Normalization的话,DCGAN就崩了:
    在这里插入图片描述
    如果WGAN和原始GAN都使用多层全连接网络(MLP),不用CNN,WGAN质量会变差些,但是原始GAN不仅质量变得更差,而且还出现了collapse mode,即多样性不足:
    在这里插入图片描述
  • 第三,在所有WGAN的实验中未观察到collapse mode,作者也只说应该是解决了,
  • 最后补充一点论文没提到,但是我个人觉得比较微妙的问题。【判别器】所近似的Wasserstein距离能够用来指示单次训练中的训练进程,这个没错;接着作者又说它可以用于比较多次训练进程,指引调参,我倒是觉得需要小心些。比如说我下次训练时改了【判别器】的层数、节点数等超参,【判别器】的拟合能力就必然有所波动,再比如说我下次训练时改了【生成器】两次迭代之间,【判别器】的迭代次数,这两种常见的变动都会使得Wasserstein距离的拟合误差就与上次不一样。那么这个拟合误差的变动究竟有多大,或者说不同的人做实验时【判别器】的拟合能力或迭代次数相差实在太大,那它们之间还能不能直接比较上述指标,我都是存疑的。
  • 进一步指出,相比于【判别器】迭代次数的改变,对【判别器】架构超参的改变会直接影响到对应的Lipschitz常数K,进而改变近似Wasserstein距离的倍数,前后两轮训练的指标就肯定不能比较了,这是需要在实际应用中注意的。对此我想到了一个工程化的解决方式,不是很优雅:取同样一对生成分布和真实分布,让前后两个不同架构的【判别器】各自拟合到收敛,看收敛到的指标差多少倍,可以近似认为是后面的K_2相对前面K_1的变化倍数,于是就可以用这个变化倍数校正前后两轮训练的指标。

六、WGAN总结

  • WGAN前作分析了Ian Goodfellow提出的原始GAN两种形式各自的问题,第一种形式等价在最优【判别器】下等价于最小化生成分布与真实分布之间的JS散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及JS散度的突变特性,使得【生成器】面临梯度消失的问题;第二种形式在最优【判别器】下等价于既要最小化生成分布与真实分布直接的KL散度,又要最大化其JS散度,相互矛盾,导致梯度不稳定,而且KL散度的不对称性使得【生成器】宁可丧失多样性也不愿丧失准确性,导致collapse mode现象。
  • WGAN前作针对分布重叠问题提出了一个过渡解决方案,通过对生成样本和真实样本加噪声使得两个分布产生重叠,理论上可以解决训练不稳定的问题,可以放心训练【判别器】到接近最优,但是未能提供一个指示训练进程的可靠指标,也未做实验验证。
  • WGAN本作引入了Wasserstein距离,由于它相对KL散度与JS散度具有优越的平滑特性,理论上可以解决梯度消失问题。接着通过数学变换将Wasserstein距离写成可求解的形式,利用一个参数数值范围受限的【判别器】神经网络来最大化这个形式,就可以近似Wasserstein距离。在此近似最优【判别器】下优化【生成器】使得Wasserstein距离缩小,就能有效拉近生成分布与真实分布。WGAN既解决了训练不稳定的问题,也提供了一个可靠的训练进程指标,而且该指标确实与生成样本的质量高度相关。作者对WGAN进行了实验验证。

七、WGAN-GP(改进的WGAN)

1、WGAN存在的问题

  • WGAN虽然理论证明很完美,但真正的效果并没有很好。WGAN在真实的实验过程中依旧存在着训练困难、收敛速度慢的 问题,相比较传统GAN在实验上提升不是很明显。

1.1 WGAN问题01

  • WGAN存在问题的原因就是WGAN在处理Lipschitz限制条件时直接采用了 weight clipping,就是每当更新完一次判别器的参数之后,就检查判别器的所有参数的绝对值有没有超过一个阈值,比如0.01,有的话就把这些参数 clip回 [-0.01, 0.01] 范围内。通过在训练过程中保证判别器的所有参数有界,就保证了判别器不能对两个略微不同的样本在判别上不会差异过大,从而间接实现了Lipschitz限制。但是,实际训练上判别器loss希望尽可能拉大真假样本的分数差,然而weight clipping独立地限制每一个网络参数的取值范围,在这种情况下最优的策略就是尽可能让所有参数走极端,要么取最大值(如0.01)要么取最小值(如-0.01)。如下图所示判别器的参数几乎都集中在最大值和最小值上:
    在这里插入图片描述

1.2 WGAN问题02

  • weight clipping会导致很容易一不小心就梯度消失或者梯度爆炸。原因是判别器是一个多层网络,如果把clipping threshold设得稍微小了一 点,每经过一层网络,梯度就变小一点点,多层之后就会指数衰减;反之,如果设得稍微大了一点,每经过一层网络,梯度变大一点点,多层之后就会指数爆 炸。只有设得不大不小,才能让生成器获得恰到好处的回传梯度,然而在实际应用中这个平衡区域可能很狭窄,就会给调参工作带来麻烦。下图中横轴代表判别器从低到高第几层,纵轴代表梯度回传到这一层之后的尺度大小(注意纵轴是对数刻度,c是clipping threshold)
    在这里插入图片描述

2、WGAN-GP解决方案

  • 在以上问题提出后,作者提出了解决方案,那就是gradient penalty(梯度惩罚)。Lipschitz限制是要求判别器的梯度不超过K,gradient penalty 就是设置一个额外的Loss项来体现 “梯度” 与 “K” 之间的联系,比如:
    R e L U [ ∣ ∣ ∇ x D ( X ) ∣ ∣ p − K ] ReLU[||\nabla_x D(X)||_p-K] ReLU[xD(X)pK]
  • 不过,既然判别器希望尽可能拉大真假样本的分数差距,自然是希望梯度越大越好,变化幅度越大越好,所以判别器在充分训练之后,其梯度norm其实就会在K附近。通过这一点可以把上面的Loss改成要求梯度norm离K越近越好:
    [ ∣ ∣ ∇ x D ( X ) ∣ ∣ p − K ] 2 [||\nabla_x D(X)||_p-K]^2 [xD(X)pK]2
  • 接着简单地把 K K K 定为1,
    [ ∣ ∣ ∇ x D ( X ) ∣ ∣ p − 1 ] 2 [||\nabla_x D(X)||_p-1]^2 [xD(X)p1]2
  • 再跟WGAN原来的判别器损失函数 L = max ⁡ D w ∈ 1 − L i p s c h i t z { E x ∼ P d a t a [ D w ( x ) ] − E x ∼ P G [ D w ( x ) ] } ( 公 式 15 ) L = \max_{D_w∈1-Lipschitz} \{\mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)]\}(公式15) L=maxDw1Lipschitz{ExPdata[Dw(x)]ExPG[Dw(x)]}15加权合并,就得到新的判别器Loss:
    − L = max ⁡ D w ∈ 1 − L i p s c h i t z { E x ∼ P d a t a [ D w ( x ) ] − E x ∼ P G [ D w ( x ) ] ⏟ Original Critic Loss − λ E x ∼ P p e n a l t y [ ∣ ∣ ∇ x D ( X ) ∣ ∣ p − 1 ] 2 ⏟ Gradient Penalty } \color{red}{-L = \max_{D_w∈1-Lipschitz} \{\underbrace{\mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)]}_{\text{Original\ Critic\ Loss}}-\underbrace{λ\mathbb{E}_{x\sim P_{penalty}}[||\nabla_x D(X)||_p-1]^2}_{\text{Gradient\ Penalty}}\}} L=Dw1Lipschitzmax{Original Critic Loss ExPdata[Dw(x)]ExPG[Dw(x)]Gradient Penalty λExPpenalty[xD(X)p1]2}

2.1 Gradient Penalty方法

  • 论文中作者提出,其实没必要在整个样本空间上施加Lipschitz限制,只要重点抓住生成样本集中区域、真实样本集中区域以及夹在它们中间的区域就行了。
    在这里插入图片描述
  • 具体地,先随机采样一对真假样本,还有一个 [0,1] 之间的随机数:
    x d a t a ∼ P d a t a , x G ∼ P G , ε ∼ U n i f o r m [ 0 , 1 ] x_{data}\sim P_{data},x_G\sim P_G,ε\sim Uniform[0,1] xdataPdataxGPGεUniform[0,1]
  • 然后在 x d a t a x_{data} xdata x G x_G xG 的连线上随机插值采样:
    x p e n a l t y = ε x d a t a + ( 1 − ε ) x G x_{penalty}=εx_{data}+(1-ε)x_G xpenalty=εxdata+(1ε)xG
  • 把按照上述流程采样得到的 x p e n a l t y x_{penalty} xpenalty 所满足的分布记为 P p e n a l t y P_{penalty} Ppenalty,得到最终版本的判别器Loss:
    − L = max ⁡ D w ∈ 1 − L i p s c h i t z { E x ∼ P d a t a [ D w ( x ) ] − E x ∼ P G [ D w ( x ) ] ⏟ Original Critic Loss − λ E x ∼ P p e n a l t y [ ∣ ∣ ∇ x D ( X ) ∣ ∣ p − 1 ] 2 ⏟ Gradient Penalty } \color{red}{-L = \max_{D_w∈1-Lipschitz} \{\underbrace{\mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)]}_{\text{Original\ Critic\ Loss}}-\underbrace{λ\mathbb{E}_{x\sim P_{penalty}}[||\nabla_x D(X)||_p-1]^2}_{\text{Gradient\ Penalty}}\}} L=Dw1Lipschitzmax{Original Critic Loss ExPdata[Dw(x)]ExPG[Dw(x)]Gradient Penalty λExPpenalty[xD(X)p1]2}
  • 这就是gradient penalty方法,相应的改进版的WGAN模型简称为WGAN-GP
  • WGAN-GP的创新点也就在目标函数的第二项上,由于模型是对每个样本独立地施加梯度惩罚,所以判别器的模型架构中不能使用Batch Normalization, 因为它会引入同个batch中不同样本的相互依赖关系。

2.2 “WGAN 的 Weight Clipping方法” v.s “WGAN-GP 的 Gradient Penalty方法”

  • Weight Clipping方法对样本全局生效,但由于间接限制判别器的梯度norm,会导致一不小心就梯度消失或梯度爆炸;
  • Gradient Penalty方法只对真假样本集中区域以及真假样本中间的过度地带生效,由于直接把判别器的梯度norm限制为1附近,所以梯度的可控性较强,容易调整到合适的尺度大小。
  • 实验表明,Gradient Penalty能够显著提高训练速度,解决了原始WGAN收敛缓慢的问题。

2.3 WGAN-GP的算法框图

在这里插入图片描述




参考资料:

深度学习中最常见GAN模型应用与解读
原始GAN存在的问题
原始GAN究竟出了什么问题
谈谈WGAN的理解-原始GAN存在问题
交叉熵、相对熵(KL散度)、JS散度和Wasserstein距离(推土机距离)
WGAN (原理解析)
WGAN-GP(改进的WGAN)介绍

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值