1 前言
卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)
2 人工神经网络
2.1 神经元
神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。
举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。
神经网络的每个神经元如下
基本wx + b的形式,其中
、
表示输入向量
、
为权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重
- b为偏置bias
- g(z) 为激活函数
- a 为输出
如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,上述简单模型可以追溯到20世纪50/60年代的感知器,可以把感知器理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。
举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素可以对应二个输入,分别用x1、x2表示。此外,这二个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:
:是否有喜欢的演唱嘉宾。
= 1 你喜欢这些嘉宾,
= 0 你不喜欢这些嘉宾。嘉宾因素的权重
= 7
:是否有人陪你同去。
= 1 有人陪你同去,
= 0 没人陪你同去。是否有人陪同的权重
= 3。
![](https://i-blog.csdnimg.cn/blog_migrate/7bb8877593afb42073c13c36648754a8.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/8e70705d122f4bb38b40174ad7bccb9f.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/d0a7ea337b10a0be223c04fb4210c67a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7f9bce9f2d35bdf5830116558d0723b2.gif)
2.2 激活函数
常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。
sigmoid的函数表达式如下
其中z是一个线性组合,比如z可以等于:b + *
+
*
。通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1。
因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):
也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0。
压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。
举个例子,如下图(图引自Stanford机器学习公开课)
z = b + *
+
*
,其中b为偏置项 假定取-30,
、
都取为20
- 如果
= 0
= 0,则z = -30,g(z) = 1/( 1 + e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0
- 如果
= 0
= 1,或
=1
= 0,则z = b +
*
+
*
= -30 + 20 = -10,同样,g(z)的值趋近于0
- 如果
= 1
= 1,则z = b +
*
+
*
= -30 + 20*1 + 20*1 = 10,此时,g(z)趋近于1。
换言之,只有和
都取1的时候,g(z)→1,判定为正样本;
或
取0的时候,g(z)→0,判定为负样本,如此达到分类的目的。
激活函数应该具有的性质:
(1)非线性。线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。。
(2)连续可微。梯度下降法的要求。
(3)范围最好不饱和,当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。
(4)单调性,当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。
(5)在原点处近似线性,这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。
目前常用的激活函数都只拥有上述性质的部分,没有一个拥有全部的~~
Sigmoid函数
![](https://i-blog.csdnimg.cn/blog_migrate/4e895515e1986d867a420636c0df2cc1.png)
目前已被淘汰
缺点:
∙ 饱和时梯度值非常小。由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。
∙ 输出值不是以0为中心值。
ReLU函数
Alex在2012年提出的一种新的激活函数。该函数的提出很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题
优点:
∙ x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
∙ 增大了网络的稀疏性。当x<0 时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就约具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好
∙ 运算量很小;
缺点:
如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。
由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要tradeoff。Leaky ReLU函数
改善了ReLU的死亡特性,但是也同时损失了一部分稀疏性,且增加了一个超参数,目前来说其好处不太明确Maxout函数
泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同样损失了部分稀疏性,每个非线性函数增加了两倍的参数
真实使用的时候最常用的还是ReLU函数,注意学习率的设置以及死亡节点所占的比例即可
2.3 神经网络
将下图的这种单个神经元
组织在一起,便形成了神经网络。下图便是一个三层神经网络结构
上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。
啥叫输入层、输出层、隐藏层呢?
- 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
- 输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
- 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。
同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2 a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。
上图(图引自Stanford机器学习公开课)中
表示第j层第i个单元的激活函数/神经元
表示从第j层映射到第j+1层的控制函数的权重矩阵
此外,上文中讲的都是一层隐藏层,但实际中也有多层隐藏层的,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。
3 卷积神经网络之层级结构
cs231n课程里给出了卷积神经网络各个层级结构,如下图
上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车
所以
- 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
中间是
- CONV:卷积计算层,线性乘积 求和。
- RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
- POOL:池化层,简言之,即取区域平均或最大。
最右边是
- FC:全连接层
4 CNN之卷积计算层
4.1 CNN怎么进行识别
![](https://i-blog.csdnimg.cn/blog_migrate/7885fa3dc57873981d20641bf0e8500f.png)
4.2 什么是卷积
![](https://i-blog.csdnimg.cn/blog_migrate/f624c7a28d56e39476eb4abc52632a0b.png)
对应位置上是数字先相乘后相加
=
![]()
4.3 图像上的卷积
如下图所示
4.4 GIF动态卷积图
a. 深度depth :神经元个数,决定输出的depth厚度。同时代表滤波器个数。
b. 步长stride :决定滑动多少步可以到边缘。
- 两个神经元,即depth=2,意味着有两个滤波器。
- 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
- zero-padding=1。
- 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
- 中间部分是两个不同的滤波器Filter w0、Filter w1
- 最右边则是两个不同的输出
随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。
值得一提的是:
- 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
- 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。
- 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。
我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。
首先,我们来分解下上述动图,如下图
接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1。
然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果
最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。
用它来进行特征提取,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f6e8c834e0e5bafc3c360d3c06891e17.png)
输入图像是32*32*3,3是它的深度(即R、G、B),卷积层是一个5*5*3的filter(感受野),这里注意:感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图;
5 CNN之激励层与池化层
5.1 ReLU激励层
2.2节介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下
ReLU的优点是收敛快,求梯度简单。
5.2 池化pool层
前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)同样地采用一个2*2的filter,max pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到。
上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。很简单不是?
对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,如下:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/09741ecb76ca904b26914dff85027d51.png)
(Avy pooling现在不怎么用了,方法是对每一个2*2的区域元素求和,再除以4,得到主要特征),而一般的filter取2*2,最大取3*3,stride取2,压缩为原来的1/4.
注意:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。
![](https://i-blog.csdnimg.cn/blog_migrate/4aca74f63f60f07a5b3584efa64bba57.gif)
在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
为什么可以通过降低维度呢?
因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。
一般池化(General Pooling)
池化作用于图像中不重合的区域(这与卷积操作不同),过程如下图。
我们定义池化窗口的大小为sizeX,即下图中红色正方形的边长,定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的,所以sizeX=stride。
最常见的池化操作为平均池化mean pooling和最大池化max pooling:
平均池化:计算图像区域的平均值作为该区域池化后的值。
最大池化:选图像区域的最大值作为该区域池化后的值。重叠池化(OverlappingPooling
重叠池化正如其名字所说的,相邻池化窗口之间会有重叠区域,此时sizeX>stride。
论文中Krizhevsky, I. Sutskever, andG. Hinton, “Imagenet classification with deep convolutional neural networks,”in NIPS,2012.中,作者使用了重叠池化,其他的设置都不变的情况下, top-1和top-5 的错误率分别减少了0.4% 和0.3%。
6 参考文献及推荐阅读
- 人工神经网络wikipedia
- 斯坦福机器学习公开课
- http://neuralnetworksanddeeplearning.com/
- 雨石 卷积神经网络:http://blog.csdn.net/stdcoutzyx/article/details/41596663
- cs231n 神经网络结构与神经元激励函数:http://cs231n.github.io/neural-networks-1/,中译版
- cs231n 卷积神经网络:http://cs231n.github.io/convolutional-networks/
- 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
- 七月在线5月深度学习班第5课CNN训练注意事项部分视频:https://www.julyedu.com/video/play/42/207
- 七月在线5月深度学习班:https://www.julyedu.com/course/getDetail/37
- 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:http://blog.csdn.net/joycewyj/article/details/51792477
- 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
- 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50100367
- 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:http://blog.csdn.net/han_xiaoyang/article/details/50447834
- 深度学习与计算机视觉系列(10)_细说卷积神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50542880
- zxy 图像卷积与滤波的一些知识点:http://blog.csdn.net/zouxy09/article/details/49080029
- zxy 深度学习CNN笔记:http://blog.csdn.net/zouxy09/article/details/8781543/
- http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/,中译版
- 《神经网络与深度学习》中文讲义:http://vdisk.weibo.com/s/A_pmE4iIPs9D
- ReLU与sigmoid/tanh的区别:https://www.zhihu.com/question/29021768
- CNN、RNN、DNN内部网络结构区别:https://www.zhihu.com/question/34681168
- 理解卷积:https://www.zhihu.com/question/22298352
- 神经网络与深度学习简史:1 感知机和BP算法、4 深度学习的伟大复兴
- 在线制作gif 动图:http://www.tuyitu.com/photoshop/gif.htm
- 支持向量机通俗导论(理解SVM的三层境界)
- CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象,甚赞。
参考:https://blog.csdn.net/v_july_v/article/details/51812459