未来主要的方向被定在了GAN相关的一个子方向,在这里从源头总结一下GAN以及相关的一些改进算法,帮自己理清一下思路,和大家共同学习。
GAN全称Generative Adversarial Networks,即生成对抗网络。GAN网络主要由两个网络构成,生成网络G和判别网络D,生成模型G的思想是将一个噪声包装成一个逼真的样本,判别模型D则需要判断送入的样本是真实的还是假的样本,两个部分相互促进,随着判别模型D对样本的判别能力不断提升,生成模型G的造假能力也不断提升。
这里以图像为应用场景:
G是一个生成式的网络,它接收一个随机的噪声z(随机数),通过这个噪声生成图像
D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就表明是真实的图片,而输出为0,就表明不可能是真实的图片。
训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量辨别出G生成的假图像和真实的图像。因此G和D构成了一个动态的“博弈过程”,最终达到平衡点。
损失函数
上述这个公式说白了就是一个最大最小优化问题,其实对应的也就是上述的两个优化过程,拆解后得到:
简单理解一下公式:
优化D:
优化D的公式的第一项,使的真样本x输入的时候,得到的结果越大越好,因为需要真样本的预测结果越接近于1越好。对于假样本,需要优化是的其结果越小越好,也就是D(G(z))越小越好。但是,第一项是越大,第二项是越小,这不矛盾了,所以呢把第二项改成1-D(G(z)),这样就是越大越好,两者合起来就是越大越好。
优化G:
同样在优化G的时候也与真实样本无关,所以把第一项直接去掉了。这个时候只有生成的假样本,但是我们这个时候是希望假样本的标签是1,也就是D(G(z))越大越好,但是呢为了统一成1-D(G(z))的形式,那么只能是最小化1-D(G(z)),本质上没有区别,只是为了形式的统一。之后这两个优化模型可以合并起来写,就变成了最开始的那个最大最小目标函数了。
GAN学习到了真实样本集的数据分布
上图图表明了GAN的生成网络如何一步步从均匀分布学习到正太分布。如图:原始数据x服从正太分布,这个过程无需提前告诉生成网络用正太分布来学习,但是生成网络学习到了。而且对于x不管是什么分布,生成网络都能学到。这就是GAN可以自动学习真实数据的分布的强大之处。
优点
(以下部分摘自ian goodfellow 在Quora的问答)
● GAN是一种生成式模型,相比较其他生成模型(玻尔兹曼机和GSNs)只用到了反向传播,而不需要复杂的马尔科夫链
● 相比其他所有模型, GAN可以产生更加清晰,真实的样本
● GAN采用的是一种无监督的学习方式训练,可以被广泛用在无监督学习和半监督学习领域
● 相比于变分自编码器, GANs没有引入任何决定性偏置( deterministic bias),变分方法引入决定性偏置,因为他们优化对数似然的下界,而不是似然度本身,这看起来导致了VAEs生成的实例比GANs更模糊
● 相比VAE, GANs没有变分下界,如果鉴别器训练良好,那么生成器可以完美的学习到训练样本的分布.换句话说,GANs是渐进一致的,但是VAE是有偏差的
● GAN应用到一些场景上,比如图片风格迁移,超分辨率,图像补全,去噪,避免了损失函数设计的困难,不管三七二十一,只要有一个的基准,直接上判别器,剩下的就交给对抗训练了
不足
● 训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.我们还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但普遍在实践中它还是比训练玻尔兹曼机稳定的多
● GAN不适合处理离散形式的数据,比如文本
● GAN存在训练不稳定、梯度消失、模式崩溃的问题(目前已解决)
DCGAN全称Deep Convolutional Generative Adversarial Networks,即深度卷积生成对抗网络。有了上一章对GAN的原理的理解,大家都知道GAN的核心思想就是博弈,两者相互竞争,相互加强。GAN模型包括生成网络G和鉴别网络D,生成网络的目的是生成假的图像使判别网络无法鉴别真假,而判别网络的目的是努力分辨真假图像。最终直到鉴别网络分辨不出生成网络生成的以假乱真的图像为止。
DCGAN是继GAN之后比较好的改进,其主要的改进主要是在网络结构上,极大的提升了GAN的稳定性。到目前为止,DCGAN的网络结构还是被广泛的使用。
生成网络模型
生成网络(Generator)接收一个随机噪声z,然后通过上采样(up-sampling)生成图像G(z)。上采样主要采用反卷积算法,G接收一个100-d随机噪声z,经过Project and reshape(实际上就是一个全连接层),转化为一个4 4 1024的feature map,然后经过多个反卷积层,生成大小为64 64 3的图像。(注意:官方给的生成网络只是为了帮助理解原理,并不是说DCGAN的生成网络就是一个反卷积网络,生成网络根据个人不同需求可以替换)
整个网络没有pooling层和上采样层的存在,实际上是使用了带步长(fractional-strided)的卷积代替了上采样,以增加训练的稳定性
判别网络模型
鉴别网络(Discriminator)的输入为一张图片,经过下采样(down-sampling,卷积运算),再接全连接层处理,送入sigmoid函数,输出真假概率。
注意
1)G,D网络不采取任何池化处理;
2)G,D网络每一层均使用批标准化处理(Batch-Normalization);
3)在G网络中,激活函数除了最后一层外,都是用Relu函数,最后一层使用tanh函数;
4)D网络中,激活函数均使用Leaky Relu函数。
损失函数的解析
其中:D(x) 真实图片的概率;G(z) G生成的假图像;D(G(z)) G生成假图像的概率。
G的目标是:生成的图像能以假乱真,所以希望D(G(z))更大,公式中用1-D(G(z))的巧妙表达,这样损失值应越小越好。
D的目标是:鉴别能力提升,所以D(G(z))应该小,D(x)应该大,一大一小,变化不定,所用采用1-D(G(z))表达,这样损失值应越大越好。
优点
DCGAN能改进GAN训练稳定的原因主要有:
◆ 使用步长卷积代替上采样层,卷积在提取图像特征上具有很好的作用,并且使用卷积代替全连接层。
◆ 生成器G和判别器D中几乎每一层都使用batchnorm层,将特征层的输出归一化到一起,加速了训练,提升了训练的稳定性。(生成器的最后一层和判别器的第一层不加batchnorm)
◆ 在判别器中使用leakrelu激活函数,而不是RELU,防止梯度稀疏,生成器中仍然采用relu,但是输出层采用tanh。
◆ 使用adam优化器训练,并且学习率最好是**0.0002
**
不足
DCGAN虽然有很好的架构,但是对GAN训练稳定性来说是治标不治本,没有从根本上解决问题,而且训练的时候仍需要小心的平衡G,D的训练进程,往往是训练一个多次,训练另一个一次。
自从GAN问世就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN(见上章)依靠的是对判别器和生成器的架构进行实验枚举,最终找到一组比较好的网络架构设置,但是实际上是治标不治本,没有彻底解决问题。而今天的主角Wasserstein GAN(下面简称WGAN)成功地做到了以下爆炸性的几点:
1)彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
2)基本解决了模式崩溃的collapse mode的问题,确保了生成样本的多样性
3)训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高
4)以上一切好处不需要精心设计的网络架构,最简单的多层全连接网络就可以做到
改进后相比原始GAN的算法实现流程却只改了四点:
1)判别器最后一层去掉sigmoid
2)生成器和判别器的loss不取log
3)每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
4)不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
Wasserstein距离
Wasserstein距离又叫Earth-Mover(EM)距离,定义如下:
Wasserstein距离是平滑的
KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化参数时,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。
将 Wasserstein距离 用于 WGAN
补充概念
Lipschitz连续条件限制了一个连续函数的最大局部变动幅度。
对公式13进一步化简
化简得到损失函数 L
损失函数解读
损失函数
算法描述
与DCGAN不同,WGAN主要从损失函数的角度对GAN做了改进,损失函数改进之后的WGAN即使在全链接层上也能得到很好的表现结果,WGAN对GAN的改进主要有:
◆ 判别器最后一层去掉sigmoid
◆ 生成器和判别器的loss不取log
◆ 对更新后的权重强制截断到一定范围内,比如[-0.01,0.01],以满足论文中提到的lipschitz连续性条件。
◆ 论文中也推荐使用SGD, RMSprop等优化器,不要基于使用动量的优化算法,比如adam,但是就我目前来说,训练GAN时,我还是adam用的多一些。
从上面看来,WGAN好像在代码上很好实现,基本上在原始GAN的代码上不用更改什么,但是它的作用是巨大的
◆ WGAN理论上给出了GAN训练不稳定的原因,即交叉熵(JS散度)不适合衡量具有不相交部分的分布之间的距离,转而使用wassertein距离去衡量生成数据分布和真实数据分布之间的距离,理论上解决了训练不稳定的问题。
◆ 解决了模式崩溃的(collapse mode)问题,生成结果多样性更丰富。
◆ 对GAN的训练提供了一个指标,此指标数值越小,表示GAN训练的越差,反之越好。
WGAN-GP是WGAN之后的改进版,主要还是改进了连续性限制的条件。
作者也发现将权重剪切到一定范围之后,比如剪切到[-0.01,+0.01]后,发生了这样的情况,如下图左边表示
发现大多数的权重都在-0.01 和0.01上,这就意味了网络的大部分权重只有两个可能数,对于深度神经网络来说不能充分发挥深度神经网络的拟合能力,简直是极大的浪费。并且,也发现强制剪切权重容易导致梯度消失或者梯度爆炸,梯度消失很好理解,就是权重得不到更新信息,梯度爆炸就是更新过猛了,权重每次更新都变化很大,很容易导致训练不稳定。梯度消失与梯度爆炸原因均在于剪切范围的选择,选择过小的话会导致梯度消失,如果设得稍微大了一点,每经过一层网络,梯度变大一点点,多层之后就会发生梯度爆炸 。为了解决这个问题,并且找一个合适的方式满足lipschitz连续性条件,作者提出了使用梯度惩罚(gradient penalty)的方式以满足此连续性条件,其结果如上图右边所示。
梯度惩罚就是既然Lipschitz限制是要求判别器的梯度不超过K,那么可以通过建立一个损失函数来满足这个要求,即先求出判别器的梯度d(D(x)),然后建立与K之间的二范数就可以实现一个简单的损失函数设计。但是注意到D的梯度的数值空间是整个样本空间,对于图片(既包含了真实数据集也包含了生成出的图片集)这样的数据集来说,维度及其高,显然是及其不适合的计算的。作者提出没必要对整个数据集(真的和生成的)做采样,只要从每一批次的样本中采样就可以了,比如可以产生一个随机数,在生成数据和真实数据上做一个插值。于是就算解决了在整个样本空间上采样的麻烦。
◆ 提出了一种新的lipschitz连续性限制手法—梯度惩罚,解决了训练梯度消失梯度爆炸的问题。
◆ 比标准WGAN拥有更快的收敛速度,并能生成更高质量的样本
◆ 提供稳定的GAN训练方式,几乎不需要怎么调参,成功训练多种针对图片生成和语言模型的GAN架构
但是论文提出,由于是对每个batch中的每一个样本都做了梯度惩罚(随机数的维度是(batchsize,1)),因此判别器中不能使用batch norm,但是可以使用其他的normalization方法,比如Layer Normalization、Weight Normalization和Instance Normalization,论文中使用了Layer Normalization,weight normalization效果也是可以的。
最小二乘GAN
全称是Least Squares Generative Adversarial Networks
其实原理部分可以一句话概括,即使用了最小二乘损失函数代替了GAN的损失函数。
但是就这样的改变,缓解了GAN训练不稳定和生成图像质量差多样性不足的问题。
事实上,作者认为使用JS散度并不能拉近真实分布和生成分布之间的距离,使用最小二乘可以将图像的分布尽可能的接近决策边界,其损失函数定义如下:
其中作者设置a=c=1,b=0
论文里还是给了一些数学推导与证明,感兴趣的可以去看看
BEGAN全称是Boundary Equilibrium GANs
BEGAN是Google在17年上半年出的一篇论文,此论文对GAN做了进一步的改进,提出了一种新的评价生成器生成质量的方式,使GAN即使使用很简单的网络,不加一些训练trick比如BN,minibatch,使用SELU激活函数等等,也能实现很好的训练效果,完全不用担心模式崩溃(model collapse)和训练不平衡的问题。
以往的GAN以及其变种都是希望生成器生成的数据分布尽可能的接近真实数据的分布,当生成数据分布等同于真实数据分布时,我们就确定生成器G经过训练可以生成和真实数据分布相同的样本,即获得了生成足以以假乱真数据的能力,所以从这一点出发,研究者们设计了各种损失函数去令G的生成数据分布尽可能接近真实数据分布。
直观来讲,如果两个分布越相近, 我们可以认为他们越相似,当生成数据分布非常接近于真实数据分布的时候,这时候生成器就有足够的生成能力。其中比较好的改进成果主要有DCGAN、WGAN、WGAN-GP等等。 BEGAN代替了这种估计概率分布方法,它不直接去估计生成分布Pg与真实分布Px的差距,而是估计分布的误差的分布之间的差距,作者认为只要分布之间的误差分布相近的话,也可以认为这些分布是相近的
首先从损失函数说起:
为了估计分布的误差,作者使用了auto-encoder作为D,D的输入是图像V,维度为RNx,输出的也是维度为RNx的图片。此处的L(v)是一个pixel-wise的损失,表示真实输入图像v和经过自编码网络D输出的D(v)的相似程度,L越小,说明v, D(v)越相似。
同样的,我们可以得到 L’(v)=|v-G(v)|n 这样一个pixl-wise误差。
此时重点来了,由于两者都是pixel-wise的, 那么L里的数值一定满足某种分布,在有足够大的像素的情况下,假设像素是满足IID即独立同分布条件,根据中心极限定理,像素的误差近似满足正太分布,那就是说L(v)和L’(v)分别是µ1 = N(m1; C1)和 µ2 = N(m2; C2)的正太分布,m为均值,维度为Rp,c为方差维度为Rp×p 。
那么根据wassertein公式,两个正太分布µ1、µ2的距离为:
对比WGAN就可以发现,这里不需要lipschize限制,这时,我们就可以给GAN分配任务了,令D不断的最大化m2,最小化m1,而G则不断最小化m2,当m2 接近m1的时候我们就认为GAN完成了训练。
分析到这里我们得出结论,我们可以去估计误差的分布而不是直接估计分布去拟合GAN,但是损失函数究竟是怎么样的呢?
损失函数网络结构
论文中给出的损失函数如下形式,关于另一个参数Kt上述图片没有表述出来:
D,G的损失在图片中已经给出了描述,从以上分析的结果来看,只要按步骤优化损失函数,就能完成GAN的训练,但是还没有那么简单,或许也注意到,为什么论文的名字叫做Boundary Equilibrium GAN,到这里完全没有涉及到Boundary Equilibrium的概念,我们继续分析
Equilibrium
试分析以下,GAN完成训练时的结果是什么样子的,理想情况下肯定是m1=m2的时候是最好的,即:
分布的期望相等,那就是G产生的图片和真实图像分布相同,这时出现了一个问题,m1=m2条件下,条件1不再是一个不可忽略项,反而趋近于无穷,作者为了解决这个问题,特意加入了一个超参数,γ 取值 [0;1]之间定义:
有了这个限制,就不会出现m1=m2的情形了,这就相当于一个boundary 将均衡条件限制住了,这就是论文名字的由来。
另外一个重要的参数就是Mgloable了,形式如下:
这个参数表示训练程度的多少,越小的话,训练程度越好,从公式中可见一斑。
BEGAN中,作者做出了以下四个贡献: