本文章总结以下经典的神经网络模型整理,大体讲下模型结构及原理…
如果想深入了解模型架构及pytorch实现,可参考我的Pytorch总结专栏 -> 划重点!!!Pytorch总结文章之目录归纳
本周主要对于神经网络的相关知识进行了学习,本文先整理神经网络学习中所需的一些基础知识,而后整理了四个经典的神经网络模型以作记录。
BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:
BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
主要是通过对输入信号的加权求和加偏置(加权求和对应的w,偏置对应的b),然后通过通过激活函数引入非线性元素并将结果映射至0——1之间的数值(比如sigmoid函数)。具体见下图:
LeNet5 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从 1988 年开始,在许多次成功的迭代后,这项由 Yann LeCun 完成的开拓性成果被命名为 LeNet5。
LeNet5 的架构基于这样的观点:(尤其是)图像的特征分布在整张图像上,以及带有可学习参数的卷积是一种用少量参数在多个位置上提取相似特征的有效方式。在那时候,没有 GPU 帮助训练,甚至 CPU 的速度也很慢。因此,能够保存参数以及计算过程是一个关键进展。这和将每个像素用作一个大型多层神经网络的单独输入相反。LeNet5 阐述了那些像素不应该被使用在第一层,因为图像具有很强的空间相关性,而使用图像中独立的像素作为不同的输入特征则利用不到这些相关性。
Lenet5特征能够总结为如下几点:
(1)卷积神经网络使用三个层作为一个系列:卷积、池化、非线性
(2)使用卷积提取空间特征
(3)使用映射到空间均值下采样
(4)双曲线(tanh)或s型(sigmoid)形式的非线性
(5)多层神经网络(MLP)作为最后的分类器
(6)层与层之间的稀疏链接矩阵避免大的计算成本
2012年,ImageNet比赛冠军的model–Alexnet,可以说是LeNet的一种更深更宽的版本。AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。AlextNet以显著的优势赢得了ILSVRC比赛的冠军,top-5的错误率从之前的25.8%降低至16.4。
上图之所以分为两层,是因为AlexNet训练时用了两块GPU。
ALexNet的主要技术点在于:
(1)使用RELU作为CNN的激活函数,解决了sigmoid在网络较深时的梯度弥散问题。
(2)训练时使用了Dropout随机忽略一部分神经元,以避免模型过拟合。
(3)在CNN中使用重叠的最大池化,步长小于池化核,这样输出之间会有重叠和覆盖,提升了特征的丰富性。此前CNN普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊性效果。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈比较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵计算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
(6)使用数据增强,减轻过拟合,提高泛化能力
具体打开AlextNet的每一阶段来看:
来自牛津大学的 VGG 网络是第一个在各个卷积层使用更小的 3×3 过滤器(filter),并把它们组合作为一个卷积序列进行处理的网络。
这看来和 LeNet 的原理相反,其中是大的卷积被用来获取一张图像中相似特征。和 AlexNet 的 9×9 或 11×11 过滤器不同,过滤器开始变得更小,离 LeNet 竭力所要避免的臭名昭著的 1×1 卷积异常接近——至少在该网络的第一层是这样。但是 VGG 巨大的进展是通过依次采用多个 3×3 卷积,能够模仿出更大的感受野(receptive field)的效果,例如 5×5 与 7×7。这些思想也被用在了最近更多的网络架构中,如 Inception 与 ResNet。
总的来说,在网络设计思路上,VGGNet是继承了AlexNet的思路,以AlexNet为基础,尝试建立一个层次更多,深度更深的网络。其网络结构一样可以由8个层次所构成,也是5组卷积层,3层全连接层。最主要的区别在于,VGGNet的每个卷积层并不是只做一次卷积操作,而是连续卷积2~4次。具体结构上的差别见下表(包括其它网络结构和VGG16与VGG19):
VGG 网络使用多个 3×3 卷积层去表征复杂特征。注意 VGG-E 的第 3、4、5 块(block):256×256 和 512×512 个 3×3 过滤器被依次使用多次以提取更多复杂特征以及这些特征的组合。其效果就等于是一个带有 3 个卷积层的大型的 512×512 大分类器。这显然意味着有大量的参数与学习能力。但是这些网络训练很困难,必须划分到较小的网络,并逐层累加。这是因为缺少强大的方式对模型进行正则化,或者或多或少约束大量由于大量参数增长的搜索空间。
VGG-16和VGG-19的表现效果差不多,所以工业上还是用VGG-16的比较多
VGG用反复堆叠33的小型卷积核和22的最大池化层,通过不断加深网络结构来提升性能,VGGNet成功地构筑了16-19层的深度卷积网络。
VGG拓展性很强,迁移到其他图片数据上的泛化性非常好。
整个网络都是用同样大小的卷积核尺寸(33)和最大池化尺寸(22),可以用来提取特征。
用VGG的模型在domain specific的图像分类任务上进行再训练相当于提供了非常好的初始化权重
表一所示为VGGNet各级别的网络结构图,表2所示为每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1´1的卷积层,1´1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。
VGGNet拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。
VGGNet在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。同时在训练中,VGGNet还使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
实践中,作者令S在[256,512]这个区间内取值,使用Multi-Scale获得多个版本的数据,并将多个版本的数据合在一起进行训练。最终提交到ILSVRC 2014的版本是仅使用Single-Scale的6个不同等级的网络与Multi-Scale的D网络的融合,达到了7.3%的错误率。不过比赛结束后作者发现只融合Multi-Scale的D和E可以达到更好的效果,错误率达到7.0%,再使用其他优化策略最终错误率可达到6.8%左右,非常接近同年的冠军Google Inceptin Net。同时,作者在对比各级网络时总结出了以下几个观点。
(1)LRN层作用不大。
(2)越深的网络效果越好。
(3)1´1的卷积也是很有效的,但是没有3´3的卷积好,大一些的卷积核可以学习更大的空间特征。
看了前面的网络结构之后,我们会发现,他们越来越深,filter越来越多,参数越来越多。 似乎提高CNN的表现的方法就是堆叠更多的CONV、POOL层排成一列(我们称之为sequential model)就行了。
但我们也应该清楚,一味地增加层数、增加通道数(filters越多,输出图像的通道数就越多),会让我们的计算量急剧增加,模型变得过于复杂,从而更容易过拟合,这样反而会让模型的性能下降。
Inception Net不再是使用Sequential model,在结构上有了重大创新。
降维:一个1×1的filter去卷积,图像的长和宽都不会变化,同时,输出图像的channels数等于filters的个数。
通过使用1×1CONV,输出的通道数大大减少,这样,整个模型的参数也会大大减少。
上面这个部分,称为“Inception Module”,而Inception Network,就是由一个个的inception module组成的:
ResNet,于2015年由微软亚洲研究院的学者们提出。
CNN面临的一个问题就是,随着层数的增加,CNN的效果会遇到瓶颈,甚至会不增反降。这往往是梯度爆炸或者梯度消失引起的。
ResNet就是为了解决这个问题而提出的,因而帮助我们训练更深的网络。 它引入了一个 residual block(残差块):
这个残差块把某一层的激活值,直接一把抓到了后面的某一层之前 ,这个过程称之为“skip connection(跳跃连接)”。 这个做法,相当于把前面的信息提取出来,加入到当前的计算中,论文作者认为,这样的做法,可以 使神经网络更容易优化。事实上确实是这样。
通过这种residual block,他们成功地搭建了一个拥有 152层的CNN
普通的神经网络都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
以nlp的一个最简单词性标注任务来说,将我 吃 苹果 三个单词标注词性为 我/n 吃/v 苹果/n。
那么这个任务的输入就是:
我 吃 苹果 (已经分词好的句子)
这个任务的输出是:
我/n 吃/v 苹果/n(词性标注好的句子)
对于这个任务来说,我们当然可以直接用普通的神经网络来做,给网络的训练数据格式了就是我-> 我/n 这样的多个单独的单词->词性标注好的单词。
但是很明显,一个句子中,前一个单词其实对于当前单词的词性预测是有很大影响的,比如预测苹果的时候,由于前面的吃是一个动词,那么很显然苹果作为名词的概率就会远大于动词的概率,因为动词后面接名词很常见,而动词后面接动词很少见。
所以为了解决一些这样类似的问题,能够更好的处理序列的信息,RNN就诞生了。
首先看一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:
如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);
U是输入层到隐藏层的权重矩阵,o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。
现在来看W是什么。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
给出这个抽象图对应的具体图:
从上图就能够很清楚的看到,上一时刻的隐藏层是如何影响当前时刻的隐藏层的。
如果把上面的图展开,循环神经网络也可以画成下面这个样子:
现在看上去就比较清楚了,这个网络在t时刻接收到输入 xt之后,隐藏层的值是st,输出值是ot 。关键一点是,st的值不仅仅取决于xt,还取决于 st-1 。我们可以用下面的公式来表示循环神经网络的计算方法:
用公式表示如下:
RNN的总括图如下:
LSTM的网络机构图如下所示:
与传统的循环神经网络相比,LSTM仍然是基于xt和ht−1来计算ht,只不过对内部的结构进行了更加精心的设计,加入了输入门it 、遗忘门ft以及输出门ot三个门和一个内部记忆单元ct。输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。
在经典的LSTM模型中,第t层的更新计算公式为:
其中it是通过输入xt和上一步的隐含层输出ht−1进行线性变换,再经过激活函数σ得到的。输入门it的结果是向量,其中每个元素是0到1之间的实数,用于控制各维度流过阀门的信息量;Wi 、Ui两个矩阵和向量bi为输入门的参数,是在训练过程中需要学习得到的。遗忘门ft和输出门ot的计算方式与输入门类似,它们有各自的参数W、U和b。与传统的循环神经网络不同的是,从上一个记忆单元的状态ct−1到当前的状态ct的转移不一定完全取决于激活函数计算得到的状态,还由输入门和遗忘门来共同控制。
在一个训练好的网络中,当输入的序列中没有重要信息时,LSTM的遗忘门的值接近于1,输入门的值接近于0,此时过去的记忆会被保存,从而实现了长期记忆功能;当输入的序列中出现了重要的信息时,LSTM应当把其存入记忆中,此时其输入门的值会接近于1;当输入的序列中出现了重要信息,且该信息意味着之前的记忆不再重要时,输入门的值接近1,而遗忘门的值接近于0,这样旧的记忆被遗忘,新的重要信息被记忆。经过这样的设计,整个网络更容易学习到序列之间的长期依赖。
GRU(Gated Recurrent Unit,门控循环单元网络)就是一种通过对LSTM的门机制进行改进从而比LSTM网络更简单的循环神经网络。
GRU网络对LSTM网络的改进有两个方面:
1、将遗忘门和输入门合并为一个门:更新门,此外另一门叫做重置门。
2、不引入额外的内部状态c,直接在当前状态ht和历史状态ht-1之间引入线性依赖关系。
GRU网络的结构如下图所示
接下来按输入数据xt和历史状态ht-1在GRU网络中流动的过程,来阐述GRU网络的工作流程。
重置门rt用来控制候选状态的计算是否依赖于上一时刻的状态ht-1。
当前时刻的候选状态为:
更新门zt用来控制当前状态ht需要从历史状态ht-1中保留多少信息,以及需要从候选状态中接收多少新信息。
然后计算出隐状态ht:
可以看到,当zt=0,rt=1时,隐状态ht为简单循环神经网络中的计算公式,GRU网络退化为简单循环神经网络。
此外,把求隐状态ht的公式整理如下,可以看到当前状态ht和历史状态ht-1之间存在线性关系,也存在非线性关系,在一定程度上可以缓解梯度消失问题。