GAN存在问题

训练困难,G和D多次尝试没有稳定性,Loss无法知道能否优化,生成样本单一,改进方案靠暴力尝试

WGAN

GAN的Loss函数选择不合适,使模型容易面临梯度消失,梯度不稳定,优化目标不定导致模型失败,WGAN,找到了更为合适的Loss函数,使得梯度呈线性,事实上WGAN对判别器权重进行了区间限制,使得权重控制在一定范围内,使得梯度更大概率的呈线性增长。

WGAN特点

无需平衡D,G的训练组合

解决collapse model(模型崩溃)问题,保证样本多样性

结构更改简单有效

改进方法:(充分利用神经网络拟合性能以及数值近似)

判别器最后一层去掉sigmoid

生成器和判别器的loss不取log

判别器的参数更新截断

不要用基于动量的优化算法,包括momentum和Adam),推荐RMSProp,SGD也行

算法截图如下:

以上是总体概括一下WGAN

接下来分析WGAN是如和改进的,(主要参照http://www.dataguru.cn/article-10687-1.html)

1.原始GAN究竟出了什么问题?

原始GAN中判别器要最小化如下损失函数,尽可能把真实样本分为正例,生成样本分为负例:

其中pr是真实样本分布,pg是由生成器产生的样本分布。对于生成器,Goodfellow一开始提出来一个损失函数,后来又提出了一个改进的损失函数,分别是:

第一种原始GAN形式的问题

一句话概括:判别器越好,生成器梯度消失越严重。WGAN前作从两个角度进行了论证,第一个角度是从生成器的等价损失函数切入的。

首先从公式1可以得到,在生成器G固定参数时最优的判别器D应该是什么。对于一个具体的样本,它可能来自真实分布也可能来自生成分布,它对公式1损失函数的贡献是

令其关于D(x)的导数为0,得

化简得最优判别器为:

这个结果从直观上很容易理解,就是看一个样本x来自真实分布和生成分布的可能性的相对比例。如果pr(x)=0且pg(x)≠0,最优判别器就应该给出概率0;如果pr(x)=pg(x),说明样本是真是假的可能性刚好一半一半,此时最优判别器的概率为0.5。

  然而GAN训练有一个trick,就是别把判别器训练得太好,否则在实验中生成器会完全学不动(loss降不下去),为了探究背后的原因,我们就可以看看在极端情况——判别器最优时,生成器的损失函数变成什么。给公式2加上一个不依赖于生成器的项,使之变成

注意,最小化这个损失函数等价于最小化公式2,而且它刚好是判别器损失函数的反。带入最优判别器即公式4,在进行简单的变换可以得到

于是就可以引入KL散度和JS散度(两个相似度衡量指标),Wasserstein距离,应用在GAN损失函数比他们更适合,接下来介绍KL散度与JS散度:

于是公式5就可以写成

  根据原始GAN定义的判别器loss,我们可以得到最优判别器的形式;而在最优判别器下,我们可以把原始GAN定义的生成器loss等价变换为最小化真实分布pr与生成分布pg之间的JS散度。我们越训练判别器,它就越接近最优,最优化生成器的loss也就会越近似于最小化pr和pg之间的JS散度。

  问题就在这个JS散度上。我们会希望,如果两个分布之间越接近它们的JS散度越小,我们通过优化JS散度就能将pg“拉向”pr,最终以假乱真。这个希望在两个分布有所重叠的时候是成立的,但是如果两个分布完全没有重叠的部分,或者它门重叠的部分可忽略(下面解释什么叫可忽略),它们的JS散度是多少呢?

答案是log2,因为对任意一个x只有四种可能:

p1(x)=0且p2(x)=0

p1(x)≠0且p2(x)≠0

p1(x)=0且p2(x)≠0

p1(x)≠0且p2(x)=0

第一种对计算JS散度无贡献,第二种情况由于重叠部分可忽略所以贡献也为0,第三种情况对公式7右边第一个项的贡献是logp2/(1/2(p2+0))=log2,第四种情况与之类似,所以最终JS(p1||p2)=log2。换句话说,无论pr与pg距离远近,只要它们俩没有一点重叠或者重叠部分可忽略,JS散度就是固定常数log2,而这对于梯度下降方法意味着梯度为0。此时对于最优判别器来说,生成器肯定是得不到梯度信息的;即使对于接近最优的判别器来说,生成器也有很大机会面临梯度消失的问题。

但是pr与pg不重叠或重叠部分可忽略的可能性有多大?不严谨的答案是:非常大。比较严谨的答案是:当pr与pg的支撑集(support)是高维空间中的低维流形(manifold)时,pr与pg重叠部分测度(measure)为0的概率为1。

  支撑集(support)其实就是函数的非零部分子集,比如ReLU函数的支撑集就是(0,+∞),一个概率分布的支撑集就是所有概率密度非零部分的集合。

  流形(manifold)是高维空间中曲线、曲面概念的拓广,可以在低维上直观观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。

  测度(measure)是高维空间中长度、面积、体积概念的拓广,可以理解为“超体积”。  

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

  “撑不满”就会导致真实分布与生成分布难以“碰到面”,这很容易在二维空间中理解:—方面,二维平面中随机取两条曲线,它们之间刚好存在重叠线段的概率为0:另—方面,虽然它们很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低—个维度,长度(测座)为0,可忽略。三维空间中也是类似的,随机两个曲面,它们之间最多就是比较有可能存在交叉线,但是交叉线比曲面低一个维度,面积(测度)是0,可忽略。从低雄空间拓展到高维空间,就有了如下逻辑:因为—开始生成器随机初始化,所以pg几乎不可能与pr有什么关联,所以它们的支撑集之间的重叠部分要么不存在,要么就比pr和pg的最小维度还要低至少—个维度,故而测度为 0”。所谓“重叠部分测度为 0”,就是上文所言“不重叠或者重叠部可忽略”的意思。

  我们就得到了WGAN前作中关于生成器梯度消失的第一个论证:在(近似)最优判别器下,最小化生成器的loss等价于最小化f与B之间的JS散度,而由于pr与pg几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数log2,最终导致生成器的梯度(近似)为0,梯度消失。

接着作者写了很多公式定理从第二个角度进行论证,但是背后的思想也可以直观地解释:

  (1)首先,pr与pg之间几乎不可能有不可忽略的重叠,所以无论它们之间的“缝隙”多狭小,都肯定存在一个最优分割曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。
  (2)由于判别器作为—个神经网络可以无限拟合这个分隔曲面,所以存在—个最优判别器,对几乎所有真实样本给出概率1,对几乎所有生成样本给出概率0,而那些隔不开的部分就是难以被最优判别器分类的样本,但是它们的测度为0,可忽略。

  (3)最优判别器在真实分布和生成分布的支撑集上给出的概率都是常数(1和0),导致生成器的loss梯度为0,梯度消失。

  有了这些理论分析,原始GAN不稳定的原因就彻底清楚了:判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练。

实验辅证如下:

WGAN前作《Towards Principled Methods for Training Generative Adversarial Networks》Figure 2。先分别将DCGAN训练1,20,25个epoch,然后固定生成器不动,判别器重新随机初始化从头开始训练,对于第一种形式的生成器loss产生的梯度可以打印出其尺度的变化曲线,可以看到随着判别器的训练,生成器的梯度均迅速衰减。注意y轴是对数坐标轴。

第二种原始GAN形式的问题

  一句话概括:最小化第二种生成器loss函数,会等价于最小化一个不合理的距离衡量,导致两个问题,一是梯度不稳定,二是collapse mode即多样性不足。WGAN前作又是从两个角度进行了论证,下面只说第一个角度。

  如前文,lan Goodfellow提出的“-log D trick”是把生成器loss改成

  

上文推导已经得到在最优判别器D*下

我们可以把KL散度(注意下面是先g后r)变换成含D*的形式:

由公式3,9,10可得最小化目标的等价变形

注意上式后两项不依赖与生成器G,最终得到最小化公式3等价于最小化

KL(pg||pr)-2JS(pr||pg) (公式11)

这个等价最小化目标存在两个严重的问题。第一是它同时要最小化生成分布与真实分布的KL散度.却又要最大化两者的JS散度。一个要拉近,一个却要推远,这在直观上非常荒谬。在数值会导致梯度不稳定.这是后面那个JS散度项的毛病。

第二,即便最前面那个正常的KL散度项也有毛病。因为KL散度不是一个对称的衡量,KL(pg||pr)与KL(pr||pg)是有差别的。以前者为例

换言之,KL(pg||pr)对于上面两种错误的惩罚是不—样的,第—种错误对应的是“生成器没能生成真实的样本”,惩罚微小;第二种错误对应的是“生成器生成了不真实的样本”,惩罚巨大。第—种错误对应的是缺乏多样性,第二种错误对应的是缺乏准确性。这一放一打之下,生成器宁可多生成一些重复但是很“安全”的样本,也不愿意去生成多样性的样本,因为那样一不小心就会产生第二种错误,得不偿失。这种现象就是大家常说的collapse mode。

  第一部分小结:在原始GAN的(近似)最优判别器下,第一种生成器loss面临梯度消失问题,第二种生成器loss面临优化目标荒谬、梯度不稳定、对多样性与准确性惩罚不平衡导致mode collapse这几个问题。

实验辅证如下:

  WGAN前作Figure 3。先分别将DCGAN训练1,20,25个epoch,然后固定生成器不动,判别器重新随机初始化从头开始训练,对于第二种形式的生成器loss产生的梯度可以打印出其尺度的变化曲线,可以看到随着判别器的训练,蓝色和绿色曲线中生成器的梯度迅速增长,说明梯度不稳定,红线对应的是DCGAN相对收敛的状态,梯度才比较稳定。

2.WGAN之前的一个过渡解决方案 

  原始GAN问题的根源可以归结为两点,一是等价优化的距离衡量(KL散度、JS散度)不合理,二是生成器随机初始化后的生成分布很难与真实分布有不可忽略的重叠。

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

  在这个解决方案下我们可以放心地把判别器训练到接近最优,不必担心梯度消失的问题。而当判别器最优时,对公式9取反可得判别器的最小loss为

其中pr+ϵ和pg+ϵ分别是加噪后的真实分布与生成分布。反过来说,从最优判别器的loss可以反推出当前两个加噪分布的JS散度。两个加噪分布的JS散度可以在某种程度上代表两个原本分布的距离,也就是说可以通过最优判别器的loss反映训练进程!然而事与愿违因为加噪JS散度的具体数值受到噪声的方差影响,随着噪声的退火,前后的数值就没法比较了,所以它不能成为pr和pg距离的本质性衡量。

加噪方案是针对原始GAN问题的第二点根源提出的,解决了训练不稳定的问题,不需要小心平衡判别器训练的火候。可以放心地把判别器训练到接近最优,但是仍然没能够提供一个衡量训练进程的数值指标。但是WGAN本作就从第一点根源出发,用Wasserstein距离代替JS散度。同时完成了稳定训练和进程指标的问题。

3.Wasserstein距离的优越性质

Wasserstein距离又叫Earth-Mover(EM)距离,定义如下:

解释如下:∏(pr,pg)是pr和pg组台起来的所有可能的联台分布的集合,反过来说,∏(pr,pg)中每一个分布的边缘分布都是pr和pg。对于每一个可能的联台分布γ而言,可以从中采样(x,y)~γ得到一个真实样本x和一个生成样本y,并算出这对样本的距离llx-yll,所以可以计算该联台分布γ下,样本对距离的期望值E(x,y)~γ[||x-y||]。在所有可能的联台分布中能够对这个期望值取到的下界,就定义为Wasserstein距离。直观上可以把E(x,y)~γ[||x-y||]理解为在γ这个"路径规划"下把pr这堆“沙土”挪到pg“位置“所需的“肖耗”,而W(pr,pg)就是"最优路径规划"下的"最小消耗”,所以才叫Earth-Mover(推土机)距离。

Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein蹄仍然能够反映它们的远近。WGAN本作通过简单的例子展示了这一点。考虑如下二维空间中的两个分布p1和p2,p1在线段AB上均匀分布,p2在线段CD上均匀分布,通过控制参数θ可以控制着两个分布的距离远近。

此时容易得到:

KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化θ这个参数,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。

4.从Wasserstein距离到WGAN

  既然Wasserstein距离有如此优越的性质,如果我们能够把它定义为生成器的loss,不就可以产生有意义的梯度来更新生成器,使得生成分布被拉向真实分布吗?
  没那么简单,因为Wasserstein距离定义(公式12)中的没法直接求解,所以作者用了一个已有的定理把它变换如下形式:

证明过程被作者丢到论文附录中了,我们也姑且不管,先看看上式究竟说了什么。

  首先需要介绍—概念一Lipschitz连续。它其实就是在一个连续函数f上面额外施加了一个限制,要求存在—个常数K≥0使得定义域内的任意两个元素x1和x2都满足|f(x1)-f(x2)| ≤ K|x1-x2|此时称函数f的Lipschitz常数为K。

简单理解,比如说 f 的定义域是实数集合,那上面的要求就等价于 f 的导函数绝对值不超过K。再比如说log(x)就不是Lipschitz连续,因为它的导函数没有上界。Lipschitz连续条件限制了—个连续函数的最大局部变动幅度。

公式13的意思就是在要求函数 f 的Lipschitz常数|| ||L不超过K的条件下,对所有可能满足条件的 取到  的上界,然后再除以K。特别地,我们可以用一组参数w来定义一系列可能的函数 fw,此时求解公式13可以近似变成求解如下形式

  再用上我们搞深度学习的人最熟悉的那—套,不就可以把 f 用—个带参数w的神经网络来表示嘛!由于神经网络的拟合能力足够强大,我们有理由相信,这样定义出来的一系列fw虽然无法囊括所有可能,但是也足以高度近似公式13要求的那个sup|| f ||L≤K了。

  最后,还不能忘了满足公式14中|| fw ||L≤K这个限制。我们其实不关心具体的K是多少,只要它不是正无穷就行,因为它只是会使得梯度变大K倍,并不会影响梯度的方向。所以作者采取了一个非常简单的做法,就是限制神经网络fθ的所有参数wi的值不超过某个范围[-c,c],比如wi∈[-0.01,0.01],此时关于输入样本x的导数 ∂f/ ∂x 也不会超过某个范围,所以一定存在某个不知道的常数使得的 fw 局部变动幅度不会超过它,Lipschitzi连续条件得以满足。具体在算法中实现,只需要每次更新完w后把它clip回这个范围就可以了。

  到此为止,我们可以构造一个含参数w、最后一层不是非线性激活层的判别器网络fw在限制w不超过某个范围的条件下,使得

尽可能取到最大,此时L就会近似真实分布与生成分布之间的Wasserstein距离(忽略常数倍数K)。注意原始GAN的判别器做的是真假二分类任务。所以最后一层是sigmoid,但是现在WGAN中的判别器 fw 做的是近似拟合Wasserstein距离,属于回归任务,所以要把最后一层的sigmoid拿掉。

  接下来生成器要近似地最小化Wasserstein距离,可以最小化L,由于Wasserstein距离的优良性质,我们不需要担心生成器梯度消失的问题。再考虑到L的第一项与生成器无关,就得到了WGAN的两个loss。

公式15是公式17的反,可以指示训练进程,其数值越小,表示真实分布与生成分布的Wasserstein距离越小,GAN训练得越好。

上文说过,WGAN与原始GAN第一种形式相比,只改了四点:

  判别器最后一层去掉sigmoid

  生成器和判别器的loss不取log

  每次更新判别器的参数之后把它们的值截断到不超过一个固定常数c

  不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

  前三点都是从理论分析中得到的,已经介绍完毕;第四点却是作者从实验中发现的,属于trick,相对比较“玄”。作者发现如果使用Adam,判别器的loss有时候会崩掉,当它崩掉时,Adam给出的更新方向与梯度方向夹角的cos值就变成负数,更新方向与梯度方向南辕北辙,这意味着判别器的loss梯度是不稳定的,所以不适合用Adam这类基于动量的优化算法。作者改用RMSProp之后,问题就解决了,因为RMSProp适合梯度不稳定的情况。

5.总结

  WGAN前作分析了Ian Goodfellow提出的原始GAN两种形式各自的问题,第一种形式等价在最优判别器下等价于最小化生成分布与真实分布之间的JS散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及JS散度的突变特性,使得生成器面临梯度消失的问题;第二种形式在最优判别器下等价于既要最小化生成分布与真实分布之间的KL散度,又要最大化其JS散度,相互矛盾,导致梯度不稳定,而且KL散度的不对称性使得生成器宁可丧失多样性也不愿丧失准确性,导致collapse mode现象。

  WGAN前作针对分布重叠问题提出了一个过渡解决方案,通过对生成样本和真实样本加噪声使得两个分布产生重叠,理论上可以解决训练不稳定的问题,可以放心训练判别器到接近最优,但是未能提供一个指示训练进程的可靠指标,也未做实验验证。

  WGAN本作引入了Wasserstein距离,由于它相对KL散度与JS散度具有优越的平滑特性,理论上可以解决梯度消失问题。接着通过数学变换将Wasserstein距离写成可求解的形式,利用一个参数数值范围受限的判别器神经网络来较大化这个形式,就可以近似Wasserstein距离。在此近似最优判别器下优化生成器使得Wasserstein距离缩小,就能有效拉近生成分布与真实分布。WGAN既解决了训练不稳定的问题,也提供了一个可靠的训练进程指标,而且该指标确实与生成样本的质量高度相关。作者对WGAN进行了实验验证。

深度学习-Wasserstein GAN论文理解笔记的更多相关文章

  1. 深度学习之 GAN 进行 mnist 图片的生成

    深度学习之 GAN 进行 mnist 图片的生成 mport numpy as np import os import codecs import torch from PIL import Imag ...

  2. Coursera深度学习(DeepLearning.ai)编程题&笔记

    因为是Jupyter Notebook的形式,所以不方便在博客中展示,具体可在我的github上查看. 第一章 Neural Network & DeepLearning week2 Logi ...

  3. 【深度学习】--GAN从入门到初始

    一.前述 GAN,生成对抗网络,在2016年基本火爆深度学习,所有有必要学习一下.生成对抗网络直观的应用可以帮我们生成数据,图片. 二.具体 1.生活案例 比如假设真钱 r 坏人定义为G  我们通过 ...

  4. 点云深度学习的3D场景理解

    转载请注明本文链接: https://www.cnblogs.com/Libo-Master/p/9759130.html PointNet: Deep Learning on Point Sets ...

  5. 关于Wasserstein GAN的一些笔记

    这篇笔记基于上一篇<关于GAN的一些笔记>. 1 GAN的缺陷 由于 $P_G$ 和 $P_{data}$ 它们实际上是 high-dim space 中的 low-dim manifol ...

  6. deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面 听课笔记

    1. 应用机器学习是高度依赖迭代尝试的,不要指望一蹴而就,必须不断调参数看结果,根据结果再继续调参数. 2. 数据集分成训练集(training set).验证集(validation/develop ...

  7. deeplearning.ai 神经网络和深度学习 week4 深层神经网络 听课笔记

    1. 计算深度神经网络的时候,尽量向量化数据,不要用for循环.唯一用for循环的地方是依次在每一层做计算. 2. 最常用的检查代码是否有错的方法是检查算法中矩阵的维度. 正向传播: 对于单个样本,第 ...

  8. 深度学习-InfoGAN论文理解笔记

    在弄清楚InfoGAN之前,可以先理解一下变分推断目的以及在概率论中的应用与ELBO是什么,以及KL散度 https://blog.csdn.net/qy20115549/article/detail ...

  9. 深度学习-语言处理特征提取 Word2Vec笔记

    Word2Vec的主要目的适用于词的特征提取,然后我们就可以用LSTM等神经网络对这些特征进行训练. 由于机器学习无法直接对文本信息进行有效的处理,机器学习只对数字,向量,多维数组敏感,所以在进行文本 ...

随机推荐

  1. haproxy 2.0 dataplaneapi docker 镜像

    为了方便测试dataplaneapi 基于官方的docker镜像,制作了一个简单的包含dataplaneapi 的镜像 下载dataplaneapi https://github.com/haprox ...

  2. STL next_permutation 全排列

    调用方法: ]={,,,}; )){ ;i<;i++) printf("%d ",arr[i]); puts(""); } 测试效果: 注:可以看到1 2 ...

  3. 洛谷 P2872 【[USACO07DEC]道路建设Building Roads】

    P2872 传送门 首先 题目概括:题目让着求使所有牧场都联通.需要修建多长的路. 显然这是一道最小生成树板子题(推荐初学者做). 那我就说一下kruskal吧. Kruskal算法是一种用来查找最小 ...

  4. 【CF241E】Flights

    [CF241E]Flights 题面 洛谷 题解 对于原来的图,如果一条边不出现在\(1\)到\(n\)的路径上面,直接\(ban\)掉即可. 那么考虑一条边\(u\rightarrow v\),一定 ...

  5. lintcode-720重排带整数字符串

    题目描述: 给一包含大写字母和整数(从 0 到 9)的字符串, 试写一函数返回有序的字母以及数字和. 样例 给出 str = AC2BEW3, 返回 ABCEW5字母按字母表的顺序排列, 接着是整数的 ...

  6. Linux里使用rz和sz命令

    lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,官网:http://freecode.com/projects/lrzsz/ windows 需要向centos服务器上传文件 ...

  7. UDF——判断边界类型

  8. .Net Core3 新特性整理

    .net core 3实现了.net 标准2.1. 1.生成可执行文件 以前版本需要dotnet run运行项目,.net core 3支持直接生成目标平台的可执行文件.比如windows就是exe了 ...

  9. qt5 源码编译

    源码 qt-everywhere-src-5.11.3 依赖 apt-get install bison build-essential gperf flex ruby python libasoun ...

  10. Nginx+keepalived实现负载均衡高可用配置

    1. 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了屏蔽负载均衡服务 ...