一文看懂四种基本的神经网络架构

一文看懂四种基本的神经网络架构,第1张

生成对抗网络(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_datapy脚本,修改训练集的路径,运行即可。

将data/testjpg替换为对应的输入地址

训练时踩了比较多坑。由于急于看结果用了比较高的学习率。大概迭代五万次的时候可以有一点能看的结果,10万次时多数还可以接受。但是仍然有许多问题,比如戴眼镜,脸上亮度不均匀,角度奇异等都可能引起生成的图像中噪声较大的问题。
转换的特征通常为面部五官特征以及肤色亮度等,不包括发型,因此男女转化之后显得比较诡异。。
比如

未完待续。。

论文:An Adversarial Approach to Hard Triplet Generation

ReID问题中都是根据图像embedding之间的特征距离来判断相似度,但是平常训练都是根据训练集的ID做监督,用softmax进行分类。而Triplet loss能够直接对图像的特征进行监督,更有利于学到好的embedding。

损失函数:

hard triplets指的是找到minibatch中 最大的一对三元组,即找到 最大的和 最小的。

但是这样直接的方式不一定能找出具有代表性的三元组,会对网络的收敛(convergence)造成问题。

三元组损失函数对于三元组的选择非常敏感,经常会有难以收敛和局部最优的问题,为此 [1] 提出了 Coupled Cluster Loss ,使得训练阶段更加稳定,网络收敛的更加快。

特征提取网络 的输出 ,对于三元组 ,传统方法的损失函数是: ,其中 是 距离。

给出一个生成器 ,通过这个生成器生成一个新的sample , 的目的是使得正样本之间距离增大,负样本之间距离减小,目的是为了生成更harder的sample
通过降低以下loss来训练 :
随后固定学习过的 ,接着训练 :

但是光靠上面的方法并不够有效,因为没有限制的情况下, 会任意 *** 纵(arbitrarily manipulate) 生成的特征向量。打个比方说, 可能随意输出一个向量,使得 非常小,但是这个对于训练来说没有意义。为了限制 ,需要他输出的向量不改变原本向量的标签。

给出一个判别器 ,对于每个特征向量, 能将其分成(K+1)类,K表示真实存在的类别,+1代表fake类别。通过降低以下loss来训练 :

其中前半部分让 分辨 生成的特征向量的标签

表示softmax loss,后半部分让 分辨 生成的特征向量。

表示fake类别。
之前提到 应该保留住输入的特征向量的标签。因此文章中提出下面的loss:

与之前的公式(2) 结合,通过降低以下loss来训练 :

​ 其中classification(5)确保了 能够正确分类

首先,basic model同时降低softmax loss和triplet loss。随后 被加入到basic model。

softmax 和similarity loss在之前的研究中有被结合起来,但是他们之间的关系并没有被深入的进行研究。

在特征向量空间(feature embedding space)中,所有相同类别的数据坐标经过 规范化后应该是在一个单位超球面(unit hyper sphere)上,图2中的decision boundary将不同类别的数据分成K个类别,这种结构能加速收敛并达到理想化(optimal)的结果。但是传统的softmax loss不能很好兼容基于特征距离(distance-based)的similarity loss。如图3(b)中。由于偏置b的存在,decision boundary不能够通过原点,因此在 规范化后,不同类别的点可能会重合。这将导致类间距离(inter-class)的缩小,影响特征向量的效果。因此文章中提出了一个没有偏执b的softmax loss。如图3(b)所示,这种无偏置softmax损失的所有决策边界都通过原点,并且决策区域是锥形的,其顶点位于原点。因此,同一类的样本在单位超球面上具有单独的投影,这确保了来自不同类别的示例之间的长的类间距离(inter-class)。

给定一个训练三元组 其中 为anchor 的类别。无偏置的softmax定义为:

其中 表示CNN网络的输出特征向量。随后网络 通过缩小 来训练(SGD)。

图4左边部分所示, 的输入是L维的特征向量,这个向量是网络 的输出,同时 的输出具有相同的维度。 包含4个全连接层,前两个降维,后两个升维,每一层后面跟了BatchNormalization和ReLU。最后的输出是输入向量和输出向量的对应位置相加。

另外,判别器 接受 产生的L维特征向量,并将其分成K+1类。 也有4个全连接层,前三个后面跟了BatchNormalization和ReLU,最后一个跟的softmax。(怎么感觉 接受的是应该是 产生的?)

文章中使用的优化器是SGD,学习率 ,步骤在Section 3中介绍。

此外,文章中尝试构建一个更强大的提取器 ,允许HTG从细粒度的局部细节创建更hard三元组,因此视觉识别模型可以用更难的三元组示例挑战变得更加鲁棒。
实际上,局部特征在许多细粒度的视觉识别任务中起着关键作用。用于图像分类的典型深度神经网络擅长提取高级全局特征,但常常缺少局部细节的特征。这可能会限制HTG探索本地细节以创建更难的triplets。例如,在没有本地细节的情况下,HTG无法生成能够识别不同车辆的大多数有辨别力的部分的三元组,例如徽标,灯光和天窗。

为了解决这个问题,文章中介绍了一种更加关注局部特征的关键点图。例如ResNet-18包含了4个连续的卷积块,在最后一个卷积块后面跟着一个全连接层作为全局特征 对于卷积块 来说,他的输出特征图可以表示为 随后我们加一个局部分支叫做keypoint bolck,它具有类似于卷积块的结构,用于本地化关键点的分布,这些关键点可以关注最具辨别力的部分以创建更难的三元组。高级语义特征映射是稀疏的(不太明白这里),我们假设关键点层的每个通道对应于特定类型的关键点,因此我们在关键点层的输出特征上应用通道层面(channel-wise)softmax来估计不同图像位置上关键点的密度:

是clock-l的输出特征图在通道c及位置(i,j)上的的点。

block-l局部特征 :

文章中提取了bolck-3和block-4的特征,和全剧特征concat后作为最后的输出特征。

备注:这部分没有看的很明白,我理解的大概意思是在网络的中间层先做一个softmax,最后和全局特征的softmax concat起来。

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方案,这项方案的引人之处在于使得计算机可以生成10241024大小的高清,它是目前无论图像清晰度还是生成质量都达到最好效果的技术,其生成的明星几乎可以达到以假乱真的效果(参考图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优化器训练,并且学习率最好是00002,(我也试过其他学习率,不得不说00002是表现最好的了)

BigGAN在训练中 Batch 采用了很大的 Batch,已经达到了 2048(我们平常训练 Batch 正常都是 64 居多),在卷积的通道上也是变大了,还有就是网络的参数变多了,在 2048 的 Batch 下整个网络的参数达到了接近 16 亿


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12922248.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存