LeNet:《Gradient-Based Learning Applied to Document Recognition》 作为CNN的开山之作,广为人知。也是手写体识别经典论文。发表于1998年
文章发表于1998年,首次提出卷积神经网络的概念,在这之前关于神经网络的研究都处于全连接神经网络的阶段,全连接神经网络的提出开启了神经网络研究的新阶段。其中提出的关于CNN的三大核心思想在当前的神经网络研究中不断推陈出新。作者提出的 LeNet-5 为师姐最早的卷积神经网络之一。
1998年,作者Yann LeCun等人回顾了纸上手写字符识别的各种方法,并使用标准手写数字来识别基准任务。对这些模型进行了比较,结果表明该网络优于所有其他模型。并发表了本文。
原文篇幅很大,不仅详细介绍了LeNet-5 ,以及卷积神经网络,还介绍了其在不同技术以及应用。因为知识底蕴有限,故主要阅读了第一二部分,作者在第一部分详细介绍了此前机器学习、神经网络的基础,第二部分详细介绍了卷积神经网络以及 LeNet-5。
在最后,我附上了在我读这篇论文过程中对我有很大帮助的博客、文章。
LeNet论文的翻译与CNN三大核心思想的解读 : 我是自己一边看原文,不懂的地方谷歌翻译,还是不明白的地方我会看这篇博客,作者叙述的很详细,本文中有很多地方的翻译我直接采用了博主的翻译,在这里强推一波。博主是 : qianqing13579
在卷积神经网络提出之前,领域能对单个模式识别任务主要分为两个模块来完成。如下图。
但这种方法有极大的局限性。
介绍了机器学习的目标:
计算: Y p = F ( Z p , W ) Y^p = F(Z^p,W) Yp=F(Zp,W)
其中 Z p Z^p Zp为第 p p p次输入的特征(原文中翻译为 pattern), W W W 表示系统中可调参数的集合,也可称为权重。 Y p Y^p Yp 为模型的输出, 另外还有 $ D^p$ 为第 p p p 次输入对应的期望输出,或者为实际输出。
定义了损失函数: E p = D ( D p , F ( W , Z p ) ) E^p = D(D^p,F(W,Z^p)) Ep=D(Dp,F(W,Zp)) 。式中的第一个D 是指计算 D p D^p Dp 与 F ( W , Z p ) F(W,Z^p) F(W,Zp) 的差异。
损失函数在训练集中的平均值为 E t r a i n E_{train} Etrain ,在测试集中的损失函数平均值为 E t e s t E_{test} Etest.(测试集与训练集互不相交)
两者之差定义为: E t e s t − E t r a i n = k ( h p ) α E_{test} - E_{train} = k (\frac{h}{p})^α Etest−Etrain=k(ph)α
P是指训练集中样本的数量, h 是是衡量机器的“有效容量”或复杂程度的指标。α 在0.5到 1 之间,k是一个常数。
我们期望这个差值越小越好,越小则证明模型的泛化能力越强,模型在真实世界上的表现可能越好。两者之差越大,则证明模型的表现越差,出现了过拟合的现象。论文中提到,两者间的差距,总会伴随着训练样本集的增大而减小。
This gap always decreases when the number of training samples increases.
这也是早期的机器学习的一大阻力,即难以从真实世界中收集到足够大的训练集。
在实际上,降低过拟合风险是通过最小化
E t r a i n + β H ( W ) E_{train} + βH(W) Etrain+βH(W)
来实现的。将此式子作为基础 loss function 的替代,最小化这个函数,来抑制过拟合的风险,并以此来期望模型得到一个好的表现。
H ( W ) H(W) H(W)称为正则函数 (H(w) is called a regulation function and β is a constant), β为一个常数,作为超参。
通过最小化 E t r a i n + β H ( W ) E_{train} + βH(W) Etrain+βH(W) ,实际上就是限制参数 W W W 的变化,抑制 W W W 的变化范围,来减少对模型过拟合的影响。
已经知道我们目标在于,最小化损失函数的输出,即让模型的输出与期望输出差异越来越低,并在真实世界中有出色的表现。我们需要基于梯度。
The loss function can be minimized by estimating the impact of small variations of the parameter values on the loss function.
通过估计参数值在微小变化上对损失函数的影响,来使损失函数最小化。
前提: E ( W ) E(W) E(W) 连续且处处可微。基于梯度下降,参数W 的迭代过程为:
W k = W k − 1 − ε ∂ E ( W ) ∂ W W_k = W_{k-1} - ε \frac{\partial E(W)}{\partial W} Wk=Wk−1−ε∂W∂E(W)
ϵ \epsilon ϵ 是一个标量常数,为超参,通常称为学习率、或者学习步长。这部分基于梯度的学习,在最优化计算方法的计算内容中。
最优化计算方法中有很多二阶的计算方法,用于最小化损失函数,例如共轭梯度发、牛顿法等等。但文章作者在文中说,这些二阶方法在大型机器学习中的帮助十分有限。而最常用的最小化方法是随机梯度算法(SGD),也称为在线更新。
当模型在每见到一组训练数据都对参数进行更新时,我们称这种梯度下降法为SGD,即如下过程:
1.初始化参数( W W W,学习率 α \alpha α)
2.计算W中每个分量的梯度
3.更新参数
4.重复步骤2 和3,直到代价值稳定
在实际运用中,使用小批量进行参数更新的mini-batch gradient descent也常常被叫做SGD,一般我们对使用单个训练数据更新还是小批量更新不做过多区分,而主要关注算法本身。
基于梯度的学习算法,在上世纪五十年代就有开始使用,但它主要被局限在线性系统中。
当以下三件事发生的时候,人们才认识到这种简单的梯度下降技术在复杂的机器学习任务重的惊人表现。
第一件事是: 早期在非线性系统中,人们总是被局部最小点而困扰,但实际上最近(1998)人们发现局部极小值似乎并不是早期非线性梯度学习技术的主要障碍。
第二是: 反向传播算法。
Rumelhart 等人推广的一个简单而有效的算法来计算由几个处理层组成的非线性中的梯度,即反向传播算法
第三是: 证明了反向传播算法应用于带有单位的多层神经网络可以解决复杂的学习任务。
反向传播的基本思想是通过从输出到输入的传播可以有效地计算梯度。
对于输入层,图片等数据的输入,虽然可以采用全连接的前馈网络来完成图片对网络的输入,并且可以取得一定的成功,但有很大的问题。
First, typical images are large, often with several hundred variables (pixels). A fully connected first layer with, e.g., one hundred hidden units in the first layer would already contain several tens of thousands of weights. Such a large number of parameters increases the capacity of the system and therefore requires a larger training set.
首先,典型的图像是巨大的,通常有几百个变量(像素)。一个完全连接的第一层,例如,在第一层有100个隐藏单元,那么这个隐藏单元已经包含了几万个重量。如此大量的参数增加了系统的容量,因此需要更大的训练集。
这里的容量,原文中为(capacity),谷歌机翻为 容量,我认为是不恰当的,我认为这里指代的是系统的假设空间。(假设空间的概念在周志华《机器学习》中了解到)。即系统的弹性大小。
此外
故采用全连接的方式对图片输入、处理是不好的。
但是没有结构的网络的主要缺点是,对于图像或者音频这些应用来说,不具备平移,形变扭曲的不变性。在输入到固定大小输入的神经网络,字符图像的大小必须归一化,并且放在输入的中间,不幸的是,没有哪种预处理能够达到如此完美:由于手写体以字符为归一化单位,会导致每个字符的大小,倾斜,位置存在变化,再加上书写风格的差异,将会导致特征位置的变化,原则上,足够大小的全连接网络可以对这些变化鲁棒,但是,要达到这种目的需要更多的在输入图像不同位置的神经元,这样可以检测到不同的特征,不论他们出现在图像的什么位置。学习这些权值参数需要大量的训练样本去覆盖可能的样本空间,在下面描述的卷积神经网络中,位移不变性(shift invariance)可以通过权值共享实现。
通俗的讲,传统的非结构化网络(unstructured nets)以及全连接前馈神经网络,对于图片或语音信号,有很大的限制。以图片为例,要求输入的图片最好不要发生形变、局部失真,要求输入图像集大小归一化,都居中。 这样才方便特征提取器提取数据。
全连接的网络的另一个缺点就是完全忽略了输入的拓扑结构。在不影响训练的结果的情况下,输入图像可以是任意的顺序。然而,图像具有很强的二维局部结构:空间相邻的像素具有高度相关性。局部相关性对于提取局部特征来说具有巨大优势,因为相邻像素的权值可以分成几类。CNN通过将隐藏结点的感受野限制在局部来提取特征。
卷积网络结合了三种结构思想,保证了一定程度的移位、缩放和失真不变性。
CNN通过局部感受野(local receptive fields),权值共享(shared weights),空间和时间上的**子采样(sub-sampling)**实现位移,缩放,和形变的不变性(shift,scale,distortion invariance)。
在论文中,作者用的叙述单词是: sub-sampling- 直译过来即子采样,在神经网络、深度学习后面的发展,这个过程被成为Pooling(池化)(参见AlexNet)。
下图为论文中提出的最早的CNN网络结构 LeNet-5
输入层输入大小归一化并且字符位于中间的字符图像。每一层的每个神经元(each unit)接受上一层中一组局部领域的神经元的输入(就是局部感受野local Receptive field)。
局部感受野通俗来讲它的思想是检测图像或者输入中的特定特征。例如我们见到鸟嘴、鸟脚、羽毛我们判断输入的图像可能是一张鸟的照片。局部感受野则是检测这一个个的特征,映射到特征图中,再探寻特征之间的关系。 (多层卷积层、是否也是将特征之间识别为一个更上层的高层特征?)
局部感受野在视觉学习神经模型中使用很多次了,使用局部感受野,神经元能够提取边缘,角点等视觉特征,这些特征在下一层中进行结合形成更高层的特征,
每一层中所有的神经元形成一个平面,这个平面中所有神经元共享权值。这种平面上各单元的输出集称为特征图(feature map)。
**神经元(unit)**的所有输出构成特征图,特征图中所有单元在图像的不同位置执行相同的操作,这样他们可以在输入图像的不同位置检测到同样的特征,一个完整的卷积层由多个特征图组成(使用不同的权值向量),这样每个位置可以提取多种特征。
一个卷积核对应检测一种特征,对应生成一张特征图。故可以理解为卷积核越多,能检测的特征越多,但伴随而来的是参数数量增加。
一个卷积核为对应若干神经元,覆盖整个输入中。 特征图的size 由卷积核的大小以及步长(stride)决定。stride 为相邻两个神经元的间隔。 卷积核的大小即(kernel size)。
一个具体的示例就是图2 LeNet-5中的第一层,第一层隐藏层中的所有单元形成6个平面,每个是一个特征图。一个特征图中的一个单元对应有25个输入 (因为kernel size = 5),这25个输入连接到输入层的5x5区域,这个区域就是局部感受野 (local Receptive field)。每个单元有25个输入,因此有25个可训练的参数加上一个偏置。由于特征图中相邻单元以前一层中连续的单元为中心,所以相邻单元的局部感受野是重叠的 (重叠区域取决于 stride)。比如,LeNet-5中,水平方向连续的单元的感受野存在5行4列的重叠。如下图:
一个特征图中所有单元共享25个权值和一个偏置,所以他们在输入图像的不同位置检测相同的特征,每一层的其他特征图使用不同的一组权值和偏置,提取不同类型的局部特征。如在图二的LeNet-5中,第一层每个输入局部感受野或提取6个不同的特征。
特征图的一种实现方式就是使用一个带有感受野的单元,扫面整个图像,并且将每个对应的位置的状态保持在特征图中,这种操作等价于卷积,后面加入一个偏置和一个函数,因此,取名为卷积网络,卷积核就是连接的权重。卷积层的核就是特征图中所有单元使用的一组连接权重。
卷积层的一个重要特性是如果输入图像移动,特征图输出将移动相同的量,否则特征图保持不变。这一特性是卷积网络对输入信号的移位和失真具有鲁棒性的基础。
这里的子采样层的概念与现在的池化层的概念等同。但在本文中对其目的的叙述比较多样。但目前的池化层主要是为了降低特征图分辨率,降低模型训练难度,但会影响模型的表现能力。随着目前硬件设备的发展,越来越多的CNN模型选择不加入池化层。
以下为Yann LeCun 对子采样层的阐述。
一旦计算出feature map,那么精确的位置就变得不重要了,相对于其他特征的大概位置是才是相关的。
在特征图中降低特征位置的精度的方式是降低特征图的空间分辨率,这个可以通过子采样层达到,子采样层通过求局部平均降低特征图的分辨率,并且降低了输出对平移和形变的敏感度。
LeNet-5中的第二个隐藏层就是子采样层。这个层包含了6个特征图,与前一层的6个特征图对应。每个神经元的感受野是2x2,每个神经元计算四个输入的平均,然后乘以一个系数,最后加上一个偏执,最后将值传递给一个sigmoid函数。相邻的神经元的感受野没有重叠。因此,子采样层的特征图的行和列是前一层特征图的一半。系数和偏置影响了sigmoid函数的效果。如果系数比较小,子采样层相当于对输入做了模糊操作。如果系数较大,根据偏置的值子采样层可以看成是“噪音 或”或者“噪音 与”操作。卷积层和子采样层是交替出现的,这种形式形成一个金字塔:每一层,特征图的分辨率逐渐减低,而特征图的数量逐渐增加。LeNet-5中第三个隐藏层(C3层)的每个神经元的输入可以来自前一层(S2)的多个特征图。子采样以及多个特征结合可以大大提高网络对几何变换的不变性。
局部感受野类似于图像的卷积操作,能够提取局部特征,而图像局部的特征检测器也可以用于整个图像,这样就可以提取整幅图像的特征,基于这个特性,我们可以将局部感受野位于不同位置的神经元设置为相同的权值,这些神经元的输出形成CNN中的一个特征图,这样直接将参数个数降到了100个,这就是权值共享的思想。
权值共享大大减少了被训练参数的数量,降低了模型的复杂性,也在一定程度上对过拟合产生了抑制。
上述就是CNN的三大核心思想:
局部感受野(local receptive fields):基于图像局部相关的原理,保留了图像局部结构,同时减少了网络的权值
权值共享(shared weights): 也是基于图像局部相关的原理,同时减少网络的权值参数
下采样(sub-sampling):对平移和形变更加鲁棒,实现特征的不变性,同时起到了一定的降维的作用。(这个在之后的发展似乎逐渐被取代)
Lenet-5包含七个层,不计入输入,所有这些层都包含可训练的参数(权重)。输入是32x32像素的图像。输入图像为32*32大小。这要比Mnist数据库(一个公认的手写数据库)中最大的字母还大(28*28)。这样做的原因是希望潜在的明显特征如笔画端点或角点能够出现在最高层特征监测器感受野的中心。
在LeNet-5中,最后一层卷积层的感受野的中心在32x32的输入图像中形成了一个20x20的区域,输入像素值被归一化了,这样背景(白色)对应-0.1,前景(黑色)对应1.175.这使得输入的均值约等于0,方差约等于1,这样能够加速学习[46]。 这里没看懂 >
C1层是一个卷积层,由6个特征图Feature Map构成。特征图中每个神经元与输入中5*5的邻域相连。特征图的大小为28*28,这样能防止输入的连接掉到边界之外。C1有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)*6=156个参数),共122,304个连接(26* 28* 28 * 6,每个神经元对应26个连接,每个feature map有28*28个unit, 一共有6个feature map)。
S2层是一个下采样层,有6个14*14的特征图。特征图中的每个单元与C1中相对应特征图的2*2邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid函数计算。每个单元的2*2感受野并不重叠,因此S2中每个特征图的行列分别是C1中特征图的一半。S2层有 12 个可训练参数(每个feature map有一个系数和偏置)和5880个连接。
C3是一个有16个特征图的卷积层。C3层的卷积核大小为5*5,每个特征图中的每个单元与S2中的多个特征图相连,表1显示了C3中每个特征图与S2中哪些特征图相连。
C3的前6个特征图以S2中3个相邻的特征图为输入。接下来6个特征图以S2中4个相邻特征图为输入,下面的3个特征图以不相邻的4个特征图为输入。最后一个特征图以S2中所有特征图为输入。
这里C3 并没有和 S2 全部相连,而现代CNN中,比如AlexNet,ResNet等, 特征图与前一层的所有特征图相连。这里的不同还不明白。
S4层是一个下采样层,由16个5 * 5大小的特征图构成。特征图中的每个单元与C3中相应特征图的2 * 2邻域相连接,跟C1和S2之间的连接一样。S4层有32个可训练参数(每个特征图1个系数和一个偏置)和2000个连接(555*16,对于S4的每个unit,对应感受野4个参数,加上一个偏置)。
C5层是一个卷积层,有120个特征图。每个单元与S4层的全部16个特征图的5 * 5领域相连。由于S4层特征图的大小也为5\ * 5(同滤波器一样),故C5特征图的大小为1 * 1:**这构成了S4和C5之间的全连接。之所以仍将C5标示为卷积层而非全连接层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1 *1大。**C5层有48120个可训练连接((5 * 5 * 16+1) *120)。
F6为全连接层。有8484个节点,所以有84 *(120+1)=1016484 *(120+1)=10164个参数
F6层计算输入向量和权重向量之间的点积,再加上一个偏置。神经元 i i i 的加权和表示为 a i a_i ai ,然后将其传递给sigmoid函数产生单元 $ i $ 的一个状态,表示为 x i x_i xi,
x i = f ( a i ) x_i = f(a_i) xi=f(ai)
sigmod函数是一个双曲线正切函数:
f ( a ) = A ∗ t a n h ( S a ) f(a) = A*tanh(Sa) f(a)=A∗tanh(Sa)
A表示函数的振幅,S决定了斜率,这个函数是一个奇函数,水平渐近线为+A,-A。常量A通常取1.7159。
输出层为全连接层,共有10个节点,采用的是径向欧式距离函数(RBF)的网络连接方式。
LeNet虽然年代久远,但它开启了神经网络的新篇章,站着现在的角度,LeNet-5可能并不是那么初始,但学习它对于理解学习卷积神经网络以及理解上周读的 AlexNet 有很大的帮助。