我们在训练对抗神经网络的时候总是出现各种各样的问题。比如说模式奔溃 (mode collapse)和 梯度消失(vanishing gradient)的问题。
比如说,模式奔溃,指的是生成器的学习效率远高于辨别器的时候,那么学习一段时间过后,辨别器便无法再继续提供有用的损失信息,以至于生成器无法得到参考而塌陷到一个局部最小点中去。而梯度消失指的是当损失趋于无限大或者无限小时,损失函数的值变化基本可以视为忽略,那么梯度就会消失,进而停止学习或者学习效率基本为零。
正如GANs模型中,我们经常使用BCE损失函数 (BCE loss problem)来作为模型的损失函数,但是其会存在一定的模式奔溃和梯度消失的问题。 为了解决这个问题,WGAN使用 EMD (Earth mover’s distance) 距离,通过类比定义两个曲线之间距离的方式来定义其损失的函数。
EMD 用于分析两张图片的距离,其实是计算两个分布数据之间的距离,也就是所谓的推土机距离。当其应用于比较生成图像和真图像的距离时,其不会直接想BCEloss那样直接使用判别器的判别结果,而是根据计算生成图像和真图像的分布距离来作为反馈,这样就可以直接避免上述的两个问题。一来模式不会立刻崩溃,而是生成一组图片才会有一个评分结果,并且比较的不是单一图像的差距,而是生成图像和真图像的分布差距。其次,这个距离可以通过对critic函数限制来达到避免梯度消失的问题。
Wasserstein loss: with c(x) critic
这个函数需要满足 1-Lipschitz 连续条件。This function needs to be 1-Lipschitz Continuous to validate W-loss
其主要是满足训练时的稳定性条件,其斜率的绝对值被正负一所限制。 which will maintain some stability during training
相对于BCE损失函数,W损失函数如何可以变得更加稳定?enforce this condition (feature space)
这个模型通过加入一个修正项的方式来矫正其满足1-lipschitz条件。
那么如何权衡? How much to weigh this regularization term against the main loss function 如何权衡main loss和penalty使得其满足1-L 连续条件
方法一: 梯度惩罚 Gradient penalty
这个方法很简单,当梯度大于一时,我们通过修正项进行修正,使得学习稳定一些。而如何检测梯度的值也非常重要,如果每次计算损失都检测,那么一定是不值当的。因此我们对特征空间中的点进行插值的方式类进行计算。x^\hat{x}x^便是插值点,我们只要计算插值点的梯度值来代替这一区域的梯度。
插值interpolation x^\hat{x}x^的表示式为:
x^=ϵx+(1−ϵ)g(z)\hat{x} = \epsilon x + (1- \epsilon)g(z) x^=ϵx+(1−ϵ)g(z)
C 表示critisizer, G代表 generator,上述表达式中 第一项 E(c(x))E(c(x))E(c(x)) 指的是C识别真图片的期望,因此,越高越好。第二项 E(c(g(x)))E(c(g(x)))E(c(g(x)))指的是C识别假图片的期望,因此越低越高,这样 第一项减去第二项便是越高越好,因此总体来说,对于C来说,整体项越大越好,C的有效率越高。而在当C取到最有效的鉴别器后,这时,寻找最高效的生成器便是最重要的。那么反过来,第一项无法改变,而第二项则是越大越好,越大意味着C把假图片识别成了真图片,因此整体便是越小越好。这也是为什么会有 min max之说。
方法二: Weight clipping
通过给gradient加入一个上限和下限来使其满足1-L连续条件,问题是这种方法降低了学习能力和速率,不建议采用
上一篇:Java:枚举类型