最近几天,入坑了生成对抗网络(GAN),主要是研读了缪茂文 潘志宏著写的《深入浅出GAN生成对抗网络原理剖析与Tensorflow实践》,这里把GAN一些基础的,必要的东西梳理一下。
GAN网络结构是由生成器和判别器组成,训练过程中,生成器G不断的生成赝品,判别器D这识别生成器G生成的结果是真品还是赝品,两个网络相互对抗,生成器G努力生成出欺骗过判别器D的赝品,而判别器D努力识别出生成器G生成的赝品,往复循环,从而训练彼此。
GAN主要用于生成任务,所谓生成任务,就是通过输入一些随机噪声给生成模型,生成模型将这些噪声映射到真实数据的分布上。以图片生成为例,我们手上有大量的真实图片数据,这些数据在高维空间会存在一个特定的概率分布,我们会使用GAN训练一个生成模型,训练时,生成模型生成的图片的概率分布会逐渐的往真实的图片的概率分布靠近,从而,生成模型会生成与真实图片相似的图片。
原论文给出了如下数学描述,假定用于生成的噪声分布是 p z ( z ) p_z(z) pz(z),真实数据分布是 p x ( x ) p_x(x) px(x),同时生成器和辨别器分别为G和D,则GAN的目标可以通过如下公式描述:
D(x)表示x来源于真实数据的分布,理想情况下,D(x)=1,logD(x)=0。若是分类器不理想,则D(x)输出越小,logD(x)则会越小。G(z)表示噪声经过生成器后生成的样本,D(G(z))则是分类器认为生成样本属于真实样本的概率,理想情况下这个数值为0,但当性能越不好,D(G(z))越大,log(1-D(G(z)))就会越小。总而言之,后面两项期望的和越大,分类器识别能力越好。 再观察估值函数V(G,D)前面的min/max,就很明显了,最终的目标是求外面的minG,G的目标是让V最小,达到以假乱真的目的;而内部嵌套的maxD,则代表D是在G给定的情况下,最大化V,即给定生成器,得到识别能力最好的分辨器。
相较于原始GAN,DGGAN主要的区别是生成器和判别器使用了深层卷积网络,
(1)生成器和判别器使用带步长的过滤来代替池化层,加快模型收敛速度,但会降低网络的稳定性
(2)生成器和判别器使用Batch Normalization来加速模型收敛避免模型过拟合
(3)生成器中最后一层使用tanh作为激活函数,其余层使用relu作为激活函数
(4)判别器中所有层都使用Leaky ReLU作为激活函数
(3) Internal Convariate Shift 现象
随着网络加深,每层网络的参数更新会导致输出变化,层层叠加会出现高层不断重新计算参数去适应底层发生的变化,这种现象叫ICS现象
BN可以缓解ICS问题,是训练网络是可以使用更大的学习速率,加快网络收敛
BN可以减少梯度爆炸和梯度弥散问题
BN减少了训练网络时对正则化的需要
BN的核心是:
BN操作保证神经网络节点间参数具有“伸缩不变性”
BN确保了神经网络中输入数据具有“伸缩不变性”
判别器的损失:
(1)判别器给真实图片打的分与其期望分数(1)的差距D_L1
(2)判别器给生成图片打的分与其期望分数(0)的差距D_L2
(3)则生成器的总损失为 D_L1 + D_L2
生成器的损失:
(1)生成图片与真实图片的差距
(2)实际上,将该差距转化为
生成器期望判别器给自己生成图片打多少分与实际判别器打多少分的差距
条件生成网络(CGAN)与DCGAN一个重要差别是,CGAN给生成器的输入除了一个随机噪声还多了一个约束条件。
colorGAN是一个经典的CGAN,ColorGAN的训练数据是彩色图片,
数据准备时,将彩色图片通过自适应阀值的方法获得对应的线条图片做为约束条件,然后再使用彩色图片的blur滤波的模糊图片作为颜色噪声。
ColorGAN还可用于去除图片的马赛克,将原图片数据随机打码,打码的图片作为约束条件,然后通过blur滤波生成全模糊的图像作为噪声,就可以进行训练了。
ColorGAN与DCGAN还有一个较大不同点是,
ColorGAN的生成器的网络结构使用了U型网络
Wasserstein GAN 是为解决传统GAN 遇到的梯度消失,训练梯度不稳定以及模式崩溃而提出的。
其本质就是用Wasserstein距离(EM距离)来替代JS散度。
GAN中使用EM距离,是在判别器的目标函数加一个 1-Lipschitz约束条件,如下图
Lipschitz函数定义如下
∣ ∣ f ( x 1 ) − f ( x 2 ) ∣ ∣ < = K ∣ ∣ x 1 − x 2 ∣ ∣ ||f(x_1)-f(x_2)|| <= K||x_1-x_2|| ∣∣f(x1)−f(x2)∣∣<=K∣∣x1−x2∣∣
当K = 1 时,Lipschitz函数就叫1-Lipschitz
WGAN论文没有直接解决如何使得判别器的目标函数服从1-Lipschitz约束,而是采用限制的方式是目标函数平滑,这种方式为 Weight Clipping
WGAN的改动有:
WGAN 使用了Weight Clipping,这会很容易会导致判别器的参数要么取极大值要么取极小值,从而导致判别器变成一个二值化网络,丧失了原本强大的拟合能力
同时Weight Clipping的限制范围若设得过大,可能会参数梯度爆炸问题,过小也可能会产生梯度消失问题
为此,WGAN-GP提出了gradient penalty(梯度惩罚)
在 WGAN或WGAN-GP中,通常是先训练K次判别器,再训练1次生成器
gradient genalty只对生成数据分布与真实数据分布之间的空间做梯度惩罚,无法对整个空间的数据做惩罚,从而导致graident penalty正则化方式不稳定。
SN GAN 使用Spectral Normalization(光谱标准化),具有一下优势
此类型的,有cycleGAN,StarGAN,XGAN…
StackGAN
PGGAN
这一使用CGAN结构的GAN,输入的约束条件
可以使用Skip-Thought 来构建句子级别的语义向量来作为约束条件
本文许多内容是《深入浅出GAN生成对抗网络原理剖析与Tensorflow实践》摘抄的内容
同时,也用paddlepaddle复现了 DCGAN和ColorGAN。
开源链接如下:
https://gitee.com/lingcb/dcgan
https://gitee.com/lingcb/color-gan