1. 生成式对抗网络GAN(一)
上面这张图很好的很好的阐述了生成式对抗网络的结构~~ 博弈论
此图给出了生成性对抗网络的概述。目前最重要的是要理解GAN是使两个网络协同工作的一种方式 - 而Generator和Discriminator都有自己的架构。为了更好地理解这个想法的来源,我们需要回忆一些基本的代数并问自己 - 我们怎么能欺骗一个比大多数人更好地分类图像的神经网络?
在我们详细描述GAN之前,让我们看一下类似的主题。给定一个训练有素的分类器,我们可以生成一个欺骗网络的样本吗?如果我们这样做,它会是什么样子?
事实证明,我们可以。
甚至更多 - 对于几乎任何给定的图像分类器,可以将图像变换为另一个图像,这将被高度置信地错误分类,同时在视觉上与原始图像无法区分!这种过程称为对抗性攻击,生成方法的简单性解释了很多关于GAN的内容。
精心计算的示例中的对抗性示例,其目的是错误分类。以下是此过程的说明。左边的熊猫与右边的熊猫无法区分 - 但它被归类为长臂猿。
图像分类器本质上是高维空间中的复杂决策边界。当然,在对图像进行分类时,我们无法绘制这个边界。但我们可以安全地假设,当训练结束时,网络并不是针对所有图像进行推广的 - 仅针对我们在训练集中的那些图像。这种概括可能不是现实生活的良好近似。换句话说,它适用于我们的数据 - 我们将利用它。
让我们开始为图像添加随机噪声并使其非常接近零。我们可以通过控制噪声的L2范数来实现这一点。数学符号不应该让您担心 - 出于所有实际目的,您可以将L2范数视为向量的长度。这里的诀窍是你在图像中拥有的像素越多 - 它的平均L2范数就越大。因此,如果噪声的范数足够低,您可以预期它在视觉上难以察觉,而损坏的图像将远离矢量空间中的原始图像。
为什么?
好吧,如果HxW图像是矢量,那么我们添加到它的HxW噪声也是矢量。原始图像具有相当密集的各种颜色 - 这增加了L2规范。另一方面,噪声是一组视觉上混乱的相当苍白的像素 - 一个小范数的矢量。最后,我们将它们添加到一起,为损坏的图像获取新的矢量,这与原始图像相对接近 - 但却错误分类!
现在,如果原始类 Dog 的决策边界不是那么远(就L2范数而言),这种加性噪声将新图像置于决策边界之外。
您不需要成为世界级拓扑学家来理解某些类别的流形或决策边界。由于每个图像只是高维空间中的矢量,因此在其上训练的分类器将“所有猴子”定义为“由隐藏参数描述的该高维斑点中的所有图像矢量”。我们将该blob称为该类的决策边界。
好的,所以,你说我们可以通过添加随机噪声轻松欺骗网络。它与生成新图像有什么关系?
现在我们假设有两个结构模型,相当于两个神经网络:
这是关于判别网络D和生成网络G的价值函数(Value Function),训练网络D使得最大概率地分对训练样本的标签(最大化log D(x)),训练网络G最小化log(1 – D(G(z))),即最大化D的损失。训练过程中固定一方,更新另一个网络的参数,交替迭代,使得对方的错误最大化,最终,G 能估测出样本数据的分布。生成模型G隐式地定义了一个概率分布Pg,我们希望Pg 收敛到数据真实分布Pdata。论文证明了这个极小化极大博弈当且仅当Pg = Pdata时存在最优解,即达到纳什均衡,此时生成模型G恢复了训练数据的分布,判别模型D的准确率等于50%。
接着上面最后一个问题:怎么才能生成我指定的图像呢?
指定标签去训练
顾名思义就是把标签也带进公式,得到有条件的公式:
具体怎么让CGAN更好的优化,这里不解释,就是平常的优化网络了。
参考文章:
本文大部分翻译此外文
通俗易懂
小博客的总结
唐宇迪大神
2. LSGAN:最小二乘生成对抗网络
解决问题: 解决传统 GAN 生成图片质量不高,训练不稳定的问题。
做法: 将传统 GAN 的 交叉熵损失函数 换成 最小二乘损失函数
本篇主要通过GAN对比来学习LSGAN
通过例子介绍:
使用 位于决策边界正确侧 但仍然 远离真实数据的假样本 更新生成器时,交叉熵损失函数将导致梯度消失的问题。
如图 (b)所示,当我们使用 假样本 (品红色)通过使鉴别器相信它们来自真实数据来更新生成器时,它 几乎不会引起错误 ,因为它们在正确的一侧,既决策边界的真实数据面。
然而,这些样本 仍然离真实数据很远 ,我们想把它们拉得接近真实数据。
问题总结:在交叉熵损失函数情况下,判别器判定真实面的假数据距离真实数据较远,效果不足。
基于这一观察,我们提出了最小二乘生成对抗网络,它采用 最小二乘损失函数作为鉴别器 。
最小二乘损失函数能够 将伪样本移向决策边界 ,
因为最小二乘损失函数会 惩罚位于决策边界正确一侧很远的样本 。
如图 (c)所示,最小二乘损失函数将惩罚假样本(品红色),并 将它们拉向决策边界 ,使它们被正确分类。
基于这一特性,最小二乘能够生成更接近真实数据的样本
总结概括
最小二乘: 最小二乘损失与交叉熵损失相比,优势在于生成样本在欺骗判别器的前提下同时让生成器把 距离决策边界比较远 的生成图片拉向 决策边界 ,这样保证了生成高质量的样本。
交叉熵: 以交叉熵作为损失,会使得生成器 不会再优化那些被判别器识别为真实图片的生成图片 ,即使这些生成图片距离判别器的决策边界仍然很远,也就是距离真实数据比较远,因为此时的交叉熵损失已经很小,生成器完成了为它设计的目标。
LSGAN的缺陷: 在于它并 没有解决当判别器足够优秀时生成器发生梯度弥散的问题
梯度弥散: 使用反向传播算法传播梯度的时候,随着传播深度的增加, 梯度的幅度会急剧减小,会导致浅层神经元的权重更新非常缓慢 ,不能有效学习。
这样一来,深层模型也就变成了前几层相对固定,只能改变最后几层的浅层模型。
GANs 的损失函数:
LSGANs的损失函数:
最小二乘
公式注释:
鉴别器 D
生成器 G
G 的目标是学习数据 x 上的分布 pg。
G 服从均匀或高斯分布 pz(z)对输入变量 z 进行采样开始,然后将输入变量 z 映射到数据空间 G(z; θg)。
D 是分类器 D(x; θd),其目的是识别图像是来自训练数据还是来自g。
z 为噪音,它可以服从归一化或者高斯分布,为真实数据 x 服从的概率分布,为 z 服从的概率分布。为期望值,同为期望值。
假设我们对鉴别器使用 a-b 编码方案 ,其中a 和b 分别是假数据和真实数据的标签。
c 表示 G 预测的D 相信的假数据的值。
最小二乘法的具体优点:
1.决策边界固定(鉴别器参数固定),生成样本靠近决策边界,更接近真实数据。
2.惩罚远离决策边界的样本时,可以在更新生成器时生成更多的梯度,这反过来缓解了梯度消失的问题(梯度消失:前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降)
GAN中:最小化等式 1 产生最小化詹森-香农散度:
LSGAN:探讨LSGAN与f散度的关系
公式解释:(下文关于a-b编码证明a,b,c条件)
将
加入到
并不会改变最佳值,因为并没有引入含有G的参数
从而我们可以推出G固定情况下的最佳鉴别器:
使用 pd 来表示 pdata,来重新表示4式
此处不详细证明
化简为:
如果: b-c = 1, b-a = 2,则
是皮尔逊散度,总之可证,当 a,b,c满足b-c = 1 和 b-a = 2的条件,则最小化等式 4 会使 pd + pg 和 2pg 之间的皮尔逊 χ2 散度最小化。
采用 a-b编码方案:
由上述证明可设a = 1, b = 1, c = 0
采用 0-1二进制编码方案 :
两式接近,但此处,论文作者采用a-b编码方式,来实现实验:
带上其中一个实验:
参考论文:Mao X D, Li Q, Xie H R, et al. Least squares generative
adversarial networks[C]//Proceedings of the 2017 IEEE
International Conference on Computer Vision, Venice, Oct
22- 29, 2017. Washington: IEEE Computer Society, 2017:
2813-2821.
3. CycleGAN原理及实验(TensorFlow)
生成对抗网络(GAN)是一个十分有效的深度学习模型,由此衍生了CycleGAN。
先简单介绍一下GAN。
网络中有生成器G(generator)和鉴别器(Discriminator)。
有两个数据域分别为X,Y。G 负责把X域中的数据拿过来拼命地模仿成真实数据并把它们藏在真实数据中,而 D 就拼命地要把伪造数据和真实数据分开。经过二者的博弈以后,G 的伪造技术越来越厉害,D 的鉴别技术也越来越厉害。直到 D 再也分不出数据是真实的还是 G 生成的数据的时候,这个对抗的过程达到一个动态的平衡。
传统的GAN是单向的:
训练这个单向GAN需要两个loss:生成器的重建Loss和判别器的判别Loss。
1. 重建Loss :希望生成的图片Gba(Gab(a))与原图a尽可能的相似。
CycleGAN本质上是两个镜像对称的GAN,构成了一个环形网络。
两个GAN共享两个生成器,并各自带一个判别器,即共有两个判别器和两个生成器。一个单向GAN两个loss,两个即共四个loss。
论文里最终使用均方误差损失表示:
CycleGAN的网络架构如图所示:
可以实现无配对的两个图片集的训练是CycleGAN与Pixel2Pixel相比的一个典型优点。但是我们仍然需要通过训练创建这个映射来确保输入图像和生成图像间存在有意义的关联,即输入输出共享一些特征。
简而言之,该模型通过从域DA获取输入图像,该输入图像被传递到第一个生成器GeneratorA→B,其任务是将来自域DA的给定图像转换到目标域DB中的图像。然后这个新生成的图像被传递到另一个生成器GeneratorB→A,其任务是在原始域DA转换回图像CyclicA,这里可与自动编码器作对比。这个输出图像必须与原始输入图像相似,用来定义非配对数据集中原来不存在的有意义映射。
鉴别器将一张图像作为输入,并尝试预测其为原始图像或是生成器的输出图像。
鉴别器本身属于卷积网络,需要从图像中提取特征,再通过添加产生一维输出的卷积层来确定提取的特征是否属于特定类别。
分别有大约2万张男人与女人的脸作为输入的训练集。
项目中提供了build_data.py脚本,修改训练集的路径,运行即可。
将data/test.jpg替换为对应的输入图片地址
训练时踩了比较多坑。由于急于看结果用了比较高的学习率。大概迭代五万次的时候可以有一点能看的结果,10万次时多数还可以接受。但是仍然有许多问题,比如戴眼镜,脸上亮度不均匀,角度奇异等都可能引起生成的图像中噪声较大的问题。
转换的特征通常为面部五官特征以及肤色亮度等,不包括发型,因此男女转化之后显得比较诡异。。
比如
未完待续。。
4. GAN生成对抗网络(一)
GAN(Generative Adversarial Networks)是两个网络的的组合, 一个网络生成模拟数据, 另一个网络判断生成的数据是真实的还是模拟的。生成模拟数据的网络要不断优化自己让判别的网络判断不出来, 判别的网络也要优化自己让自己判断得更准确。 二者关系形成对抗博弈,因此叫 对抗神经网络 (生成对抗网络)。实验证明, 利用这种网络间的对抗关系所形成的网络, 在无监督及半监督领域取得了很好的效果, 可以算是用网络来监督网络的一个自学习过程。在GAN发明之前,变分自编码器被认为是理论完美、实现简单,使用神经网络训练起来很稳定, 生成的图片逼近度也较高, 但是人类还是可以很轻易地分辨出真实图片与机器生成的图片。
生成对抗网络包含了 2 个子网络: 生成网络(Generator, G)和判别网络(Discriminator,D), 其中生成网络负责学习样本的真实分布,判别网络负责将生成网络采样的样本与真实样本区分开来。
生成网络 G(𝐳) 生成网络 G 和自编码器的 Decoder 功能类似, 从先验分布 中采样隐藏变量 ,通过生成网络 G 参数化的 分布, 获得生成样本 ,如下图所示。 其中隐藏变量𝒛的先验分布 可以假设属于某中已知的分布,比如多元均匀分布 。
可以用深度神经网络来参数化, 如下图所示, 从均匀分布 中采样出隐藏变量𝒛, 经过多层转置卷积层网络参数化的 分布中采样出样本 。
判别网络 D(𝒙) 判别网络和普通的二分类网络功能类似,它接受输入样本𝒙,包含了采样自真实数据分布 的样本 ,也包含了采样自生成网络的假样本 , 和 共同组成了判别网络的训练数据集。判别网络输出为𝒙属于真实样本的概率 ,我们把所有真实样本 的标签标注为1,所有生成网络产生的样本 标注为0, 通过最小化判别网络预测值与标签之间的误差来优化判别网络参数。
我们的目标很明确, 既要不断提升判断器辨别真假图像样本的能力, 又要不断提升生成器生成更加逼真的图像,使判别器越来越难判别。
对于判别网络 D ,它的目标是能够很好地分辨出真样本 与假样本 。即最小化图片的预测值和真实值之间的交叉熵损失函数:
其中 代表真实样本 在判别网络 的输出, 为判别网络的参数集, 为生成样本 在判别网络的输出, 为 的标签,由于真实样本标注为真,故 , 为生成样本的 的标签,由于生成样本标注为假,故 。 根据二分类问题的交叉熵损失函数定义:
因此判别网络的优化目标是:
去掉 中的负号,把 问题转换为 问题,并写为期望形式:
对于生成网络G(𝒛) ,我们希望 能够很好地骗过判别网络 , 假样本 在判别网络的输出越接近真实的标签越好。也就是说,在训练生成网络时, 希望判别网络的输出 越逼近 1 越好,此时的交叉熵损失函数:
把 问题转换为 问题,并写为期望形式:
再等价转化为:
GAN的优化过程不像通常的求损失函数的最小值, 而是保持生成与判别两股力量的动态平衡。 因此, 其训练过程要比一般神经网络难很多。
把判别网络的目标和生成网络的目标合并,写成min-max形式:
原GAN论文中:
这里为了好理解,把各个符号梳理的更清晰了,注意符号和网络参数的对应。
理想情况下 , 会有更精确的鉴别真伪数据的能力,经过大量次数的迭代训练会使 尽可能模拟出以假乱真的样本, 最终整个GAN会达到所谓的纳什均衡, 即 对于生成样本和真实样本鉴别结果为正确率和错误率各占50%。下面具体从理论层面来推导。
现在从理论层面进行分析, 通过博弈学习的训练方式,生成器 G 和判别器 D 分别会达到什么状态。 具体地,来看以下 2 个问题:
首先我们通过 一维正态分布的例子给出一个直观的解释,如下图所示,黑色虚线曲线代表了真实数据的分布 , 为某正态分布 , 绿色实线代表了生成网络学习到的分布 , 蓝色虚线代表了判别器的决策边界曲线, 图中(a)(b)(c)(d)分别代表了生成网络的学习轨迹。在初始状态,如图 (a)所示, 分布与 差异较大,判别器可以很轻松地学习到决策边界,即图(a)中的蓝色虚线,将来自 的采样点判定为 0, 中的采样点判定为 1。 随着生成网络的分布 越来越逼近真实分布 ,判别器越来越困难将真假样本区分开,如图 (b)(c)所示。 最后,生成网络性能达到最佳,学习到的分布 ,此时从生成网络中采样的样本非常逼真, 判别器无法区分,即判定为真假样本的概率均等,如图(d)所示。
固定生成器G的参数 ,判别器D最佳能达到的状态:
证明: 对于给定的生成器G,要让判别器D达到最优,我们的目标是最大化损失函数,其积分形式为:
对于给定的 ,真实分布始终是固定的,所以 和 都是定值,于是对于判别器D,要找出
的最大值,其中 是判别器网络参数,对于函数 ,不难得到 在 处取得极大值且是最大值。因此可得 的极值点也为
故判别器 能达到的最佳状态为定理中给出的式子。
现在考虑第二个问题。
JS 散度(Jensen–Shannon divergence)
对于KL散度, ,是不对称的。但JS散度是对称的。
当 达到 时,考虑此时 和 的 散度:
考虑到判别网络到达 时,此时的损失函数为:
于是我们可以得到:
对于生成网络 而言,目标是最小化损失函数,由于 ,因此 取得最小值仅在 时(此时 ), 取得最小值:
此时生成网络达到 状态是:
即 的学到的分布 与真实分布 一致,网络达到纳什均衡点,此时:
即对于生成器生成的图像有0.5的概率被判定为真,也有0.5的概率被判定为假。
5. BEGAN边界平衡生成对抗网络
解决问题: GAN训练模型较为困难
做法: BEGAN并没有直接去估计生成分布 pg 和真实分布 px 的距离,而是估计两者分布误差的距离。
分布之间的误差分布相近的话,也可以认为 pg 和 px 是相近的。
BEGAN 将判别器 G 设计成自编码器用来重构分布误差,并优化分
布误差之间的距离,如下式:
BEGAN 提出一种均衡概念,用以平衡 G 和 D 的训练,使 GAN 即使使用很简单的网络,不加如 BN、minibath 等训练技巧也能得到很好的训练效果。
同时还提出了一种能够在样本多样性和样本质量上均衡的超参数以及衡量模型收敛性的方法。
实验中发现 BEGAN 收敛很快,并且 G 和 D 训练平衡,但超参数的选取比较考验经验。
1.使得GAN具有快速而稳定的收敛的标准训练过程。
2.引入均衡概念,均衡鉴别器和发生器的功率。
3.提供控制图像多样性和视觉质量之间权衡的新方法
4.收敛的近似度量
使用自动编码器作为鉴别器,使用从瓦瑟斯坦距离(类似于我先前提到的KL散度,具有正定性,对称性,三角不等式特性)导出的损失来匹配自动编码器损失分布。
L:R^Nx->R+训练像素式自动编码器的 1.损失函数:
BEGAN中提出了一种思路,它使用了自动编码器做为判别器 D,它所做的是尽可能地匹配误差的分布而不是直接匹配样本的分布,如果误差的分布之间足够的接近,那么真实的样本之间的分布也会足够的接近。
D:自动编码器功能
n:是目标标准
v:是Nx维度的样例
u1,2是自动编码器损失函数的两个分布
Γ(u1,u2)是1和2的所有组合的集合
m1,2∈R是他们各自的平均值
瓦瑟斯坦距离为:
其中x1和x2是从
利用詹森不等式,可以导出W1(u1,u2)的下界:
目标是优化自动编码器损失分布之间的瓦瑟斯坦距离的下限,而不是样本分布之间的下限。
设计鉴频器,使自动编码器损耗之间的等式1最大化。
设u1为损失L(x)的分布,其中x为实样本。
设u2为损失L(G(z))的分布
其中G : RNz →RNx为生成函数
z∈[-1,1]Nz为维数Nz的均匀随机样本
由于m1,m2 ∈R+到达最大化| m1-m2 |只有两种可能的解决方案:
选择解决方案(b)作为我们的目标,因为最小化m1自然会导致对真实图像的自动编码。
给定鉴别器和发生器参数θD和θG
每个参数都通过最小化损耗LD和LG来更新
将问题表示为GAN目标,其中zD和zG是z的样本:
在BEGAN中G和D对应的损失函数:
2.引入平衡:
当产生器和鉴别器损失之间保持平衡,满足情况:
生成的样本不能被鉴别器从真实样本中区分出来,那么它们的 误差分布包括预期误差应该是相同的 ,使得其均衡。
γ引入来平衡D既可以对真实图像自动编码,又可以正确的判别输入的样本。γ很小时,说明分母部分值很大,那么此时模型专注于识别的正确率,则出现G只生成可以骗过D的图像
鉴别器有两个相互竞争的目标:
1.自动编码真实图像和从生成的图像中鉴别真实图像。
2.γ项让我们平衡这两个目标。
较低的γ值导致较低的图像多样性 ,因为鉴别器更侧重于自动编码真实图像。
将γ称为分集比。有一个自然的边界,图像清晰,有细节。
对于θD和θG和每一训练步t,来说的目标
γ∈[0,1]是一个超参数,值越小代表生成的样本多样性越低
λk是 kt + 1 的更新步长,kt表示对D判别能力的重视度
采用比例控制理论来维持平衡
这是使用一个变量kt ∈[0,1]来实现的,以控制在梯度下降过程中对L(G(zD))的重视程度。
我们初始化k0 = 0.λk是k的比例增益;
在机器学习术语中,它是k的学习率。
我们在实验中使用了0.001。
本质上,这可以被认为是闭环反馈控制的一种形式,其中kt在每一步被调整以保持等式4。
在早期训练阶段,G倾向于为自动编码器生成易于重建的数据,因为生成的数据接近于0,并且还没有准确地了解真实的数据分布。
这时L(X)>L(G(z))
与需要交替训练 D 和 G 或预训练 D 的传统训练相比,BEGAN提出的方法开始不需要稳定训练。
Adam在训练中使用默认的超参数
θD 和 θG 基于各自的损失通过独立的Adam优化器独立更新。
我们通常使用 n = 16 的批量。
3.全局收敛度量:
确定 GANs 的收敛性通常是一项困难的任务,因为最初的公式被定义为零和博弈。
结果,一个亏损上升,另一个亏损下降。
我们通过使用 平衡概念 导出了 收敛的全局度量 :我们可以将收敛过程框架为找到比例控制算法(控制装置输出信号与输人信号间呈线性关系的控制作用数学表示法)|γL(x)-L(G(Zg))|的 瞬时过程误差绝对值最小的最近重构L(x) 。这一衡量标准由两项和:
该度量可用于确定网络何时达到其 最终状态 或 模型是否已崩溃 也即是模型是否收敛。
4.模型架构
鉴别器: R Nx->R Nx是一个卷积深度神经网络,其架构为自动编码器。
Nx = H × W × C 是x 尺寸的简写
其中 H、 W、 C 是高度、宽度和颜色。
我们使用自动编码器和深度编码器和解码器。目的是尽可能简单,以避免典型的GAN诡计。
结构如图 1 所示。我们使用了 3 × 3 的卷积,在它们的输出端应用了指数线性单位。
每层重复多次(通常为 2 次)。我们观察到,重复次数越多,视觉效果越好。
卷积滤波器随着每次下采样线性增加。
下采样作为步长为 2 的子采样实现,上采样由最近邻完成。
在编码器和解码器之间的边界处,经过处理的数据的张量通过完全连接的层被映射到嵌入状态 h ∈RNh 和从嵌入状态 h∈ RNh 来,其中 Nh 是自动编码器的隐藏状态的维度,而没有任何非线性。
生成器 G : RNz → RNx 使用与鉴别器解码器相同的架构(虽然权重不同)。
但为了简化。输入状态为均匀采样的 z∈ [-1, 1]Nz。
这个简单的架构实现了高质量的结果,并展示了技术的健壮性。
此外,可选的细化有助于梯度传播,并产生更清晰的图像。受深度残差网络[8]的启发,使用消失残差初始化网络:对于连续的相同大小的层,层的输入与其输出相结合:inx+1 =carry×inx+(1 carry)×outx。
在实验中,我们从进位= 1 开始,经过 16000 步
逐渐减少到 0。
我们还引入了跳跃连接[8, 17, 9]来帮助梯度传播。第一解码器张量 h0 是通过将 h 投影到 8 × 8 × n 张量而获得的。在每个上采样步骤之后,输出与上采样到相同维数的 h0 连接。
这在隐藏状态和解码器的每个连续上采样层之间创建了跳跃连接。
我们没有探索 GANs 中通常使用的其他技术,如批量归一化、缺失、转置卷积或卷积滤波器的指数增长,尽管它们可能会进一步改进这些结果
5.通过实验来理解
变 γ 的值时,模型生成结果的多样性和质量对比效果如下所示,从中可以看出
γ值越小,生成的图像越清晰,也更接近;
γ值越大,多样性提高了,但是图像的质量同样也下降了
BEGAN的空间连续性与其他GAN相比表现更优异:
伴随着模型收敛,图像质量也在不断提升
总之:BEGAN针对 GAN 训练难易度难、控制生成样本多样性难、平衡鉴别器和生成器收敛难等问题,做出了很大的改善。
参考论文:Berthelot D, Schumm T, Metz L. BEGAN: boundary equilibrium generative adversarial networks[J]. arXiv:1703.10717,
2017
6. 如何完善生成对抗网络
1.GAN最开始是设计用于生成连续数据,但是自然语言处理中我们要用来生成离散tokens的序列。因为生成器(Generator,简称G)需要利用从判别器(Discriminator,简称D)得到的梯度进行训练,而G和D都需要完全可微,碰到有离散变量的时候就会有问题,只用BP不能为G提供训练的梯度。在GAN中我们通过对G的参数进行微小的改变,令其生成的数据更加“逼真”。若生成的数据是基于离散的tokens,D给出的信息很多时候都没有意义,因为和图像不同。图像是连续的,微小的改变可以在像素点上面反应出来,但是你对tokens做微小的改变,在对应的dictionaryspace里面可能根本就没有相应的tokens.2.GAN只可以对已经生成的完整序列进行打分,而对一部分生成的序列,如何判断它现在生成的一部分的质量和之后生成整个序列的质量也是一个问题。
7. GAN的基本介绍和变种
GAN,全称为Generative Adversarial Nets,直译为“生成式对抗网络”。GAN作为生成模型的代表,自2014年被Ian Goodfellow提出后引起了业界的广泛关注并不断涌现出新的改进模型,深度学习泰斗之一的Yann LeCun高度评价GAN是机器学习界近十年来最有意思的想法。
GAN始终存在训练难、稳定性差以及模型崩塌(Model Collapse)等问题。产生这种不匹配的根本原因其实还是对GAN背后产生作用的理论机制没有探索清楚。
在推动GAN应用方面,2017年有两项技术是非常值得关注的。其中一个是CycleGAN,其本质是利用对偶学习并结合GAN机制来优化生成图片的效果的,采取类似思想的包括DualGAN以及DiscoGAN等,包括后续的很多改进模型例如StarGAN等。CycleGAN的重要性主要在于使得GAN系列的模型不再局限于监督学习,它引入了无监督学习的方式,只要准备两个不同领域的图片集合即可,不需要训练模型所需的两个领域的图片一一对应,这样极大扩展了它的使用范围并降低了应用的普及难度。
另外一项值得关注的技术是英伟达采取“渐进式生成”技术路线的GAN方案,这项方案的引人之处在于使得计算机可以生成1024*1024大小的高清图片,它是目前无论图像清晰度还是图片生成质量都达到最好效果的技术,其生成的明星图片几乎可以达到以假乱真的效果(参考图3)。英伟达这项由粗到细,首先生成图像的模糊轮廓,再逐步添加细节的思想其实并非特别新颖的思路,在之前的StackGAN等很多方案都采用了类似思想,它的独特之处在于这种由粗到细的网络结构是动态生成的而非事先固定的静态网络,更关键的是产生的图片效果特别好
首先,有一个一代的 generator,它能生成一些很差的图片,然后有一个一代的 discriminator,它能准确的把生成的图片,和真实的图片分类,简而言之,这个 discriminator 就是一个二分类器,对生成的图片输出 0,对真实的图片输出 1。
接着,开始训练出二代的 generator,它能生成稍好一点的图片,能够让一代的 discriminator 认为这些生成的图片是真实的图片。然后会训练出一个二代的 discriminator,它能准确的识别出真实的图片,和二代 generator 生成的图片。以此类推,会有三代,四代。。。n 代的 generator 和 discriminator,最后 discriminator 无法分辨生成的图片和真实图片,这个网络就拟合了。
对抗样本(adversarial examples)是机器学习模型的输入,攻击者故意设计它们以引起模型出错;它们就像是机器的视觉错觉。
对抗样本指的是一个经过微小调整就可以让机器学习算法输出错误结果的输入样本。在图像识别中,可以理解为原来被一个卷积神经网络(CNN)分类为一个类(比如“熊猫”)的图片,经过非常细微甚至人眼无法察觉的改动后,突然被误分成另一个类(比如“长臂猿”)。
对抗训练
对抗训练是防御对抗样本攻击的一种方法。将对抗样本和正常样本一起训练是一种有效的正则化,可以提高模型的准确度,同时也能有效降低对抗样本的攻击成功率。不过这种防御也只是针对同样用来产生训练集中的对抗样本的方法。
确实在下图中可以看到,训练集是正常样本和对抗样本,测试集是正常样本的红线比训练集和测试集都是正常样本的错误率要降低,说明对抗训练是有正则化的功能。
Figure 9
在训练的时候直接生成对抗样本是比较低效的,之前提到的FGSM是一个高效的对抗训练方法。只需要改变目标函数就能在训练每个正常样本的同时也考虑了对抗样本。模型训练去给对抗样本赋予和正常样本原分类同样的类别。
用经过FGSM训练的网络,可以有效的防御用FGSM产生的对抗样本攻击,但是如果换其他对抗攻击方法,也会被攻破。
对抗样本的工作思路,可以有以下两个方面的意义:
结论
要为集成模型创建对抗样本,因为梯度方法的问题,难度会加大。但是生成的算法更为可行有效。
单个模型出现盲点可以由其他模型弥补,采用的会是输出结果最好的模型数据。
我们发现当我们用动态创建的对抗模型来训练算法时,能够解决这些对抗样本的问题。这是因为当模型面对这些可能出现问题的对抗低概率区域时,可以产生更高的“免疫力”。这同时也支持了低概率区域的论点,在这些区域的对抗样本更难处理。
DCGAN是继GAN之后比较好的改进,其主要的改进主要是在网络结构上,到目前为止,DCGAN的网络结构还是被广泛的使用,DCGAN极大的提升了GAN训练的稳定性以及生成结果质量。
论文的主要贡献是:
◆ 为GAN的训练提供了一个很好的网络拓扑结构。
◆ 表明生成的特征具有向量的计算特性。
D(x)表示D网络判断真实图片是否真实的概率(因为x是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))D(G(z))是为了D判断G生成的图片是否真实的概率。
G的目的:G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))D(G(z))尽可能得大,这是V(D,G)V(D,G)会变小。
D的目的:D的能力越强,D(x)D(x)应该越大,D(G(x))D(G(x))应该越小。因此D的目的和G不同,D希望V(D,G)V(D,G)越大越好。
DCGAN对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度,这些改变有:
取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。
在D和G中均使用batch normalization
去掉FC层,使网络变为全卷积网络
G网络中使用ReLU作为激活函数,最后一层使用tanh
D网络中使用LeakyReLU作为激活函数
DCGAN中的G网络示意:
DCGAN的生成器网络结构如上图所示,相较原始的GAN,DCGAN几乎完全使用了卷积层代替全链接层,判别器几乎是和生成器对称的,从上图中我们可以看到,整个网络没有pooling层和上采样层的存在,实际上是使用了带步长(fractional-strided)的卷积代替了上采样,以增加训练的稳定性。
DCGAN能改进GAN训练稳定的原因主要有:
◆ 使用步长卷积代替上采样层,卷积在提取图像特征上具有很好的作用,并且使用卷积代替全连接层。
◆ 生成器G和判别器D中几乎每一层都使用batchnorm层,将特征层的输出归一化到一起,加速了训练,提升了训练的稳定性。(生成器的最后一层和判别器的第一层不加batchnorm)
◆ 在判别器中使用leakrelu激活函数,而不是RELU,防止梯度稀疏,生成器中仍然采用relu,但是输出层采用tanh
◆ 使用adam优化器训练,并且学习率最好是0.0002,(我也试过其他学习率,不得不说0.0002是表现最好的了)
BigGAN在训练中 Batch 采用了很大的 Batch,已经达到了 2048(我们平常训练 Batch 正常都是 64 居多),在卷积的通道上也是变大了,还有就是网络的参数变多了,在 2048 的 Batch 下整个网络的参数达到了接近 16 亿
8. 【模型解读】历数GAN的5大基本结构
首发于微信公众号《有三AI》
【模型解读】历数GAN的5大基本结构
生成对抗网络是近几年来无监督学习领域里最大的进展,被誉为下一代深度学习,不管是研究热度还是论文数量,已经逼近甚至超越传统判别式的CNN架构。
这一次我们简单介绍一下生成对抗网络的主流模型结构,从一个生成器一个判别器到多个生成器多个判别器。
作者 | 言有三
编辑 | 言有三
我们这一期文章不打算从头开始讲述GAN,所以如果大家没有相关基础的,就先看一下我们上一期GAN的介绍。
【技术综述】有三说GANs(上)
一个基本的用于生成图像的GAN的结构就是这样的。
Generator就是生成器,它输入噪声,输出产生的图像。通常噪声就是一个一维的向量,经过reshape为二维图像,然后利用若干个反卷积层来学习上采样。
如全卷积的DCGAN模型[1],输入就是1*100的向量,然后经过一个全连接层学习,reshape到4*4*1024的张量,再经过4个上采样的反卷积网络,生成64*64的图。
Discrimator就是普通的CNN分类器,输入真实样本或者生成的假样本进行分类,在DCGAN中也是4个卷积层。
采用多个判别器[2]的好处带来了类似于boosting的优势,训练一个过于好的判别器,会损坏生成器的性能,这是GAN面临的一个大难题。如果能够训练多个没有那么强的判别器,然后进行boosting,可以取得不错的效果,甚至连dropout技术都可以应用进来。
多个判别器还可以相互进行分工,比如在图像分类中,一个进行粗粒度的分类,一个进行细粒度的分类。在语音任务中,各自用于不同声道的处理。
一般来说,生成器相比判别器要完成的任务更难,因为它要完成数据概率密度的拟合,而判别器只需要进行判别,导致影响GAN性能的一个问题就是模式坍塌,即生成高度相似的样本。
采用多个生成器单个判别器的方法,可以有效地缓解这个问题。
从上图结构可以看出,多个生成器采用同样的结构,在网络的浅层还共享权重。
在利用GAN进行半监督的图像分类任务时,判别器需要同时担任两个角色,即判别生成的假样本,以及预测类别,这对判别器提出了较高的要求。通过增加一个分类器可以分担判别器的工作量,即将捕捉样本和标签的条件分布这一任务交给生成器和分类器,而判别器只专注于区分真实样本和生成的样本。
这一类结构以Triple Generative Adversarial Nets为代表,下图是它的网络结构。
多个生成器和多个判别器就又有几种。
5.1 级联结构[5]
早期以DCGAN为代表的网络生成的图片分辨率太低,质量不够好,都不超过100×100,在32×32或者64×64左右。这是因为难以一次性学习到生成高分辨率的样本,收敛过程容易不稳定。
类似的问题在图像分割,目标检测中都存在。在目标检测中,级联网络被广泛使用,即采用从粗到精的方法依次改进检测器的性能。在图像分割中进行上采样时也采用学习小倍率的放大而不是大倍率的方法,如利用两个2倍上采样替换一个4倍的上采样,不仅可以增强网络的表达能力,还降低了学习难度。
基于此,金字塔GAN结构被提出并广泛使用,它参考图像领域里面的金字塔结构由粗到精一步一步生成图像,并添加残差进行学习。
上图就是它的结构,从低分辨率z3开始,逐级提升,最终生成I0,这是一个金字塔形状的结构,以下符号较多用图片代替。
5.2 并行与循环结构[6]
GAN有一大应用就是风格化,实现两个域之间的风格互换,以CycleGAN[6]为典型代表。它包含了多个生成器和多个判别器。Cycle的典型结构如下:
X和Y分别表示两个域的图像,可知这里存在两个生成器G和F,分别用于从X到Y的生成和Y到X到生成,包含两个判别器,分别是Dx和Dy。而损失本身也增加了一个循环损失,感兴趣读者可以去细读文章。
另外在cross domain学习中也常用到多判别器多生成器多结构,分别学习不同的域。而且各个域的判别器和生成器通常会共享一些权重,如下图是CoGAN[7]的网络结构。
另外还有一些零零散散的结构,比如3D GAN,RNN GAN,由于都是上面这几类的变种,不再统一介绍。
[1] Radford A, Metz L, Chintala S, et al. Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks[J]. international conference on learning representations, 2016.
[2] Durugkar I P, Gemp I, Mahadevan S, et al. Generative Multi-Adversarial Networks[J]. international conference on learning representations, 2017.
[3] Ghosh A, Kulharia V, Namboodiri V P, et al. Multi-Agent Diverse Generative Adversarial Networks[J]. computer vision and pattern recognition, 2018: 8513-8521.
[4] Chongxuan L I, Xu T, Zhu J, et al. Triple Generative Adversarial Nets[J]. neural information processing systems, 2017: 4088-4098.
[5] Denton E L, Chintala S, Szlam A, et al. Deep generative image models using a Laplacian pyramid of adversarial networks[J]. neural information processing systems, 2015: 1486-1494.
[6] Zhu J, Park T, Isola P, et al. Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks[J]. international conference on computer vision, 2017: 2242-2251.
[7] Liu M, Tuzel O. Coupled Generative Adversarial Networks[J]. neural information processing systems, 2016: 469-477.
本系列的完整目录:
【模型解读】从LeNet到VGG,看卷积+池化串联的网络结构
【模型解读】network in network中的1*1卷积,你懂了吗
【模型解读】GoogLeNet中的inception结构,你看懂了吗
【模型解读】说说移动端基准模型MobileNets
【模型解读】pooling去哪儿了?
【模型解读】resnet中的残差连接,你确定真的看懂了?
【模型解读】“不正经”的卷积神经网络
【模型解读】“全连接”的卷积网络,有什么好?
【模型解读】从“局部连接”回到“全连接”的神经网络
【模型解读】深度学习网络只能有一个输入吗
【模型解读】从2D卷积到3D卷积,都有什么不一样
【模型解读】浅析RNN到LSTM
9. 什么是生成对抗网络
生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。