深度学习之生成式对抗网络GAN

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuy9803/article/details/82597934

 

一、GAN介绍

生成式对抗网络GAN(Generative Adversarial Networks)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative model)和判别模型(Discriminative model)的相互博弈学习产生相当好的输出。原始GAN理论中并不要求G和D都是神经网络,只需要是能够拟合相应生成和判别的函数即可。但实际应用中一般均使用深度神经网络DNN/MLP作为G和D。一个优秀的GAN应用需要有良好的的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

GAN将机器学习中的两大模型紧密结合在了一起,在这个框架中将会有两个模型被同时训练:G用来捕获数据分布,D用来估计样本来自训练数据而不是G的概率,G的训练目的是最大化D产生错误的概率。这个框架相当于一个极小化极大的双方博弈。在任意函数G和D的空间中存在唯一解,此时G恢复训练数据分布,且D处处都等于1/2。在G和D由DNN构成的情况下,可以使用反向传播进行训练,在训练或生成样本时不需要任何马尔可夫链或展开的近似推理网络。

以生成图片为例,G为一个生成图片的网络,接收一个随机的噪声z生成图片G(z);D为一个判别网络,判断一张图片x是不是真实的,D(x)表示x是真实图片的概率,若D(x)等于1表示x是100%真实的图片、等于0表示x不可能是真实的图片。训练过程中G和D构成一个动态博弈过程,博弈的结果就是G可以生成足以“以假乱真”的图片G(z),而D难以判断G生成的图片是不是真实的,即D(G(z))=0.5。这样就得到了一个生成模型G,可以用来生成图片。Goodfellow从理论上证明了该算法的收敛性,且在模型收敛时,生成数据和真实数据具有相同的分布。

GAN的应用有:图像生成(超分辨率),语义分割,文字生成,数据增强,信息检索/排序,聊天机器人等。

 

二、对抗网络

       

为了学习生成器G对数据x的分布 p_{g},先从一个简单的分布中采样一个噪声信号z(均匀分布or正态分布),先验概率为 p_{z}(z)。DNN/MLP的参数为 \theta _{g},z经过G(z;\theta _{g})映射得到 x_{g}D(x;\theta _{d}) 的输出是一个标量,表示x是真实数据而不是 p_{g} 生成的概率,G和D都是可微函数,可以用BP算法训练。内循环训练k次D最大化正确分配标签概率,同时训练1次G最小化log(1-D(G(z))):G和D的训练是关于V(G,D)的极小化极大的二者博弈问题 two-player minimax game。

Minimax game是一种递归寻找失败的最大可能性中的最小值的算法,即最小化对方的最大得益。该算法是一个零和算法,一方要在可选的选项中选择将其优势最大化的选择,而另一方则选择令对方优势最小化的选项,输赢的总和为零。

\underset{G}{\min}\, \underset{D}{\max}\, V(G,D)=E_{x\sim p_{data}(x)}[\log D(x)]+E_{z\sim p_{z}(z)}[\log (1-D(G(z)))]

这个方程在训练初期可能无法为G提供足够的梯度进行学习,在训练初期当G生成的效果很差、与训练数据明显不同时,D会以高的置信度拒接生成样本,log(1-D(G(z)))趋近于零梯度饱和;因此选择最大化logD(G(z))而不是最小化log(1-D(G(z)))来训练G。

在训练GAN时,同时更新判别分布(D,蓝色的虚线)使其能够区分数据生成分布 p_{x}(黑色的点线)中的样本和生成分布  p_{g}(G,绿色实线)中的样本。下面的水平线为均匀采样z的区域,上面的水平线为x的部分区域,朝上的箭头为映射x=G(z)将非均匀分布 p_{g} 作用在转换后的样本上。G在 p_{g} 高密度区域收缩,在 p_{g} 低密度区域扩散。

(a) 考虑一个接近收敛的对抗模型对:p_{g}p_{data} 相似,D是个部分准确的分类器;

(b) 算法的内循环中,保持G不变优化D,直到分类的准确率最高:D^{*}(x)=\frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)}

(c) 在G更新1次后,D的梯度引导G(z)流向更可能分类为数据的区域;

(d) 训练若干步后,如果G和D接近某个稳定点且无法继续提高性能,则 p_{g}=p_{data},D(x)=1/2。

 

三、公式推导

生成器G隐式定义了概率分布 p_{g} 作为 z\sim p_{z} 时G(z)的样本,如果有足够的训练容量及训练时间,下面的算法可以收敛到 p_{data} 的近似估计。

1、p_{g}=p_{data} 全局最优解

训练包括顺序完成的两个阶段:固定G训练D,再固定D训练G,固定的意思是不进行训练,神经网络只是向前传播,不进行反向传播。

Proposition 1. G固定时,最优的D为:D_{G}^{*}(x)=\frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)}

Proof:对于任意G,D的训练目的是使V(G,D)的值最大

        V(G,D)=\int_{x}p_{data}(x)\log D(x)dx+\int_{z}p_{z}(z)\log (1-D(g(z)))dz

                        = \int_{x}p_{data}(x)\log D(x)+p_{g}(x)\log (1-D(x))dx

对于任意 (a,b)\in R^{2} \ {0,0},函数 y=a\log y+b\log (1-y) 在[0,1]之间取最大值\frac{a}{a+b}。注意到D的训练目标可以被解释为最大化估计条件概率P(Y=y|x)的对数似然,Y表示x为真实分布 p_{data}(y=1)或者生成分布 p_{g}(y=0),因此:

       C(G)=\underset{D}{\mathrm{max}} V(G,D)\\\\=E_{x\sim p_{data}}[\log D_{G}^{*}(x)]+E_{z\sim p_{z}}[\log (1-D_{G}^{*}(G(z)))]\\\\=E_{x\sim p_{data}}[\log D_{G}^{*}(x)]+E_{x\sim p_{g}}[\log (1-D_{G}^{*}(x))]\\\\=E_{x\sim p_{data}}[\log \frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)}]+E_{x\sim p_{g}}[\log \frac{p_{g}(x)}{p_{data}(x)+p_{g}(x)}]

Theorem 1. 训练目标C(G)的全局最优解仅在 p_{g}=p_{data} 时获得,此时 C(G)=-\log 4

Proof:对于 p_{g}=p_{data}D_{G}^{*}(x)=1/2,因此 C(G)=\log 1/2+\log 1/2=-\log 4

       E_{x\sim p_{data}}[-\log 2]+E_{x\sim p_{g}}[-\log 2]=-\log 4

       C(G)=-\log 4+KL\left ( p_{data}|| \frac{p_{data}+p_{g}}{2} \right )+KL\left ( p_{g}|| \frac{p_{data}+p_{g}}{2} \right )

后两项是Jensen-Shannon散度,衡量两个概率分布的相似度,取值在0到1之间。JS散度是KL散度的变体,解决了KL散度不对称的问题。当两个分布距离较远、完全没有重叠时,KL散度没有意义,而JS散度是一个常数,这在学习算法中是比较致命的问题,意味着梯度为零无法训练。

由于两个分布的JS散度的值非负,且二者相同的时候为0,因此 C^{*}=-\log 4是C(G)的全局最小值,唯一解为 p_{g}=p_{data},这表明生成模型完美的复制了数据产生的过程。

 

2、算法收敛性证明

Propostion 2. 如果G和D有足够的性能,对于算法1的每一步,给定G时D能够达到最优解,并且通过更新 p_{g} 来提高这个判别准则。

       E_{x\sim p_{data}}[\log D_{G}^{*}(x)]+E_{x\sim p_{g}}[\log (1-D_{G}^{*}(x))]

因此 p_{g} 收敛为 p_{data}

Proof:考虑 V(G,D)=U(p_{g},D) 为关于 p_{g} 的凸函数,上确界的次导数包含达到最大值处的该函数的导数。如果f(x)=sup_{\alpha \in A}f_{\alpha }(x) 且对每一个ɑ,f_{\alpha }(x) 是关于x的凸函数,那么如果\beta =\arg sup_{\alpha \in A}f_{\alpha }(x),则 \partial f_{\beta }(x)\in \partial f。这等价于给定对应的G和最优的D,计算 p_{g} 的梯度更新。如Thm1已经证明的,\mathrm{sup}_{D}U(p_{g},D) 是关于 p_{g} 的凸函数且有唯一的全局最优解,因此当 p_{g} 的更新足够小时,p_{g} 收敛到 p_{x}

实际上对抗网络通过 G(z;\theta _{g}) 表示 p_{g} 分布的有限簇,并且我们优化 \theta _{g} 而不是 p_{g} 本身,使用MLP定义G在参数空间引入的多个临界点。尽管缺乏理论证明,但在实际中MLP的优良性能表明了这是一个合理的模型。

 

四、GAN总结

1、优点

(1)生成模型G不需要直接用样本更新,避免了损失函数设计的困难;

(2)GAN是一个非常灵活的框架,各种类型的损失函数都可以整合到GAN模型中,可以产生更加清晰、真实的样本,广泛用于无监督学习和半监督学习领域;

(3)相比于变分自编码器,GAN没有引入任何决定性偏置(deterministic bias),由于变分方法引入了决定性偏置,是优化对数似然的下界,而不是似然本身,导致VAE生成的实例比GAN模糊。GAN没有变分下界,如果训练良好,GAN是渐进一致的。

(4)GAN相比其他的生成模型(受限玻尔兹曼机RBM、DBM、生成随机网络GSN等)只用到了反向传播,不需要复杂的Markov链;GAN的表达能力更强,而基于Markov链的模型需要分布比较模糊才能在不同的模式间进行混合。

 

2、缺点

(1)p_{g}(x) 是隐式表示,没有直接关于G的表达,而是通过一些参数进行控制;

(2)训练GAN需要达到纳什均衡,有时梯度下降法无法做到,相比VAE、PixelRNN不太稳定;

(3)GAN不适合处理离散形式的数据,如文本;

(4)GAN存在训练不稳定、梯度消失、模式崩溃等问题。

 

纳什均衡(Nash equilibrium)

在一个博弈过程中,无论对方的策略选择如何,当事人一方都会选择某个确定的策略,则该策略被称作支配性策略。如果两个博弈的当事人的策略组合分别构成各自的支配性策略,那么这个组合就被定义为纳什均衡。

一个策略组合被称为纳什均衡,当每个博弈者的均衡策略都是为了达到自己期望收益的最大值,与此同时,其他所有博弈者也遵循这样的策略。

 

模式崩溃(model collapse)

一般出现在GAN训练不稳定时,具体表现为生成结果很差,即使经过长时间训练也无法得到很好的改善。

原因在于GAN采用的是对抗训练的方式,G的梯度更新来自于D,所以当G生成的样本不是很真实,但D给出了正确的评价,这时G就会继续按照这样进行输出,这样G和D就会自我欺骗下去,导致最终生成结果特征不全。

 

3、训练GAN的一些技巧

(1)输入规范到(-1,1)之间,最后一层的激活函数使用tanh(BEGAN除外);

(2)使用wassertein GAN的损失函数;

(3)如果有标签数据,尽量使用标签,还可以使用标签平滑(单边标签平滑、双边标签平滑);

(4)使用BN、instance norm或weight norm;

(5)避免使用ReLU和pooling,减少梯度稀疏的可能性,可以使用Leaky ReLU;

(6)优化器尽量使用Adam,学习率初始值可以选择1e-4,随着训练进行不断减小学习率;

(7)给D的网络增加高斯噪声,相当于一种正则措施。


 

五、GAN的变体

在论文的future work部分,作者提出了5个可能扩展的方向:

1、DCGAN(Deep Convolutional GANs)

DCGAN提升了GAN训练的稳定性以及生成结果的质量,为GAN的训练提供了一个很好的网络拓扑结构,表明生成的特征具有向量的计算特性。

DCGAN使用fractional-strided步长卷积代替上采样层,从小的维度产生大的维度(上卷积),使用全卷积代替全连接层,不使用pooling层。D几乎和G是对称的,且几乎每一层都使用BN加速训练提升稳定性,D使用LeakkyReLU防止梯度稀疏,G使用ReLU、输出层使用tanh。使用Adam优化器训练,初始学习率为0.0002。

 

2、WGAN

自从2014年Ian Goodfellow提出以来,GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN依靠的是对判别器和生成器的架构进行实验枚举,最终找到一组比较好的网络架构设置,但是实际上没有彻底解决问题。

        L_{D}^{WGAN}=E[D(x)]-E[D(G(z))]

        L_{G}^{WGAN}=E[D(G(z))]

        W_{D}\leftarrow clipByValue(W_{D},-0.01,0.01)

Wassertein 距离

用于衡量两个分布P、Q之间的距离:W(P,Q)=\underset{\gamma \sim \prod (P,Q)}{\inf} E_{(x,y)\sim \gamma }[||x-y||]

\prod (P,Q) 是P和Q分布组合起来的所有可能的联合分布的集合,对于每一个可能的联合分布γ,可以从中采样\gamma \sim \prod (P,Q) 得到一个样本x和y,并计算出这对样本的距离||x-y||、以及样本对距离的期望。在所有可能的联合分布中能够对这个期望值得到的下界就是Wasserstein距离。直观上可以把E理解为在γ这个路径规划下将土堆P挪到Q所需要的消耗,所以Wasserstein距离又称Earth-Mover距离(EM距离)。

Wasserstein距离比JS散度的优势在于,即使两个分布重叠的部分很少,仍然能够反映两个分布的远近。根据Kantorovich-Rubinstein对偶原理,可以得到Wasserstein距离的等价形式:

        W(P,Q)=\underset{||f||_{L}\leqslant 1}{\sup} E_{x\sim P}[f(x)]-E_{x\sim Q}[f(x)]

Lipschitz连续

是一个比通常连续更强的光滑性条件,Lipschitz连续函数限制了函数改变的速度,符合Lipschitz条件的函数的斜率,必小于一个Lipschitz常数的实数(该常数依函数而定):

对于在实数集的子集的函数f:D\subseteq R\rightarrow R,若存在常数K,使得|f(a)-f(b)|\leqslant |a-b|\; \; \forall a,b\in D,则称f符合Lipschitz条件,对于f最小的常数K称为f的Lipschitz常数。若K<1,f为收缩映射。

 

GAN的目标函数是最小化真实样本分布和生成样本分布之间的JS散度,但如果两个分布的样本空间往往不完全重合,是无法定义JS散度的。解决方案是使用Wasserstein距离代替JS散度,得到WGAN算法,相比GAN参数更加不敏感,训练过程更加平滑。WGAN对GAN的改进之处在于:

(1)D最后一层去掉sigmoid;

(2)G好D的loss不取log;

(3)对更新后的权重强制截断到不超过一个固定常数c,如[-0.01,0.01]内,以满足论文中提到的lipschitz连续性条件;

(4)优化器使用RMSProp、SGD等,不要使用基于动量的算法如Momentum、Adam等。

使用Wasserstein距离需要满足Lipschitz连续性条件,因此要将权重限制到一定范围内,这就造成了隐患,虽然理论证明很漂亮,但实际训练时生成结果并没有期待的那么好。

 

3、WGAN-GP

是WGAN的改进,改变了连续性的限制条件,因为将权重剪切到一定范围后,如[-0.01,0.01],大多数权重都集中到-0.01和0.01上,这就意味着网络大部分权重只有两个可能的数,不能充分发挥深度神经网络的拟合能力,而且强制剪切权重容易导致梯度消失或梯度爆炸。比WGAN收敛速度更快,并能生成更高质量的样本。训练方式稳定,几乎不需要调参,成功训练多种针对图片生成和语言模型的GAN架构。

为了解决这个问题、且满足lipschitz连续性条件,WGAN-GP使用梯度惩罚(gradient penalty)的方式,先求出D的梯度d(D(x)),然后建立它与梯度限制K之间的二范数的损失函数。

作者提出没有必要对整个数据集(真实的和生成的)做采样,只需要从每一个批次的样本中采样即可,比如可以产生一个随机数,在生成数据和真实数据上做一个插值 X'=X*\theta +(1-\theta )*X_{fake}

        L_{D}^{WGAN_GP}=L_{D}^{WGAN}+\lambda E[(|\triangledown D(\alpha x-(1-\alpha G(z)))|-1)^{2}]

        L_{G}^{WGAN-GP}=L_{G}^{WGAN}

 

4、LSGAN

使用最小二乘损失函数代替GAN的损失函数,缓解了GAN训练不稳定和生成图像质量差、多样性不足的问题。

使用JS散度并不能拉近真实分布和生成分布之间的距离,而使用最小二乘法可以将图像的分布尽可能的接近决策边界。

       L_{D}^{LSGAN}=E[(D(x)-b)^{2}]+E[(D(G(z))-a)^{2}]

       L_{G}^{LSGAN}=E[(D(G(z))-c)^{2}]

 

5、BEGAN

BEGAN的D使用auto-encoder的结构,输入是图片,输出是经过编码解码后的图片。BEGAN不直接估计生成分布与真实分布的差距,而是设计合理的损失函数拉近它们之间的距离,只要分布的误差分布相近则认为这些分布是相近的。即如果A和B相似,B和C相似,则认为A和C相似。

       L_{D}^{BEGEN}=D_{AE}(x)-k_{t}D_{AE}(G(z))

       L_{G}^{BEGEN}=D_{AE}(G(z))

       k_{t+1}=k_{t}+\lambda (\gamma D_{AE}(x)-D_{AE}(G(z)))

 

参考资料

https://arxiv.org/pdf/1406.2661.pdf

https://arxiv.org/pdf/1511.06434.pdf

https://arxiv.org/pdf/1701.07875.pdf

https://ask.julyedu.com/question/7668

https://blog.csdn.net/qq_25737169/article/details/78857788

https://baijiahao.baidu.com/s?id=1608234436964134667&wfr=spider&for=pc

https://mp.weixin.qq.com/s?__biz=MzUyMjE2MTE0Mw==&mid=2247484964&idx=1&sn=a859222f408a991dbade1909917595ae&chksm=f9d158bccea6d1aa5a7afb17d39c704d719a7b47613250bff50928343fe49a63a72c27e7bab0&scene=21#wechat_redirect

https://www.leiphone.com/news/201702/EU12GVIe2pNGtgEk.html?viewType=weixin

 

展开阅读全文

生成式对抗网络GAN1

03-14

<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn <li>rn <span>Tensorflow2.0介绍:</span> rn </li>rn</ul>rn<p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn tensorflow是GOOGLE在2015年底发布的一款深度学习框架,也是目前全世界用得最多,发展最好的深度学习框架。2019年3月8日,GOOGLE发布最新tensorflow2版本。新版本的tensorflow有很多新特征,更快更容易使用更人性化。但是老版的tensorflow程序在新版本中几乎都无法继续使用,所以我们有必要学习新版tensorflow2的新用法。rn</p>rn<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn <li>rn <span>课程介绍:</span> rn </li>rn</ul>rn<p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn 我们的这门课程适合小白学习,也适合有基础的同学学习。课程会从0开始学习,从python环境安装,python入门,numpy,pandas,matplotlib使用,深度学习基础,一直讲到tensorflow基础,进阶,项目实战。不管你是0基础小白,想进入AI行业,还是有一定基础,想学习最新的tensorflow2的使用,都适合我们这门课程。rn</p>rn<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn <li>rn <span>讲师介绍:</span> rn </li>rn</ul>rn<p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn 覃秉丰,物理系毕业转AI行业,想转行同学可以找我聊聊。机器学习、深度学习神经网络领域多年研究开发授课经验,精通算法原理与编程实践;曾完成过多项图像识别、目标识别、语音识别等企业项目,一线实战经验丰富;长期为多家包括世界五百强在内的大型企业总部做人工智能技术内训服务(中国移动、中国银行,华夏银行,中国太平洋,国家电网、中海油等)。上课特点:公式尽量一个一个符号推,代码尽量一行一行讲,希望所有人都能学有所得。rn</p>

生成式对抗网络GAN2

03-14

<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn <li>rn <span>Tensorflow2.0介绍:</span> rn </li>rn</ul>rn<p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn tensorflow是GOOGLE在2015年底发布的一款深度学习框架,也是目前全世界用得最多,发展最好的深度学习框架。2019年3月8日,GOOGLE发布最新tensorflow2版本。新版本的tensorflow有很多新特征,更快更容易使用更人性化。但是老版的tensorflow程序在新版本中几乎都无法继续使用,所以我们有必要学习新版tensorflow2的新用法。rn</p>rn<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn <li>rn <span>课程介绍:</span> rn </li>rn</ul>rn<p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn 我们的这门课程适合小白学习,也适合有基础的同学学习。课程会从0开始学习,从python环境安装,python入门,numpy,pandas,matplotlib使用,深度学习基础,一直讲到tensorflow基础,进阶,项目实战。不管你是0基础小白,想进入AI行业,还是有一定基础,想学习最新的tensorflow2的使用,都适合我们这门课程。rn</p>rn<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn <li>rn <span>讲师介绍:</span> rn </li>rn</ul>rn<p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;">rn 覃秉丰,物理系毕业转AI行业,想转行同学可以找我聊聊。机器学习、深度学习神经网络领域多年研究开发授课经验,精通算法原理与编程实践;曾完成过多项图像识别、目标识别、语音识别等企业项目,一线实战经验丰富;长期为多家包括世界五百强在内的大型企业总部做人工智能技术内训服务(中国移动、中国银行,华夏银行,中国太平洋,国家电网、中海油等)。上课特点:公式尽量一个一个符号推,代码尽量一行一行讲,希望所有人都能学有所得。rn</p>

没有更多推荐了,返回首页