深度学习
深度学习就是通过多层神经网络上运用各种机器学习算法学习样本数据的内在规律和表示层次,从而实现各种任务的算法集合。各种任务都是啥,有:数据挖掘,计算机视觉,语音识别,自然语言处理等。‘
深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化,并不像大家听到的一样,觉得这两个概念其实是同一个东西,在知乎上有相关讨论:看“深度学习”和“多层神经网络”的区别?,我们这里直接拿出结论:
从广义上说深度学习的网络结构也是多层神经网络的一种。更简单来说,多层神经网络 做的步骤是:特征映射到值。特征是 人工 挑选。深度学习 做的步骤是 信号->特征->值。 特征是由 网络自己 选择。
深度学习的核心是 特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。深度学习是一个框架,包含多个重要算法:
- Convolutional Neural Networks(CNN)卷积神经网络
- AutoEncoder自动编码器
- Sparse Coding稀疏编码
- Restricted Boltzmann Machine(RBM)限制波尔兹曼机
- Deep Belief Networks(DBN)深度信念网络
- Recurrent neural Network(RNN)多层反馈循环神经网络神经网络
对不同的任务(图像,语音,文本),需要选用不同的网络模型才能达到更好的效果。
神经网络
首先什么是神经网络呢?神经网络也指的是 人工神经网络(Artificial Neural Networks,简称ANNs),是一种模仿生物神经网络行为特征的算法数学模型,由 神经元、节点与节点之间的连接(突触) 所构成,如下图所示:
每个神经网络单元抽象出来的数学模型如下,也叫 感知机,它接收多个输入(x 1 , x 2 , x 3 . . . x_1,x_2,x_3...x1,x2,x3...),产生一个输出,这就好比是神经末梢感受各种外部环境的变化(外部刺激),然后产生电信号,以便于转导到神经细胞(又叫神经元)。如下图所示:
单个的感知机就构成了一个简单的模型,但在现实世界中,实际的决策模型则要复杂得多,往往是由多个感知机组成的多层网络,如下图所示,这也是经典的神经网络模型,由 输入层、隐含层、输出层 构成。如下图所示:
人工神经网络可以映射任意复杂的非线性关系,具有很强的鲁棒性、记忆能力、自学习等能力,在分类、预测、模式识别等方面有着广泛的应用。
1.卷积神经网络(CNN)的定义
卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。
卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。
2.DNN与CNN的区别
全连接网络由于都是“全连接”方式,所以𝑤和𝑏参数格外的多,这就使得训练过程中说要更新的参数权重非常多,整个网络训练的收敛会非常慢。于是发明了卷积神经网络(Convolutional Neural Network, CNN)。
全连接网络的局限性
- 参数数量太多
- 没有利用像素之间的位置信息
- 网络层数限制
卷积网络的优点
- 局部连接:这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
- 权值共享:一组连接可以共享同一个卷积核权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
- 下采样:可以使用stride来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
3.卷积的数学定义
函数f和g的卷积表示 经过翻转和平移的重叠部分的面积。
𝑓(𝑡)先不动,𝑔(−𝑡)相当于𝑔(𝑡)函数的图像沿着𝑦轴(𝑡=0)做一次翻转。𝑔(𝑥−𝑡)相当于𝑔(−𝑡)的整个图像沿着𝑡轴向右平移𝑥个单位。卷积的值等于𝑓(𝑡)和𝑔(𝑥−𝑡)相乘后与𝑦=0轴围的面积。
4.CNN的结构组成
一个完整的CNN结构包括:
输入层:输入图像
卷积层:特征提取
池化层:降低尺寸
全连接层:计算并输出
输入层
在处理图像的CNN中,输入层一般代表了一张图片的像素矩阵。可以用三维矩阵代表一张图片。三维矩阵的长和宽代表了图像的大小,而三维矩阵的深度代表了图像的色彩通道。比如黑白图片的深度为1,而在RGB色彩模式下,图像的深度为3。
在输入层进行输入时,便是将对应图片的三个通道的矩阵进行输入。
与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度和深度。其中的宽度和高度是很好理解的,因为本身卷积就是一个二维模板,但是在卷积神经网络中的深度指的是激活数据体的第三个维度,而不是整个网络的深度,整个网络的深度指的是网络的层数。举个例子来理解什么是宽度,高度和深?
左侧是一个普通的全连接神经网络,他总共有三层,输入层的大小是3*1,隐藏层的大小是4*2,输出层的大小是1*1,而整个网络的深度为3,因为它只有输入输出层和隐藏层三个层次。而对于右边的卷积神经网络来说,他整个网络的深度为4,因为它由输入层、卷积层、池化层、全连接层四个部分组成。但是与全连接网络不一样的是,每一个部分之中除了宽度和高度之外还有另一个维度,就是我们数据的深度。我们知道计算机中的图片是分为RGB三个通道的,所以一张图片的输入并不是单纯的一张彩色图片,一般情况下是三张不同通道的矩阵组成的,如果假设图像的宽高为255*255,那么输入层的排列就是255*255*3。这样的排列并不是针对输入层才有,后面各个层也都有这种排列方式。
卷积层
如图中所示,该图像通过不同的卷积核最终得到了不同的特征图。对于一张图像来说,纹理、边缘、颜色等都是属于该图像的特征,这些特征不仅可以帮助我们去理解记忆图片,它也可以帮助CNN去理解我们的图片。接下来我们将进入卷积的具体操作过程。
卷积的过程包括以下几个步骤:
定义卷积核:选择一个小的矩阵作为卷积核,用于提取图像的特征。
卷积操作:使用卷积核与图像的每一部分做点积,并得到一个特征图。
激活函数:使用激活函数增强特征,并进行非线性变换。
通过多次卷积操作,可以提取图像的多级特征,最终得到有用的特征图。卷积是 CNN 中重要的一部分,并且是实现图像识别等任务的关键。
卷积操作通过使用过滤器filter,也称作卷积核,将当前层神经网络上的子节点矩阵转化为下一层神经网络上的一个节点矩阵,得到的矩阵称之为特征图(feature map)。这里以像素矩阵通道等于1时来了解卷积过程。首先,先定义一个的卷积核,其实是一个矩阵。卷积核的数值这里是手工设置的,这些值是网络的参数,通常是随机初始化后通过网络学习得到的。
卷积操作就是卷积核矩阵跟卷积核覆盖的图片局部区域矩阵对应的每个元素相乘后累加求和。
在完成上面的卷积操作后,卷积核会继续移动,然后再进行卷积操作。一次移动的距离称作步长(Stride)。这里设定步长为1,则向右移动1个单元格,在当前区域继续进行卷积操作,得到卷积值。注意,卷积步长只在输入矩阵的长和宽这两个维度实施。单个filter在输入矩阵上完成卷积的整个动态过程如下图所示。当卷积核移动到输入矩阵的最右侧时,下一次将向下移动一个步长,同时从最左侧重新开始。在卷积过程中,要始终保持卷积核矩阵在输入矩阵范围内。卷积层的操作过程就是将上面的卷积核矩阵从输入矩阵的左上角一个步长接一个步长地移动到右下角。在移动过程中计算每一个卷积值,最终计算得到的矩阵就是特征图(feature map)。
卷积(Convolution)
卷积神经网络中的核心即为 卷积运算,其相当于图像处理中的 滤波器运算。对于一个 m × n 大小的卷积核,
其对某一原图像X进行卷积运算的过程为:卷积核W中的每一个权值w分别和覆盖的原图像X中所对应的像素x相乘,然后再求和。计算公式为:
所以一幅图像的一个完整的卷积运算过程为:卷积核以一定的间隔滑动,并对所覆盖的区域进行卷积运算得到值 z,直至遍历完整幅图像。如下图所示:
举一个标准的卷积运算例子,初始位置的计算过程:1x1+1x0+1x1+0x0+1x1+1x0+0x1+0x0+1x1=4,详细的就不推导了。
如上图,卷积核大小是3x3的,也就是说其卷积核每次覆盖原图像的9个像素,行和列都滑动了3次,一共滑动3x3=9次,得到了一个3×3的二维数据。这个大小是怎么计算的呢?
首先给出结论,对于一个大小为的原图像,经过大小为f的卷积运算后,其输出图像的尺寸为n-f+1。所以对于上图的例子,5-3+1=3即为所求。
步长(stride)
滑动一定的间距,但这个间距该如何定义呢? 这个概念就是卷积的 “步长”(stride)。经过步长 s 的操作后,其输出图像的尺寸为:
其中n是图像大小,f是卷积核大小,s是步长。
stride=1表示卷积核滑过每一个相距是1的像素,是最基本的单步滑动,作为标准卷积模式。Stride是2表示卷积核的移动步长是2,跳过相邻像素,输出图像缩小为原来的1/2。Stride是3表示卷积核的移动步长是3,跳过2个相邻像素,图像缩小为原来的1/3,以此类推。
详细的卷积层尺寸推算细节可以看一下这个文章——CNN中卷积层的计算细节
填充(padding)
在标准的卷积过程中,存在两个问题:
- 每次卷积运算后,图像就会缩小尺寸。在经历多次运算后,图像最终会失去其本来的形状,变为 1 × 1 “柱状”。
- 对于图像边缘的像素,只被一个输出使用,但图像中间的像素,则被多个输出使用。这意味着卷积过程丢掉了图像边缘位置的许多信息。
对于这个问题,可以采用额外的 “假” 像素(通常值为 0, 因此经常使用的术语 ”零填充“ )填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于其中心,同时延伸到边缘之外的假像素。假设填充的像素大小为 p,则 n nn 就变成了 n+2p,故其输出图像的尺寸为
至于是否选择填充像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。
- Valid 卷积意味着 不填充,即图像会通过卷积并逐渐缩小,输出的图像尺寸即为上述公式
- Same卷积意味 填充,输出图像的尺寸与输入图像的尺寸相同。
根据上述尺寸的计算公式,
感受野(Receptive field)
在处理图像这样的高维度输入时,让每个神经元都与前一层中的所有神经元进行全连接是不现实的。相反,我们让每个神经元只与输入数据的一个局部区域连接。该连接的空间大小叫做神经元的感受野(receptive field),它的尺寸是一个超参数(其实就是滤波器的空间尺寸)。在深度方向上,这个连接的大小总是和输入量的深度相等。需要再次强调的是,我们对待空间维度(宽和高)与深度维度是不同的:连接在空间(宽高)上是局部的,但是在深度上总是和输入数据的深度一致。
感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,换句话说,即为每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和pooling层,在层与层之间均为局部连接。神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。
可以看到在Conv1中的每一个单元所能看到的原始图像范围是33,而由于Conv2的每个单元都是由 22范围的Conv1构成,因此回溯到原始图像,其实是能够看到5*5的原始图像范围的。因此我们说Conv1的感受野是3,Conv2的感受野是5。输入图像的每个单元的感受野被定义为1,这应该很好理解,因为每个像素只能看到自己。
在卷积神经网络中,局部连接和权值共享是两个重要的概念。它们的出现,使得卷积神经网络能够更有效地处理图像等二维数据。下面是对这两个概念的简单介绍:
局部连接
局部连接是指卷积神经网络中神经元只与部分相邻神经元连接。在图像处理中,通常认为相邻的像素之间存在某种关联,这种关联可以用局部连接来表达。相对于全连接,局部连接的优势在于可以有效地减少网络参数数量,降低计算复杂度,并且可以捕捉到更细节的图像特征。
权值共享
权值共享是指卷积神经网络中所有神经元所使用的卷积核参数是相同的。这意味着,当一个卷积核识别到某种特征时,它在图像的任何位置都可以使用相同的权重来计算。由于图像中相似的局部结构通常出现在不同的位置,因此权值共享可以显著降低模型的参数数量,从而避免过拟合,提高模型的泛化能力。
综上所述,局部连接和权值共享是卷积神经网络的两个重要特点,它们的出现有效地降低了网络的复杂度,提高了模型的效率和鲁棒性。
虽然与普通的全连接神经网络结构上不同,但是它仍然具有和全连接网络一样的传播机制,下面将介绍卷积神经网络通过反向传播进行调参的过程。
反向传播
具体来说,卷积层的反向传播包括两个步骤:反向卷积和梯度计算。以下是具体的步骤:
反向卷积(或反卷积):反向卷积是将上一层网络的误差梯度(即损失函数对输出值的偏导数)传递到当前卷积层的过程。反向卷积的操作与卷积操作类似,但是将输入数据和卷积核进行“旋转180度”,然后进行卷积操作,得到误差梯度图。
梯度计算:通过误差梯度图和当前卷积层的输入数据,可以计算出当前卷积层的权重梯度和偏置项梯度。具体来说,权重梯度可以通过将误差梯度图与当前卷积层的输入数据进行卷积操作得到,而偏置项梯度可以通过将误差梯度图中的所有值相加得到。
在完成上述两个步骤后,可以根据梯度下降法更新卷积层的权重和偏置项。
池化层
对数据进行降采样(Down Sampling),缩小数据规模,收集关键数据,同时提高计算速度。池化层的作用是缩小特征图,保留有用信息,得到一个更小的子图来表征原图。池化操作本质上是对图片进行降采样,可以认为是将一张分辨率高的图片转化为分辨率较低的子图,保留的子图不会对图片内容理解产生太大影响。
池化的过程包括以下几个步骤:
定义池化窗口:选择一个小的矩阵作为池化窗口,用于提取图像的特征。
池化操作:使用池化窗口对图像的每一部分做池化操作,得到池化结果。
重复池化操作:重复以上步骤,不断地减小图像的尺寸,同时保留主要的特征。
池化的作用在于缩小图像的尺寸,减小计算量和参数数量,提高模型的泛化能力。同时,池化还有利于防止过拟合。
池化(Pooling)
随着模型网络不断加深,卷积核越来越多,要训练的参数还是很多,而且直接拿卷积核提取的特征直接训练也容易出现过拟合的现象。CNN使用的另一个有效的工具被称为“池化(Pooling)”出现并解决了上面这些问题,为了有效地减少计算量,池化就是将输入图像进行缩小,减少像素信息,只保留重要信息;为了有效地解决过拟合问题,池化可以减少数据,但特征的统计属性仍能够描述图像,而由于降低了数据维度,可以有效地避免过拟合。
给出池化的定义,对不同位置区域提取出有代表性的特征(进行聚合统计,例如最大值、平均值等),这种聚合的操作就叫做 池化,池化的过程通常也被称为 特征映射 的过程(特征降维)。听起来很高深,其实简单地说就是下采样。
池化的过程如下图所示:
池化主要有两种,除了 最大值池化(Max Pooling) 之外,还有 平均值池化(Average pooling),CNN中随机池化使用的较少。
最大池化是对局部的值取最大;平均池化是对局部的值取平均;随机池化是根据概率对局部的值进行采样,采样结果便是池化结果。概念非常容易理解,其示意图如下所示:
三种池化的意义:
- 最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不用观察物体在图片中的具体位置,只关心其是否出现,则使用最大池化效果比较好。
- 平均池化往往能保留整体数据的特征,能凸出背景的信息。
- 随机池化中元素值大的被选中的概率也大,但不是像最大池化总是取最大值。随机池化一方面最大化地保证了Max值的取值,一方面又确保了不会完全是max值起作用,造成过度失真。除此之外,其可以在一定程度上避免过拟合。
激活函数
回顾一下感知机,感知机在接收到各个输入,然后进行求和,再经过激活函数后输出。为什么神经网络需要非线性激活函数?
为了使神经网络能够拟合出各种复杂的函数,必须使用 非线性激活函数,用来加入非线性因素,把卷积层输出结果做非线性映射。
依此类推,网络的输出仅仅只是输入特征的线性组合。实际上,无论网络有多少层,整体完全可以仅使用1层表示。同理,引入其他线性函数 (如 g ′ = 2 x g^{'}=2xg′=2x)仍然起不到任何作用,因为线性函数的组合本身仍是线性函数。
常用的激活函数有sigmoid、tanh、relu等等,前两者sigmoid / tanh比较常见于全连接层,后者ReLU常见于卷积层。
反向传播
回顾一下反向传播的内容,其中max(x,y)函数的反向传播可以简单理解为将梯度只沿最大的数回传。因此,在向前传播经过汇聚层的时候,通常会把池中最大元素的索引记录下来,这样在反向传播的时候梯度的路由就很高效。
对于最大池化操作,梯度计算可以直接将误差梯度传递到最大值所在的位置,而其他位置的梯度为零。对于平均池化操作,梯度计算可以将误差梯度平均分配到所有位置。
全连接层
将特征向量转化为分类概率,分类概率是指将输入图片判定为猫或狗的概率。全连接层通常作为CNN的最后一层,对图像的特征进行分类并得出最终的输出结果。
全连接层的工作方式是将图像的特征向量作为输入,通过一组权值,计算得到一个分类结果。全连接层中的每一个神经元代表一个特定的类别,最后的输出即为所属类别的概率。
在经过多层的卷积层和池化层操作后,一般会有1个或2个全连接层,给出最后的分类结果。全连接层在整个卷积神经网络中起到“分类器”的作用,它将学到的特征表示映射到类标签空间。在实际中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1×1的卷积;而前层是卷积层的全连接层可以转化为卷积核为h×w的全局卷积,h和w分别为前层卷积输出结果的高和宽。
卷积神经网络的过程
首先需要一张图片进行输入,在输入之后需要对其进行卷积操作,用于特征提取,在特征提取过后,需要用激活函数对所得到的特征图进行激活。在激活之后,需要利用池化去进行降低尺寸,在降低尺寸之后,又要重新进行卷积激活,然后再进行池化,就这样不停循环下去,直到这个神经网络的规模能够满足我们全连接层计算,那我们就进入全连接层,然后在全连接层中进行详细的计算以及进行分类,这就是卷积神经网络CNN的一个整体的过程。
可视化
学习前的卷积核是随机进行初始化的,使用截断的正态分布或者其他的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。可以发现,通过学习滤波器被更新成了有规律的滤波器,比如从白到黑渐变的滤波器、含有块状区域(称为blob)的滤波器等。
不同卷积核经过学习,改变了自身对不同特征的响应程度,如边缘(颜色变化的分界线)和斑块(局部的块状区域)等,其中第2个卷积核对垂直边缘响应,第5个卷积核对水平边缘响应,第9个对倾斜边缘响应,第13个对中心斑块响应。
上面的结果是针对第1层的卷积层得出的。第1层的卷积层中提取了边缘或斑块等“低级”信息,而在堆叠了多层的CNN中,随着层次加深,提取的信息(准确说,是响应强烈的神经元))也越来越抽象。如图所示,第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应。
也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
5.应用
CNN 最早 由Yann LeCun提出并应用在 手写字体识别上(MINST)。
当年美国大多数银行就是用它来识别支票上面的手写数字的。能够达到这种商用的地步,它的准确性可想而知。毕竟目前学术界和工业界的结合是最受争议的。LeCun提出的网络称为LeNet5(效果和paper等的链接在这),其网络结构如下:
这是一个最典型的卷积网络,由卷积层、池化层、全连接层组成,通过巧妙的设计,利用卷积、参数共享、池化等操作 提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行 分类识别,这个网络也是最近大量神经网络架构的起点,给这个领域带来了许多灵感。
详细的论文讲解,可以查看这个博客——大话CNN经典模型:LeNet
可视化的结果:
6.神经网络游乐场
网站地址:A Neural Network Playground