原始GAN存在训练不稳定的情况,主要原因是JS散度的选取不太合理。我们的目标是通过神经网络的学习,不断地让生成分布 P g P_{g} Pg 不断接近真实分布 P r P_{r} Pr。但是当使用JS散度作为两个分布之间的距离的度量时,如果两个分布之间没有重叠,或重叠部分可忽略,则JS散度的计算值始终为log2,即失去了指导 P g P_{g} Pg 向 P r P_{r} Pr 靠拢的梯度。与此同时, P g P_{g} Pg 和 P r P_{r} Pr 的支撑集属于高维空间的低维流形,因此两者的重叠部分可忽略不计,JS散度也始终接近于常数log2,造成了梯度的消失。
因此,要解决GAN训练不稳定的问题,就要从改变生成分布 P g P_{g} Pg 与真实分布 P r P_{r} Pr之间的距离度量入手。在WGAN中,作者把JS散度改为Wasserstein距离,达到的训练效果比GAN更加稳定。
Wasserstein距离
Wasserstein距离又称为推土机距离(Earth-Mover),其定义如下:
W ( P r , P g ) = i n f γ ∼ ∏ ( P r , P g ) E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] W(P_{r},P_{g})=\mathop{inf}\limits_{\gamma\sim\prod(P_{r},P_{g})}E_{(x,y)\sim\gamma}[||x-y||] W(Pr,Pg)=γ∼∏(Pr,Pg)infE(x,y)∼γ[∣∣x−y∣∣]
其中, ∏ ( P r , P g ) \prod(P_{r},P_{g}) ∏(Pr,Pg)表示两个分布 P r P_{r} Pr 和 P g P_{g} Pg 组合而成的联合分布集合。每一个 γ \gamma γ对应一个联合分布,在这个联合分布 γ \gamma γ 采样出一个样本对 ( x , y ) (x,y) (x,y),其中 x x x 为真实样本, y y y 为生成的数据,因此可以计算这个样本对中 x x x 和 y y y 的距离,即 ∣ ∣ x − y ∣ ∣ ||x-y|| ∣∣x−y∣∣,进而可以得到该联合分布 γ \gamma γ 下样本对距离的期望,在所有可能的联合分布中取到使期望最小的。
为什么Wasserstein距离又成为Earth-Mover?因为在上式中,相当于将生成分布 P g P_{g} Pg 里面的所有样本,移动到真实分布 P g P_{g} Pg 的对应位置,列举出所有可能的移动方案,并挑选出移动代价最小的方案。
Wasserstein距离的优点是即使两个分布没有重叠,仍然可以度量两个分布之间的距离,而非JS散度的常数log2。
WGAN
在引入Wasserstein距离后,直接将其引入到损失函数中显然是不现实的,因为要穷举出所有可能的联合分布,直接进行求解的难度相当大。因此,需要进行一些变换来在网络中引入Wasserstein距离。
于是WGAN的作者通过一个已经存在且非常复杂的定理,将Wasserstein距离转化为下式:
W ( P r , P g ) = 1 K s u p ∣ ∣ ∣ f ∣ ∣ L ≤ K E x ∼ P r [ f ( x ) ] − E x ∼ P g [ f ( x ) ] W(P_{r},P_{g})=\frac{1}{K}\mathop{sup}\limits_{|||f||_{L}\leq K}E_{x\sim P_{r}}[f(x)]-E_{x\sim P_{g}}[f(x)] W(Pr,Pg)=K1∣∣∣f∣∣L≤KsupEx∼Pr[f(x)]−Ex∼Pg[f(x)]
上面的公式意味着要最大化 E x ∼ P r [ f ( x ) ] − E x ∼ P g [ f ( x ) ] E_{x\sim P_{r}}[f(x)]-E_{x\sim P_{g}}[f(x)] Ex∼Pr[f(x)]−Ex∼Pg[f(x)]。也就是说,当样本 x x x 从真实分布 P r P_{r} Pr 中采样时,我们希望经过函数 f ( x ) f(x) f(x) 变换之后的期望值越大越好;同样地。当样本 x x x 从生成分布 P g P_{g} Pg 中采样时,我们希望经过函数 f ( x ) f(x) f(x) 变换之后的期望值越小越好。
但是 E x ∼ P r [ f ( x ) ] E_{x\sim P_{r}}[f(x)] Ex∼Pr[f(x)] 不能无止境的大,同时 E x ∼ P g [ f ( x ) ] E_{x\sim P_{g}}[f(x)] Ex∼Pg[f(x)] 也不能无止境的小,因为这样的话损失函数会越来越大,永远无法达到收敛。因此,需要对函数 f f f 做Lipschitz 连续的限制。对于 Lipschitz 连续,其定义如下:
∣ f ( x 1 ) − f ( x 2 ) ∣ ≤ K ∣ x 1 − x 2 ∣ |f(x_{1})-f(x_{2})|\leq K|x_{1}-x_{2}| ∣f(x1)−f(x2)∣≤K∣x1−x2∣
Lipschitz连续描述的是一个函数在任意点的导数都不超过常数 K K K,意味着这个函数 f ( x ) f(x) f(x) 是平滑的,不会出现梯度的突变。这个限制会使得损失函数可以收敛。我们并不关注这个 K K K 的值是多少,只要不是正无穷即可,因为 K K K 的大小并不会改变梯度的方向。
由于神经网络你和函数的能力非常强大,这里的函数 f ( x ) f(x) f(x) 可以使用神经网络来近似拟合。该神经网络就是鉴别器Discriminator,我们假设他的参数为 w w w,所以训练鉴别器时的损失函数就是在满足Lipschitz连续的约束下,去最大化L:
L = E x ∼ P r [ f w ( x ) ] − E x ∼ P g [ f w ( x ) ] L = E_{x\sim P_{r}}[f_{w}(x)]-E_{x\sim P_{g}}[f_{w}(x)] L=Ex∼Pr[fw(x)]−Ex∼Pg[fw(x)]
此时这个最大化的 L L L 就可以认为是生成分布与真实分布之间的Wasserstein距离。
那么问题来了,如何做Lipschitz约束?
这个问题在原始的WGAN论文中也困扰着作者,作者采用了非常简单粗暴的方法:将参数集 w w w 中所有的值 w i w_{i} wi 都限定在 [ − c , c ] [-c,c] [−c,c] 的范围内(weight clipping),此时一定会存在一个常数 K K K,使得关于输入样本的导数 ∂ f w ∂ x \frac{\partial f_{w}}{\partial x} ∂x∂fw 小于常数 K K K,即函数 f w f_{w} fw的局部变化幅度不超过某一个常数 K K K。
下面看一下WGAN中的算法步骤:
总得来说,WGAN相较于GAN来说有四点改动:
⋅ \cdot ⋅ 将生成分布与真实分布之间的距离由JS散度改为Waseerstein距离,在实际算法中对应上图的第5行:原始GAN对应的损失函数取log,而WGAN不需要取log;
⋅ \cdot ⋅ 每一次训练完Discriminator后,需要将 w w w中的每一个 w i w_{i} wi截断到 [ − c , c ] [-c,c] [−c,c]的范围内, c c c 的值通常取 0.01;
⋅ \cdot ⋅ WGAN中的Discriminator最后一层要把sigmoid激活层拿掉,因为WGAN不再是 0-1分类问题,而是变成了一个回归问题,让鉴别器函数 f w f_{w} fw 去近似拟合Wasserstein距离;
⋅ \cdot ⋅ WGAN采用RMSProp的优化方法,而并没有采用基于动量的Adam或Momentum,这是在实验中发现的trick。
WGAN-GP
WGAN-GP(Gradient Penalty)是WGAN的提升版本。在WGAN中,为了满足Lipschitz连续,作者强行采用了weight clipping 的做法,将Discriminator的参数都截断在区间 [ − 0.01 , 0.01 ] [-0.01,0.01] [−0.01,0.01]之间。然而鉴别器的loss试图将真假样本的分数拉开,由于weight clipping会独立的限制每一个网络参数的取值范围,因此会使得鉴别器的参数走向两个极端,即堆积在-0.01和+0.01,其参数取值如下图所示:
weight clipping还存在一个问题就是关于截断阈值 c c c 的选取,太小的阈值或太大的阈值都会导致训练中出现梯度弥散/爆炸的情况,因此需要选取一个合理的阈值 c c c。而实践中这个合理的阈值范围较小,因此会带来调参工作的麻烦。
基于WGAN中weight clipping上述的两个缺点,WGAN-GP的作者通过引入一个梯度惩罚项(Gradient Penalty)来取代weight clipping,实现Lipschitz连续的约束。在引入梯度惩罚项之后,Discriminator的loss可以写为:
L ( D ) = − E x ∼ P r D ( x ) + E x ∼ P g D ( x ) + λ E x ∼ χ [ ∣ ∣ ▽ x D ( x ) ∣ ∣ p − 1 ] 2 L(D)=-E_{x\sim P_{r}}D(x)+E_{x\sim P_{g}}D(x)+\lambda E_{x\sim \chi} [||\bigtriangledown_{x}D(x)||_{p}-1]^{2} L(D)=−Ex∼PrD(x)+Ex∼PgD(x)+λEx∼χ[∣∣▽xD(x)∣∣p−1]2
上式中的前两项与WGAN大同小异。目标是最小化loss,即增大真实样本的给分,减小生成样本的打分,同时最小化梯度惩罚项。通过第三项梯度惩罚项,我们可以看到这里将Lipschitz的K值设定为1。同时,不仅仅是梯度的norm不超过1都视为一样的,而是越接近于1越好。理由是在实践中我们需要利用梯度信息来指导生成分布向真实分布靠拢,所以梯度不至于过小,可以有效的加快收敛速度。
我们可以观察到,计算梯度惩罚项时,样本 x x x 是从分布 χ \chi χ 中采样的,这个分布 χ \chi χ 属于真实分布(红色区域)与生成分布(黄色区域) 之间的一个分布(蓝色区域),如下图所示:
也就是说,没有必要对整个样本空间中的区域进行Lipschitz约束,只需要针对夹在生成分布与真实分布中间的蓝色区域进行限制即可。为什么要选择这个区域?原文中作者说通过实验,发现选择这个区域的实验效果较好(嗯!先实验后理论)。其实也可以理解,我们的生成分布需要向真实分布靠近,而中间区域的梯度信息对两者的拉近有一定的指导作用。
那么这个中间的分布如何定义?首先选取一个 [ 0 , 1 ] [0,1] [0,1]之间的随机数 ϵ \epsilon ϵ,并采样一对样本: x r ∼ P r x_{r}\sim P_{r} xr∼Pr, x g ∼ P g x_{g}\sim P_{g} xg∼Pg,随后在两个样本点的连线上进行随机插值采样:
x ^ = ϵ x r + ( 1 − ϵ ) x g \hat{x}=\epsilon x_{r} +(1-\epsilon) x_{g} x^=ϵxr+(1−ϵ)xg
随后把所有按照上述流程采样得到的 x ^ \hat{x} x^ 所满足的分布定义为 P x ^ P_{\hat{x}} Px^,因此最终Discriminator的loss定义为:
L ( D ) = − E x ∼ P r D ( x ) + E x ∼ P g D ( x ) + λ E x ∼ P x ^ [ ∣ ∣ ▽ x D ( x ) ∣ ∣ p − 1 ] 2 L(D)=-E_{x\sim P_{r}}D(x)+E_{x\sim P_{g}}D(x)+\lambda E_{x\sim P_{\hat{x}}} [||\bigtriangledown_{x}D(x)||_{p}-1]^{2} L(D)=−Ex∼PrD(x)+Ex∼PgD(x)+λEx∼Px^[∣∣▽xD(x)∣∣p−1]2
通过引入Gradient Penalty,取代weight clipping,实现了Lipschitz连续的约束。其实不管是weight clipping也好,还是gradient penalty也好,他们的目的都是希望实现Lipschitz连续,即寻找梯度与常数K之间的关系,以达到函数平滑的效果。weight clipping显然有些粗暴,而gradient penalty通过公式有了一个更直观的度量方法。
需要注意的是,由于是对每一个样本进行梯度的惩罚,因此不能使用Batch Normalization。
最后贴一张WGAN-GP的算法流程:
小结
GAN中衡量生成分布与真实分布之间距离用到的是JS散度,而JS散度在两个分布的重叠可忽略时,其计算值固定为定值。而一开始随机生成的分布与真实分布间很难有不可忽略的重叠,因此会出现梯度消失的状况;再加上JS散度本身有梯度突变的特性,也会导致训练的不稳定。
因此在WGAN中,作者用Wasserstein距离取代了GAN中的JS散度,使得两个分布即使在没有重叠的时候,也可以衡量两者之间的远近。同时,Wasserstein距离相较于JS散度有平滑的特性,理论上可以解决梯度消失的问题。Wasserstein距离原始表达式看起来与损失函数关系不大,因此作者通过一个很复杂的理论,将Wasserstein距离转化成了两个期望的差值,在满足Lipschitz连续的约束下求最大,这个最大值可近似等价于Wasserstein距离。
而对于Lipschitz连续的约束,在WGAN中采用了将Discriminator的权重参数限定到一个较小的范围内,这样他的梯度也相对较小,从而总会有一个常数K,使得所有的梯度值小于K,从而满足Lipschitz连续。因此,将Wasserstein距离作为两个分布之间距离的衡量,可以有效的把生成分布向真实分布拉近,一定程度上解决了训练时梯度不稳定的问题,达到了更好的效果。
WGAN的weight clipping处理的有些粗暴,会导致参数走向两极化,同时不合理的阈值设定会导致梯度消失或爆炸。此外,将所有的梯度值都设定在小于K的范围也不太合理,因此WGAN-GP引入了一个梯度惩罚项,让梯度越趋近于K越好,这里的K设定为1,因为这样不仅可以解决梯度不稳定的问题,还可以加速收敛。最后,不必对整个样本空间进行Lipschitz约束,只需对夹在生成分布和真实分布中间的区域的样本进行梯度惩罚即可。
如果有不妥之处,还请大家交流指正。
参考:
https://www.jianshu.com/p/e901908a1d93
https://www.cnblogs.com/Allen-rg/p/10305125.html
https://www.bilibili.com/video/av24011528?p=6
https://blog.csdn.net/weixin_41036461/article/details/82385334
https://blog.csdn.net/qq_38826019/article/details/80786061?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task