“ 深度学习是在多层神经网络上运用各种机器学习算法,解决文本、图像问题的算法集合。其中卷积神经网络是深度学习的代表算法之一。本文旨在入门卷积神经网络,提供深度学习的先行知识。”
01
—
它是什么
卷积神经网络起源于神经网络,最早追溯于日本学者福岛邦彦提出的neocognition模型,它是最早被提出的深度学习模型,是对生物的视觉皮层进行仿造。初代人工神经网络ANN,主要是由简单的感知器神经层组成,只能进行有限的简单计算。
1987年由亚历山大-怀贝儿提出时间延迟网络(Time Delay Neural Network, TDNN),主要应用于语音识别领域,包括了输入层和2个一维卷积构成的隐含层。后续慢慢衍生了各种算法,如平移不变人工神经网络(SIANN)、深度前馈神经网络(FNN)、循环神经网络(RNN)等。虽然有各种衍生算法,但基本上有一整套的核心框架。输入层、隐含层、输出层三个层次,其中隐含层又包括卷积层、池化层和全连接层。各个算法的不同点主要集中在隐含层的算法使用上,如卷积核的个数、卷积层的参数、池化层的池化函数以及全连接层激励函数等。
02
—
问题空间
图像分类是对输入图像的操作,最终输出一组最好的描述图像内容的分类或者分类的概率。
计算机看到一张图片,看到的是一堆像素值。根据图片的分辨率和尺寸,他将看到的是一个32*32*3(3代表RGB值)的数组,其中每个元素的值都从0-255不等,其描述了对应那一点的像素灰度。其中的思想是:当你提供给计算机这一数组后,它将输出描述该图像属于某一特定分类的概率的数字(比如:80% 是猫、15% 是狗、5% 是鸟)。
我们想要计算机能够区分开所有提供给它的图片,以及能够搞清楚各自的特征。计算机也可以通过寻找诸如边缘和曲线之类的低级特点来分类图片,继而通过一系列卷积层建构出更为抽象的概念。
因此CNN的框架结构是:**你挑一张图片,让他经历一系列卷积层、非线性层、池化(下采样downsampling)层和完全连接层,最终得到输出。输出可以是最好地描述了图像内容的一个单独分类或者一组分类的概率。**
03
—
核心层:卷积层
卷积层:该层主要进行卷积操作,简单理解,通过将一副图片抽象成像素矩阵(一般是空间三维矩阵),然后在选取一个卷积核,也有可能是多个,通过步长为n的卷积操作(可以理解为相乘)。每个卷积核单元都会有相应的权重,通过将图片上的像素矩阵核卷积核的对应权重相乘,最后将所有的乘积相加得到一个输出,形成一个简化的图。
整个卷积过程可以用下面这幅动态的图表达:
举例:如果输入内容为一个32*32*3的像素值数组。其中有个5*5的区域叫做过滤器(filter,也被称作是神经元neuron或者kernel核),该核区域扫描过的区域被称为感受野(receiptive field)。过滤器同样也是一个数组,其中的数字被称作权重或者参数。重点在于过滤器的深度必须与输入内容的深度相同,这样才能保证可以进行数学运算,因此过滤器的大小为5*5*3。以过滤器所处在的第一个位置为例,即图像的左上角。当筛选值在图像上滑动时,过滤器中的值会与图像中的原始值相乘(计算点积)。这些乘积会被加在一起(一共75个),现在得到一个乘和,该数字只是表示过滤器位于图片左上角的情况。我们在输入内容上的每个位置重复该过程。输入内容的每个特定位置都会产生一个数字。过滤器滑过所有的区域后将得到一个28*28*1的数组(32-5+1),我们称之为激活映射(activation map)或特征映射(feature map). 当我们使用两个而不是一个5*5*3的过滤器时,输出总量将会变成28*28*2.采用的过滤器越多,空间维度保留得也就越好。
第一层:高层次角度,每个核够可以被看作是特征标识符(feature identifiers)。这里的特征值指的是例如直边缘、原色、曲线之类的东西。想想所有图像都共有的一些最简单的特征。假设第一组过滤器是7*7*3的曲线检测器。为了易于分析,暂且忽略该过滤器的深度为3个单元,只考虑过滤器和图像的顶层层面。作为曲线过滤器,它将有一个像素结构,在曲线形状旁时会产生更高的数值。
从数学角度看,点积计算结果与像素值吻合(要做的是将卷积核与图像的原始像素相乘),如下图:
很明显,如果输入图像上某个形状看起来很像过滤器表示的曲线,那么所有的点积加起来将会得出一个很大的值!
当然也会存在相乘相加后值较小的时候,这是因为此时选择的卷积核不是十分match,未实现激活,卷积核可以重新选取,最好能有区分效应。因为输入内容如果没有任何东西,即空白区域,那的确很难激活也就很难做到区分。
一个典型的CNN结构应该是如下的:
输入->卷积->ReLU->卷积->ReLU->池化->ReLU->卷积->ReLU->池化->全链接
为了预测处图片内容的分类,网络需要识别更高级的特征,如手,爪子和耳朵的区别。第一个卷积层的输出将会是一个28*28*3的数组(假设我们使用的是3个5*5*3的过滤器)。当我们进入另一个卷积层时,第一个卷积层的输出正是第二个卷积层的输入。第一层的输入是原始图像,而第二层输入正是第一层输出的激活映射,也就是说,这一层的输入大体描绘了低级特征在原始图片中的位置,在此基础上再采用一组过滤器(第2个卷积层),输出将是表示了更高级的特征的激活映射。这类特征可以是半圆(曲线与直线的组合)或四边形(几条直线的组合,随着多层网络越深和经过更多的卷积层后,将得到更为复杂特征的激活映射。
有趣的是,越深入网络,过滤器的感受也越大,意味着它们能够处理更大范围的原始输入内容(或着说它们可以对更大区域的像素空间产生反应)。
04
—
核心层:池化层
在几个ReLU层之后,程序员也许会选择用一个池化层(pooling layer),它同时也被叫做下采样层(downsampling)。在这个类别中,也有几种可选择的层,最受欢迎的就是最大池化(max pooling)。它基本上采用了一个过滤器(通常是2*2)和一个同样长度的步幅。然后把它应用到输入内容上,输出过滤器卷积计算的每个子区域中的最大数字。如下图:
简单池化就选取每个矩阵中的最大值,在相应的步长(上图为2)中即可。
池化层还有其他选择,如平均池化(average pooling)和L2-norm池化。这一层背后的直观推理是:一旦我们知道了原始输入(这里会有一个高激活值)中一个特定的特征,它与其他特征的相对位置就比它的绝对位置更重要。可想而知,这一层大幅度较少了输入卷的空间维度(长度和宽度改变了,但深度没有变)。这达到了两个主要目的:第一权重参数的数目减少到了75%,因此降低了计算成本。第二是它可以控制过拟合。
此时,一般还会做一些额外的操作,增加一层dropout层。因为在训练时,会出现一些过拟合现象,通过丢弃dropout一个随机的激活参数值,保证神经网络不会对样本过度拟合。
05
—
核心层:完全连接层
检测到高级特征后,网络最后的完全连接层就更是锦上添花来了,简单的来说,这一层处理输入内容(该输入可能是卷积层,ReLU层或者是池化层的输出)后会输出一个N维向量,N是该程序必须选择的分类数量。完全连接层观察上一层的输出(其表示了更高级特征的激活映射)并确定这些特征与哪一分类最为吻合。完全连接层观察高级特征和哪一分类最为吻合和拥有怎样的特定权重,因此计算出权重和先前层之间的点积后,将得到不同分类的正确概率。
一种全卷积神经网络(Lenet),从左到右依次为卷积->子采样->卷积->子采样->全连接->全连接->高斯连接。
06
—
训练过程
-
卷积层中的过滤器如何知道寻求边缘与曲线
-
完全连接层怎么知道观察哪些激活图
-
每一层级的滤波器如何知道需要哪些值
-
ANS:计算机通过一个名为反向传播的训练过程来调整过滤器的值
反向传播算法
-
前向传播:简单的理解,神经网络中的某个节点的值,是通过上一层与该节点有连接的节点以及该连接权值进行加权和运算,最终在加上一个偏置项即为该节点的值。
-
损失函数:主要是计算预测值与真实值之间的误差,一般使用均方误差代替
-
后向传播:利用其中某个节点的改变对总误差的影响有多少,即偏导数,通过链式法则,变成上一层的偏导数,最终一直链式下去。然后根据梯度下降原理,从当前权重减去学习率,最终求出权重参数。
-
权重更新:在梯度下降的过程中,不断的更新权重,使得损失函数最小。
我们需要将损失函数最小化,将其视为微积分优化问题的话,也就是说我们想要找出是哪部分输入直接导致了网络的损失。在网络中进行后向传导,测定出是哪部分权重导致了最大的损失,寻找调整方法并减少损失。一旦计算出该导数,将进行最后一步也就是权重更新。所有过滤器的权重将会更新,以便它们顺着梯度方向改变。
总得来说,前向传导、损失函数、后向传导、以及参数更新被称为一个学习周期,对每一个训练图片,程序将重复固定数目的周期过程。一旦完成了最后训练样本上的参数更新,网络有望得到更好的训练,以便在层级中的权重得到正确调整。
07
—
部分问题
步幅控制着过滤器围绕输入内容进行卷积计算的方式。过滤器移动的距离就是步幅。步幅的设通常要确保输出内容是一个整数而非分数。正常情况下,程序员如果想让接受域重叠得更少并且想要更小的空间维度(spatial dimensions)时,他们会增加步幅。
再看一下填充padding,过滤输入层之后,空间维度减少了,如果我们继续使用卷积层,尺寸见效的速度就会会超过我们的预期。我们想要尽可能的多的保留原始输入内容的信息,这样我们就能提取出那些低层的特征。为做到这点,我们可以对这个层应用大小为2的零填充(zero padding)。零填充在输入内容的边界周围补充零。
如果步幅为1,而且把零填充设置为:
其中K是过滤器尺寸,那么输入输出内容就总能保持一致的空间维度。计算任意给定卷积层的输出的大小的公式是:
其中O是输出尺寸,K是过滤器尺寸,P是填充,S是步幅。
神经网络很大程度上取决于数据类型,图像的大小,复杂度,图像处理任务的类型以及其他更多特征的不同都会造成数据的不同。对于数据集,选择超参数的一个方法就是找到能创造出图像在合适尺度上抽像的正确组合。
每个卷积层之后,通常会立即应用一个非线性层(或激活层),起目的就是给一个在卷积层中刚经过线性计算操作(只是数组元素依次相乘)的系统引入非线性特征。过去,人们用的是像双曲正切和S型函数这样的非线性方程。但研究者发现ReLU层效果好得多,因为神经网络能够在准确度不发生明显改变的情况下把训练速度提高的很多(由于计算效率增加)。它同样能够减轻梯度消失的问题(由于梯度以指数方式在层中消失,导致网络较低层的训练速度非常慢。)ReLu层对输入内容的所有值都应用了函数f(x) = max(0, x),用基本术语来说,这一层把所有的负激活(negative activation)都变成了零,这一层会增加模型乃至整个神经网络的非线性特征,而不会影响到卷积层的感受野。
08
—
总结
卷积神经网络算法算是比较成熟的算法,其中有很多种衍生算法,但基本上都离不开文中介绍的这几层,这里推荐大家使用Python语言尝试coding,主要是样本与调参的过程,基本大多数的算法包都已经集成,github上也有大神提供。本文只是冰山一角,很多地方都是简化的理解,不对或者有更佳的想法可以留言,一起讨论。欢迎您的留言与检验,谢谢指正。
论文:Rectified Linear Units Improve Restricted Boltzmann Machines
如果对笔者的文章感兴趣,可搜寻"菜叶头"微信公众号,关注留言!
网友评论