AI机动队
首发于AI机动队
生成模型中的左右互搏术:生成对抗网络GAN——深度学习第二十章(四)

生成模型中的左右互搏术:生成对抗网络GAN——深度学习第二十章(四)

继续总结花书第20章最后一部分生成对抗网络Generative Adversarial Network,简称GAN。主要结合斯坦福Syllabus | CS 231N中与Generative Model相关内容以及NIPS 2016 tutorial: Generative Adversarial Networks来进行总结。

我们之前总结的两个主要的模型FVBN与VAE都是显性的定义了概率密度分布,假如我们并不需要求密度分布,而只是希望模型能产生合理的样本,那么我就可以放弃对密度分布的定义,而GAN就是这样一种模型,它采取了博弈论的解决方法:通过两个神经网络的相互博弈,其中一个叫做生成网络Generator Network,一个叫做判别网络Discriminator Network,生成网络尽力产生可以以假乱真的样本来迷惑判别网络,判别网络尽力区分真实样本与生成网络生成的假样本,通过不断的交替学习,两个网络的准确度都越来越高,最后生成网络可以模拟与训练集分布相同的样本分布,如下图所示。

更详细地,我们用 D 来表示判别函数, \theta ^{(D)} 来表示该网络的参数,用 J^{(D)}(\theta ^{(D)}, \theta ^{(G)}) 来表示其损失函数,用 G 来表示生成函数,用 \theta ^{(G)} 来表示该网络的参数,用 J^{(G)}(\theta ^{(D)}, \theta ^{(G)}) 来表示其损失函数。生成网络的作用是在只能控制\theta ^{(G)}的情况下尽量减小J^{(G)}(\theta ^{(D)}, \theta ^{(G)}),而判别网络的作用是在只能控制\theta ^{(D)}的情况下尽量减小J^{(D)}(\theta ^{(D)}, \theta ^{(G)})。把这两个网络看做两个玩家,每个玩家都只能控制自己的参数,而不能改变另一个玩家的参数,所以相较于将该问题看做一个优化问题,更自然的是当做博弈论中的博弈问题,而该问题的解就是纳什均衡(Nash equilibrium)状态,即 (\theta ^{(D)}, \theta ^{(G)}) 使得 J^{(D)} 相对于 \theta ^{(D)} 极小同时 J^{(G)} 相对于\theta ^{(G)}极小。

对于判别网络,其损失函数就是经典的二元分类器的交叉熵损失 J^{(D)}(\theta ^{(D)}, \theta ^{(G)}) = -E_{x\sim p_{data}}log\ D_{\theta _D}(x) - E_{z\sim p_z}log(1-D_{\theta _D}(G_{\theta _G}(z)))

其中来自于真实分布的样本标记是1,而来自于生成网络的样本标记为0。

我们如何定义生成网络的损失函数呢?最简单的假设就是假设这是一个零和博弈 zero-sum game。则 J^{(G)} = -J^{(D)} ,由于它与判别网络损失恰恰相反,所以我们可以用minmax的形式表示我们希望得到的解

\theta ^* = \underset{\theta ^{(G)}}{\mathrm{argmin}}\ \underset{\theta ^{(D)}}{\mathrm{max}}V(\theta ^{(D)},\theta ^{(G)})

其中 V(\theta ^{(D)}, \theta ^{(G)})=E_{x\sim p_{data}}log\ D_{\theta _D}(x) +E_{z\sim p_z}log(1-D_{\theta _D}(G_{\theta _G}(z)))

以上表达式可以做如下理解:判别网络的目的是令 V(\theta ^{(D)}, \theta ^{(G)}) 尽量大就是使真实样本 D_{\theta _D}(x) 接近于1,而伪造样本 D_{\theta _D}(G_{\theta _G}(z)) 接近于0。而生成网络的目的是令 V(\theta ^{(D)}, \theta ^{(G)}) 尽量小即使伪造样本D_{\theta _D}(G_{\theta _G}(z)) 接近于1。

训练过程就是在如下两步中交替进行:

  • 对判别网络进行梯度上升 \underset{\theta ^{(D)}}{\mathrm{max}}[E_{x\sim p_{data}}log\ D_{\theta _D}(x) +E_{z\sim p_z}log(1-D_{\theta _D}(G_{\theta _G}(z)))]
  • 对生成网络进行梯度下降  \underset{\theta ^{(G)}}{\mathrm{min}}E_{z\sim p_z}log(1-D_{\theta _D}(G_{\theta _G}(z)))

但是实际训练中,生成网络如果以如此目标进行优化效果并不好,因为我们希望的是当生成的样本真实度较差时,我们希望梯度较高以更快的进入到效果较好的区间,但是 log(1-D_{\theta _D}(G_{\theta _G}(z)))D_{\theta _D}(G_{\theta _G}(z)) 接近0的区间较为平滑,梯度较小,不易优化,所以我们通常选择另一种目标函数  \underset{\theta ^{(G)}}{\mathrm{max}}E_{z\sim p_z}log(D_{\theta _D}(G_{\theta _G}(z))) 进行梯度上升,它与 log(1-D_{\theta _D}(G_{\theta _G}(z))) 的对比如下图所示,可见在在 D_{\theta _D}(G_{\theta _G}(z)) 接近0的区间梯度较高,可以更快速的进入到生成样本真实度较高的区域。

与之前的生成网络的目的是使判别网络判别正确的概率极小化相比,新的目标是使判别网络判别错误的概率极大化。

所以整个训练过程变为如下的形式

  • 对判别网络进行梯度上升 \underset{\theta ^{(D)}}{\mathrm{max}}[E_{x\sim p_{data}}log\ D_{\theta _D}(x) +E_{z\sim p_z}log(1-D_{\theta _D}(G_{\theta _G}(z)))]
  • 对生成网络进行梯度上升  \underset{\theta ^{(G)}}{\mathrm{max}}E_{z\sim p_z}log(D_{\theta _D}(G_{\theta _G}(z)))

当训练完毕后,从模型产生样本时就不再需要判别网络了,而是从生成网络中取样,如下图所示。

以上就是GAN的基本原理,即从博弈的角度来使生成网络与判别网络共同进步,最后使生成网络可以以假乱真。而GAN的变种模型也很多,可以参考hindupuravinash/the-gan-zoo中列举的各种GAN模型。这里就介绍一个作为很多GAN类模型基础的DCGAN模型,它的全称是Deep, Convolution GAN,顾名思义就是将深度卷积网络与GAN相结合,其生成网络结构如下图所示

它可以产生一些真实度很高的图片,如下图所示

近两年关于GAN的研究和应用非常多,比如图像风格迁移,根据文字生成图像等等。 另一方面,GAN也由于训练过程的不稳定性常受诟病,为了增强GAN的稳定性,也有Wasserstein GAN, LSGAN等改进模型方面的研究。

总结一下,做为深度学习花书的最后一部分,GAN是近些年生成模型研究比较活跃的方向,它的原理不再是对显性概率分布做直接计算或近似处理,而是利用了生成网络与判别网络的相互博弈,是一种新颖而有效的思路。希望这方面的模型能够更加稳定,得到更多的应用。


注:截图来自斯坦福Syllabus | CS 231N中与Generative Model相关的讲义以及NIPS 2016 tutorial: Generative Adversarial Networks,推荐阅读原书和原论文。

编辑于 2018-12-03

文章被以下专栏收录