深度学习-生成模型:WGAN【Lipschitz:Weight Clipping】--> WGAN-GP【Lipschitz:Gradient Penalty】

  • 一、WGAN相比较GAN的改进点
  • 二、原始GAN究竟出了什么问题
    • 1、原始GAN的损失函数
      • 1.1 【判别器】的损失函数
      • 1.2 生产器的损失函数
    • 2、第一种原始GAN形式的问题
    • 3、第二种原始GAN形式的问题
    • 4、原始GAN问题小结
  • 三、WGAN之前的一个过渡解决方案
  • 四、Wasserstein Distance/Wasserstein距离\text{Wasserstein Distance/Wasserstein距离}Wasserstein Distance/Wasserstein距离
  • 五、从Wasserstein距离到WGAN
  • 六、WGAN总结
  • 七、WGAN-GP(改进的WGAN)
    • 1、WGAN存在的问题
      • 1.1 WGAN问题01
      • 1.2 WGAN问题02
    • 2、WGAN-GP解决方案
      • 2.1 Gradient Penalty方法
      • 2.2 “WGAN 的 Weight Clipping方法” v.s “WGAN-GP 的 Gradient Penalty方法”
      • 2.3 WGAN-GP的算法框图
  • 自从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中【判别器】要最小化如下损失函数,尽可能把真实样本分为正例,生成样本分为负例,所以【判别器】的损失函数由两部分组成:
    −Ex∼Pdata(x)[logD(x)]−Ex∼PG(x)[log(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)}−Ex∼Pdata​(x)​[logD(x)]−Ex∼PG​(x)​[log(1−D(x))](公式1)
    其中:PdataP_{data}Pdata​ 是真实样本分布;PGP_GPG​ 是生产器生产的样本的样本分布;

1.2 生产器的损失函数

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

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

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

    一方面,二维平面中随机取两条曲线,它们之间刚好存在重叠线段的概率为0;另一方面,虽然它们很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低一个维度,长度(测度)为0,可忽略。三维空间中也是类似的,随机取两个曲面,它们之间最多就是比较有可能存在交叉线,但是交叉线比曲面低一个维度,面积(测度)是0,可忽略。从低维空间拓展到高维空间,就有了如下逻辑:因为一开始【生成器】随机初始化,所以PGP_GPG​几乎不可能与PdataP_{data}Pdata​有什么关联,所以它们的支撑集之间的重叠部分要么不存在,要么就比PdataP_{data}Pdata​和PGP_GPG​的最小维度还要低至少一个维度,故而测度为0。所谓“重叠部分测度为0”,就是上文所言“不重叠或者重叠部分可忽略”的意思。
  • 我们就得到了WGAN前作中关于【生成器】梯度消失的第一个论证:在(近似)最优【判别器】下,最小化【生成器】的loss等价于最小化 PdataP_{data}Pdata​ 与 PGP_GPG​之间的JS散度,而由于 PdataP_{data}Pdata​ 与 PGP_GPG​ 几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数 log⁡2\log 2log2,最终导致【生成器】的梯度(近似)为0,梯度消失。
  • 接着作者写了很多公式定理从第二个角度进行论证,但是背后的思想也可以直观地解释:
    • 首先,PdataP_{data}Pdata​ 与 PGP_GPG​ 之间几乎不可能有不可忽略的重叠,所以无论它们之间的“缝隙”多狭小,都肯定存在一个最优分割曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。
    • 由于【判别器】作为一个神经网络可以无限拟合这个分隔曲面,所以存在一个最优【判别器】,对几乎所有真实样本给出概率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改成
    Ex∼PG[−log⁡D(x)](公式3)\mathbb{E}_{x\sim P_G}[- \log D(x)](公式3)Ex∼PG​​[−logD(x)](公式3)
  • 上文推导已经得到在最优【判别器】 D∗D^*D∗ 下
    Ex∼Pdata[log⁡D∗(x)]+Ex∼PG[log⁡(1−D∗(x))]=2JS(Pdata∣∣PG)−2log⁡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)Ex∼Pdata​​[logD∗(x)]+Ex∼PG​​[log(1−D∗(x))]=2JS(Pdata​∣∣PG​)−2log2(公式9)
  • 我们可以把KL散度(注意下面是先G后data)变换成含 D∗D^*D∗ 的形式:
    KL(PG∣∣Pdata)=Ex∼PG[log⁡PG(x)Pdata(x)]=Ex∼PG[log⁡PG(x)/(Pdata(x)+PG(x))Pdata(x)/(Pdata(x)+PG(x))](公式10)=Ex∼PG[log⁡1−D∗(x)D∗(x)]=Ex∼PGlog⁡[1−D∗(x)]−Ex∼PGlog⁡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(PG​∣∣Pdata​)​=Ex∼PG​​[logPdata​(x)PG​(x)​]=Ex∼PG​​[logPdata​(x)/(Pdata​(x)+PG​(x))PG​(x)/(Pdata​(x)+PG​(x))​](公式10)=Ex∼PG​​[logD∗(x)1−D∗(x)​]=Ex∼PG​​log[1−D∗(x)]−Ex∼PG​​logD∗(x)​
  • 由公式3,9,10可得最小化目标的等价变形
    Ex∼PG[−log⁡D∗(x)]=KL(PG∣∣Pdata)−Ex∼PGlog⁡[1−D∗(x)]=KL(PG∣∣Pdata)−2JS(Pdata∣∣PG)+2log⁡2+Ex∼Pdata[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}Ex∼PG​​[−logD∗(x)]​=KL(PG​∣∣Pdata​)−Ex∼PG​​log[1−D∗(x)]=KL(PG​∣∣Pdata​)−2JS(Pdata​∣∣PG​)+2log2+Ex∼Pdata​​[logD∗(x)]​
  • 注意上式最后两项不依赖于【生成器】G,最终得到最小化公式3等价于最小化
    KL(PG∣∣Pdata)−2JS(Pdata∣∣PG)(公式11)KL(P_G || P_{data}) - 2JS(P_{data} || P_G)(公式11)KL(PG​∣∣Pdata​)−2JS(Pdata​∣∣PG​)(公式11)
  • 这个等价最小化目标存在两个严重的问题。第一是它同时要最小化生成分布与真实分布的KL散度,却又要最大化两者的JS散度,一个要拉近,一个却要推远!这在直观上非常荒谬,在数值上则会导致梯度不稳定,这是后面那个JS散度项的毛病。
  • 第二,即便是前面那个正常的KL散度项也有毛病。因为KL散度不是一个对称的衡量,KL(PG∣∣Pdata)KL(P_G || P_{data})KL(PG​∣∣Pdata​) 与 KL(Pdata∣∣PG)KL(P_{data} || P_G)KL(Pdata​∣∣PG​) 是有差别的。以前者为例
    • 当 PG(x)→0P_G(x)\rightarrow 0PG​(x)→0而 Pdata(x)→1P_{data}(x)\rightarrow 1Pdata​(x)→1 时,PG(x)log⁡PG(x)Pdata(x)→0P_G(x) \log \cfrac{P_G(x)}{P_{data}(x)} \rightarrow 0PG​(x)logPdata​(x)PG​(x)​→0,对 KL(PG∣∣Pdata)KL(P_G || P_{data})KL(PG​∣∣Pdata​) 贡献趋近0
    • 当 PG(x)→1P_G(x)\rightarrow 1PG​(x)→1而 Pdata(x)→0P_{data}(x)\rightarrow 0Pdata​(x)→0 时,PG(x)log⁡PG(x)Pdata(x)→+∞P_G(x) \log \cfrac{P_G(x)}{P_{data}(x)} \rightarrow +\inftyPG​(x)logPdata​(x)PG​(x)​→+∞,对 KL(PG∣∣Pdata)KL(P_G || P_{data})KL(PG​∣∣Pdata​) 贡献趋近正无穷
  • 换言之,KL(PG∣∣Pdata)KL(P_G || P_{data})KL(PG​∣∣Pdata​) 对于上面两种错误的惩罚是不一样的,第一种错误对应的是“【生成器】没能生成真实的样本”,惩罚微小;第二种错误对应的是“【生成器】生成了不真实的样本” ,惩罚巨大。第一种错误对应的是缺乏多样性,第二种错误对应的是缺乏准确性。这一放一打之下,【生成器】宁可多生成一些重复但是很“安全”的样本,也不愿意去生成多样性的样本,因为那样一不小心就会产生第二种错误,得不偿失。这种现象就是大家常说的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⁡LD(Pdata+ϵ,PG+ϵ)=−Ex∼Pdata+ϵ[log⁡D∗(x)]−Ex∼Pg+ϵ[log⁡(1−D∗(x))]=2log⁡2−2JS(Pdata+ϵ∣∣PG+ϵ)\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+ϵ​)​=−Ex∼Pdata+ϵ​​[logD∗(x)]−Ex∼Pg+ϵ​​[log(1−D∗(x))]=2log2−2JS(Pdata+ϵ​∣∣PG+ϵ​)​
  • 其中 Pdata+ϵP_{data+\epsilon}Pdata+ϵ​ 和 PG+ϵP_{G+\epsilon}PG+ϵ​ 分别是加噪后的真实分布与生成分布。反过来说,从最优【判别器】的loss可以反推出当前两个加噪分布的JS散度。两个加噪分布的JS散度可以在某种程度上代表两个原本分布的距离,也就是说可以通过最优【判别器】的loss反映训练进程!……真的有这样的好事吗?
  • 并没有,因为加噪JS散度的具体数值受到噪声的方差影响,随着噪声的退火,前后的数值就没法比较了,所以它不能成为 PdataP_{data}Pdata​ 和 PGP_GPG​ 距离的本质性衡量。
  • 因为本文的重点是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(Pdata,PG)=inf⁡γ∼Π(Pdata,PG)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​)inf​E(x,y)∼γ​[∣∣x−y∣∣](公式12)
  • Π(Pdata,PG)\Pi (P_{data}, P_G)Π(Pdata​,PG​) 是 PdataP_{data}Pdata​ 和 PGP_GPG​ 组合起来的所有可能的联合分布的集合,反过来说,Π(Pdata,PG)\Pi (P_{data}, P_G)Π(Pdata​,PG​) 中每一个分布的边缘分布都是 PdataP_{data}Pdata​ 和 PGP_GPG​。
  • 对于每一个可能的联合分布 γ\gammaγ 而言,可以从中采样 (x,y)∼γ(x, y) \sim \gamma(x,y)∼γ 得到一个真实样本 xxx 和一个生成样本 yyy,并算出这对样本的距离 ∣∣x−y∣∣||x-y||∣∣x−y∣∣,所以可以计算该联合分布 γ\gammaγ 下样本对距离的期望值 E(x,y)∼γ[∣∣x−y∣∣]\mathbb{E}_{(x, y) \sim \gamma} [||x - y||]E(x,y)∼γ​[∣∣x−y∣∣]。
  • 在所有可能的联合分布中能够对这个期望值取到的下界 inf⁡γ∼Π(Pdata,PG)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)∼γ​[∣∣x−y∣∣],就定义为Wasserstein距离。
  • 直观上可以把 E(x,y)∼γ[∣∣x−y∣∣]\mathbb{E}_{(x, y) \sim \gamma} [||x - y||]E(x,y)∼γ​[∣∣x−y∣∣] 理解为在 γ\gammaγ 这个“路径规划”下把PdataP_{data}Pdata​ 这堆“沙土”挪到 PGP_GPG​ “位置”所需的“消耗”,而 W(Pdata,PG)W(P_{data}, P_G)W(Pdata​,PG​) 就是“最优路径规划”下的“最小消耗”,所以才叫Earth-Mover(推土机)距离。
  • Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。WGAN本作通过简单的例子展示了这一点。考虑如下二维空间中的两个分布 P1P_1P1​ 和P2P_2P2​,P1P_1P1​在线段AB上均匀分布,P2P_2P2​在线段CD上均匀分布,通过控制参数 θ\thetaθ 可以控制着两个分布的距离远近。
  • 此时容易得到(读者可自行验证)
    KL(P1∣∣P2)=KL(P1∣∣P2)={+∞if θ≠00if θ=0(突变)JS(P1∣∣P2)={log⁡2if θ≠00if θ−0(突变)W(P0,P1)=∣θ∣(平滑)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(P1​∣∣P2​)=KL(P1​∣∣P2​)={+∞0​if θ​=0if θ=0​(突变)JS(P1​∣∣P2​)={log20​if θ​=0if θ−0​(突变)W(P0​,P1​)=∣θ∣(平滑)
  • KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化 θ\thetaθ 这个参数,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。

五、从Wasserstein距离到WGAN

  • 既然Wasserstein距离有如此优越的性质,如果我们能够把它定义为【生成器】的loss,不就可以产生有意义的梯度来更新【生成器】,使得生成分布被拉向真实分布吗?
  • 没那么简单,因为Wasserstein距离定义(公式12)中的 inf⁡γ∼Π(Pdata,PG)\inf_{\gamma \sim \Pi (P_{data}, P_G)}infγ∼Π(Pdata​,PG​)​ 没法直接求解,不过没关系,作者用了一个已有的定理把它变换为如下形式
    W(Pdata,PG)=1Ksup⁡∣∣D∣∣L≤KEx∼Pdata[D(x)]−Ex∼PG[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​)=K1​∣∣D∣∣L​≤Ksup​Ex∼Pdata​​[D(x)]−Ex∼PG​​[D(x)](公式13)

    • 公式13必须满足 D(x)∈Lipschitz连续函数D(x)∈Lipschitz连续函数D(x)∈Lipschitz连续函数
      ∣D(x1)−D(x2)∣≤K∣x1−x2∣\color{violet}{|D(x_1) - D(x_2)| \leq K |x_1 - x_2|}∣D(x1​)−D(x2​)∣≤K∣x1​−x2​∣
    • Lipschitz连续性限制其实就是在一个连续函数 DDD 上面额外施加了一个限制,要求存在一个常数 K≥0K\geq 0K≥0 使得定义域内的任意两个元素 x1x_1x1​ 和 x2x_2x2​ 都满足
    • 此时称函数 DDD 的Lipschitz常数为 KKK。当 K=1K=1K=1 时,为“1-Lipschitz”。
    • 简单理解,比如说 DDD 的定义域是实数集合,那上面的要求就等价于 DDD 的导函数绝对值不超过 KKK
    • 再比如说 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的意思就是在要求函数 DDD 的Lipschitz常数 ∣∣D∣∣L||D||_L∣∣D∣∣L​不超过 KKK 的条件下,对所有可能满足条件的 DDD 取到 Ex∼Pdata[D(x)]−Ex∼PG[D(x)]\mathbb{E}_{x \sim P_{data}} [D(x)] - \mathbb{E}_{x \sim P_G} [D(x)]Ex∼Pdata​​[D(x)]−Ex∼PG​​[D(x)]的上界,然后再除以 KKK。
  • 特别地,我们可以用一组参数 www 来定义一系列可能的函数 DwD_wDw​,此时求解公式13可以近似变成求解如下形式
    K⋅W(Pdata,PG)≈max⁡w:∣Dw∣L≤KEx∼Pdata[Dw(x)]−Ex∼PG[Dw(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)K⋅W(Pdata​,PG​)≈w:∣Dw​∣L​≤Kmax​Ex∼Pdata​​[Dw​(x)]−Ex∼PG​​[Dw​(x)](公式14)
  • 再用上我们搞深度学习的人最熟悉的那一套,不就可以把 DDD 用一个带参数 www 的神经网络来表示嘛!由于神经网络的拟合能力足够强大,我们有理由相信,这样定义出来的一系列 DwD_wDw​ 虽然无法囊括所有可能,但是也足以高度近似公式13要求的那个 sup∣∣D∣∣L≤Ksup_{||D||_L \leq K}sup∣∣D∣∣L​≤K​了。
  • 最后,还不能忘了满足公式14中 ∣∣Dw∣∣L≤K||D_w||_L \leq K∣∣Dw​∣∣L​≤K 这个限制。我们其实不关心具体的 KKK 是多少,只要它不是正无穷就行,因为 KKK 只是会使得梯度变大 KKK 倍,并不会影响梯度的方向。所以作者采取了一个非常简单的做法,就是限制神经网络 DθD_\thetaDθ​ 的所有参数 wiw_iwi​ 的不超过某个范围 [−c,c][-c, c][−c,c],比如 wi∈[−0.01,0.01]w_i \in [- 0.01, 0.01]wi​∈[−0.01,0.01],此时关于输入样本 xxx 的导数 ∂Dw∂x\cfrac{\partial D_w}{\partial x}∂x∂Dw​​ 也不会超过某个范围,所以一定存在某个不知道的常数 KKK 使得 DwD_wDw​ 的局部变动幅度不会超过它,Lipschitz连续条件得以满足。具体在算法实现中,只需要每次更新完 www后把它clip回这个范围就可以了。
  • 到此为止,我们可以构造一个含参数 www、最后一层不是非线性激活层的【判别器】网络 DwD_wDw​,在限制 www 不超过某个范围的条件下,使得 L=Ex∼Pdata[Dw(x)]−Ex∼PG[Dw(x)]L = \mathbb{E}_{x \sim P_{data}} [D_w(x)] - \mathbb{E}_{x \sim P_G} [D_w(x)]L=Ex∼Pdata​​[Dw​(x)]−Ex∼PG​​[Dw​(x)] 尽可能取到最大,此时 LLL 就会近似真实分布与生成分布之间的Wasserstein距离(常数倍数K=1K=1K=1)。
    L=max⁡Dw∈1−Lipschitz{Ex∼Pdata[Dw(x)]−Ex∼PG[Dw(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=Dw​∈1−Lipschitzmax​{Ex∼Pdata​​[Dw​(x)]−Ex∼PG​​[Dw​(x)]}(公式15)
    注意原始GAN的【判别器】做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的【判别器】 DwD_wDw​ 做的是近似拟合Wasserstein距离,属于回归任务,所以WGAN要把最后一层的sigmoid拿掉。
  • 接下来【生成器】要近似地最小化Wasserstein距离,可以最小化 LLL,由于Wasserstein距离的优良性质,我们不需要担心【生成器】梯度消失的问题。再考虑到 LLL 的第一项与【生成器】无关,就得到了WGAN的两个Loss。
    1. WGAN【生成器】Loss函数:−Ex∼PG[Dw(x)](公式16)- \mathbb{E}_{x \sim P_G} [D_w(x)] \quad \text{(公式16)}−Ex∼PG​​[Dw​(x)](公式16)
    2. WGAN【判别器】Loss函数:Ex∼PG[Dw(x)]−Ex∼Pdata[Dw(x)](公式17)\mathbb{E}_{x \sim P_G} [D_w(x)]- \mathbb{E}_{x \sim P_{data}} [D_w(x)] \quad \text{(公式17)}Ex∼PG​​[Dw​(x)]−Ex∼Pdata​​[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” 之间的联系,比如:
    ReLU[∣∣∇xD(X)∣∣p−K]ReLU[||\nabla_x D(X)||_p-K]ReLU[∣∣∇x​D(X)∣∣p​−K]
  • 不过,既然判别器希望尽可能拉大真假样本的分数差距,自然是希望梯度越大越好,变化幅度越大越好,所以判别器在充分训练之后,其梯度norm其实就会在K附近。通过这一点可以把上面的Loss改成要求梯度norm离K越近越好:
    [∣∣∇xD(X)∣∣p−K]2[||\nabla_x D(X)||_p-K]^2[∣∣∇x​D(X)∣∣p​−K]2
  • 接着简单地把 KKK 定为1,
    [∣∣∇xD(X)∣∣p−1]2[||\nabla_x D(X)||_p-1]^2[∣∣∇x​D(X)∣∣p​−1]2
  • 再跟WGAN原来的判别器损失函数 L=max⁡Dw∈1−Lipschitz{Ex∼Pdata[Dw(x)]−Ex∼PG[Dw(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=maxDw​∈1−Lipschitz​{Ex∼Pdata​​[Dw​(x)]−Ex∼PG​​[Dw​(x)]}(公式15)加权合并,就得到新的判别器Loss:
    −L=max⁡Dw∈1−Lipschitz{Ex∼Pdata[Dw(x)]−Ex∼PG[Dw(x)]⏟Original Critic Loss−λEx∼Ppenalty[∣∣∇xD(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=Dw​∈1−Lipschitzmax​{Original Critic LossEx∼Pdata​​[Dw​(x)]−Ex∼PG​​[Dw​(x)]​​−Gradient PenaltyλEx∼Ppenalty​​[∣∣∇x​D(X)∣∣p​−1]2​​}

2.1 Gradient Penalty方法

  • 论文中作者提出,其实没必要在整个样本空间上施加Lipschitz限制,只要重点抓住生成样本集中区域、真实样本集中区域以及夹在它们中间的区域就行了。
  • 具体地,先随机采样一对真假样本,还有一个 [0,1] 之间的随机数:
    xdata∼Pdata,xG∼PG,ε∼Uniform[0,1]x_{data}\sim P_{data},x_G\sim P_G,ε\sim Uniform[0,1]xdata​∼Pdata​,xG​∼PG​,ε∼Uniform[0,1]
  • 然后在 xdatax_{data}xdata​ 和 xGx_GxG​ 的连线上随机插值采样:
    xpenalty=εxdata+(1−ε)xGx_{penalty}=εx_{data}+(1-ε)x_Gxpenalty​=εxdata​+(1−ε)xG​
  • 把按照上述流程采样得到的 xpenaltyx_{penalty}xpenalty​ 所满足的分布记为 PpenaltyP_{penalty}Ppenalty​,得到最终版本的判别器Loss:
    −L=max⁡Dw∈1−Lipschitz{Ex∼Pdata[Dw(x)]−Ex∼PG[Dw(x)]⏟Original Critic Loss−λEx∼Ppenalty[∣∣∇xD(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=Dw​∈1−Lipschitzmax​{Original Critic LossEx∼Pdata​​[Dw​(x)]−Ex∼PG​​[Dw​(x)]​​−Gradient PenaltyλEx∼Ppenalty​​[∣∣∇x​D(X)∣∣p​−1]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)介绍

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

  1. Wasserstein GAN最新进展:从weight clipping到gradient penalty,更加先进的Lipschitz限制手法

    作者:郑华滨 链接:https://www.zhihu.com/question/52602529/answer/158727900 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  2. 深度学习中的Lipschitz约束:泛化与生成模型

    作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 去年写过一篇 WGAN-GP 的入门读物互怼的艺术:从零直达WGAN-GP,提到通过梯度惩罚来为 ...

  3. 生死看淡,不服就GAN(七)----用更稳定的生成模型WGAN生成cifar

    WGAN提出Wasserstein距离取代原始GAN的JS散度衡量两分布之间距离,使模型更加稳定并消除了mode collapse问题.关于WGAN的介绍,建议参考以下博客: 令人拍案叫绝的Wasse ...

  4. 【轩说AI】生成模型(2)—— GAN生成对抗网络 + WGAN + Conditional GAN + Cycle GAN

    文章目录 GAN生成对抗网络(Generative Adversarial Network) 神经网络的本质就是一个函数,一个用于拟合的函数 生成模型面临的前所未有的问题 GAN解决这一问题的思想 O ...

  5. Wasserstein距离在生成模型中的应用

    作者丨黄若孜 学校丨复旦大学软件学院硕士生 研究方向丨推荐系统 前言 本文是关于 Wasserstein 距离在生成模型中的应用的一个总结,第一部分讲 Wasserstein 距离的定义和性质,第二部 ...

  6. 对抗生成网络学习(四)——WGAN+爬虫生成皮卡丘图像(tensorflow实现)

    一.背景 WGAN的全称为Wasserstein GAN, 是Martin Arjovsky等人于17年1月份提出的一个模型,该文章可以参考[1].WGAN针对GAN存在的问题进行了有针对性的改进,但 ...

  7. 【阿里云课程】生成模型之GAN优化目标设计与改进

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第11课中的一节,介绍如下: GAN优化目标设计与改进 本次课程是阿里天池联合有三AI推出的深度学习系列课程第11期,深度生 ...

  8. 【生成模型】解读显式生成模型之完全可见置信网络FVBN

    上一期为大家说明了什么是极大似然法,以及如何使用极大似然法搭建生成模型,本期将为大家介绍第一个显式生成模型完全可见置信网络FVBN. 作者&编辑 | 小米粥 1 完全可见置信网络 在完全可见置 ...

  9. 【阿里云课程】生成模型之GAN原理与优化基础

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第11课中的一节,介绍如下: 生成对抗网络基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第11期,深度生成模型之 ...

最新文章

  1. 人工智能芯片借鉴大脑学习机制实现终身学习
  2. java用线程插入一张图片_JAVA中怎么用线程实现图片的切换?
  3. logz.io一个企业级的ELK日志分析器 内部集成了机器学习识别威胁——核心:利用用户对于特定日志事件的反馈处理动作来学习判断日志威胁 + 类似语音识别的专家系统从各方收集日志威胁信息...
  4. FisherFace 进行人脸分裂
  5. 【开机自启】属于你的个性化!八步完成喜欢的软件开机自启!
  6. 微信小程序 PDF下载打印
  7. Java反射-继承关系
  8. 信息学奥赛一本通(1127:图像旋转)
  9. javascript基础修炼(10)——VirtualDOM和基本DFS
  10. 往数组里添加键值对_框架都是花哨的东西!js才是根基,分享一下给原生js数组的操作...
  11. Corporate Action Guidelines Terms
  12. python函数及方法大全_Python常用方法和技巧汇总
  13. sfm点云代码_SfM实现过程分析
  14. Gradle sync failed: 句柄无效。 的解决方法
  15. 永恒之蓝 MS17-010漏洞复现
  16. POI导出word中cell单元格内换行问题
  17. 解除隐藏已购项目_从AppStore的已购项目中隐藏已经购买的APP
  18. 强哥带你零基础学java-03运行第一个java程序
  19. html css 等比例缩放(记录)
  20. 七阶拉丁方阵_拉丁方阵【转】

热门文章

  1. 数加平台——阿里大数据OS实践
  2. 阿里云·数加,阿里下一代数据集成实践
  3. java怎么实现购物车_java实现网上购物车程序
  4. SAP HANA SQL系列四:数字函数
  5. 通过淘宝链接获取解析获取商品id(淘宝API )
  6. ap接口 php_cos-php-sdk-v5接口文档
  7. 数字集成电路设计考试概念总结
  8. 利用动态渲染页面对京东笔记本电脑信息爬取
  9. 帝企鹅变形记:开放与封闭 马化腾将左右下半生
  10. 【练习七 字符串编程题9. 音乐DJ和回响贝斯】