深度学习常见主流经典算法概述(二)(CNN的本质,以LeNet为例)

三、LeNet结构

3.1 LeNet概述

LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络,因为这个东西手写识别都能商用化了
结构如图
深度学习常见主流经典算法概述(二)(CNN的本质,以LeNet为例)_第1张图片
第一个问题:为什么会有CNN,见上一章说过的,因为科学家在实验的时候发现局部性问题,越远影响越不大,然后发现像卷积这样构造的神经网络 真香~,所以有了CNN,第二个问题,CNN如何运算?转自CNN计算图,这个图真棒:
深度学习常见主流经典算法概述(二)(CNN的本质,以LeNet为例)_第2张图片,也可以见CNN计算
深度学习常见主流经典算法概述(二)(CNN的本质,以LeNet为例)_第3张图片
如何训练?用SGD,adam,adamgrad都可以,这个去看深度学习那本书或者谷歌。这个学过机器学习的人怕是不陌生。
现在博客都写的这么形象了,哈哈:里面博客也有池化的运算教程:所以卷积就是一种模板运算,池化就相当于滤波。这个下面再讲
为什么我们把卷积过后的层叫做特征图(feature map)呢?,很多人只是理解个大概,觉得CNN是个黑箱模型,其实不是,以往我们进行机器学习的时候要人工构造特征,但是CNN可以自动筛选特征,对于多个带标签的图片,比如狗狗,训练过后神经网络会倾向于在有用的特征处设置更高的权重,比如这个狗
深度学习常见主流经典算法概述(二)(CNN的本质,以LeNet为例)_第4张图片
CNN会在鼻子这块有更高的叠加权重,估能提取出鼻子。还比如耳朵
在这里插入图片描述在这里插入图片描述
下一层会在此基础上进行提取,比如在鼻子上更细节的一些东西,故CNN的训练的原理就是把一张图片提取成无数个细节,然后新的图片进来做判别的时候就是检测各个特征与真实特征的符合程度决定是不是狗,还是猫。

卷积的作用是提取更细节的特征,那么池化呢,减少特征的噪声让特征更纯净,但是容易丢失数据,为什么这样呢,因为权更新的原因,会产生一些权值非常大的噪点,这是因为SGD产生的,如果只有卷积的话,随着层数增加,特征提取会越来越不纯净,就造成了过拟合,泛化能力会减弱,但是池化核太大也不行,这样无法提取特征,但是我们可以在多次池化后,进行纯卷积,或者用resnet筛选,或者inception,或者一些其他的办法,这个之后讲。所以LeNet如图

现在我们来讲重点:如何用LeNet来进行手写字体识别
深度学习常见主流经典算法概述(二)(CNN的本质,以LeNet为例)_第5张图片
先记住我说的,卷积就是从各个特征中提取共性
第一层卷积是得到了3的轮廓,为什么?我们用计算机图形学来解释,为了得到轮廓,我们可以进行canny算子检测,那把canny算子稍微变一下,然后RGB图是不是在边缘处梯度都会出现突变?那是不是累加后就得到各种各样的轮廓?即使上面6张,然后进行池化,于是轮廓更加纯净,那么再卷积得到的是3的部分组成部分,为什么?,假如我们用全一的模板去对轮廓进行运算,轮廓就会扩张,当然我们还可以用模板运算让像素变负了扩张,最后因为CNN是多个通道的模板和,就会导致一些地方被屏蔽,一些地方被加强了,这里解释一下:
比如输入是7-7-3(3通道),那卷积核个数必须为通道的倍数,即3的倍数,故每个卷积核组就有相当于通道个数的卷积核,每个卷积核组用于提取一种特征。因为是每个通道乘相应卷积核相加。
所以如果是检测人脸发现把人脸轮廓扩张后,多张轮廓图的鼻子部分像素很密集,于是我们就提取出了鼻子。所以卷积核的大小是做什么的?是不是当周围像素点之间条件依赖比较大的时候,我们希望有大的卷积核,反之则用小核,步长也一样,如果周围相关性大就小步长,否则大步长,x方向和y方向是一个道理,zero padding是为什么,是为了计算图像边界的信息,还不是因为图像邻近像素条件依赖太强了。事实上,我们发现,在刚输入第一次卷积的时候,这种依赖并不强(2*2核都可以),后面卷积依赖会增强,但并是说就要用大核了。卷积核太大容易过拟合,卷积核太小又不能很好提取特征。那关键是什么,是不是要计算其协方差矩阵来决定网络结构?总之,越大越短(步长)越细节,越小越长越粗犷。如何改网络结构后面再讲。
在第二层卷积我们得到了3的部分组成部分,然后我肯定是要判别,测试输入的3满足我哪些部分,比如我有20个部分,它满足18个,我是不是就可以判定它是3?那为什么是FC?也可以不用呀,为什么我在识别的时候不直接用3层FC直接解决?,我们说过,当神经元足够多的时候,带relu激活函数的浅层网络能近似任意函数,而深层网络的参数量要比浅层少,那为什么不直接FC?是不是因为无法避免的local minimum和saddle point啊?之前一直没人解决这个问题,但是人们慢慢发现,先对图像进行特征运算,再FC效果会好很多,而因为我之前说的局部性原理,有了CNN,结果很神奇,CNN效果比单纯FC好太多,然后人们查看其卷积后的细节后才知道,CNN能自动提取特征!,多么神奇啊,然后人们慢慢知道,CNN之所以好一些数学原理(比如局部性等)是一方面,另一方面是因为他是先提取特征在进行神经网络运算的。这也符合人类先验,于是改造网络的工作渐渐变成了如何让CNN更好的提取特征,比如我可以基于人类已有算法进行引导,比如canny。然后还可以通过结构的改进让特征更加具象化,这都是符合人类先验的,但人类先验不一定是最正确的。机器的目的是超过人类,而不是近似人类,于是我们通过数学的方法去改进网络,当然,也有结合一些自然界的先验,毕竟几亿年来的自然选择肯定有它好的地方。这里先说数学上,比方说,我要做一个19层的卷积,我发现直接用前12层的时候,准确率是一直上升的,但加上第13层的时候他的准确率居然下降了,那肯定是第13层特征构造的不好,那肯定要改进,比如加上第11层的监督,比如inception,总之要让层有所值,那这里resnet可以理解为一个万金油,在具体细节上,比如选择什么核,是要结合输出及各像素进行相关性分析得出的,而不是随便弄。也可以选择统计输出分布的方法,让输出收敛。这里举个近年来的例子,比如2D人脸识别,人们通过构造特征的方式(比如canny,你也可以把第一层卷积核初始化为canny这样,又比如关键点提取),给数据集加上噪声,对数据集进行筛选,进行逆滤波复原,图像增强,先进行人脸定位等,并且也改进了网络结构,结果让人脸识别在测试集正确率达到了99%以上(详见kaggle各大kernel),这往往意味着泛化能力很好,但现实情况却不是这样,因为我们永远不能低估现实环境的复杂性和人类的创造力。所以2D人脸识别全跪了,所以苹果用的是3D-TOF识别,这种能提取人脸的3D结构,在现实情况也能达到商用级别。唯一缺憾是会让手机比较丑。
最后softmax是让输出更平滑,可以再减去个max防止计算机溢出。
所以CNN的本质就是把之前人们手动选择模板提取特征变成了自动模式,可能机器也认为先提取特征会更好吧,哈哈,不要笑,这个是有人证明的。

你可能感兴趣的