机器学习篇:卷积神经网络DNN和CNN
0 前言
常言道,温故而知新,那有没有什么东西是每一次看到都像是接触了一种新的知识呢?或许机器学习相关技术发展太过迅速,或许是我之前每次接触都未深入,我总感觉机器学习相关的技术我并不能建立一个完整的概念,或者说并不深入研究的话,对于机器学习的概念都太过零碎了。
几次想要开始整理,但是因为我对机器学习的某些方面还是欠缺了解,总感觉整理不下去,初步定下以下话题吧。
-
卷积神经网络DNN和CNN
-
循环神经网络RNN
-
神经网络发展历史
-
自然语言处理 NLP
这里想要整理的是DNN和CNN,主要涉及
-
常见的视觉任务
-
神经网络DNN
-
卷积神经网络CNN
1、 常见的视觉任务
卷积神经网络最常见的应用在于计算机视觉任务,计算机视觉是关于研究计算机视觉能力的学科,或者说是使机器能对环境和其中的刺激进行可视化分析的学科。图像识别从图像分类到定位(目标检测、语义分割、实例分割)到目标追踪,主要包括以下任务:
-
图像分类:是图像识别的基础,识别出图像中有哪几类的物体
-
目标检测:识别出每一类物体具体的位置并用规则的形状框出来
-
语义分割/实例分割:每一类物品具体的形状位置识别/每一类物品种单个个体识别出来
-
场景文字识别
-
图像生成
-
目标追踪
-
人体关键点检测:人体姿势估计
-
视频分类:通常是几秒的小视频
-
度量学习:通常应用于人脸检测
2、 神经网络
神经网络技术起源于上世纪五六十年代,当时叫感知机(perceptron
),包含有输入层、输出层和一个隐藏层。输入的特征向量通过隐藏层变换到达输出层,由输出层得到分类结果。但是单层感知机对稍微复杂一些的函数都无能为力,直到上世纪八十年代Hition
、Rumelhart
等人发明了多层感知机,即具有各层隐藏层的感知机。
多层感知机可以摆脱早期离散传输函数的束缚,使用sigmoid
或tanh
等连续函数模拟神经元对激励的响应,在训练算法上使用Werbos
发明的反向传播BP
(Back-propagation algorithm)算法。这就是所说的神经网络NN
。
神经网络的层数直接决定了它对现实的刻画能力--利用每层更少的神经元你和更加复杂的函数。但是随着神经网络层数的加深,出现了两个问题:
-
优化函数越来越容易陷入局部最优解
-
梯度消失
2006年,Hition提出了深度学习的概念,引发了深度学习的热潮。具体是利用预训练的方式缓解了局部最优解的问题,将隐藏层增加到了7层,实现了真正意义上的“深度”。
为了克服梯度消失,ReLU,maxout等传输函数代替了sigmoid,形成了如今DNN的基本形式。结构跟多层感知机一样。如下图所示:
维度灾难:然而DNN中每一个下层神经元都连接着上一层全部的神经元的输出作为输入,而且需要为每一个输入配置权重w,这就导致了参数数量膨胀。譬如处理一张200×200的图像,输入层包含40000维,隐藏层400000神经元,那么就需要160亿参数,现在的图像就没有200×200那么小的了。
因此引入了卷积神经网络CNN,使用卷积核实现了局部连接、权值共享。
后面为了应对时间顺序的输入,引入了循环神经网络RNN。
3、CNN(卷积神经网络)
卷积神经网络基本的整体结构包含多个CONV(卷积层)+RELU(激活函数)+POOL(池化层)以及最后的全连接神经网络分类层。
3.1 卷积计算
每一层卷积层共用一个卷积核,实现了局部连接、权值共享。权值共享极大地减少了参数的数量,大大提高了计算速度,减少内存消耗。
卷积计算包含一维卷积计算,二维卷积计算,多通道卷积计算和三维卷积计算。其中二维卷积计算是针对图像二维矩阵的处理,多通道卷积计算是针对彩色三通道二维矩阵的处理,而三维卷积计算是针对视频的处理,这里暂不涉及。
3.1.1一维卷积计算
一维卷积是两个信号之间的运算,其本质是卷积核从左到右滑过信号,每滑动一格做一次点积。
卷积有三种方式
valid:卷积核完全在信号内
same:卷积核中心在信号内(padding:不够的位置补零)
full:卷积核边沿在信号内(padding:不够的位置补零)
3.1.2 二维卷积计算
二维卷积通常用于图片的计算,图片在计算机底层就是一个矩阵,矩阵中的每个元素都是0-255。
二维卷积参与运算的元素:二维卷积核(filter)和二维信号。二维卷积同样也包含valid、same、full三种计算方式,这里仅展示valid方式。
3.1.3 多通道卷积计算
虽说二维卷积可以处理图像的二维矩阵表示,但是彩色图像一般是三通道(RGB通道)的二维矩阵数据。而多通道的卷积计算参与运算的元素有:N通道的二维卷积核和N通道的二维信号,最后的结果是二维信号,其过程是各通道二维信号核卷积进行点积操作后将各通道对应位置的值相加。
3.1.4 卷积核的分析与计算
有关于卷积计算的细节还包括两个细节步长(stride)和边界填充(Padding)。
步长stride:反映了filter滑动一次的距离,上面的记录都默认步长为1。
边界填充Padding上面就有提过,默认是使用0,好像有人也尝试过通过拓展原图边界的方式来进行边界填充,但是效果并不佳。
从上面可以观察到,似乎原信号进行了卷积之后长度和体积都会改变。如下图,二维矩阵就从6×6变成了4×4
关于输出特征图体积的计算,当输入大小为W1×H1×D1: 指定卷积核(filter)个数为K,卷积核filter大小为(F),步长S,边界填充P,那么输出特征图的体积为:
W2 = (W1-F+2P)/S+1
H2 = (H1-F+2P)/S+1
D2=K
譬如一个6×6×3的输入,卷积核个数为2,大小为3,步长为1,边界填充P=0。最后的结果是4×4×2。
3.2 池化POOLING
3.2.1 池化和上下采样
缩小图像,也称下采样(subsampled
)或降残阳(downsampled
),主要目的是使得图像符合显示区域的大小或者生成缩略图。
放大图像,也称上采样(upsampling
)或图像插值(interpolating
),主要目的是方法原图像,从而科一显示在更高分辨率的显示设备上。对图像的缩放操作并不能带来更多关于该图像的信息,因此图像的质量将不可避免地受到影响。然而却是有一些缩放方法能够增加图像地信息,从而使得缩放后地图像质量超过原图质量的。
POOLING:池化、汇聚、汇合,它是卷积神经网络中的一个重要的概念,实际上是一种形式的降采样。它会压缩输入的特征图,一方面减少特征,导致了参数减少,进而简化了卷积神经网络计算时的复杂度;另一方面保持了特征的某种不变性(旋转、平移、伸缩等)。
池化的作用在于:
-
特征不变形:池化操作时模型更加关注是否存在某些特征而不是特征具体的位置。
-
特征降维:池化相当于在空间范围内做了维度的约减,从而使模型科一抽取更加广泛的特征,同时减少了下一层输入大小,进而减少计算量和参数个数。
-
在一定程度上防止过拟合
3.2.2 平均池化和最大池化
池化层的操作就是窗口滑动。计算取值,池化的窗口一遍不重叠即它的滑动窗口的步长stride=滑动窗口的大小。池化窗口的计算方式有两种,一种是平均池化(Avgrage pooling
),取窗口中数值的平均值,一种是最大池化(Max pooling
),取窗口中数值的最大值。
4、全连接层
全连接层有卷积层都可以互相转换:对于任意一个卷积层,要把它变成全连接层只需要把权重变成一个巨大的矩阵,其中除了一些特定区块,大部分都是0(因为局部感知),而且好多区块的权值还相同(由于权重共享)。相反的,任何一个全连接层也可以变成卷积层。
5、正向传播和反向传播
上面解释了CNN网络的基本结构,将图像的二维矩阵从输入层输入卷积神经网络,经过一系列神经元提取特征,处理特征最后得到分类结果,似乎好像很简单,但是好像有一件很重要的事情没有解释:无论是全连接层还是实现了权值共享的卷积层,我们都需要确认各个神经元中各层的全连接权重参数和卷积核中的参数,这就要涉及到模型训练了。
对于已有的打好了标签的数据进行模型训练包括两个过程:正向传播和反向传播。一般来说我们会为模型设置初始权重,对输入特征进行计算后得出模型预测值y',通过比较其与真实值y之间的差距并将结果反馈给模型按照偏导值更改权重参数并重新计算y',如此反复,直到y'无限逼近y。
在模型训练初步得出结果后,会使用另一部分打好标签的验证集验证模型的可用性,由此引出两个概念:欠拟合和过拟合。欠拟合是指在模型训练集中模型都不能很好地拟合数据集,而过拟合是指模型能很好地拟合训练集,但是在验证集中表现极差,主要原因是模型太过关心训练集某些特定特征而导致整个模型缺乏普适性。
6、卷积神经网络地优缺点
优点:
-
共享卷积核、对高维数据处理无压力
-
无需手动选取特征,训练好权重后特征分类效果就比较好
缺点;
-
需要调参,需要大样本量,深度训练需要大量计算资源支撑
-
物理含义不明确(我们并不清楚卷积层提取到的到底是什么特征,神经网络本身就是一种难以解释的“黑箱模型”)
7、经典卷积神经网络
7.1 LeNet
1998年LeCun
等人发布了LeNet
网络,从而揭开了深度学习的面纱,之后的深度神经网络都是在这个基础上进行改进的。LetNet
被用来做手写字符和打印字符的识别任务,效果很好,曾被广泛的应用于美国银行指标写体识别,取得很大的成功。
LetNet-5
是一个较简单的卷积神经网络:输入二维图像,先经过两次卷积层和池化层,再经过全连接层,最后使用softmax
分类作为输出层。其层数包含
-
输入层:灰度化、二值化并归一化成为32×32的二维矩阵
-
C1卷积层:输入图片32×32,卷积核大小5×5,卷积核个数6。
-
S2池化层:池化窗口大小2×2,池化方式:4各输入相加后乘以一个可训练参数,再加上一个可训练偏置后通过sigmoid。
-
C3卷积层:卷积大小5×5,个数16
-
S4池化层:池化窗口大小2×2,池化方式:4各输入相加后乘以一个可训练参数,再加上一个可训练偏置后通过sigmoid。
-
C5卷积层:卷积大小5×5,个数120
-
F16全连接层:计算输入向量和权重向量之间的点积后再加上一个偏置,结果通过sigmoid函数输出。
-
输出层
7.2AlexNet
2012 ILSVRC(大规模视觉识别挑战赛)冠军,远超第2名。
其主要贡献包括:
-
ReLu非线性单元:传统的激活函数一般是sigmoid和tanh两种饱和非线性函数。在使用梯度下降算法进行训练时,使用这些饱和的非线性函数会比使用非饱和的非线性函数ReLu慢很多,模型收敛需要更长的时间。所以使用ReLu非线性函数能够加速训练。
-
多GPU训练
-
局部响应多归一化层(Local Response Normalization Layer):其主要是为了防止过拟合,增加模型泛化能力。但是这种方法已经很少使用,取而代之的是BN。
-
重叠的池化层:论文指出能够“稍微”减轻过拟合,不过目前主流的还是不重叠的池化层
-
数据增广:当有标注的图片素材过少,可以通过平移、水平翻转,随机裁剪,色彩抖动,加入噪点等方法增广数据。
-
Dropout:缓解过拟合,主要原理是随机删除某些神经元的结果(不参与前向计算和反向传播)。该方法已经被申请专利,并且与BN的使用有冲突。
7.3 VGG
VGG在2014年ILSVRC挑战赛中赢得了定位任务的冠军和分类任务的亚军。
AlexNet标明通过加深网络深度可能能够提升性能,VGG沿着这个思路做出了出色的工作,进一步证实了加深网络能够提升算法。
主要贡献:更深层次的网络,更小的卷积核、池化核。
-
VGG全部使用了3×3的卷积核和2×2的池化核
-
VGG的激活函数全部使用了ReLU
7.4 小卷积核
随着卷积神经网络研究的深入,小卷积核渐渐称为了主流,其中最常使用3×3的卷积核,而1×1的卷积核使用则是为了升维或者降维。
首先,引入感受野的概念,在卷积神经网络CNN中,决定某一层输出结果中的一个元素所对应的输出层的区域的大小被称作感受野(receptive field)。
而在感受野范围不变的情况下:
一个5×5的卷积核就可以用两个串联的3×3卷积核来代替,一个7×7的卷积核就可以用三个串联的3×3卷积核来代替。
那么三个3×3的卷积核相比一个7×7的卷积核有什么优势呢?一是包含了三个ReLU层而不是一个,使决策函数更有判别性。二是减少了参数,三个3×3卷积核需要的参数个数是 3(3×3×输入通道数×输出通道数)=27×输入通道数×输出通道数,而一个7×7卷积核需要7×7×输入通道数×输出通道数=49×输入通道数×输出通道数。
总结来说,小卷积核的优势在于:
-
参数变少:计算时间变短、存储空间小
-
非线性增强:拟合能力更强
-
层级变高:抽象能力强,提取更加复杂的特征
参考