Python 全栈体系【四阶】(四十六)

第五章 深度学习

十、生成对抗网络(GAN)

4. GAN的数学原理

4.1 GAN的数学推导

生成模型会从一个输入空间将数据映射到生成空间(即通过输入数据,在函数作用下生成输出数据),写成公式的形式是x=G(z)。通常,输入z会满足一个简单形式的随机分布(比如高斯分布或者均匀分布等),为了使得生成的数据分布能够尽可能地逼近真实数据分布,生成函数G会是一个神经网络的形式,通过神经网络可以模拟出各种完全不同的分布类型。

以下是生成对抗网络中的代价函数,以判别器D为例,代价函数写作 J ( D ) J^{(D)} JD,形式如下所示:

在这里插入图片描述

其中,E表示期望概率, x ∼ P d a t a x \sim P_{data} xPdata表示x满足 P d a t a P_{data} Pdata分布。

对于生成器来说它与判别器是紧密相关的,我们可以把两者看作一个零和博弈,它们的代价综合应该是零,所以生成器的代价函数应满足如下等式:

J ( G ) = − J ( D ) J^{(G)} = -J^{(D)} J(G)=J(D)

这样一来,我们可以设置一个价值函数V来表示 J ( G ) J^{(G)} JG J ( D ) J^{(D)} JD

在这里插入图片描述

我们现在把问题变成了需要寻找一个合适的 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D)θ(G))使得 J ( G ) J^{(G)} JG J ( D ) J^{(D)} JD都尽可能小,也就是说对于判别器而言越大越 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D)θ(G))好,而对于生成器来说则是越小越好 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D)θ(G)),从而形成了两者之间的博弈关系。

在博弈论中,博弈双方的决策组合会形成一个纳什平衡点(Nash equilibrium),在这个博弈平衡点下博弈中的任何一方将无法通过自身的行为而增加自己的收益。在生成对抗网络中,我们要计算的纳什平衡点正是要寻找一个生成器G与判别器D使得各自的代价函数最小,从上面的推导中也可以得出我们希望找到一个 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D)θ(G))对于生成器来说最小而对判别器来说最大,我们可以把它定义成一个寻找极大极小值的问题,公式如下所示:

在这里插入图片描述

我们可以用图形化的方法理解一下这个极大极小值的概念,一个很好的例子就是鞍点(saddle point),如下图所示,即在一个方向是函数的极大值点,而在另一个方向是函数的极小值点。

在这里插入图片描述

在上面公式的基础上,我们可以分别求出理想的判别器D*和生成器G*:

在这里插入图片描述

下面我们先来看一下如何求出理想的判别器,对于上述的D*,我们假定生成器G是固定的,令式子中的G(z)=x。推导如下:

在这里插入图片描述

我们现在的目标是希望寻找一个D使得V最大,我们希望对于积分中的项 f ( x ) = p d a t a ( x ) l o g D ( x )+ p g ( x ) l o g ( 1 − D ( x )) f(x)=p_{data}(x)logD(x)+p_g(x)log(1-D(x)) fx=pdataxlogDx)+pgxlog1Dx)),无论x取何值都能最大。其中,我们已知 p d a t a p_{data} pdata是固定的,之前我们也假定生成器G固定,所以 p g p_g pg也是固定的,所以我们可以很容易地求出D以使得f(x)最大。我们假设x固定,f(x)对D(x)求导等于零,下面是求解D(x)的推导。

在这里插入图片描述

可以看出它是一个范围在0到1的值,这也符合我们判别器的模式,理想的判别器在接收到真实数据时应该判断为1,而对于生成数据则应该判断为0,当生成数据分布与真实数据分布非常接近的时候,应该输出的结果为1/2.

找到了D*之后,我们再来推导一下生成器G*。现在先把D*(x)代入前面的积分式子中重新表示:

在这里插入图片描述

到了这一步,我们需要先介绍一个定义——Jensen–Shannon散度,我们这里简称JS散度。在概率统计中,JS散度也与前面提到的KL散度一样具备了测量两个概率分布相似程度的能力,它的计算方法基于KL散度,继承了KL散度的非负性等,但有一点重要的不同,JS散度具备了对称性。JS散度的公式如下,我们还是以P和Q作为例子,另外我们设定 M = 1 2 ( P + Q ) M=\frac{1}{2}(P+Q) M=21(P+Q),KL为KL散度公式。

在这里插入图片描述

对于上面的 M a x V ( G , D ) MaxV(G,D) MaxV(G,D),由于JS散度是非负的,当且仅当 p d a t a = p g p_{data}=p_g pdata=pg的时候,上式可以取得全局最小值 − l o g ( 4 ) -log(4) log4。所以我们要求的最优生成器G*,正是要使得G*的分布 p g = p d a t a p_g=p_{data} pg=pdata.

4.2 GAN的可视化理解

下面我们用一个可视化概率分布的例子来更深入地认识一下生成对抗网络。Ian Goodfellow的论中给出了这样一个GAN的可视化实现的例子:下图中的点线为真实数据分布,曲线为生成数据样本,生成对抗网络在这个例子中的目标在于,让曲线(也就是生成数据的分布)逐渐逼近点线(代表的真实数据分布)。

在这里插入图片描述

虚线为生成对抗网络中的判别器,它被赋予了初步区分真实数据与生成数据的能力,并对于它的划分性能加上一定的白噪声,使得模拟环境更为真实。输入域为z(图中下方的直线)在这个例子里默认为一个均匀分布的数据,生成域为x(图中上方的直线)为不均匀分布数据,通过生成函数x=G(z)形成一个映射关系,如图中的那些箭头所示,将均匀分布的数据映射成非均匀数据。

从a到d的四张图可以展现整个生成对抗网络的运作过程。在a图中,可以说是一种初始的状态,生成数据与真实数据还有比较大的差距,判别器具备初步划分是否为真实数据的能力,但是由于存在噪声,效果仍有缺陷。b图中,通过使用两类标签数据对于判别器的训练,判别器D开始逐渐向一个比较完善的方向收敛,最终呈现出图中的结果。当判别器逐渐完美后,我们开始迭代生成器G,如图c所示。通过判别器D的倒数梯度方向作为指导,我们让生成数据向真实数据的分布方向移动,让生成数据更容易被判别器判断为真实数据。在反复的一系列上述训练过程后,生成器与判别器会进入图d的最终状态,此时 p g p_g pg会非常逼近甚至完全等于 p d a t a p_{data} pdata,当达到理想的 p g = p d a t a p_g=p_{data} pg=pdata的时候,D与G都已经无法再更进一步优化了,此时G生成的数据已经达到了我们期望的目的,能够完全模拟出真实数据的分布,而D在这个状态下已经无法分辨两种数据分布(因为它们完全相同),此时 D ( x ) = 1 2 D(x)=\frac{1}{2} D(x)=21.

5. DCGAN

5.1 概述

DCGAN的创始论文《Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks》(基于深层卷积生成对抗网络的无监督表示学习)发表于2015年,文章在GAN的基础之上提出了全新的DCGAN架构,该网络在训练过程中状态稳定,并可以有效实现高质量的图片生成及相关的生成模型应用。由于其具有非常强的实用性,在它之后的大量GAN模型都是基于DCGAN进行的改良版本。为了使得GAN能够很好地适应于卷积神经网络架构,DCGAN提出了四点架构设计规则,分别是:

  • 使用卷积层替代池化层。首先第一点是把传统卷积网络中的池化层全部去除,使用卷积层代替。对于判别器,我们使用步长卷积(strided convolution)来代替池化层;对于生成器,我们使用分数步长卷积(fractional-strided convolutions)来代替池化层。
  • 去除全连接层。目前的研究趋势中我们会发现非常多的研究都在试图去除全连接层,常规的卷积神经网络往往会在卷积层后添加全连接层用以输出最终向量,但我们知道全连接层的缺点在于参数过多,当神经网络层数深了以后运算速度会变得非常慢,此外全连接层也会使得网络容易过度拟合。有研究使用了全局平均池化(global average pooling)来替代全连接层,可以使得模型更稳定,但也影响了收敛速度。论文中说的一种折中方案是将生成器的随机输入直接与卷积层特征输入进行连接,同样地对于判别器的输出层也是与卷积层的输出特征连接,具体的操作会在后面的框架结构介绍中说明。
  • 使用批归一化(batch normalization)。由于深度学习的神经网络层数很多,每一层都会使得输出数据的分布发生变化,随着层数的增加网络的整体偏差会越来越大。批归一化的目标则是为了解决这一问题,通过对每一层的输入进行归一化处理,能够有效使得数据服从某个固定的数据分布。
  • 使用恰当的激活函数。在DCGAN网络框架中,生成器和判别器使用了不同的激活函数来设计。生成器中使用ReLU函数,但对于输出层使用了Tanh激活函数,因为研究者们在实验中观察到使用有边界的激活函数可以让模型更快地进行学习,并能快速覆盖色彩空间。而在判别器中对所有层均使用LeakyReLU,在实际使用中尤其适用于高分辨率的图像判别模型。这些激活函数的选择是研究者在多次实验测试中得出的结论,可以有效使得DCGAN得到最优的结果。
5.2 网络结构

下图是DCGAN生成器G的架构图,输入数据为100维的随机数据z,服从范围在[-1,1]的均匀分布,经过一系列分数步长卷积后,最后形成一幅64×64×3的RGB图片,与训练图片大小一致。

在这里插入图片描述

对于判别器D的架构,基本是生成器G的反向操作,如下图所示。输入层为64×64×3的图像数据,经过一系列卷积层降低数据的维度,最终输出的是一个二分类数据。

在这里插入图片描述

5.3 训练细节

1)对于用于训练的图像数据样本,仅将数据缩放到[-1,1]的范围内,这个也是tanh的取值范围,并不做任何其他处理。

2)模型均采用Mini-Batch大小为128的批量随机梯度下降方法进行训练。权重的初始化使用满足均值为0、方差为0.02的高斯分布的随机变量。

3)对于激活函数LeakyReLU,其中Leak的部分设置斜率为0.2。

4)训练过程中使用Adam优化器进行超参数调优。学习率使用0.0002,动量β1取0.5,使得训练更加稳定。

  • 14
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
(5)\\python全栈day41-50\\python全栈s3 day41;目录中文件数:10个 ├─(1) 01 python s3 day41 JS的历史以及引入方式.avi ├─(2) 02 python s3 day41 JS的基础规范.avi ├─(3) 03 python s3 day41 JS的基本数据类型.avi ├─(4) 04 python s3 day41 JS的运算符.avi ├─(5) 05 python s3 day41 JS的控制语句与循环.avi ├─(6) 06 python s3 day41 JS的循环与异常.avi ├─(7) 07 python s3 day41 JS的字符串对象.avi ├─(8) 08 python s3 day41 JS的数组对象.avi ├─(9) 09 python s3 day41 JS的函数对象.avi ├─(10) day41.rar (6)\\python全栈day41-50\\python全栈s3 day42;目录中文件数:6个 ├─(11) 01 python s3 day42 JS的函数作用域.avi ├─(12) 02 python s3 day42 JS的window对象之定时器.avi ├─(13) 03 python s3 day42 JS的history对象和location对象.avi ├─(14) 04 python s3 day42 JS的DOM节点.avi ├─(15) 05 python s3 day42 JS的DOM节点.avi ├─(16) day42.rar (7)\\python全栈day41-50\\python全栈s3 day43;目录中文件数:10个 ├─(17) 01 python s3 day43 上节知识回顾.avi ├─(18) 02 python s3 day43 js之onsubmit事件与组织事件外延.avi ├─(19) 03 python s3 day43 DOM节点的增删改查与属性设值.avi ├─(20) 04 python s3 day43 正反选练习.avi ├─(21) 05 python s3 day43 js练习之二级联动.avi ├─(22) 06 python s3 day43 jquery以及jquery对象介绍.avi ├─(23) 07 python s3 day43 jquery选择器.avi ├─(24) 08 python s3 day43 jquery的查找筛选器.avi ├─(25) 09 python s3 day43 jquery练习之左侧菜单.avi ├─(26) day43课件代码.rar (8)\\python全栈day41-50\\python全栈s3 day44;目录中文件数:10个 ├─(27) 01 python s3 day44 jquery属性操作之html,text,val方法.avi ├─(28) 02 python s3 day44 jquery循环方法和attr,prop方法.avi ├─(29) 03 python s3 day44 jquery模态对话框与clone的应用.avi ├─(30) 04 python s3 day44 jqueryCSS操作之offsets,position以及scrolltop.avi ├─(31) 05 python s3 day44 jquery事件绑定与事件委托.avi ├─(32) 06 python s3 day44 jquery动画效果.avi ├─(33) 07 python s3 day44 jquery扩展与插件.avi ├─(34) 08 python s3 day44 jquery扩展补充.avi ├─(35) 09 python s3 day44 本周作业轮播图以及思路.avi ├─(36) day44课件代码.rar (9)\\python全栈day41-50\\python全栈s3 day45;目录中文件数:3个 ├─(37) day45.rar ├─(38) 轮播图片css部分.avi ├─(39) 轮播图片js部分.avi (10)\\python全栈day41-50\\python全栈s3 day46;目录中文件数:8个 ├─(40) 01 python s3 day46 数据库与dbms的概念.avi ├─(41) 02 python s3 day46 sql规范.avi ├─(42) 03 python s3 day46 数据库操作DDL.avi ├─(43) 04 python s3 day46 mysql的数据类型.a

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬小帽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值