gan推荐算法(万字长文解读GAN从基本概念)
gan推荐算法(万字长文解读GAN从基本概念)1.4.1 DCGAN1.4 GAN 常见的模型结构自回归模型通过对概率分布显式建模来生成数据VAE 和 GAN 均是:假设隐变量 z 服从某种分布,并学习一个映射 X = G(z),实现隐变量分布 z 与真实数据分布 pdata(x) 的转换。GAN 使用判别器去度量映射 X = G(z) 的优劣,而 VAE 通过隐变量 z 与标准正态分布的 KL 散度和重构误差去度量。
在 VAE 中,真实样本 X 通过神经网络计算出均值方差(假设隐变量服从正态分布),然后通过采样得到采样变量 Z 并进行重构。VAE 和 GAN 均是学习了隐变量 z 到真实数据分布的映射。但是和 GAN 不同的是:
-
GAN 的思路比较粗暴,使用一个判别器去度量分布转换模块(即生成器)生成分布与真实数据分布的距离。
-
VAE 则没有那么直观,VAE 通过约束隐变量 服从标准正态分布以及重构数据实现了分布转换映射
生成式模型对比
-
自回归模型通过对概率分布显式建模来生成数据
-
VAE 和 GAN 均是:假设隐变量 z 服从某种分布,并学习一个映射 X = G(z),实现隐变量分布 z 与真实数据分布 pdata(x) 的转换。
-
GAN 使用判别器去度量映射 X = G(z) 的优劣,而 VAE 通过隐变量 z 与标准正态分布的 KL 散度和重构误差去度量。
1.4 GAN 常见的模型结构
1.4.1 DCGAN
DCGAN 提出使用 CNN 结构来稳定 GAN 的训练,并使用了以下一些 trick:
-
Batch Normalization
-
使用 Transpose convlution 进行上采样
-
使用 Leaky ReLu 作为激活函数
上面这些 trick 对于稳定 GAN 的训练有许多帮助,自己设计 GAN 网络时也可以酌情使用。
1.4.2 层级结构
GAN 对于高分辨率图像生成一直存在许多问题,层级结构的 GAN 通过逐层次,分阶段生成,一步步提生图像的分辨率。典型的使用多对 GAN 的模型有 StackGAN,GoGAN。使用单一 GAN,分阶段生成的有 ProgressiveGAN。StackGAN 和 ProgressiveGAN 结构如下:
1.4.3 自编码结构
经典的 GAN 结构里面,判别网络通常被当做一种用于区分真实/生成样本的概率模型。而在自编码器结构里面,判别器(使用 AE 作为判别器)通常被当做能量函数 (Energy function)。对于离数据流形空间比较近的样本,其能量较小,反之则大。有了这种距离度量方式,自然就可以使用判别器去指导生成器的学习。
AE 作为判别器,为什么就可以当做能量函数,用于度量生成样本离数据流形空间的距离呢?首先,先看 AE 的 loss:
AE 的 loss 是一个重构误差。使用 AE 做为判别器时,如果输入真实样本,其重构误差会很小。如果输入生成的样本,其重构误差会很大。因为对于生成的样本,AE 很难学习到一个图像的压缩表示(即生成的样本离数据流行形空间很远)。所以,VAE 的重构误差作为 pdata和 pg之间的距离度量是合理的。典型的自编码器结构的 GAN 有:BEGAN EBGAN MAGAN 等
1.5 GAN 的训练障碍 (Obstacles)
1.5.1 理论中存在的问题
经典 GAN 的判别器有两种 loss,分别是:
-
使用上面第一个公式作为 loss 时:在判别器达到最优的时候,等价于最小化生成分布与真实分布之间的 JS 散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及 JS 散度的突变特性,使得生成器面临梯度消失的问题
-
使用上面第二个公式作为 loss 时:在最优判别器下,等价于既要最小化生成分布与真实分布直接的 KL 散度,又要最大化其 JS 散度,相互矛盾,导致梯度不稳定,而且 KL 散度的不对称性使得生成器宁可丧失多样性也不愿丧失准确性,导致 collapse mode 现象 [7]。
1.5.2 实践中存在的问题
GAN 在实践中存在两个问题:
其一,GAN 提出者 Ian Goodfellow 在理论中虽然证明了 GAN 是可以达到纳什均衡的。可是我们在实际实现中,我们是在参数空间优化,而非函数空间,这导致理论上的保证在实践中是不成立的。
其二,GAN 的优化目标是一个极小极大 (minmax) 问题,即
,也就是说,优化生成器的时候,最小化的是
。可是我们是迭代优化的,要保证 V(G D) 最大化,就需要迭代非常多次,这就导致训练时间很长。如果我们只迭代一次判别器,然后迭代一次生成器,不断循环迭代。这样原先的极小极大问题,就容易变成极大极小 (maxmin) 问题,可二者是不一样的,即:
如果变化为极小极大问题,那么迭代就是这样的,生成器先生成一些样本,然后判别器给出错误的判别结果并惩罚生成器,于是生成器调整生成的概率分布。可是这样往往导致生成器变「懒」,只生成一些简单的,重复的样本,即缺乏多样性,也叫 mode collapse。
1.5.3 稳定 GAN 训练的技巧
如上所述,GAN 在理论上和实践上存在三个大问题,导致训练过程十分不稳定,且存在 mode collapse 的问题。为了改善上述情况,可以使用以下技巧稳定训练:
-
Feature matching: 方法很简单,使用判别器某一层的特征替换原始 GAN Loss 中的输出。即最小化:生成图片通过判别器的特征和真实图片通过判别器得到的特征之间的距离。
-
标签平滑:GAN 训练中的标签非 0 即 1,这使得判别器预测出来的 confidence 倾向于更高的值。使用标签平滑可以缓解该问题。具体来说,就是把标签 1 替换为 0.8~1.0 之间的随机数。
-
谱归一化:WGAN 和 Improve WGAN 通过施加 Lipschitz 条件来约束优化过程,谱归一化则是对判别器的每一层都施加 Lipschitz 约束,但是谱归一化相比于 Improve WGAN 计算效率要高一些。
-
PatchGAN:准确来说 PatchGAN 并不是用于稳定训练,但这个技术被广泛用于图像翻译当中,PatchGAN 相当于对图像的每一个小 Patch 进行判别,这样可以使得生成器生成更加锐利清晰的边缘。具体做法是这样的:假设输入一张 256x256 的图像到判别器,输出的是一个 4x4 的 confidence map,confidence map 中每一个像素值代表当前 patch 是真实图像的置信度,即为 PatchGAN。当前图像 patch 的大小就是感受野的大小,最后将所有 Patch 的 Loss 求平均作为最终的 Loss。
1.6 GAN mode collapse 的解决方案
1.6.1 针对目标函数的改进方法
为了避免前面提到的由于优化 maxmin 导致 mode 跳来跳去的问题,UnrolledGAN 采用修改生成器 loss 来解决。具体而言,UnrolledGAN 在更新生成器时更新 k 次生成器,参考的 Loss 不是某一次的 loss,是判别器后面 k 次迭代的 loss。注意,判别器后面 k 次迭代不更新自己的参数,只计算 loss 用于更新生成器。这种方式使得生成器考虑到了后面 k 次判别器的变化情况,避免在不同 mode 之间切换导致的模式崩溃问题。此处务必和迭代 k 次生成器,然后迭代 1 次判别器区分开 [8]。DRAGAN 则引入博弈论中的无后悔算法,改造其 loss 以解决 mode collapse 问题 [9]。前文所述的 EBGAN 则是加入 VAE 的重构误差以解决 mode collapse。
1.6.2 针对网络结构的改进方法
Multi agent diverse GAN(MAD-GAN) 采用多个生成器,一个判别器以保障样本生成的多样性。具体结构如下:
相比于普通 GAN,多了几个生成器,且在 loss 设计的时候,加入一个正则项。正则项使用余弦距离惩罚三个生成器生成样本的一致性。
MRGAN 则添加了一个判别器来惩罚生成样本的 mode collapse 问题。具体结构如下:
输入样本 x 通过一个 Encoder 编码为隐变量 E(x),然后隐变量被 Generator 重构,训练时,Loss 有三个。DM和 R(重构误差)用于指导生成 real-like 的样本。而 DD则对 E(x) 和 z 生成的样本进行判别,显然二者生成样本都是 fake samples,所以这个判别器主要用于判断生成的样本是否具有多样性,即是否出现 mode collapse。
1.6.3 Mini-batch Discrimination
Mini-batch discrimination 在判别器的中间层建立一个 mini-batch layer 用于计算基于 L1 距离的样本统计量,通过建立该统计量去判别一个 batch 内某个样本与其他样本有多接近。这个信息可以被判别器利用到,从而甄别出哪些缺乏多样性的样本。对生成器而言,则要试图生成具有多样性的样本。
2. 关于 GAN 隐空间的理解
隐空间是数据的一种压缩表示的空间。通常来说,我们直接在数据空间对图像进行修改是不现实的,因为图像属性位于高维空间中的流形中。但是在隐空间,由于每一个隐变量代表了某个具体的属性,所以这是可行的。
在这部分,我们会探讨 GAN 是如何处理隐空间及其属性的,此外还将探讨变分方法如何结合到 GAN 的框架中。
2.1 隐空间分解
GAN 的输入隐变量 z 是非结构化的,我们不知道隐变量中的每一位数分别控制着什么属性。因此有学者提出,将隐变量分解为一个条件变量 c 和标准输入隐变量 z。具体包括有监督的方法和无监督的方法。
2.1.1 有监督方法
典型的有监督方法有 CGAN,ACGAN。
CGAN 将随机噪声 z 和类别标签 c 作为生成器的输入,判别器则将生成的样本/真实样本与类别标签作为输入。以此学习标签和图片之间的关联性。
ACGAN 将随机噪声 和类别标签 作为生成器的输入,判别器则将生成的样本/真实样本输入,且回归出图片的类别标签。以此学习标签和图片之间的关联性。二者结构如下 (左边为 CGAN,右边为 ACGAN):
2.1.2 无监督方法
相比于有监督方法,无监督方法不使用任何标签信息。因此,无监督方法需要对隐空间进行解耦得到有意义的特征表示。
InfoGAN 对把输入噪声分解为隐变量 z 和条件变量 c(训练时,条件变量 c 从均匀分布采样而来。),二者被一起送入生成器。在训练过程中通过最大化 c 和 G(z c) 的互信息 I(c,G(z c)) 以实现变量解耦(
的互信息表示 c 里面关于 G(z c) 的信息有多少,如果最大化互信息
,也就是最大化生成结果和条件变量 c 的关联性)。模型结构和 CGAN 基本一致,除了 Loss 多了一项最大互信息。具体如下 [10]:
从上面分析可以看出,InfoGAN 只是实现了信息的解耦,至于条件变量 c 每一个值的具体含义是什么,我们无法控制。于是 ss-InfoGAN 出现了,ss-InfoGAN 采用半监督学习方法,把条件变量 c 分成两部分
,css则利用标签像 CGAN 一样学习,则像 InfoGAN 一样学习。
2.2 GAN 与 VAE 的结合
GAN 相比于 VAE 可以生成清晰的图像,但是却容易出现 mode collapse 问题。VAE 由于鼓励重构所有样本,所以不会出现 mode collapse 问题。
一个典型结合二者的工作是 VAEGAN,结构很像前文提及的 MRGAN,具体如下: