zoukankan      html  css  js  c++  java
  • 卷积神经网络基础

    聊一聊神经网络的前生今世。

    生物神经元到MP模型

    人工神经网络(Artificial Neural Network),简称神经网络(Neural Network, NN),是人类模拟生物神经网络的结构和功能提出的数学模型,广泛应用于计算机视觉等领域。

    人工神经网络与生物神经网络有大量相似之处,例如两者最基础的单元都是神经元。 神经元又称神经细胞,是生物神经网络的基本组成。其外观和大小在神经系统中差异很 大,但都具有相同的结构体,胞体和树突、轴突。胞体又名为核周体,由内质网、微管、 游离核糖体、神经丝和核组成。轴突和树突是神经元的突起,在神经元间传递电信号。神 经元的功能是接受信号并对其做出反应、传导兴奋、处理并储存信息以及发生细胞之间的 联结等,由这些功能动物才能迅速对环境的变化做出整合性的反应。

    生物神经网络

    神经元之间相互连接,当某一神经元处于“兴奋”状态时,其相连神经元的电位将发 生改变,若神经元电位改变量超过了一定的数值(也称为阈值),则被激活处于“兴奋状 态”,向下一级连接的神经元继续传递电位改变信息。信息从一个神经元以电传导的方式跨过细胞之间的联结(即突触),传给另一个神经元,最终使肌肉收缩或腺体分泌。

    神经元可以处理信息,也可以以某种目前还未知的方式存储信息。神经元通过突触的 连接使数目众多的神经元组成比其他系统复杂得多的神经系统。从神经元的结构特性和生物功能可以得出结论:神经元是一个多输入单输出的信息处理单元,并且对信息的处理是非线性的。

    基于上述情形,1943 年 McCulloch 和 Pitts 提出了 MP 模型,一种基于阈值逻辑的算法的神经网络计算模型,由固定的结构和权重组成。

    在 MP 模型中,某个神经元接受来自其余多个神经元的传递信号,多个输入与对应连接 权重相乘后输入该神经元进行求和,再与神经元预设的阈值进行比较,最后通过激活函数 产生神经元输出。每一个神经元均为多输入单输出的信息处理单元,具有空间整合特性和阈值特性。

    MP 模型把神经元进行抽象为一个简单的数学模型,模拟了生物神经元形式,成功证明了神经元能够执行逻辑功能,开创了人工神经网络研究的时代。从此神经网络的研究演变 为两种不同的研究思路:一种是继续生物学原理方面的探究,着重关注大脑中信息传递与 处理的生物学过程;另一种则演变为计算机学科,即神经网络在人工智能里的实际应用。 后者的研究是模仿前者的原理机制。

    感知机

    前面提到了:MP 模型是感知机的原型,MP 模型是一种理论,并没有在计算机上实现,而感知机可以视为 MP 模型在计算机上的实现。这一小节就来看一下感知机的理论,学习过程,实现,以及缺陷。

    基本介绍

    感知机(Perceptron)是Frank Rosenblatt在1957年提出的概念,其结构与MP模型类似,一般被视为最简单的人工神经网络,也作为二元线性分类器被广泛使用。通常情况下指单层的人工神经网络,以区别于多层感知机(Multilayer Perceptron)。尽管感知机结构简单,但能够学习并解决较复杂问题。

    感知机模型

    假设我们有一个????维输入的单层感知机,????1 至 ????n为 n 维输入向量的各个分量,????1 至????n 为 各个输入分量连接到感知机的权量(或称权值),????为阈值,????为激活函数(又称为激励函 数或传递函数),y为标量输出。理想的激活函数 ????(∙) 通常为阶跃函数或者 sigmoid 函数。 感知机的输出是输入向量????与权重向量????求得内积后,经激活函数????所得到的标量。

    用数学公式来表示就是:
    $$
    output=egin{cases}0,ifwx+bleq 0
    1,ifwx+b >0end{cases}
    $$
    权重 W 的初始值一般为随机设置的,往往达不到较好的拟合结果。那如何更改权重数值使标量输出 y 逼近实际值呢?

    感知机学习过程

    首先通过计算得到输出值,接下来将实际输出值和理论输出值做差,由此来调整每一个输出端上的权值。学习规则是用来计算新的权值矩阵 W 及新的偏差 B 的算法。

    即我们针对给定的训练数据,我们假设权重 theta 为某一个值,利用已有的训练数据的输入与预设权重做加权和,将得到的数据与训练数据的输出做比较,当他们的值分别代入到损失函数中会得到一个值,这个值用于描述预测值与真实值之间的差距。我们希望差距越小越好,由于训练数据的是固定的,也就是输入与真实值固定,唯一能够改变的就是权重 theta,所以我们要做的就是调整 theta 来使损失函数取最小值。

    也就是说,感知的学习过程即:在给定训练数据的情况下,通过调整权重 theta,使损失函数最小化的过程,其根本的目的是为了让预测值与真实值之间的差距更小,得到更接近与实践情况的模型。

    感知机的缺陷

    单层感知器类似一个逻辑回归模型,可以做线性分类任务,但是不能做更复杂的任务。第二次AI浪潮中马文·明斯基在其著作中证明了感知器本质上是一种线性模型,只能处理线性分类问题,就连最简单的XOR(亦或)问题都无法正确解决。作为人工智能领域的开创者之一,这一声明也直接或间接促使神经网络的研究陷入了近20年的停滞。

    线性不可分

    单层感知器结构简单,权重更新计算快速,能够实现逻辑计算中的 NOT、OR、AND 等简 单计算,但是对于稍微复杂的 NOR 异或问题就无法解决,其本质缺陷是不能处理线性不可分问题。而在此基础上提出的多层感知器就能解决此类问题。

    原理上的缺陷

    BP神经网络仍然是有监督的传统机器学习方法,遵循着以下思路。

    传统机器学习方法

    也就是说,不过是在最后面将SVM或者其他分类器换成神经网络,在大部分情况下其实没有什么优势,甚至增加了问题的复杂度。

    提取的特征虽然是研究者们经过反复实验证明有效的特征(也就是说特征任然是人为提取的),但仍然会一定程度上丢失了图像中的结构信息,从而丢失了一些对旋转扭曲等的不变性。而且要求输入的大小是固定的。为了学习到如偏移等微小的变化,需要有足够多的参数和足够多丰富的样本,最终学习到的权重,很可能在不同的位置处还会有非常相似的权重。

    结构上的缺陷

    传统神经网络层与层之间采用全连接,训练一个卷积神经网络的流程和训练一个全连接网络没有任何区别,区别仅仅在于层与层之间的连接方式不同

    隐藏层神经元数量越多的全连接网络包含连接权值参量越多,极大的增加了系统消耗和内存占用,并且需要更大的训练集来确定连接权值。

    如果一个隐藏层特征图像大小为100x100,输入层的特征图像大小为100x100,这意味着学习这一层需要100x100x100x100=10^8的参数。如果以32位的浮点数进行存储,就需要4*108的字节的存储量,约等于400MB的参数量。仅仅这样的一个网络层,其模型参数量已经超过了AlexNet网络的参数量,而100x100的特征图像分辨率,已经低于很多任务能够成功解决的下限。除了计算过程中需要存储的海量的参数,还有海量的计算,这些都超过了当时硬件的能力,因此大大限制了网络的大小,尤其是对于一些大的图像输入。

    其次,对于图像或者音频而言不具备平移,旋转,拉伸的不变性,输入到神经网络前必须经过预处理。以手写字符为例,对其进行归一化会导致字符的大小,倾斜程度及位置发生改变,再加上书写风格的差异,会导致图像特征变化。对于这些可能出现的问题,往往需要更多的神经元来增强网络的鲁棒性。

    不同风格手写字符示意图

    再者,全连接的网络忽略了输入的拓扑结构。在一幅图像中,相邻的像素相关性较高的可以归为一个区域,像素之间相关性较低的则可视为图片中的不同区域,利用这个特性进行局部特征的提取有巨大的优势。但如何充分利用这些局部信息呢?

    20 世纪 60 年代,Hubel 和 Wiesel 在研究猫脑皮层中负责处理局部敏感和方向选择的神经元时,发现了一种特别的网络结构显著降低了反馈神经网络的复杂性,随即提出了卷积神经网络(Convolutional Neural Networks,CNN)的概念。近期 CNN 已经成为众多科学领域的研究热点之一,该网络不需要对图像进行复杂的预处理,可以直接输入原始图像,因而在计算机视觉方面得到广泛的应用。本章节也将对卷积神经网络的基本概念做一个基本的介绍。

    总结:传统的线性模型如感知机,无法解决非线性问题,因此需要探究新的解决方案来解决非线性问题。

    多层感知机与 BP 算法

    多层感知机(Multi-Layer Perceptron)是由单层感知机推广而来,最主要的特点是有多个神经元层。一般将 MLP 的第一层称为输入层,中间的层为隐藏层,最后一层为输出 层。MLP 并没有规定隐藏层的数量,因此可以根据实际处理需求选择合适的隐藏层层数, 对于隐藏层和输出层中每层神经元的个数也没有限制。

    MLP 神经网络结构模型如下,分别为单隐层前馈网络和多层前馈网络,分别如图 1.3、 图 1.4 所示。其中,输入层神经元仅接受外界信息并传递给隐藏层,隐藏层与输出层的神 经元对信号进行加工,包含功能神经元。

    神经网络

    多层感知机的关键问题在于如何训练其中各层间的连接权值。其训练问题又大致地分为两类:

    1. 一类是将其它连接权值进行固定,只训练某两层间的连接权值,研究者们已从数学上证明了这种方法对所有非线性可分的样本集都是收敛的;
    2. 另一类即大家所熟知的 back propagation(BP)算法,通常使用 sigmoid 和 tanh 等连续函数模拟神经元对激励的响 应,使用反向传播对神经网络的连接权值进行训练。

    虽然 BP 算法应用广泛,但同时存在优化函数容易陷入局部最优问题,在优化过程中偏 离真正的全局最优点,性能下降,并且“梯度消失”现象严重等问题亟待解决。这些问题 也限制了 BP 神经网络在计算机视觉等方面的应用。

    卷积神经网络的核心基础概念

    卷积与权值共享

    卷积是 CNN 的核心,用卷积核作用于图像可以得到相应的图像特征。 在传统 BP 神经网络中,前后层之间的神经元是“全连接”的,即每个神经元都与前一层的所有神经元相连,而卷积中的神经元只与上一层中部分神经元相连。从仿生的角度来说,CNN 在处理图像矩阵问题时会更加高效,例如人的单个视觉神经元并不需要对全部图像进行感知,只需要对局部信息进行感知即可,距离较远,相关性比较弱的元素不在计算范围内。从计算的角度来说,卷积使得参数量与计算量大幅度降低。

    二维卷积的实例

    接下来介绍下卷积的具体操作,操作如图 1.7 所示。 例如原始图像大小是 7×7,卷积核大小是 3×3。首先卷积核与原始图像左上角 3×3 对应位置的元素相乘求和,得到的数值作为结果矩阵第一行第一列的元素值,然后卷积核向右移动一个单位(即步长 stride 为 1),与原始图像前三行第 2、3、4 列所对应位置的元素分别相乘并求和,得到的数值作为结果矩阵第一行第二列的元素值,以此类推。

    这就是一个卷积核矩阵在一个原始矩阵上从上往下、从左往右扫描,每次扫描都得到 一个结果,将所有结果组合到一起得到一个新的结果矩阵。

    如果将大量图片作为训练集,则最终卷积核会训练成待提取的特征,例如识别飞机, 那么卷积核可以是机身或者飞机机翼的形状等。

    卷积核与原始图像做卷积操作,符合卷积核特征的部分得到的结果也比较大,经过激活函数往下一层传播。不符合卷积特征的区域,获得的数值比较小,往下传播的程度也会受到限制。卷积操作后的结果可以较好地表征该区域符合特征的程度,这也是卷积后得到的矩阵被称为特征平面的原因。

    从上述表示中我们可以引出权值共享的概念,即将从图像一个局部区域学习到的信息 应用到的其它区域。

    图像的局部特征具有重复性(也称为位置无关性),即图像中存在某个基本特征图形可能出现在图片上的任意位置,于是为在数据的不同位置检测是否存在相同的模式可以通过在不同位置共享相同的权值实现。

    用一个相同的卷积核对整幅图像进行一个卷积操作,相当于对图像做一个全图滤波, 选出图片上所有符合这个卷积核的特征。一个卷积核对应的特征比如是边缘,那么用该卷积核去对图像做全图滤波,即是将图像各个位置的边缘都选择出来(帮助实现不变性)。 不同的特征可以通过不同的卷积核实现。

    感受野

    感受野(receptive field)是卷积神经网络的重要概念之一,当前流行的物体识别方法的架构大都围绕感受野的设计。

    感受野的示意图

    从直观上讲,感受野就是视觉感受区域的大小。在卷积神经网络中,用数学的语言就是感受野是 CNN 中的某一层输出结果的一个元素对应输入层的一个映射,即 feature map 上的一个点所对应的输入图上的区域,具体示例如图 1.8 所示。

    如果一个神经元的大小是受到上层 N×N 的神经元的区域的影响,那么就可以说,该神 经元的感受野是 N×N,因为它反映了 N×N 区域的信息。在图 1.8 中,conv2 中的像素点 5,是由 conv1 的 2×2 的区域计算得来,而该 2×2 区域,又是由 raw image 中 5×5 的区 域计算而来,所以,该像素的感受野是 5×5。可以看出感受野越大,得到的全局信息越多。

    接下来给出感受野相关参数的数学定义。一个特征的感受野可以通过区域的中心位置和特征大小进行描述。计算每一层的感受野信息,需要了解每一层的额外信息,包括:当前感受野的尺寸 r,相邻特征之间的距离 j,起始特征的中心坐标 start,其中特征的中心 坐标定义为其感受野的中心坐标(如上述固定大小 CNN 特征图所述)。假设卷积核 (kernel size)大小为 k,填充大小(padding size)为 p,步长大小(stride size)为 s,下标 in 表示输入,out 表示输出,其输出层的相关属性计算如下。

    • 输出特征图在每个维度上的大小:$$n_{out}=left[ frac {n_{in}+2p-k}{5} ight] +1$$

    • 相邻特征图相邻特征之间的距离:$$ j_{oui}=j_{in}s$$

    • 输出特征图的 receptive field size: $$ r_{out}=r_{in}+left( k-1 ight) _{in} $$

    池化

    有了感受野再来解释池化(pooling)也很简单,从 raw image 到 conv1, 再到 conv2,图像越来越小。每过一级就相当于一次降采样,这就是池化。池化可以通过步长不为 1 的卷积实现,也可以通过 pool 直接插值采样实现,本质上没有区别,只是权重不同。

    通过卷积获得了特征之后,下一步则是用这些特征去做分类。理论上讲,人们可以把 所有解析出来的特征关联到一个分类器,例如 softmax 分类器,但计算量非常大,并且极 易出现过度拟合(over-fitting)。而池化层则可以对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。

    最大池化操作示意图

    池化作用于图像中不重合的区域(这与卷积操作不同),一般而言池化操作的每一池化窗口都是不重叠的,所以池化窗口的大小等于 stride。这里的移动步长 stride=2,采用一个大小为 2×2 的池化窗口,max pooling 是在每一个区域中寻找最大 值,最终在原特征图中提取主要特征得到右图。

    最大池化与平均池化

    最常见的池化操作为平均池化(mean pooling)和最大池化(max pooling)。平均池 化是计算图像区域所有元素的平均值作为该区域池化后的值,最大池化则是选图像区域中 元素的最大值作为该区域池化后的值。在 ICLR2013 上,Zeiler 提出了随机池化 (stochastic pooling),只需对 feature map 中的元素按照其概率值大小随机选择,元 素被选中的概率与其数值大小正相关,并非如同 max-pooling 那样直接选取最大值。这种 随机池化操作不但最大化的保证了取值的 Max,也部分确保不会所有元素都被选取 max 值,造成过度失真。

    池化操作提取信息的过程中,如果选取区域均值(mean pooling),往往能保留整体数据的特征,较好的突出背景信息;如果选取区域最大值(max pooling),则能更好保留 纹理特征。但最理想的还是小波变换,不但可以在整体上更加细微,也能够保留更多的细节特征。池化操作本质是使特征图缩小,有可能影响网络的准确度,对此我们可以通过增加特征图的深度来弥补精度的缺失。

    卷积神经网络的基本结构

    卷积神经网络依旧是层级网络,但层的功能和形式发生了变化,是传统神经网络的改 进。其主要包含数据输入层(Input layer),卷积计算层(Convolutional layer), ReLU 激励层 (ReLU layer),池化层(Pooling layer)以及全连接层(Full connection layer)。

    卷积神经网络的基本结构

    Layer Note
    输入层 输入层是整个神经网络的输入,在处理图像的卷积神经网络中,它一般代表了一张图片的像素矩阵。如上图所示,最左侧三维矩阵就可以代表一张图像。其中三维矩阵的长和宽代表了图像的大小,深度代表了图像的色彩通道(channel)。从输入层开始,卷积神经网络通过不同的神经网络结构将上一层的三维矩阵转化为下一层的三维矩阵,直到最后的全连接层。

    数据输入层主要是对原始图像数据进行预处理,其中包括:去均值,把输入数据各个维度都中心化为 0;归一化,减少各维度数据因取值范围不同而带来的干扰。
    卷积层 传统全连接层输入是整张图片的像素点,而卷积层中每个节点的输入是上一层神经网络的一小块,这个小块常用的大小有 3x3 或者 5x5。卷积层试图将神经网络中的每一个小块进行更加深入的分析从而得到抽象程度更高的特征。一般来说,通过卷积层处理过的节点矩阵会变得更深,所以上图所示经过卷积层之后的节点矩阵深度会增加。

    卷积神经网络的重点,也与普通前馈神经网络的不同之处在于,卷积神经网络包含了 普通神经网络没有的特征处理器,它是由卷积层和池化层(也称为降采样层)构成的。

    卷积层中,一个神经元只与邻层部分(通常为方阵区域)的神经元连接,包含多干个特征平面(FeatureMap),每个特征平面由多个神经元按矩阵形式排列组成,同一特征平面的神经元共享权值(卷积核)。共享权值(卷积核)大大减少了网络各层之间的连接,降低了过拟合的风险。

    一般卷积神经网络包含多个卷积层,一个卷积层可以有多个不同的卷积核。图像通过多个不同的卷积核进行处理提取出局部特征,每个卷积核映射出一个新的特征图,再将卷积输出结果进行非线性激活函数的处理产生输出。
    池化层 池化层神经网络不会改变三维矩阵的深度,但她可以缩小矩阵的大小。池化操作可以认为是将一张分辨率较高的图片转化为分辨率较低的图片。通过池化层,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。

    接下来对激活函数处理的结果通过降采样,也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。

    池化用于压缩网络参数和数据大小,降低过拟合。如果输入为一幅图像,那么池化层的最主要作用就是压缩图像的同时保证该图像特征的不变性。一辆车的图像被缩小了一倍仍能认出这是一辆车,说明处理后的图像仍包含着原始图片里最重要的特征,图像压缩时 去掉的只是一些冗余信息,留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。池化操作的作用就是把冗余信息去除,将重要的信息保留,这样可以在一定程度上防止过拟合,方便网络的优化。
    全连接层 在经过多轮卷积层和池化层的处理之后,在卷积神经网络的最后一般会由 1 到 2 个全连接层来给出最后的分类结果。经过几轮卷积层和池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征。

    我们可以将卷积层和池化层看成自动图像特征提取的过程。在特征提取完成之后,任然需要使用全连接层来完成分类任务。

    全连接层,即两层之间所有神经元权重连接,通常全连接层在卷积神经网络尾部,跟传统的神经网络神经元的连接方式相同。
    softmax层 Softmax 层主要用于分类问题,通过 Softmax 层,可以得到当前阳历属于不同种类的概率分布情况。

    卷积神经网络的训练算法也同一般机器学习算法类似,先定义损失函数 Loss function,计算和实际结果的差值,找到最小化损失函数的参数值,利用随机梯度下降法进行权值调整。

    训练卷积神经网络时,网络的参数往往需进行 fine-tuning,就是使用已用于其他目标、预训练模型的权重或者部分权重,作为初始值开始训练,这样可以很快收敛到一个较理想的状态。

    卷积神经网络通过局部感受野(local receptive fields),权值共享(shared weights),下采样(sub-sampling)实现位移,缩放,和形变的不变性。主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。权值共享大大降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的 复杂过程。同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于全连接神经网络的一大优势。

    参考

    [1] Hubel D H, Wiesel T N. Receptive fields, binocular interaction and functional architecture in the cat’s visual cortex[J]. The Journal of physiology, 1962, 160(1): 106-154.

    [2] Fukushima K. Neocognitron: A self-organizing neural network model for a mechanism of pattern recognition unaffected by shift in position[J]. Biological cybernetics, 1980, 36(4): 193-202.

    [3] Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

    【AI初识境】从头理解神经网络-内行与外行的分水岭

    Convolutional Neural Networks (CNNs / ConvNets)

    Tensorflow:实战Google深度学习框架

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
    倍福TwinCAT(贝福Beckhoff)基础教程 松下绝对值驱动器如何做初始化设置
    倍福TwinCAT(贝福Beckhoff)基础教程 松下官方软件开启报错伺服未就绪怎么办
    JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185112.html
Copyright © 2011-2022 走看看