zoukankan      html  css  js  c++  java
  • Wasserstein GAN

      WGAN论文指出,原始GAN以JS、KL散度作为损失容易导致生成器梯度消失,他们提出了一种新的损失函数——Wasserstein 距离,很大程度上解决了GAN训练难的问题。

    原始GAN的损失函数的缺陷

      当两个分布之间重叠很小,或者说,两个分布的概率密度同时大于0的区域在整个分布的占比几乎为0时(无穷小,但还不是0),随着分布之间的靠拢,用于衡量分布之间差异的KL、JS散度几乎没有变化,也就是梯度十分小。而真实分布与生成分布在训练开始时的重叠就是十分小的(证明要用到拓扑学和测度论,直观理解请看后面的知乎链接),并且由于我们只能用部分样本代替真实分布与生成分布来训练,这种情况就更加严重了,从而解释了生成器训练时梯度消失的问题。

      论文举了个简单的例子用于理解。如下图所示,$P_1,P_2$表示两个二维空间中的均匀分布:

      如果我们要将$P_1$移动到$P_2$,就要计算两个分布之间的差异,然后再计算梯度来减小差异。下面分别以KL散度、JS散度和Wasserstein 距离作为差异指标,计算得到:

    egin{equation*} egin{aligned} &KL(P_1||P_2) = KL(P_2||P_1) = left{ egin{aligned} &+infty,& heta e 0\ &0,& heta = 0 end{aligned} ight.\ &JS(P_1||P_2) = left{ egin{aligned} &log 2,& heta e 0\ &0,& heta = 0 end{aligned} ight. \ &W(P_1,P_2) = | heta| end{aligned} end{equation*}

      看得出,KL、JS散度的梯度是0,没法训练。而Wasserstein距离则计算出一个符合常识的距离指标,可以计算梯度控制$P_1$向$P_2$靠近。

      当然以上只是简单的举例,你一眼就能看出$P_1,P_2$之间的距离用$ heta$表示更合理。下面开始具体介绍Wasserstein 距离,以及以它为损失函数的WGAN。

    Wasserstein距离与WGAN

      Wasserstein距离又叫Earth-Mover(EM)距离。对于真实分布$P_r$和生成分布$P_g$,Wasserstein距离$W(P_r,P_g)$定义如下:

    egin{equation} egin{aligned} W(P_r,P_g) = inflimits_{gammasimPi(P_r,P_g)}mathbb{E}_{(x,y)simgamma}left(||x-y|| ight) end{aligned} end{equation}

      其中$Pi(P_r,P_g)$表示$P_r$和$P_g$组合起来的所有可能的联合分布的集合,集合中的每个联合分布的边缘分布都为$P_r$和$P_g$。对于每一个可能的联合分布$gamma$而言,可以从中采样$(x,y)sim gamma$得到一个真实样本$x$和一个生成样本$y$,并算出这对样本的距离$||x-y||$,所以可以计算该联合分布$gamma$下样本对距离的期望值$mathbb{E}_{(x,y)simgamma}left(||x-y|| ight)$。而在所有可能的联合分布中能够对这个期望值取到的下界$inflimits_{gammasimPi(P_r,P_g)}mathbb{E}_{(x,y)simgamma}left(||x-y|| ight)$,就定义为Wasserstein距离。

      Wasserstein距离是比JS、KL散度在定义上更弱的差异评估标准,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。但是上面的定义是不能用作GAN的损失的,于是论文用了一个已有的定理把它变换为如下形式(推导过程用到了拓扑学和测度论,先挖个坑,以后学了再回来填):

    egin{equation} egin{aligned} W(P_r,P_g) =  frac{1}{K}suplimits_{|f|_Lle K}mathbb{E}_{xsim P_r}[f(x)] -mathbb{E}_{xsim P_g}[f(x)] end{aligned} end{equation}

      其中$|f|_Lle K$表示,对于常数$K$,连续函数$f$定义域内的任意两个元素$x_1$和$x_2$都应满足

    egin{equation} egin{aligned}|f(x_1)-f(x_2)|le K|x_1-x_2|end{aligned} end{equation}

      定义域为实数域时,上式所表达的就是$|f'(x)|le K$。这个限制叫Lipschitz连续。为了可以在神经网络中应用,进一步近似变换$(2)$式为如下形式

    egin{equation} egin{aligned} K cdot W(P_r,P_g) approx maxlimits_{w:|f_w|_Lle K}mathbb{E}_{xsim P_r}[f_w(x)] -mathbb{E}_{xsim P_g}[f_w(x)] end{aligned} end{equation}

      将所有可能的函数,用一个带参数的函数来表示,通过改变参数来表示这些可能的函数。虽然不能囊括所有可能,但也足以高度近似$(2)$式了。这样一来,判别器就可以定义为$f_w$。而对于公式中的Lipschitz连续限制,论文则是直接将判别器的所有参数$w_i$限制在某个范围$[-c,c]$内。因为我们其实无需关心具体的K是多少,它只是会使得梯度变大$K$倍,并不影响梯度的方向。

      综上,判别器做的事就是优化判别器参数,来计算真实分布与生成分布之间的Wasserstein距离,也就是最大化$(4)$式。损失函数如下:

    egin{equation} egin{aligned}L(w)= -mathbb{E}_{xsim P_r}[f_w(x)] +mathbb{E}_{xsim P_g}[f_w(x)] end{aligned} end{equation}

      而生成器做的事则是优化生成器的参数,最小化真实分布与生成分布之间的Wasserstein距离,也就是最小化$(4)$式。忽略生成器参数的无关项,损失函数如下:

    egin{equation} egin{aligned}L( heta)= -mathbb{E}_{xsim P_g}[f_w(x)] end{aligned} end{equation}

      生成器参数$ heta$控制生成分布$P_g$。

      WGAN优化式写成最小最大的形式如下:

    egin{equation} egin{aligned}   minlimits_{ heta:P_g}maxlimits_{w:|f_w|_Lle K}mathbb{E}_{xsim P_r}[f_w(x)] -mathbb{E}_{xsim P_g}[f_w(x)] end{aligned} end{equation}

      论文中训练WGAN的算法如下:

      总的来说,尽管上面写了一大通,WGAN对原始GAN做出的实际改进十分简洁,只有四点:

      1、判别器输出层去掉sigmoid。

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

      3、将判别器参数的绝对值截断在常数$c$以内。

      4、不要用基于动量的优化算法,推荐RMSProp,SGD也行(这是实验得出的结论)。

    参考资料

      Wasserstein GAN

      令人拍案叫绝的Wasserstein GAN - 知乎 

  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/qizhou/p/13547202.html
Copyright © 2011-2022 走看看