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 亿
神经网络中的对抗攻击与对抗样本
对抗攻击
对抗攻击论文参考:
《Intriguing properties of neural networks》
《神经网络有趣的特性》
《Threat of Adversarial Attacks on Deep Learning in Computer Vision: A Survey》,以下简称『Survey』。
图片做适当修改后能欺骗深度学习模型的可能性
1.举例理解:
左边是一张能够被GoogLeNet正常分类为熊猫的图片,在添加一定的噪音后变成右图,在人的肉眼看来,它还是熊猫,但GoogLeNet会判定为长臂猿。这种被修改后人类无法明显察觉,却被机器识别错误的数据即为 对抗样本 ,而这整个过程就可以理解为 对抗攻击 。
2.数学理解:
神经网络中每层神经元的输入 a = g(Wx+b),其中 g 为激活函数,W 为权重参数,x 为上一层的样本数据,b 为偏置参数,那么从拓扑学角度来看,在一个二维平面上,这个过程相当于哪几个步骤呢?
(1)一次使用权重参数矩阵 W 的线性变换
(2)一次使用偏执向量 b 的移动
(3)一次应用非线性激活函数 g 的变换
在 二维平面 ,其实是将整个平面进行了 旋转、移动和拉伸 三步。
分类问题
简单分类问题:通过较少几次变换将问题转换为一条直线可分割的空间。
既是一层神经网络就可以完成分类,通过变换空间布局,最终通过一条直线完成分类。
举例:
简单转换ing........
转换结果看下图
复杂分类问题:通过多几次的转换完成将问题转换为一条直线可分割的空间。
就是多层神经网络完成分类,通过变换空间布局,最终通过一条直线完成分类。
举例:
动态多步转换
以上是从低维度理解神经网络的训练,其中也有难以拉伸的例外,下图所示的圆套圆的情况,就是难以在二维空间将其拉伸到理想的位置的例子。
但,增加神经元,可以在 三维空间 中轻松将其分离。
看!
归纳 同样对于复杂问题可以通过,增加神经元在高维度通过更长且复杂的方式解决。
但是例如两个相互套起来的环,按照推测需要在四维空间中才能完全分开,然而我们难以想象四维空间,在现实世界的数据集中,这种死结或者缠绕问题可能会更复杂。
对于神经网络来,可以选择 将打成死结的数据尽可能拉伸开,而不是完全解开 ,如下图,对于分类问题来说,已经具有较高的准确率和召回率。
部分情况下,为了更精确地分类,较宽的神经网络可能相对深度来说更重要。
综上所述
1. 神经网络中包含语义信息的不在每个独立的神经单元,而是整个空间。 神经网络在最后一层能将样本中诸多变化的因子理清楚并理解其语义,并不是因为某个独立神经元中包含了什么特定的语义,而是 对整个空间进行变换后从最终的表征层中学到的 ,经过学习,神经网络会 放大某些相关因子,同时缩小某些无关因子 。
2. 神经网络学习到的输入到输出的映射在很大程度上是不连续的。 就像上面图中为了解开一个死结所做的拉伸结果一样, 在人看来,在拉伸距离较大的地方我们可以认为这种映射是连续的, 然而 对于仍然缠绕在一起的部分,之前可以用来划分界限的直线或者超平面已经无法连续 。
通过仔细观察可以区分出来,但是上文只是一个简单的例子,现实世界中的真实数据较为复杂,对于肉眼来说可能很难分清楚缠绕在一起的部分。对于神经网络来说, 对抗样本已经严重的跨过了用于分类的界限 ,而对于肉眼其实还 看不出来它有移动。
()线性特性的攻击行为()和()高效制造对抗样本的方法()
参考论文:
《Explaining and harnessing adversarial examples》
《对抗性例子的解读和掌握》
深度神经网络在高纬空间中的线性特性已经足以产生这种攻击行为 ,并提出了一种 更高效生成对抗样本的方法 ,接下来我们就简单分析一下这一理论和方法。
目前神经网络为了提高训练效率所使用的激活函数在局部都过于线性。
例如:
类比先前举出的拓扑学例子,在 最后的表征层 都是 通过直线或超平面完成的分类 ,在线性的假设下,暂且不通过二维或三维空间来理解,先从一个简单的数学公式角度开始。
数学解释
公式内容解释:
w 是训练好的参数向量
x 表示真实样本数据向量
η 表示给图像加入的噪音向量
x ~表示加入噪音后新生成的样本
当加入足够小的 η 时,肉眼无法区分出 x 的变化,直观感觉上左边的式子可能也不会变化很大。
事实上 ,然而 η 当的方向与 w 完全一致的时候,即使很小,也会使整个激活值变化很大。
假设证明:
如果 w 是一个 n 维向量,而其权值的平均大小为 m,那么激活值将会增加 nm。可见,在一个肉眼几乎无法差觉的扰动干扰下,对神经网络最终激活层的计算会产生巨大的干扰,从而迷惑神经网络训练出来的模型。
寻找正确方向
当 η 与 w 的方向一致时会使激活值最大,那么,如何找到这个正确的方向呢?
结论,那就是损失函数在待构造样本上的梯度方向,即下面的式子。
ε 是一个调节系数
sign() 是一个符号函数,代表的意思也很简单,就是取一个值的符号
(当值大于 0 时取 1,当值等于 0 时取 0,当值小于 0 时取 -1)
▽ 表示求 x 的梯度,可以理解为偏导,
J 是训练模型的损失函数。
结论的由来
在正常的神经网络模型训练过程中,有一个过程叫反向传播,就是对参数求偏导,然后将参数更新,我们结合下面这张图看一下。
假设图中的函数即为 损失函数 ,为了使损失函数降到最低,我们会根据当前值的梯度去调整。
当梯度小于 0 的时候我们可以看出,当前值需要右移。
而当梯度大于 0 的时候,当前值需要左移。
这个过程实际上就是用 θ 减去 θ。扩展到损失函数 J(θ, x, y) 中,θ 即为 我们要调整的参数 ,因此在样本 x 和 y 不改变的情况下,我们会**不断去调整参数 θ **以寻求局部最优解,即 θ = θ - θ 。
生成对抗样本,也可以采用类似的方法,那就是 固定参数 θ,调整 x 同时使损失函数增大 ,而不是变小,此时就应该让 x 往相反的方向走,即 x = x + x ,这样是不是很容易可以理解上面 η 的定义呢?在实践中,我们还需要通过 ε 这个参数来 调节噪音的大小 ,这种方法相比之前提到的优化方法非常高效,基本只需要一次计算就可以找到对抗样本,因此作者将这种方法叫做 快速梯度符号法 (Fast Gradient Sign Method,FGSM)。总结一下FGSM,这种方法通过替换目标值 y 就可以 让攻击样本朝着指定的分类目标走 ,即,可以做任意目标的欺骗。
将线性假设简化到二维空间,我们要求的 η 其方向正好就接近于参数 w 的方向,不再展开说明,有兴趣的读者可以自行画一画。
建立在一个高维空间线性的假设或猜测前提下,需要 实验 支撑,根据下列图片分析展开。
图片解释
这张图是对数据集CIFAR-10的分类器的决策边界示意图。
其中每个小格子代表的是不同的CIFAR-10样本,
每个小格子中:
横向从左往右代表的是FGSM算法中的梯度方向,
纵向代表的是FGSM梯度方向的正交方向,
白色表示模型能分类正确的情况
彩色代表预测出错的情况
不同的颜色代表不同的错误预测分类。
可以看出,在出错的区域都程线性分布,另外,如果横轴的方向走的不够远,即便再往其他方向走都无法使模型出错,而一单进入这个区域,就会出现大量的对抗样本。而在随机找到的对抗样本中,这种分布也是很随机的,甚至很难找到,见下图。
从实验结果表明
高维空间中的线性假设也是合理的
举例
一匹叫做 Clever Hans 的马,刚出现的时候人们认为这匹马会做算术,但实际上它只是会阅读人的表情,当它点马蹄的次数接近正确答案时,人们的表情会更兴奋,它就知道该这个时候停止了。
隐喻神经网络,一个测试效果良好的分类器,其实并不像人类一样学习到了所分类样本的真正底层概念,只不过刚好构建了一个在训练数据上运行相当良好的模型,所以,你以为你以为的就是你以为的吗?
分类器能够在训练集的不同子集上训练时获得大致相同的分类权重,因为机器学习算法能够泛化, 基础分类权重的稳定性反过来又会导致对抗性样本的稳定性。因此, 对抗攻击可以认为是存在于任何神经网络模型。
以上是论文二的线性特性的攻击行为
高效制造对抗样本的方法
目前来看还没有能够完全抵抗这种攻击的方法,其实结合攻击的原理也不难看出,即便分类器做得再好,总能使一个样本用最小的干扰走到错误的分类区域,我们能做的更多是如何构造鲁棒性更强的模型,同时也保持对这个领域的关注。『Survey』(注意第一篇论文的引用有注释)中总结的目前抵御攻击的办法可以分为三大类:
1.修改训练样本 ———— 通过添加更多的对抗样本到训练集中可以有效避免一部分攻击 ,但这更像是一种无奈的做法, 当扩大样本集的时候,其实分类边界有可能也在随之扩大 。
2.修改训练网络 ,这类方法会对训练网络做出一定调整,其中有一种方式是模拟生物学 在最后一层使用更加非线性的激活函数 ,但这种方式又会 导致训练效率和效果下降 。修改训练网络的方法分为 完全抵抗 和 仅检测 两种方式,完全抵抗其实就是让模型能将对抗样本识别为正确的分类,而仅检测是为了发现这种攻击样本,从而拒绝服务。
3.附加网络 ,这种方式是在 不改变原有模型的情况下使用额外的网络进行辅助 ,这样可以使原有网络保持不变,其中最有效的一种方式是生成式对抗网络——GAN。同样的,这种方式也分为 完全抵抗 和 仅检测 两种方式。
总结一下
定义:
对抗样本:是指在数据集中通过故意添加细微的干扰所形成的输入样本,会导致模型以高置信度给出一个错误的输出。
原因分析:
对抗样本出现的主要原因之一是过度线性, 神经网络主要是基于线性块构建的,实现的整体函数被证明是高度线性的,如果一个线性函数具有许多输入,那么它的值可以非常迅速地改变。
参考:
GAN(1) GAN介绍: 基本概念及逻辑
GAN由Ian Goodfellow于2014年提出,并迅速成为了非常火热的研究话题,GAN的变种更是有上千种,深度学习先驱之一的Yann LeCun就曾说, "GAN及其变种是数十年来机器学习领域最有趣的 idea" 。
听起来很厉害的样子,那么什么是GAN呢?
生成式对抗网络(GAN, Generative Adversarial Networks )是一种 深度学习 模型,是近年来复杂分布上 无监督学习 最具前景的方法之一。模型通过(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的零和博弈进行学习,即通过两个网络的互相对抗来达到最好的生成效果。
这一段看完了,所以,什么是GAN?看懂了吗?感觉充满了问号。。。接下来跟着李宏毅老师的节奏好好梳理一下。
概念里说,模型通过框架中(至少)两个模块:生成模型G(Generative Model)和判别模型D(Discriminative Model),那么什么是生成模型?什么是判别模型?
生成模型G 是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。在GAN中,可以理解为输入一个vector,生成一个图片、语音、文本等有结构的输出。
判别模型D 是一种对未知数据与已知数据之间关系进行建模的方法,在GAN中,可以理解为判别器建立了训练数据与生成器输出的数据的关系,按训练数据的标准为生成的数据打分。
以图像的生成为例:
知道了生成器和判别器是什么,那么他们是怎么配合工作来推动GAN的学习的呢?
以学习画二次元人物头像为例:
就这样一步一步,老师觉得我们画的头像和真正的二次元美图一样美的时候,就不再抽我们大嘴巴子,我们终于出师了,是一个合格的生成器了!(这里的老师就是判别器,判别器也是需要学习的,虽然老师水平高,但他不学习也不一定知道什么是美丽的二次元头像)
生成器和判别器通过零和博弈来学习,什么是零和博弈呢?
零和博弈(zero-sum game) ,又称零和游戏,是博弈论的一个概念,属非合作博弈。
它是指参与博弈的各方,在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为“零”,可以说自己的幸福是建立在他人的痛苦之上的,二者的大小完全相等,因而双方都想尽一切办法以实现“损人利己”。
在上面的例子中,老师(判别器)抽我们(生成器)大嘴巴子,抽的越多他的快乐越多,我们的快乐越少,我们通过和老师博弈改变双方的快乐,但快乐数值的总和一直都是零,这就是判别器和生成器的零和博弈,这种博弈的关系也是GAN中“Adversarial”的由来。
了解了GAN中的几个关键词的含义后,我们来看看GAN是怎样运行的:
过程听起来不是很复杂,不过问题是生成器和判别器两个NN网络是用什么结构组合在一起的呢?
其实, generator和discriminator是同一个大的网络 ,像上图,整个大的网络的 前半部分是generator,后半部分是discriminator ,所以其输入是vector,输出就是得分,而图片就在中间hidden层,即两个网络的衔接处。所谓的生成是指:网络中间的一层hidden-layer的输出是一个图片,判别是指:对这个生成的图片,网络的后半部分会训练出一个得分(或者说概率)。
用稍微数学化一些的语言来表示上述过程:
什么是结构化学习?
在机器学习过程中,对数据的拟合其实就是在找一个拟合函数:
对于回归问题(Regression)来说,这个函数输出一个标量(scalar)
对于分类问题(Classification)来说,这个函数输出一个类别(one-hot 向量)
如果输出的是一个序列,一个矩阵,一个图,一颗树...
其输出由具有依赖关系的组件组成的,这就叫做结构化学习。
首先,对于一般的分类问题,每个类别会对应多个样本,而结构化学习如果把每一个output当做一个类别来看的话,输出空间就非常大,因为其输出是多种多样的,很可能是One-shot learning甚至Zero-shot learning。
One-shot learning: 对某一/某些类别只提供一个或者少量的训练样本;
Zero-shot learning: 对某一/某些类别完全不提供训练样本。
以文本为例,输入“吃了吗?”,输出“吃过了”、“吃了”、“吃啦”等等都可以看做不同的类,所以用普通的分类是难以解决的。
再者,结构化学习的输出是由具有依赖关系的组件组成的,需要考虑整体。
GAN的生成器可以生成各种输出,判别器可以判断输出的好坏,似乎这两个模块都有很强的学习能力,那么他们能独立工作吗?为什么一定要进行博弈呢?
首先来看看生成器能不能自己学习。
生成器当然可以自己学习,在GAN之前就有自编码器AE、变分自编码器VAE。
自编码器是一个如下图所示结构的神经网络,其输入和输出的维度相同,中间的隐含层维度最小,作为编码的结果,其前半部分encoder会尽可能的保留原始输入的信息,以便在后半部分decoder还原输入。
其实自编码器AE得到的decoder就是一个生成器,不过AE的缺点是无法处理没有训练过的数据,当给code加上噪声后,就不知道会输出什么了,可能是一个完全的乱码或者是噪声,我们希望的是“生成模型”能够对任意的输入编码产生有相关意义的数据,这就是我们后面的“变分自编码器VAE”所要做的事情。
变分自编码器直接编码成高斯分布,可以对各种随机输入产生有意义的输出。
编码器的目标是让输出与输入尽可能的相似,怎么评价相似呢?实际上是计算输入向量与输出向量的距离,拿图片来说,向量距离表示两个图片有多少像素不同,但没法表达更多的东西,比如位置等。
如下图所示,编码器会认为上面只差1个像素的图更好,但实际上上面两个在奇怪的地方多/少一个像素点,更容易看出不是人的手写数字,而下面两个虽然像素差的多,但其实只是笔画长一点而已,更像是手写的数字。
组间之间的关系非常重要,在编码器中,尽管两个组间高度相关,但却无法相互影响,我们需要structure 来约束这个事情。就是在后面在加几个隐藏层,就可以调整第L层的神经元输出。也就是说理论上,VAE要想获得GAN的效果,它的网络要比GAN要深才行。
而且由于VAE算法采用的分布采样,因此做一些离得比较散的目标效果不好:
下图中绿色是目标,蓝色是VAE学习的结果
总结一下,不依靠判别器,生成器独立去学习是可以的,不过生成器是一个一个component来生成,每个component之间的关系不好控制,存在一定的缺点,不能从全局把握结果的好坏。
那么,判别器能不能独立学习来生成好的结果呢?
判别器也是可以独立学习的。
判别器也就是Evaluation function, Potential Function, Energy Function …其特点是top-down evaluation,所以很容易控制component之间的关系,能更好的判断一个结果的好坏,以手写数字为例,判别器能轻松的捕捉到元素之间的相关性,这可是生成器很难解决的问题啊。
例如上面提到的问题,图中所示的CNN Filter就可以轻松识别是不是有孤立的的像素点。
那么应该怎么做才能让判别器得到好的输出呢?
只需要穷举所有可能的x,再挑一个使得判别器得分最好的那个即可:
判别器训练的一个难点是缺失负向样本,比如我们想要生成手写字体或者二次元头像,那么我们的训练数据其实只有正向样本,或许我们可以通过给正向样本增加噪声来得到负向样本,但我们制作的负向样本的质量及分布是很难把握的,怎么解决这个问题呢?
可以采用让判别器自己来生成负向样本的方法,算法流程如下:
看起来似乎和GAN训练差不多,但其实还存在着问题。如下图可以帮助我们理解判别器训练的过程,可以理解为判别器在为真实样本打高分,同时压制其他样本的得分,并在每次迭代中修复自己的漏洞,最终希望训练到除了真实样本其他全是低分:
其缺点是什么呢?
在高维空间中,负样本采样过程其实是很难进行的,再者判别器生成样本的过程,即argmax过程,要枚举大量样本,效率很低。
判别器的生成既然这么麻烦的话,真的有用判别器来做生成任务的吗?实际上,概率图模型就是一类典型的判别器做生成的例子。
思考一下,概率图模型我们会有一个图,根据图还会有一个Potential Function(势函数,详细马尔科夫随机场、CRF),这不就形成了一个可以打分的判别器吗!计算出来的概率不就是打的分吗?想一下CRF的训练,就是通过给正向样本和负样本打分,不过迭代过程是不是有我不确定,HMM应该就没有吧?总之这个角度的思路是非常棒的!
总结一下,判别器和生成器的区别:生成器 VS 判别器
综合以上所述的生成器和判别器的优缺点,我们发现两者是互补的,因此将其组合起来使用,充分利用两者的优势:
Benefit of GAN
(1) From Discriminator’s point of view
• Using generator to generate negative samples
(2)From Generator’s point of view
• Still generate the object component-bycomponent
• But it is learned from the discriminator with global view. (跟discriminator 学习大局观)
GAN 的数学理论及推导在下一篇详述,李宏毅老师在第一节介绍课程中也没有讲这部分。
主要参考
对抗生成网络(GAN)教程(2018) 李宏毅
生成式对抗网络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更好的优化,这里不解释,就是平常的优化网络了。
参考文章:
本文大部分翻译此外文
通俗易懂
小博客的总结
唐宇迪大神
gan是什么意思 gan的意思
1、gan的意思是生成式对抗网络。
2、生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。
3、模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为G 和 D。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。
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的概率被判定为假。
0条大神的评论