学号:20021110085 姓名:郑佳
转载自:https://zhuanlan.zhihu.com/p/273247515 (这是我个人的知乎文章)
嵌牛导读】LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。
【嵌牛鼻子】Lenet-5经典论文解读
【嵌牛正文】
一 论文基本信息
论文题目:Gradient-Based Learning Applied to Document Recognition
代码:Pytorch 搭建 LeNet-5 网络
该论文是图灵奖获得者Yann Lecun的一篇关于CNN的开山之作,他也因此被称为“卷积神经网络之父”,这当然也离不开Hinton等人的反向传播算法。
【AI大咖】再认识Yann LeCun,一个可能是拥有最多中文名的男人 (详细了解)
2 简要了解深度学习三巨头
ACM 宣布,2018 年图灵奖获得者是号称深度学习三巨头的 Yoshua Bengio, Yann LeCun 和 Geoffrey Hinton,得奖理由是:他们在概念和工程上取得的巨大突破,使得深度神经网络成为计算的关键元素(For conceptual and engineering breakthroughs that have made deep neural networks a critical component of computing.)。
详情参考:Yoshua Bengio, Yann LeCun, Geoffrey Hinton 获 2018 年图灵奖
3 论文详解
3.1 相关背景
反向传播算法最早于上世纪70年代被提出,但是直到1986年,由David Rumelhart, Geoffrey Hinton, 和Ronald Williams联合发表了一篇著名论文(Learning representations by back-propagating errors)[也即BP算法]之后,人们才完全认识到这个算法的重要性。BP解决了神经网络的非线性分类学习的问题,然而梯度消失的问题没有得到很好的解决。1998年,Yann Lecun等人成功将卷积神经网络应用到手写字识别方面,取得了非常不多效果。
90年代,支持向量机(Support Vector Machine, SVM)当时在人像识别、文本分类等模式识别(pattern recognition)问题中有得到了广泛的应用。研究者也发现,网络层数越多,网络的表达能力越强,进而可处理更复杂的问题。但网络层数的增加,参数也随之增加,计算复杂度也在增大,当时的计算机的运算能力和存储不足以支撑。
3.2 介绍
早期模式识别的时代,研究学者深知自然数据的多样性和丰富性,无论是语音、字形还是其他类型的模式,几乎不可能完全靠手工来建立一个精确的识别系统。因此,大多数模式识别系统是使用自动学习技术和手工制作的算法相结合的。Lecun认为,使用机器学习的技术解决模式识别问题变得越发重要,同时也想证明模式识别的系统可以依赖自动学习的技术,而不是手工设计的启发式方法。以字符识别为例,LeCun证明人工设计特征抽取的工作可以通过特别设计的机器学习方法替代,并直接应用在原始的像素图像上。这里字符识别任务是指从识别图像上的字符。当然,LeCun这里想要证明的就是使用神经网络可以较好地做字符识别任务。
人工设计的特征抽取结果做字符识别的过程如下图所示:
第一个模块称为特征提取器,可转换输入模式,以便可以用低维表示向量或符号的短字符串:1、可以很容易匹配或比较;2、关于输入模式的变换和失真不会改变他们的本性。特征提取器包含大多数先验知识,并且非常特定于任务。 它也是大多数设计工作的重点,因为它通常是完全手工制作的。
第二个模块称为分类器,通常是通用的并且可以训练。这种方法的主要问题之一是识别准确度在很大程度上取决于设计人员提出适当的功能集。事实证明,这是一项艰巨的任务,必须为每个新问题重新设计特征。 大量的模式识别文献致力于描述并比较不同功能集的相对优点用于特定任务。
这样做的原因是当时的分类器只能处理低维空间且容易分类的问题。这种方法最核心的步骤就是设计能力,这是完全手工工作,并且结果主要取决于特征设计能力。
在当时,研究学者已经有以下三方面的认识:
带有快速运算的低成本机器的可用允许我们更多地依赖“蛮力”的数值运算而不是算法的改进。
与问题相关的大的数据库的可用性使得研究者更加依赖真实数据而不是人工设计的特征来构造模式识别系统。
更加强大的算法的出现使得可以处理更高维度的数据并产生更复杂的决策功能。
在介绍算法之前,LeCun还描述了五个方面的基础知识:
A Learning from Data(从数据中学习)
当训练集数量增长的时候,测试集的误差和训练集误差之间的gap会减小。
B Gradient-Based Learning(基于梯度的学习)
最小化问题是很多计算机领域问题的核心问题。基于梯度的学习证明最小化连续的函数要比最小化离散函数更容易。在本文中,大多数未知数的梯度求解都是很容易的。也就是我们只要循环求解下式即可:
这里,随机梯度下降(Stochastic Gradient Descent)方法是很有效的。在较大数据规模下,这个方法在很多时候都比常规的梯度下降方法或者二阶方法更快地收敛。
C Gradient Back Propagation(梯度后向传播)
基于梯度的学习在20世纪50年代末期开始被使用,但主要是应用在线性系统中。LeCun认为这种简单的方法现在可以用在复杂系统中主要是由于三个方面的原因。我们分别看一下。
1)是之前认为的局部最优问题并不是主要的问题。在非线性基于梯度的学习技术,如玻尔兹曼机(Boltzmann machines)的成功之后,局部最优并不是一个主要的障碍变得很明显(apparent)。
2)是Rummelhart等人提出的一个简单的但却很有效的梯度计算方法的流行,该方法可以用来处理多个层组成的复杂系统,即反向传播算法(back-propagation)。
3)是反向传播方法和sigmoid单元在神经网络中的应用可以用来解决复杂的学习任务。
反向传播算法的基本思想是梯度可以通过从输出到输入的计算得到。这个思想在20世纪60年代在控制论论文中提出,直到最近才运用到机器学习中。有意思的是,之前在神经网络中反向传播的推导并不是用的“梯度”,用的是中间层单元的虚拟目标(vertual targets)或者是最小干扰参数(minimal disturbance arguments)。
多层神经网络中局部最优问题似乎不是一个问题,这一点在理论上是有点“神秘”的。如果网络的大小相对于任务来说过大的话,那么参数空间中“多余的维度(extra dimensions)”将会降低无法触及区域的风险。反向传播是目前最广泛的神经网络的学习方法,也许是任何形式的最广泛的学习方法。
D Learning in Real Handwriting Recognition Systems(手写识别系统的学习)
实验表明,基于梯度的学习训练的神经网络比在同一数据上测试的所有其他方法性能更好。最好的神经网络被称为卷积网络,旨在学习如何直接从像素图像中提取相关特征。
然而,手写识别中最困难的问题之一是不仅要识别单个字符,还要将字符从其邻域中分离出来单词或句子,一个被称为分段的过程。主要是先用启发式方法产生大量可能的分割结果,然后基于得分找出最好的一个。这种情况,分割的质量主要取决于生成分割的启发式方法以及如何找出最匹配的分割结果。这里,使用人工标出不正确的分割非常重要。显然这种方式不仅非常耗时费力,而且非常困难。比如8的右边分出来之后应该标注为3还是8呢?
在这篇文章中,LeCun提出了两个方法解决这个问题。一个是优化全局的损失函数,第二个方法是识别出每一个可能的分割结果,并选出最中心的字符。
E Globally Trainable Systems (全局训练系统)
如前所述,大多数的识别系统都是多个模块的。例如,文档识别系统由field定位器、field分割器和识别器组成,还包括一个情景后处理器。一般情况下,模块之间的通信都是数字信息。最好的方式应该是全局系统都是最小化一个目标来获得文档级别的识别准确性。LeCun据此提出了一个由多个可微的神经网络组成的前馈网络。每一个模块都是连续且可微的。这样就使得我们可以通过反向传播算法优化整个系统了。
3.3 用于字符识别的卷积神经网络
使用梯度下降法的多层网络可以从大量的数据中学习复杂的,高纬,非线性的映射,这使得他们成为图像识别任务的首选。在传统的模式识别的模型中,手工设计的特征提取器从图像中提取相关特征清除不相关的信息。分类器可以将这些特征进行分类。全连接的多层网络可以作为分类器。一个更有意思的模式就是尽量依赖特征提取器本身进行学习。对于字符识别,可以将图像作为行向量作为输入输入到网络中。虽然这些任务(比如字符识别)可以使用传统的前向全连接网络完成。但是还存在一些问题。
首先,图像是非常大的,由很多像素组成。具有100个隐藏单元的全连接网络包含成千上万的权重,这么多参数提高了系统的消耗和内存占用,因此需要更大的训练集。但是没有结构的网络的主要缺点是,多于图像或者音频这些应用来说,不具备平移,形变扭曲的不变性。在输入到固定大小输入的网络钱,字符图像的大小必须归一化,并且放在输入的中间,不幸的是,没有哪种预处理能够达到如此完美:由于手写体以字符为归一化单位,会导致每个字符的大小,倾斜,位置存在变化,再加上书写风格的差异,将会导致特征位置的变化,原则上,足够大小的全连接网络可以对这些变化鲁棒,但是,要达到这种目的需要更多的在输入图像不同位置的神经元,这样可以检测到不同的特征,不论他们出现在图像的什么位置。学习这些权值参数需要大量的训练样本去覆盖可能的样本空间,在下面描述的卷积神经网络中,位移不变性(shift invariance)可以通过权值共享实现。
其次,全连接的网络的另一个缺点就是完全忽略了输入的拓扑结构。在不影响训练的结果的情况下,输入图像可以是任意的顺序。然而,图像具有很强的二维局部结构:空间相邻的像素具有高度相关性。局部相关性对于提取局部特征来说具有巨大优势,因为相邻像素的权值可以分成几类。CNN通过将隐藏结点的感受野限制在局部来提取特征。
3.3.1 卷积神经网络
卷积网络联合了三个架构特征导致了转换、拉伸和扭曲的不变形:1)局部感受野(Local Receptive Fields);2)共享权重(Shared Weights);3)时间和空间的二次抽样(Spatial or Temporal Subsampling)。
局部感受野就是接受输入的几个相邻的单元来操作。它可以追溯到20世纪60年代早期的感知机时代。局部连接在神经网络处理视觉问题中很常见。局部感受野可以抽取图像初级的特征,如边、转角等。这些特征会在后来的层中通过各种联合的方式来检测高级别特征。此外,局部初级的特征也能在全局图像中发挥作用。这个知识可以用来强制某些单元,其感受野在图像的不同位置,但是拥有相同权重。
将局部感受野位于图像不同位置的一组神经元设置为相同的权值(这就是权值共享)。
在特征图中降低特征位置的精度的方式是降低特征图的空间分辨率,这个可以通过下采样层达到,下采样层通过求局部平均降低特征图的分辨率,并且降低了输出对平移和形变的敏感度。
3.4 Lenet-5
LeNet-5共有7层,不包含输入,分别为卷积-池化-卷积-池化-全连接-全连接-全连接。
input:32*32的灰度图像,也即一个二维矩阵,没有RGB三通道。
卷积和池化的格式如下:
卷积核(size*size*n,stride),size*size表示卷积核的大小,n表示卷积核个数,stride表示步长。【Lenet-5中的卷积方式均为“valid”】
池化(size*size,stride),size*size表示卷积核的大小,stride表示步长。
C1层(卷积层):
输入图片大小:32x32,通道数为1
卷积核(5*5*6,1),输入经过C1后变为了28x28x6。
输出featuremap大小:28*28 (32-5+1)=28
神经元数量(输出):28*28*6
可训练参数:(5*5+1) * 6=156(每个卷积核有5*5=25个unit参数和一个bias参数,一共6个滤波器)
连接数:(5*5+1)*6*28*28=122304
S2层(池化层,也成下采样层):
池化(2*2,2),池化方式为average pooling(平均池化),下同
输出featureMap大小:14*14
神经元数量(输出):14*14*6
连接数:(2*2+1)*6*14*14
C3层(卷积层):
卷积核(5*5*16,1),输入经过C1后变为了28x28x6。
输出featureMap大小:10*10 (14-5+1)=10
可训练参数:6*(3*5*5+1)+6*(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516
关于上述参数的计算,比如6*(3*5*5+1)是如何得到的?
首先,先看一个卷积核与上层的三个feature map 相连,由于此时feature map是3通道的(通道数即为
feature map个数),所以卷积核也必须是3通道的,对其分别卷积(对应相乘,相加),再加上bias,
也即(3*5*5+1),故6个卷积核即为:6*(3*5*5+1)
连接数:10*10*1516=151600
这一层16个卷积核中只有10个和前面的6层相连接。也就是说,这16个卷积核并不是扫描前一层所有的6个通道。如下图,0 1 2 3 4 5这 6个卷积核是扫描3个相邻,然后是6 7 8 9 10 11 这6个卷积核是扫描4个相邻,12 13 14这3个是扫描4个非相邻,最后一个15扫描6个。实际上前面的6通道每个都只有10个卷积核扫描到。
S4层(池化层,也成下采样层):
池化(2*2,2),池化方式为average pooling(平均池化)
输出featureMap大小:5*5(10/2)
神经元数量:5*5*16=400
连接数:16*(2*2+1)*5*5=2000
C5层(卷积层):
卷积核(5*5*120,1)
输出featureMap大小:1*1(5-5+1)
可训练参数/连接:120*(16*5*5+1)=48120
C6层(全连接):
输入向量维度:[1,120]
权重参数的维度:[120,84]
计算方式:输入的向量与权重参数之间用矩阵点积的方式进行运算,再加上一个偏置,结果通过sigmoid函数输出,最终得到一个输出维度为[1,86]的向量。
可训练参数:84*(120+1)=10164
output层:
输入向量维度:[1,84]
权重参数的维度:[84,10]
同上计算方式,得到一个输出维度为[1,10]的向量
Output层也是全连接层,共有10个节点,分别代表数字0到9。
Lenet-5的网络图如下:
参考:
网络解析(一):LeNet-5详解
LeNet论文的翻译与CNN三大核心思想的解读_QQ哥的专栏-CSDN博客
CNN入门算法LeNet-5介绍(论文详细解读)_徐先森的博客-CSDN博客
浅谈LeNet-5_江小举的博客-CSDN博客