Wasserstein GAN 与 WGAN-GP

一、fGAN使用JS散度存在的问题

当$P_G$分布与$P_{data}$分布没有重叠的时候,此时的JSD恒等于$log2$,这样导致$P_G$分布难以向$P_{data}$进行移动。

而大多数情况下,$P_G$与$P_{data}$是难以重叠的,其原因有两方面理解:

  1. 原始数据角度

    $P_{data}$与$P_G$和二维图像相似都属于高维空间的低维流形。因而其重叠的部分几乎可以被忽略(三维空间中的两个交叉曲面投影到二维中可能只有两个点是相交的)

  2. 采样角度

    由于采样的数量较少,而二者重叠的部分又比较小,所以很容易采样出来的都不是重叠部分的,因而会产生不重叠的现象。

二、 WGAN

参考:令人拍案叫绝的Wasserstein GAN

  1. 使用Wasserstein距离来替代JSD

    ​ Wasserstein距离又称作是Earth Mover’s 距离,他的目的是考虑一个最小的代价,将$P$分布转换成近似$Q$分布,如果用条形图来表示的话就和搬土块差不多。

    ​ 这样就带来一个问题,如上图所示,搬土块的方式有很多,那么哪种方式代价最小?这里常用的方式就是穷举moving plans找到一个代价小的方式。

    ​ 下图就是一个moving plan $\gamma$其中每个小方块代表从P到Q需要搬动多少土,越亮搬得越多,对于P和Q上的每一个Bar都代表着对应的一行或者一列的小方块的累和。那么Wasserstein距离对应的就是求解一个最优化问题,使得穷举出来的不同的moving plan代价最小

  2. WGAN

    那么将Wasserstein距离应用到GAN中,就需要通过$V(G,D)$来评估Wasserstein距离,将原来的JSD换掉。其形式为:

​ 其目标是让在$P_{data}$分布上的D值更大,让在$P_G$分布上的D值更小。

  1. 1-Lipschitz条件

    Lipschitz function的目的是约束Discriminator函数不要过于崎岖,应该趋于平滑。如果没有进行平滑性约束,D可能在$P_G$部分趋于负无穷,而在$P_{data}$部分趋于正无穷。

    Lipschitz function:

    当$K=1$的时候称为”1-Lipschitz”,其中不等式左边部分为输出变化率,右边部分为输入变化率,可以看出来该条件是将D的导数约束在-1~1之间。

  2. Weight Clipping

    ​ 这个是作者在发表论文的时候采取的一种比较粗暴的方式,而且并不能产生真正意义上的1-Lipschitz约束。对于$||f_w||_L \leq K​$这个限制。我们其实不关心具体的$K​$是多少,只要它不是正无穷就行,因为它只是会使得梯度变大$K​$倍,并不会影响梯度的方向。所以作者采取了一个非常简单的做法,就是限制神经网络$f_\omega​$的所有参数$w_i​$的不超过某个范围$[-c, c]​$,比如$w_i \in [- 0.01, 0.01]​$,此时关于输入样本$x​$的导数$\frac{\partial f_w}{\partial x}​$也不会超过某个范围,所以一定存在某个不知道的常数$K​$使得$f_w​$的局部变动幅度不会超过它,Lipschitz连续条件得以满足。具体在算法实现中,只需要每次更新完$w​$后把它clip回这个范围就可以了。

三、Improved WGAN (WGAN-GP)

  1. 原理

    先来看一下在WGAN-GP中是如何改进以满足1-Lipschitz条件的。由上面的Lipschitz function可以得到,满足约束条件的等价条件是

​ 也就是说,我们可以通过在原有的V(G,D)上加一个惩罚项,使得其满足上述约束:

​ 由于上述条件说明对于$\forall x​$都满足,而难以实际采样到所有的样本,因而需要使用一个$P_{penalty}​$分布来进行采样。即将上式变成:

​ 在WGAN-GP中采用的$P_{penalty}$是通过$P_G$与$P_{data}$间的随机插值方式进行采样的:

​ 这种方式并不是一个绝对的方式,论文中说明该种采样方式是可以达到一定效果的。

  1. 形式改变
  • 判别器最后一层去掉sigmoid
  • 生成器和判别器的loss不取log
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

原始GAN的判别器做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的判别器$f_w​$做的是近似拟合Wasserstein距离,属于回归任务,所以要把最后一层的sigmoid拿掉。

四、WGAN-GP(GAN的稳定性)

WGAN梯度裁剪的问题

梯度裁剪会导致最优化困难。在梯度裁剪约束下,大多数神经网络架构只有在学习极其简单地函数时才能达到k地最大梯度范数。因此,通过梯度裁剪来实现k-Lipschitz约束将会导致critic偏向更简单的函数。如下图所示,在小型数据集上,权重剪枝不能捕捉到数据分布的高阶矩。

算法:

先随机采一对真假样本,还有一个0-1的随机数:

在$x_r$和$x_g$的连线上进行随机线性插值采样:

最终的Loss:

  • Gradient Penalty 项: $\lambda\mathbb{E}_{\hat{x}\sim\mathbb{P}_\hat{x}}[(||\nabla_{\hat{x}}D(\hat{x})||_2-1)^2]$
  • Wasserstein 距离项: $\mathbb{E}_{\hat{x}\sim\mathbb{P}_g}[D(\tilde{x})]-\mathbb{E}_{x\sim\mathbb{P}_r}[D(x)]$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# [GP] 先随机采一对真假样本,还有一个0-1的随机数:
epsilon = tf.random_uniform(shape=[batch_size, 1], minval=0., maxval=1.)
# [GP] 在x_r和x_g的连线上进行随机线性插值采样:
X_hat_State = self.expert_s + epsilon * (self.agent_s - self.expert_s)
X_hat_Action = expert_a_one_hot + epsilon * (agent_a_one_hot - expert_a_one_hot)
X_hat_s_a = tf.concat([X_hat_State, X_hat_Action], axis=1)

...

with tf.variable_scope('Discriminator_loss'):
wasserstein = tf.reduce_mean(crit_A) - tf.reduce_mean(crit_e) # Wasserstein 距离
grad_D_X_hat = tf.gradients(X_hat_crit, [X_hat_s_a])[0]
slopes = tf.sqrt(tf.reduce_sum(tf.square(grad_D_X_hat), reduction_indices=[1]))
gradient_penalty = tf.reduce_mean((slopes - 1.) ** 2) #[GP] Gradient Penalty
loss = wasserstein + LAMBDA * gradient_penalty
tf.summary.scalar('discriminator', loss)

本文标题:Wasserstein GAN 与 WGAN-GP

文章作者:zhkmxx930

发布时间:2019年04月11日 - 16:04

最后更新:2019年07月18日 - 17:07

原始链接:https://zhkmxx9302013.github.io/post/64ddacfe.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

一分钱也是爱,mua~