美文网首页
经典论文之LeNet-5

经典论文之LeNet-5

作者: 筑梦家洋可 | 来源:发表于2020-05-11 23:31 被阅读0次

Reference: LeCun, Y.; Bottou, L.; Bengio, Y. & Haffner, P. (1998). Gradient-based learning applied to document recognition.Proceedings of the IEEE. 86(11): 2278 - 2324.

基本信息

简介:如果是对Computer Vision有所了解的同学应该都不会对LeNet-5陌生,这篇由LeCun和Bengio在1998年(我竟然还没出生)撰写的论文着实牛掰。实际上LeNet-5的诞生还要早(大约是1994年)。LeNet-5基本上为CNN在2012年以后的爆发奠定了基调。当然除了LeNet-5还有LeNet-1、LeNet-4等网络结构,在原始论文中也作为比较提到。

背景:当初LeNet-5的设计主要是为了解决手写识别问题。那时传统的识别方案很多特征都是hand-crafted,识别的准确率很大程度上受制于所设计的特征,而且最大的问题在于手动设计特征对领域性先验知识的要求很高还耗时耗力,更别谈什么泛化能力,基本上只能针对特定领域。

Architecture

稍微有一点computer vision经验的人都不会对下面这张图陌生,这张图是LeCun在原始论文中po的一张结构图,很直观能get到LeNet-5的结构。但是原始论文的操作手法和现在的大多数人的implementation稍微不同,这里针对每一层做一个阐释。

@原始论文LeNet-5结构图 | center
原始架构除去输入层外一共7层,输入是3232的灰度图,也就是说输入大小是32321,并对输入图片进行正则化(后文查看标准化有什么用),正则化后白色(背景)为-0.1,黑色为1.175,最终均值大约为0,方差大约为1.


第一层C_1,采用6个5
5的卷积核按步长为1,0填充进行卷积(没记错的话,那时候的卷积还没有对padding进行研究)。那么参数只有卷积核的权重和偏置(后文查看为什么采用权重和偏置),那么总的参数个数就是556+6=156个参数,卷积后的特征图大小为28286(后文查看CNN output计算公式),每个像素都与前一层的5∗5个像素和1一个bias有连接,有6∗(5∗5+1)∗(28∗28)个连接。


第二层,对6个特征图进行下采样,即对feature map做22,步长为2,0填充的池化,池化层对池化窗口的四个值进行加和以下采样,并将下采样后的特征图乘以一个可训练系数加上偏置,并通过sigmoid函数进行非线性映射。最终池化后的特征图大小为14146,那么总的参数个数就是26=12个参数,651414=5880个连接。
池化层本身通过下采样减少了数据量,保留了有用信息,同时也减少了模型参数,降低了过拟合。


第三层C_3,采用16个5
5的卷积核按步长为1,0填充进行卷积(实际上没有添加padding的卷积核本身就带有下采样效果)。最终总的参数个数就是6∗(3∗5∗5+1)+6∗(4∗5∗5+1)+3∗(4∗5∗5+1)+1∗(6∗5∗5+1)=1516个参数,151600个连接。原文中为了控制连接数量和打破网络对称性,并没有对和所有进行连接,而是按照下图所示规则:
@第二层和第三层连接图 | center
原文中对这个模式的解释为:前六个(即上图横坐标0-5)卷积核提取中 连续三个子集中的特征,后六个(即上图横坐标6-11)卷积核提取中 连续四个子集中的特征,后三个(即上图横坐标12-14)卷积核提取中离散的四个子集中的特征,最后一个提取全图特征。(现在貌似没看到这么做了,可能比较麻烦,效果也不是特别显著


第四层,对16个特征图进行下采样,即对feature map做22,步长为2,0填充的池化。最终池化后的特征图大小为5516,那么总的参数个数就是216=32个参数,16(554+25)=2000个连接。


第五层C_5,采用120个5
5的卷积核按步长为1,0填充进行卷积。那么总的参数个数就是(5516+1)120=48120个参数,同样由48120个连接卷积后的特征图大小为11120。


第六层FC_6是一个全连接层,该层采用a_i=f(W \cdot x_i)$$$$f(a) = A \tanh (S a)其中,A是振幅(原始论文设值为1.7159),S是相位。全连接层共有120
84+84=10164个参数。


第七层输出层,采用RBF函数作为损失函数:用于度量输入和参数的距离,这里援引原始论文的解释:

输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每个有84个输入。换句话说,每个输出RBF单元计算输入向量和参数向量之间的欧式距离。输入离参数向量越远,RBF输出的越大。一个RBF输出可以被理解为衡量输入模式和与RBF相关联类的一个模型的匹配程度的惩罚项。用概率术语来说,RBF输出可以被理解为F6层配置空间的高斯分布的负对数似然函数。给定一个输入模式,损失函数应能使得F6的配置与RBF参数向量(即模式的期望分类)足够接近。这些单元的参数是人工选取并保持固定的(至少初始时候如此)。这些参数向量的成分被设为-1或1。虽然这些参数可以以-1和1等概率的方式任选,或者构成一个纠错码,但是被设计成一个相应字符类的7*12大小(即84)的格式化图片。这种表示对识别单独的数字不是很有用,但是对识别可打印ASCII集中的字符串很有用。

使用这种分布编码而非更常用的“1 of N”编码用于产生输出的另一个原因是,当类别比较大的时候,非分布编码的效果比较差。原因是大多数时间非分布编码的输出必须为0。这使得用sigmoid单元很难实现。另一个原因是分类器不仅用于识别字母,也用于拒绝非字母。使用分布编码的RBF更适合该目标。因为与sigmoid不同,他们在输入空间的较好限制的区域内兴奋,而非典型模式更容易落到外边。

RBF参数向量起着F6层目标向量的角色。需要指出这些向量的成分是+1或-1,这正好在F6 sigmoid的范围内,因此可以防止sigmoid函数饱和。实际上,+1和-1是sigmoid函数的最大弯曲的点处。这使得F6单元运行在最大非线性范围内。必须避免sigmoid函数的饱和,因为这将会导致损失函数较慢的收敛和病态问题。

原论文中的损失函数采用MSE,并添加了一个惩罚项(后文查看为什么要添加惩罚项),计算公式为:E(W) = \frac{1}{P} \sum_{p=1}^{P}{(y_{D^p}(Z^p, W)+ \log(e^{-j}+\sum_{i}e^{-y_i(z^p,W)}))}
右边这个对数部分就是惩罚项,且小于等于左边。但实际上现在很多对于LeNet-5的实现是没有这一部分的,因为效果不明显。

附录

标准化有什么用

关于标准化和归一化,网上有的博客是混用的,这个我都接受,毕竟英文翻译都是normalization,但是有人怎么会把正则化和这两个搞混???正则化完全不同,英文是regularization,这里按下不表。个人认为归一化和标准化只是方法上的区别,这两者都是数据缩放的方法,本质都是一种线性变换,但是标准化特指将数据缩放为均值为0,方差为1的区间(z-score normalization/Standardization)。而归一化有Rescaling、Mean normalization、Scaling to unit length三种不同的选择,方法不同,目的一致。但是这两者还是稍有差别,具体表现在归一化的方法直接是根据极值进行缩放到[0, 1],易受极值影响。而标准化是根据方差进行数据缩放平移,数据范围可能是[-\infty, +\infty],也就是会考虑数据分布特征,更适合对于噪声和异常值的处理。

但……我还是没说normalization到底有什么用?这里祭出Andrew Ng的图:

@标准化的作用 | center
可以看出,当数据标准化(无量纲化)后,数据分布如上左图,数据分布呈椭圆形,但是一旦进行无量纲化后,数据分布更成近似圆形,从BP算法的方案上看,左图如果初始位置在长轴端点就会导致训练时间过长,右图巧妙避免了这个问题。

所以总结一下normalization作用就是更容易正确收敛

为什么采用权重和偏置

这里这个权重和偏置很有意思,大多数初学者可能都没有考虑过,你细品,这Wx+b难道不就是初中的kx+b???套了件马甲就不认识了?一次函数在高等数学里应该是一条直线,能够用直线区分的两个类别被称为线性可分,但是有这么一个问题,如果非要用线性去解决线性不可分问题呢???

这里又要引用别人的博客的例子:https://blog.csdn.net/dengheCSDN/article/details/78109253

|center
我们把横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类。试问能找到一个线性函数把两类正确分开么?不能,因为二维空间里的线性函数就是指直线,显然找不到符合条件的直线。但我们可以找到一条曲线,例如下面这一条:g(x)=c_0+c_1x+c_2x^2
|center
但是曲线就不是二维空间里的线形了,那咋办???那我们从代数的观点去看,我把上面直线的方程转化为f(y)=<a, y>=\begin{bmatrix} 1 \\ x \\ x^2 \end{bmatrix}\quad \cdot \begin{bmatrix} c_0 \\ c_1 \\ c_2 \end{bmatrix}\quad=ay。从形式上看,这就是一个线性函数啊,只不过y为三维变量,y的次数为1所以是线性函数,只不过这里是四维空间的线性函数(哪来的四维呢?f(y)也算一维哦,不信你自己想想y=kx+b里的y有没有算。)这里二维空间解决不了的线性不可分问题升到四维,用四维空间的线性方案解决了!
说到这,我想提一个观点,以前看梁冬的《觉者》有一期采访华大基因的尹烨,尹烨提到人要想解决想不通的问题只能靠升维。和这里突然不谋而合,欧氏空间解决不了的线性不可分问题升到四维问题就迎刃而解了。

这里就是为什么要用w作为权重,w是决定那个分离超平面的方向所在。b就是对该平面的移动,如果没有b,所有的分离超平面都过原点。

CNN output计算公式

对于输入图像(或者特征图)大小为input_size,给定kernel_size、padding、stride,计算得出output_size为:
output=1+\frac{input+2*padding-kenel}{stride}
该公式既适用于卷积过程,也适用于池化过程。

为什么要添加惩罚项

根据Occam's Razor原理:如无必要,勿增实体。在机器学习过程中,我们希望训练得到的是泛化能力强的模型,然鹅生活中越简洁、抽象的对象越容易描述,越具体、复杂、明显就越不容易描述区分,描述区分的泛化能力就越不好。问题来了:如何控制这个复杂度?通常的做法是在损失函数后面加上一个正则惩罚项:L = L_0 + \frac{\lambda}{n}{}\sum_{w}{|w|}
没有加上正则项的部分叫做经验风险,加上正则项的损失函数叫做结构风险,结构风险多的\frac{\lambda}{n}{}\sum_{w}{|w|}这一部分叫做penalty(惩罚项),惩罚项常用的是L_1或者L_2范数。惩罚项的意思就是通过计算权重绝对值的均值加上一个权重因子\lambda作为重视程度,也叫做惩罚系数。

结构风险通过通过惩罚项控制模型复杂程度,降低过拟合并提高泛化能力。

后记

由于笔者本身能力有限,文章内容和文字可能出现一些错误,欢迎各位批评指正,共同讨论,共同学习。

相关文章

网友评论

      本文标题:经典论文之LeNet-5

      本文链接:https://www.haomeiwen.com/subject/wypmnhtx.html