令人拍案叫绝的Wasserstein GAN

986907217 8年前
   <p>最近出现了一篇比较火热的 GAN 相关研究《 Wassertein GAN 》。中山大学的郑华滨在知乎上 发表了一篇文章介绍该研究内容 ,获得了极大的关注。机器之心经授权转载此篇文章,且因段内公式较多,有的公式采取了文字或截图等方式进行展示。</p>    <p>在 GAN 的相关研究如火如荼甚至可以说是泛滥的今天,一篇新鲜出炉的 arXiv 论文《Wassertein GAN(https://arxiv.org/abs/1701.07875)》却在 Reddit的Machine Learning 频道火了,连 Goodfellow 都在帖子里和大家热烈讨论,这篇论文究竟有什么了不得的地方呢? </p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/35ee7536442c44bbfee2ef752ca0d29c.jpg"></p>    <p>要知道自从 2014 年 Ian Goodfellow 提出以来,GAN 就存在着训练困难、生成器和判别器的 loss 无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进 DCGAN 依靠的是对判别器和生成器的架构进行实验枚举,最终找到一组比较好的网络架构设置,但是实际上是治标不治本,没有彻底解决问题。而今天的主角 Wasserstein GAN(下面简称 WGAN )成功地做到了以下爆炸性的几点:</p>    <ul>     <li> <p>彻底解决 GAN 训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度</p> </li>     <li> <p>基本解决了 collapse mode 的问题,确保了生成样本的多样性 </p> </li>     <li> <p>训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表 GAN 训练得越好,代表生成器产生的图像质量越高(如题图所示)</p> </li>     <li> <p>以上一切好处不需要精心设计的网络架构,最简单的多层全连接网络就可以做到</p> </li>    </ul>    <p>那以上好处来自哪里?这就是令人拍案叫绝的部分了——实际上作者整整花了两篇论文,在第一篇《Towards Principled Methods for Training Generative Adversarial Networks》里面推了一堆公式定理,从理论上分析了原始 GAN 的问题所在,从而针对性地给出了改进要点;在这第二篇《Wassertein GAN》里面,又再从这个改进点出发推了一堆公式定理,最终给出了改进的算法实现流程,而改进后相比原始 GAN 的算法实现流程却只改了四点:</p>    <ul>     <li> <p>判别器最后一层去掉 sigmoid</p> </li>     <li> <p>生成器和判别器的 loss 不取 log</p> </li>     <li> <p>每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c</p> </li>     <li> <p>不要用基于动量的优化算法(包括 momentum 和 Adam ),推荐 RMSProp , SGD 也行</p> </li>    </ul>    <p>算法截图如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/307629f848aa46decbcbcb3a77550681.jpg"></p>    <p>改动是如此简单,效果却惊人地好,以至于 Reddit 上不少人在感叹:就这样?没有别的了? 太简单了吧!这些反应让我想起了一个颇有年头的鸡汤段子,说是一个工程师在电机外壳上用粉笔划了一条线排除了故障,要价一万美元——画一条线,1美元;知道在哪画线, 9999 美元。上面这四点改进就是作者 Martin Arjovsky 划的简简单单四条线,对于工程实现便已足够,但是知道在哪划线,背后却是精巧的数学分析,而这也是本文想要整理的内容。</p>    <p>本文内容分为五个部分:</p>    <ul>     <li> <p>原始 GAN 究竟出了什么问题?(此部分较长)</p> </li>     <li> <p>WGAN 之前的一个过渡解决方案 </p> </li>     <li> <p>Wasserstein 距离的优越性质</p> </li>     <li> <p>从 Wasserstein 距离到 WGAN </p> </li>     <li> <p>总结</p> </li>    </ul>    <p>理解原文的很多公式定理需要对测度论、 拓扑学等数学知识有所掌握,本文会从直观的角度对每一个重要公式进行解读,有时通过一些低维的例子帮助读者理解数学背后的思想,所以不免会失于严谨,如有引喻不当之处,欢迎在评论中指出。</p>    <p>以下简称《Wassertein GAN》为 「 WGAN 本作 」 ,简称《Towards Principled Methods for Training Generative Adversarial Networks》为 「 WGAN前作 」 。</p>    <p>WGAN 源码实现:https://github.com/martinarjovsky/WassersteinGAN</p>    <p>第一部分:原始 GAN 究竟出了什么问题?</p>    <p>回顾一下,原始 GAN 中 判别器要最小化如下损失函数,尽可能把真实样本分为正例,生成样本分为负例:</p>    <p><img src="https://simg.open-open.com/show/84e3d847955ac346fcea443be2e8e3a5.png"></p>    <p>其中 Pr 是真实样本分布,Pg 是由生成器产生的样本分布。对于生成器, Goodfellow 一开始提出来一个损失函数,后来又提出了一个改进的损失函数,分别是</p>    <p><img src="https://simg.open-open.com/show/3edffe3c945d420fcc853c565ee656f2.png"></p>    <p><img src="https://simg.open-open.com/show/f899ec0a0d2267827d92dbad930c8db3.png"></p>    <p>后者在 WGAN 两篇论文中称为 「 the - log D alternative 」 或 「 the - log D trick 」 。WGAN 前作分别分析了这两种形式的原始 GAN 各自的问题所在,下面分别说明。</p>    <p>第一种原始 GAN 形式的问题</p>    <p>一句话概括:判别器越好,生成器梯度消失越严重。WGAN 前作从两个角度进行了论证,第一个角度是从生成器的等价损失函数切入的。</p>    <p>首先从公式 1 可以得到,在生成器 G 固定参数时最优的判别器 D 应该是什么。对于一个具体的样本,它可能来自真实分布也可能来自生成分布,它对公式 1 损失函数的贡献是</p>    <p><img src="https://simg.open-open.com/show/2ce1e827bb5dd563ab0af042e2e040e2.png"></p>    <p>令其关于 D(x) 的导数为0,得</p>    <p><img src="https://simg.open-open.com/show/d6b3d7e04b083b9bb295cf422cc8bdf1.png"></p>    <p>化简得最优判别器为:</p>    <p><img src="https://simg.open-open.com/show/74e4d48f1f7a3accc6012748a06c008d.png"></p>    <p>这个结果从直观上很容易理解,就是看一个样本x来自真实分布和生成分布的可能性的相对比例。如果 Pr(x) = 0 且 Pg(x) 不等于0,最优判别器就应该非常自信地给出概率0;如果Pr(x) = Pg(x),说明该样本是真是假的可能性刚好一半一半,此时最优判别器也应该给出概率 0.5。</p>    <p>然而 GAN 训练有一个 trick,就是别把判别器训练得太好,否则在实验中生成器会完全学不动( loss 降不下去),为了探究背后的原因,我们就可以看看在极端情况——判别器最优时,生成器的损失函数变成什么。给公式2加上一个不依赖于生成器的项,使之变成</p>    <p><img src="https://simg.open-open.com/show/5a6aa6d509c8da34123cc4b01e014a9f.png"></p>    <p>注意,最小化这个损失函数等价于最小化公式2,而且它刚好是判别器损失函数的反。代入最优判别器即公式4,再进行简单的变换可以得到</p>    <p><img src="https://simg.open-open.com/show/5372e003cd8bfe399cf29b8b094b495c.png"></p>    <p>变换成这个样子是为了引入 Kullback–Leibler divergence(简称KL散度)和 Jensen-Shannon divergence(简称 JS 散度)这两个重要的相似度衡量指标,后面的主角之一 Wasserstein 距离,就是要来吊打它们两个的。所以接下来介绍这两个重要的配角—— KL 散度和 JS 散度:</p>    <p><img src="https://simg.open-open.com/show/b73d60d9f2752d8d607f5409fa4454d3.jpg"></p>    <p>于是公式5就可以继续写成</p>    <p><img src="https://simg.open-open.com/show/aeccd08bf5fe4adcfa830c613f4bb8ed.png"></p>    <p>到这里读者可以先喘一口气,看看目前得到了什么结论:根据原始 GAN 定义的判别器 loss,我们可以得到最优判别器的形式;而在最优判别器的下,我们可以把原始 GAN 定义的生成器 loss 等价变换为最小化真实分布 Pr 与生成分布 Pg 之间的 JS 散度。我们越训练判别器,它就越接近最优,最小化生成器的 loss 也就会越近似于最小化 Pr 和 Pg 之间的 JS 散度。</p>    <p>问题就出在这个 JS 散度上。我们会希望如果两个分布之间越接近它们的 JS 散度越小,我们通过优化 JS 散度就能将 Pg 「 拉向 」 Pr,最终以假乱真。这个希望在两个分布有所重叠的时候是成立的,但是如果两个分布完全没有重叠的部分,或者它们重叠的部分可忽略(下面解释什么叫可忽略),它们的 JS 散度是多少呢?</p>    <p>答案是 log2 ,因为对于任意一个 x 只有四种可能:</p>    <p><img src="https://simg.open-open.com/show/9728123c29c25d7fec92ec30b19beea1.jpg"></p>    <p>第一种对计算 JS 散度无贡献,第二种情况由于重叠部分可忽略所以贡献也为 0,第三种情况对公式 7 右边第一个项的贡献是 log 2*P1/(P1+0) = log 2,第四种情况与之类似,所以最终 JS(P1||P2) = log 2。</p>    <p>换句话说,无论 Pr 跟 Pg 是远在天边,还是近在眼前,只要它们俩没有一点重叠或者重叠部分可忽略,JS 散度就固定是常数 log2,而这对于梯度下降方法意味着——梯度为 0!此时对于最优判别器来说,生成器肯定是得不到一丁点梯度信息的;即使对于接近最优的判别器来说,生成器也有很大机会面临梯度消失的问题。</p>    <p>但是 Pr 与 Pg 不重叠或重叠部分可忽略的可能性有多大?不严谨的答案是:非常大。比较严谨的答案是:当 Pr 与 Pg 的支撑集(support)是高维空间中的低维流形(manifold)时, Pr 与 Pg 重叠部分测度(measure)为 0 的概率为 1 。</p>    <p>不用被奇怪的术语吓得关掉页面,虽然论文给出的是严格的数学表述,但是直观上其实很容易理解。首先简单介绍一下这几个概念:</p>    <ul>     <li> <p>支撑集(support)其实就是函数的非零部分子集,比如 ReLU 函数的支撑集就是(0,+∞),一个概率分布的支撑集就是所有概率密度非零部分的集合。</p> </li>     <li> <p>流形(manifold)是高维空间中曲线、曲面概念的拓广,我们可以在低维上直观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有 2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。</p> </li>     <li> <p>测度(measure)是高维空间中长度、面积、体积概念的拓广,可以理解为 「 超体积 」 。</p> </li>    </ul>    <p>回过头来看第一句话, 「 当 Pr 与 Pg 的支撑集是高维空间中的低维流形时 」 ,基本上是成立的。原因是 GAN 中的生成器一般是从某个低维(比如 100 维)的随机分布中采样出一个编码向量,再经过一个神经网络生成出一个高维样本(比如 64x64 的图片就有 4096 维)。当生成器的参数固定时,生成样本的概率分布虽然是定义在 4096 维的空间上,但它本身所有可能产生的变化已经被那个 100 维的随机分布限定了,其本质维度就是 100 ,再考虑到神经网络带来的映射降维,最终可能比 100 还小,所以生成样本分布的支撑集就在 4096 维空间中构成一个最多 100 维的低维流形, 「 撑不满 」 整个高维空间。</p>    <p>「 撑不满 」 就会导致真实分布与生成分布难以 「 碰到面 」 ,这很容易在二维空间中理解:一方面,二维平面中随机取两条曲线,它们之间刚好存在重叠线段的概率为 0;另一方面,虽然它们很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低一个维度,长度(测度)为 0,可忽略。三维空间中也是类似的,随机取两个曲面,它们之间最多就是比较有可能存在交叉线,但是交叉线比曲面低一个维度,面积(测度)是 0,可忽略。从低维空间拓展到高维空间,就有了如下逻辑:因为一开始生成器随机初始化,所以 Pr 几乎不可能与 Pg 有什么关联,所以 Pg 几乎不可能与Pr有什么关联,所以它们的支撑集之间的重叠部分要么不存在,要么就比 Pr 和 Pg 的最小维度还要低至少一个维度,故而测度为 0 。所谓 「 重叠部分测度为0 」 ,就是上文所言 「 不重叠或者重叠部分可忽略 」 的意思。</p>    <p>我们就得到了 WGAN 前作中关于生成器梯度消失的第一个论证:在(近似)最优判别器下,最小化生成器的 loss 等价于最小化 Pr 与 Pg 之间的 JS 散度,而由于 Pr 与 Pg 几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数 log2 ,最终导致生成器的梯度(近似)为 0,梯度消失。</p>    <p>接着作者写了很多公式定理从第二个角度进行论证,但是背后的思想也可以直观地解释:</p>    <ul>     <li> <p>首先,Pr 与 Pg 之间几乎不可能有不可忽略的重叠,所以无论它们之间的 「 缝隙 」 多狭小,都肯定存在一个最优分割曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。</p> </li>     <li> <p>由于判别器作为一个神经网络可以无限拟合这个分隔曲面,所以存在一个最优判别器,对几乎所有真实样本给出概率 1,对几乎所有生成样本给出概率 0,而那些隔不开的部分就是难以被最优判别器分类的样本,但是它们的测度为 0,可忽略。</p> </li>     <li> <p>最优判别器在真实分布和生成分布的支撑集上给出的概率都是常数(1和0),导致生成器的 loss 梯度为 0,梯度消失。</p> </li>    </ul>    <p>有了这些理论分析,原始 GAN 不稳定的原因就彻底清楚了:判别器训练得太好,生成器梯度消失,生成器 loss 降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以 GAN 才那么难训练。</p>    <p>实验辅证如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bffa1e897113b3cff267618e1e786ea8.jpg"></p>    <p>WGAN 前作 Figure 2。先分别将 DCGAN 训练1,20,25个 epoch,然后固定生成器不动,判别器重新随机初始化从头开始训练,对于第一种形式的生成器 loss 产生的梯度可以打印出其尺度的变化曲线,可以看到随着判别器的训练,生成器的梯度均迅速衰减。注意y轴是对数坐标轴。</p>    <p>第二种原始 GAN 形式的问题</p>    <p>一句话概括:最小化第二种生成器 loss 函数,会等价于最小化一个不合理的距离衡量,导致两个问题,一是梯度不稳定,二是 collapse mode 即多样性不足。WGAN 前作又是从两个角度进行了论证,下面只说第一个角度,因为对于第二个角度我难以找到一个直观的解释方式,感兴趣的读者还是去看论文吧(逃)。</p>    <p>如前文所说,Ian Goodfellow 提出的 「 - log D trick 」 是把生成器 loss 改成</p>    <p><img src="https://simg.open-open.com/show/07202edfd00ed6720cd1e0ff9dfaf24f.png" alt="令人拍案叫绝的Wasserstein GAN" width="123" height="20"></p>    <p>上文推导已经得到在最优判别器 D* 下</p>    <p><img src="https://simg.open-open.com/show/c5cb2a0a30a58f205c634ae1442da85c.png"></p>    <p>我们可以把 KL 散度(注意下面是先 g 后 r)变换成含 D* 的形式:</p>    <p><img src="https://simg.open-open.com/show/f5d7acc0dac70518827fcd4f58c78a75.png"></p>    <p>由公式 3,9,10 可得最小化目标的等价变形</p>    <p><img src="https://simg.open-open.com/show/5dbce02a970e3a08654b1956e0112450.png"></p>    <p>注意上式最后两项不依赖于生成器 G,最终得到最小化公式 3 等价于最小化</p>    <p><img src="https://simg.open-open.com/show/28428c7c1ef79b4d29a04dcc32cfb486.png"></p>    <p>这个等价最小化目标存在两个严重的问题。第一是它同时要最小化生成分布与真实分布的 KL 散度,却又要最大化两者的 JS 散度,一个要拉近,一个却要推远!这在直观上非常荒谬,在数值上则会导致梯度不稳定,这是后面那个 JS 散度项的毛病。</p>    <p>第二,即便是前面那个正常的 KL 散度项也有毛病。因为KL散度不是一个对称的衡量,KL(Pg || Pr)与KL(Pr || Pg)是有差别的。以前者为例</p>    <p><img src="https://simg.open-open.com/show/29f4e092849bc50e0a1ee93432c47bf7.jpg"></p>    <p>换言之,</p>    <p>KL(Pg||Pr)</p>    <p>对于上面两种错误的惩罚是不一样的,第一种错误对应的是 「 生成器没能生成真实的样本 」 ,惩罚微小;第二种错误对应的是 「 生成器生成了不真实的样本 」 ,惩罚巨大。第一种错误对应的是缺乏多样性,第二种错误对应的是缺乏准确性。这一放一打之下,生成器宁可多生成一些重复但是很 「 安全 」 的样本,也不愿意去生成多样性的样本,因为那样一不小心就会产生第二种错误,得不偿失。这种现象就是大家常说的 collapse mode。</p>    <p>第一部分小结:在原始 GAN 的(近似)最优判别器下,第一种生成器 loss 面临梯度消失问题,第二种生成器 loss 面临优化目标荒谬、梯度不稳定、对多样性与准确性惩罚不平衡导致 mode collapse 这几个问题。</p>    <p>实验辅证如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1ead5d597c19e1fdab0a4ad1aa921ed5.jpg"></p>    <p>WGAN 前作 Figure 3 。先分别将 DCGAN 训练 1,20,25个 epoch,然后固定生成器不动,判别器重新随机初始化从头开始训练,对于第二种形式的生成器 loss 产生的梯度可以打印出其尺度的变化曲线,可以看到随着判别器的训练,蓝色和绿色曲线中生成器的梯度迅速增长,说明梯度不稳定,红线对应的是 DCGAN 相对收敛的状态,梯度才比较稳定。</p>    <p>第二部分: WGAN 之前的一个过渡解决方案 </p>    <p>原始 GAN 问题的根源可以归结为两点,一是等价优化的距离衡量(KL 散度、JS 散度)不合理,二是生成器随机初始化后的生成分布很难与真实分布有不可忽略的重叠。</p>    <p>WGAN 前作其实已经针对第二点提出了一个解决方案,就是对生成样本和真实样本加噪声,直观上说,使得原本的两个低维流形 「 弥散 」 到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在重叠, JS 散度就能真正发挥作用,此时如果两个分布越靠近,它们 「 弥散 」 出来的部分重叠得越多, JS 散度也会越小而不会一直是一个常数,于是(在第一种原始 GAN 形式下)梯度消失的问题就解决了。在训练过程中,我们可以对所加的噪声进行退火(annealing),慢慢减小其方差,到后面两个低维流形 「 本体 」 都已经有重叠时,就算把噪声完全拿掉, JS 散度也能照样发挥作用,继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。以上是对原文的直观解释。</p>    <p>在这个解决方案下我们可以放心地把判别器训练到接近最优,不必担心梯度消失的问题。而当判别器最优时,对公式9取反可得判别器的最小 loss 为</p>    <p><img src="https://simg.open-open.com/show/8cacb701155cafa2d4ceec1ce9ca10d6.png"></p>    <p>其中P_{r+epsilon}和P_{g+epsilon}分别是加噪后的真实分布与生成分布。反过来说,从最优判别器的 loss 可以反推出当前两个加噪分布的 JS 散度。两个加噪分布的 JS 散度可以在某种程度上代表两个原本分布的距离,也就是说可以通过最优判别器的 loss 反映训练进程!……真的有这样的好事吗?</p>    <p>并没有,因为加噪 JS 散度的具体数值受到噪声的方差影响,随着噪声的退火,前后的数值就没法比较了,所以它不能成为 pr 和 Pg 距离的本质性衡量。</p>    <p>因为本文的重点是 WGAN 本身,所以 WGAN 前作的加噪方案简单介绍到这里,感兴趣的读者可以阅读原文了解更多细节。加噪方案是针对原始 GAN 问题的第二点根源提出的,解决了训练不稳定的问题,不需要小心平衡判别器训练的火候,可以放心地把判别器训练到接近最优,但是仍然没能够提供一个衡量训练进程的数值指标。但是 WGAN 本作就从第一点根源出发,用 Wasserstein 距离代替 JS 散度,同时完成了稳定训练和进程指标的问题!</p>    <p>作者未对此方案进行实验验证。 </p>    <p>第三部分:Wasserstein 距离的优越性质</p>    <p>Wasserstein 距离又叫 Earth-Mover(EM) 距离,定义如下:</p>    <p><img src="https://simg.open-open.com/show/39ce0e1ec4966a6fa4c8acf29bf12d7d.png"></p>    <p>解释如下: Pi(Pr, Pg) 是 Pr和 Pg 组合起来的所有可能的联合分布的集合,反过来说, Pi(Pr, Pg) 中每一个分布的边缘分布都是Pr和Pg。对于每一个可能的联合分布 gamma 而言,可以从中采样(x, y)服从 gamma 分布得到一个真实样本x和一个生成样本 y,</p>    <p>并算出这对样本的距离 ||x-y||,所以可以计算该联合分布 gamma 下样本对距离的期望值</p>    <p><img src="https://simg.open-open.com/show/62af8d18670ddd7661953e8410b6a298.png"> 在所有可能的联合分布中能够对这个期望值取到的下界</p>    <p><img src="https://simg.open-open.com/show/db46992b10df98f495f31a9b960ff265.png"> 就定义为 Wasserstein 距离。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0e3010aab340fd5b386e01cd1d64e263.jpg"></p>    <p>此时容易得到(读者可自行验证)</p>    <p><img src="https://simg.open-open.com/show/4fe8635780599bc6babe574f99c718bd.jpg"></p>    <p>KL 散度和 JS 散度是突变的,要么最大要么最小,Wasserstein 距离却是平滑的,如果我们要用梯度下降法优化这个参数,前两者根本提供不了梯度,Wasserstein 距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则 KL 和 JS 既反映不了远近,也提供不了梯度,但是 Wasserstein 却可以提供有意义的梯度。</p>    <p>第四部分:从 Wasserstein 距离到 WGAN</p>    <p>既然 Wasserstein 距离有如此优越的性质,如果我们能够把它定义为生成器的 loss,不就可以产生有意义的梯度来更新生成器,使得生成分布被拉向真实分布吗?</p>    <p>没那么简单,因为 Wasserstein 距离定义(公式12)中的 <img src="https://simg.open-open.com/show/396e3bfe3039c829e8b544503510fb2d.png"> 没法直接求解,不过没关系,作者用了一个已有的定理把它变换为如下形式</p>    <p><img src="https://simg.open-open.com/show/9a560857a38c34a35fb47d9897632ff3.png"></p>    <p>证明过程被作者丢到论文附录中了,我们也姑且不管,先看看上式究竟说了什么。</p>    <p>首先需要介绍一个概念——Lipschitz 连续。它其实就是在一个连续函数上面额外施加了一个限制,要求存在一个常数K>=0使得定义域内的任意两个元素x1和x2都满足</p>    <p><img src="https://simg.open-open.com/show/ae36174f5d9ecd841b2c89f54c792176.png"></p>    <p>此时称函数 f 的 Lipschitz 常数为K。</p>    <p>简单理解,比如说 f 的定义域是实数集合,那上面的要求就等价于 f 的导函数绝对值不超过 K 。再比如说 log(x) 就不是 Lipschitz 连续,因为它的导函数没有上界。 Lipschitz 连续条件限制了一个连续函数的最大局部变动幅度。</p>    <p>公式13的意思就是在要求函数f的 Lipschitz 常数 ||f||L 不超过K的条件下,对所有可能满足条件的 f 取到 <img src="https://simg.open-open.com/show/ff0bcdf22fee0895521c6dfdc97f4613.png"> 的上界,然后再除以 K。特别地,我们可以用一组参数w来定义一系列可能的函数fw, 此时求解公式13可以近似变成求解如下形式:</p>    <p><img src="https://simg.open-open.com/show/553edec1e7f9568e5e371cba597accb5.png"></p>    <p>再用上我们搞深度学习的人最熟悉的那一套,不就可以把用一个带参数的神经网络来表示嘛!由于神经网络的拟合能力足够强大,我们有理由相信,这样定义出来的一系列虽然无法囊括所有可能,但是也足以高度近似公式13要求的那个 <img src="https://simg.open-open.com/show/e0c59305bdff96a8f99582ccd12c05fb.png"> 了。</p>    <p>最后,还不能忘了满足公式 14 中 <img src="https://simg.open-open.com/show/187f7d06bb17ff027ed489b12b470e43.png"> 这个限制。我们其实不关心具体的K是多少,只要它不是正无穷就行,因为它只是会使得梯度变大 K 倍,并不会影响梯度的方向。所以作者采取了一个非常简单的做法,就是限制神经网络 f_theta 的所有参数 w_i 的不超过某个范围 [-c, c] ,比如  <img src="https://simg.open-open.com/show/abfe08822bc6b56db9b72a8777cf444b.png"> ,此时所有偏导数 <img src="https://simg.open-open.com/show/950c20e633b7891f7c8538cf9f94a2ab.png"> 也不会超过某个范围,所以一定存在某个不知道的常数 K 使得 fw 的局部变动幅度不会超过它,Lipsc hitz 连续条件得以满足。具体在算法实现中,只需要每次更新完 w 后把它 clip 回这个范围就可以了。</p>    <p>到此为止,我们可以构造一个含参数 w、最后一层不是非线性激活层的判别器网络,在限制w不超过某个范围的条件下,使得</p>    <p><img src="https://simg.open-open.com/show/d1711cfdbb1e1dd4ebb8ca42f39196e6.png"> (公式15)</p>    <p>尽可能取到最大,此时 L 就会近似真实分布与生成分布之间的 Wasserstein 距离(忽略常数倍数 K)。注意原始 GAN 的判别器做的是真假二分类任务,所以最后一层是 sigmoid,但是现在 WGAN 中的判别器 f_w 做的是近似拟合 Wasserstein 距离,属于回归任务,所以要把最后一层的 sigmoid 拿掉。</p>    <p>接下来生成器要近似地最小化 Wasserstein 距离,可以最小化 L,由于 Wasserstein 距离的优良性质,我们不需要担心生成器梯度消失的问题。再考虑到的第一项与生成器无关,就得到了 WGAN 的两个 loss</p>    <p><img src="https://simg.open-open.com/show/0319e160abe70feaffc3ec88c0f8f0f7.jpg"></p>    <p>公式15是公式17的反,可以指示训练进程,其数值越小,表示真实分布与生成分布的 Wasserstein 距离越小,GAN 训练得越好。</p>    <p>WGAN 完整的算法流程已经贴过了,为了方便读者此处再贴一遍:</p>    <p><img src="https://simg.open-open.com/show/716fb257aa9d3f5cf867b900d121c6c3.jpg" alt="令人拍案叫绝的Wasserstein GAN" width="550" height="321"></p>    <p>上文说过,WGAN 与原始 GAN 第一种形式相比,只改了四点:</p>    <ul>     <li> <p>判别器最后一层去掉 sigmoid</p> </li>     <li> <p>生成器和判别器的 loss 不取 log</p> </li>     <li> <p>每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数 c</p> </li>     <li> <p>不要用基于动量的优化算法(包括 momentum和Adam),推荐 RMSProp,SGD 也行</p> </li>    </ul>    <p>前三点都是从理论分析中得到的,已经介绍完毕;第四点却是作者从实验中发现的,属于trick,相对比较 「 玄 」 。作者发现如果使用 Adam,判别器的 loss 有时候会崩掉,当它崩掉时, Adam 给出的更新方向与梯度方向夹角的 cos 值就变成负数,更新方向与梯度方向南辕北辙,这意味着判别器的 loss 梯度是不稳定的,所以不适合用 Adam 这类基于动量的优化算法。作者改用 RMSProp 之后,问题就解决了,因为 RMSProp 适合梯度不稳定的情况。</p>    <p>对 WGAN 作者做了不少实验验证,本文只提比较重要的两点。第一,判别器所近似的 Wasserstein 距离与生成器的生成图片质量高度相关,如下所示(此即题图):</p>    <p><img src="https://simg.open-open.com/show/879943542a4d27a010ef86f27cb607cd.jpg" alt="令人拍案叫绝的Wasserstein GAN" width="550" height="356"></p>    <p>第二, WGAN 如果用类似 DCGAN 架构,生成图片的效果与 DCGAN 差不多:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/2427cdd6ffa2c0ede14e31a95f80d163.jpg"></p>    <p>但是厉害的地方在于 WGAN 不用 DCGAN 各种特殊的架构设计也能做到不错的效果,比如如果大家一起拿掉 Batch Normalization 的话, DCGAN 就崩了:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/5dbc070970b60ce2aa0091a41bc88164.jpg"></p>    <p>如果 WGAN 和原始 GAN 都使用多层全连接网络(MLP),不用 CNN, WGAN 质量会变差些,但是原始 GAN 不仅质量变得更差,而且还出现了 collapse mode ,即多样性不足:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/e3b4d8f37d6300c5be616ed845a40a57.jpg"></p>    <p>第三,在所有WGAN的实验中未观察到collapse mode,作者也只说应该是解决了,最后补充一点论文没提到,但是我个人觉得比较微妙的问题。判别器所近似的Wasserstein距离能够用来指示单次训练中的训练进程,这个没错;接着作者又说它可以用于比较多次训练进程,指引调参,我倒是觉得需要小心些。比如说我下次训练时改了判别器的层数、节点数等超参,判别器的拟合能力就必然有所波动,再比如说我下次训练时改了生成器两次迭代之间,判别器的迭代次数,这两种常见的变动都会使得Wasserstein距离的拟合误差就与上次不一样。那么这个拟合误差的变动究竟有多大,或者说不同的人做实验时判别器的拟合能力或迭代次数相差实在太大,那它们之间还能不能直接比较上述指标,我都是存疑的。</p>    <p>评论区的知乎网友@Minjie Xu 进一步指出,相比于判别器迭代次数的改变,对判别器架构超参的改变会直接影响到对应的Lipschitz常数K,进而改变近似Wasserstein距离的倍数,前后两轮训练的指标就肯定不能比较了,这是需要在实际应用中注意的。对此我想到了一个工程化的解决方式,不是很优雅:取同样一对生成分布和真实分布,让前后两个不同架构的判别器各自拟合到收敛,看收敛到的指标差多少倍,可以近似认为是后面的K2相对前面的K1变化倍数,于是就可以用这个变化倍数校正前后两轮训练的指标。</p>    <p>第五部分:总结</p>    <p>WGAN 前作分析了 Ian Goodfellow 提出的原始 GAN 两种形式各自的问题,第一种形式等价在最优判别器下等价于最小化生成分布与真实分布之间的 JS 散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及 JS 散度的突变特性,使得生成器面临梯度消失的问题;第二种形式在最优判别器下等价于既要最小化生成分布与真实分布直接的 KL 散度,又要最大化其 JS 散度,相互矛盾,导致梯度不稳定,而且 KL 散度的不对称性使得生成器宁可丧失多样性也不愿丧失准确性,导致 collapse mode 现象。</p>    <p>WGAN 前作针对分布重叠问题提出了一个过渡解决方案,通过对生成样本和真实样本加噪声使得两个分布产生重叠,理论上可以解决训练不稳定的问题,可以放心训练判别器到接近最优,但是未能提供一个指示训练进程的可靠指标,也未做实验验证。</p>    <p>WGAN 本作引入了 Wasserstein 距离,由于它相对KL散度与 JS 散度具有优越的平滑特性,理论上可以解决梯度消失问题。接着通过数学变换将 Wasserstein 距离写成可求解的形式,利用一个参数数值范围受限的判别器神经网络来最大化这个形式,就可以近似 Wasserstein 距离。在此近似最优判别器下优化生成器使得 Wasserstein 距离缩小,就能有效拉近生成分布与真实分布。 WGAN 既解决了训练不稳定的问题,也提供了一个可靠的训练进程指标,而且该指标确实与生成样本的质量高度相关。作者对 WGAN 进行了实验验证。</p>    <p> </p>    <p>来自:http://www.jiqizhixin.com/article/2247</p>    <p> </p>