CNN研究的历史
私以为,神经网络这一大类的算法,是仿生学与数学结合的一次突破,不管是最原始的神经网络还是现在非常常见各种变种,都是在参考人类大脑的某一工作原理的工作方式,并将其转化为数学模型的表达.
举个最简单的栗子,本文提到的卷积神经网络CNN, 里面有一个非常重要的概念叫做感受野,其来源是1968年的一篇研究猫与猴子视觉皮层的论文,生物学家将视觉皮层中对视野的小区域单独反应的神经元称为感受野,相邻细胞具有相似和重叠的感受野.
受这个概念的启发,在然后是1980年,神经感知机(neocognitron)的提出,标志了第一个初始的卷积神经网络的诞生,后续的二十多年,又经过多位研究人员的改进.在2005年有学者完成了GPU上的CNN实现.再往后,随着CPU与GPU算力的提升,更深层次的神经网络训练变成现实.
2012年是神经网络研究突飞猛进的一年,随着AlexNet在ImageNet竞赛中夺魁,并惊人的把错误率记录从26%降低到15%,CNN研究正式起飞了.当然,最初是lecun大佬用lenet识别手写数字,大佬今年也因为这些计算机视觉上的研究获图灵奖了.
未来某一天如果在人类神经系统的工作原理上有了真正的突破性进展, 那随之而来的应该也会是深度学习领域的一次重大进步, 或许到那个时候才是强人工智能的时代.
CNN的基本原理
前面我们提到过感受野,研究表明大脑中的一些个体神经元细胞只有在某个方位的边缘存在的情况下才会响应. 对应到视觉来说.人在识别物体时靠的是检测物体的一些边缘.
比如说,在白纸上画个最简单的人脸,人眼怎么知道这是个人脸?有两个圈代表眼镜,有一个圈代表鼻子,还有一个椭圆代表嘴,当然还有一个外部轮廓,就是大脸.
现在我们知道了图像识别的关键在于找某些特定的边缘,那么有什么办法可以使图像的边缘更为突出,比如说下面这两张图.
怎么做到的?就是卷积.
什么是卷积
它的物理意义大概可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果。[1]
我最初接触的卷积,是大学时信号与系统课程里的卷积公式以及概率论里根据联合概率密度函数求分布的公式,也就是:
图像对于计算机而言,其实是一个二维的数组,那么如何针对这个数组做卷积?下面这个图可以很直观地描述这个过程.
至于为何可以这样做,包含大量信号处理的知识,可以参考[1]文中的内容.
这张图包含了CNN最基本的原理与网络特点.
CNN的基本组成
CNN作为神经网络的一种,也同样由输入输出隐藏层三种组成,其中隐藏层包含卷积层,池化层,全连接层,激励层.下面逐一介绍各层.
输入层
这个可以略过把.卷积层
卷积层是CNN的核心,这一层的处理方式上文已经提到过了,不再赘述.卷积层的主要作用,在于提取更高层次特征,也就是我们之前提到过的加强边缘.不得不感叹一下,特征工程真的是很多机器学习任务中非常核心的步骤,而对于某些可以通用的特征提取方法,干脆就像CNN一样融入到模型的描述里.
在前馈过程中,通过滤波器对输入图像进行卷积,产生滤波器的二维激活图.
关于卷积层的结构,可以参考一个斯坦福的课程动态演示图.在这-
池化层
池化层又称为下采样层,作用是在保持尽可能多的信息的前提下减少数据量,效果相当于resize得到一张较为模糊的图片.最常见的max_pooling的做法是每四个邻域内的像素点取一个最大值.如下图
原本想在这里说一下tensorflow里的conv1d,conv2d的, 碍于还得讲解nhwc与nchw的区别等等问题,暂时先略过.
此外,在tf里有几个很重要的参数
其中stride表示步长,也就是每一步在各维度上前进的长度.padding为表示输入输出的大小是否一致,same表示一致,valid表示不同.
tf里有个坑, 曾经困扰了我一段时间,以下面代码为例
# 定义一个矩阵a,表示需要被卷积的矩阵。
a = np.array(np.arange(1, 1 + 12).reshape([1, 6, 2]), dtype=np.float32)
# 卷积核,此处卷积核的数目为1
kernel = np.array(np.arange(1, 1 + 4), dtype=np.float32).reshape([2, 2, 1])
# 进行conv1d卷积
conv1d = tf.nn.conv1d(a, kernel, 1, 'VALID')
# 得到运行结果如下
----kernel----
[[[ 1.]
[ 2.]]
[[ 3.]
[ 4.]]]
-------a------
[[[ 1. 2.]
[ 3. 4.]
[ 5. 6.]
[ 7. 8.]
[ 9. 10.]
[ 11. 12.]]]
----conv------
[[[ 30.]
[ 50.]
[ 70.]
[ 90.]
[ 110.]]]
这里的输入的tensor与卷积核的维度其实是不一致的,简单地想象一下,这两个应该没法做卷积运算,那背后的问题出在哪里?最初以为是nhwc的问题,特意去研究了Intel的文档,仍然没有找到结果.最终实在没有办法,查源代码,于是发现了在源码的方法注释里有这样一段.
仔细看一下,才能发现,其实input与filter的维度顺序是不一样的,才会出现之前的问题.
这里不太清楚源码的作者这样做的出发点是什么,有大佬能指出就最好了.
- 全连接层
全连接层是对卷积与池化层输出进行综合处理的层, 网络结构与普通的神经网络隐藏层一致. - 激励层
对池化层的输出使用激活函数,因此在池化层后需要跟一层激励,进行非线性映射,通常使用relu(因为收敛速度快,梯度计算也简单).这一层的首选当然是relu,次选是leaky relu或max out, 不要使用sigmoid. - 输出层
略过,一般接个softmax
CNN的特点
CNN的三个特点其实也来自于两种特殊的网络结构:卷积层,池化层.
- 局部感知
这里的其实说的是上文中提到的感受野的概念,因为图像中,像素点与远处像素点的关系并不大,所以局部感知能获取到一定的局部特征. - 权值共享
池化层的计算,如果针对每个区域需要单独计算感受野的权值,那么需要计算的参数数量可能是天文数字.所以,主要是基于计算复杂度的考虑,就有了权值共享这一设计. - 多卷积核
一种卷积核代表的是一种特征,为获得更多不同的特征集合,卷积层会有多个卷积核,生成不同的特征,这也是为什么卷积后的图片的高,每一个图片代表不同的特征。
CNN的架构演化
CNN的架构演化从1990s的Lenet开始,到21世纪初的沉寂,再到alexnet焕发第二春,开始大红大紫,主要得益于这些年来算力的提升.不得不提的就是lecun,以及NVIDIA的黄仁勋刀神,前者首创了使用cnn进行图像分类并在GPU上实现,后者极大地推动了显卡算力的提升. 也就是因为显卡的运算能力的提升,越来越多的深度CNN模型才能够运行起来.下面顺着每一年的ImageNet比赛简单提几个比较重要的模型.
-
lenet与alexnet
lenet是lecun提出的首次使用CNN进行手写识别的网络结构,并且奠定了后序CNN的基本结构,就是卷积池化全连接,
现在常用的lenet会在池化层后接一个激励层.
-
alexnet与ZF-net
Alexnet在2012年的ImageNet比赛中以超出第二名10.9%的优势夺冠,从此深度学习开始正式兴起.
相对于lenet,主要的改进在于
- 更深的网络
- 在池化层后使用relu激活
- dropout
- Local Responce Normalization:局部响应归一
zfnet是2013年的ImageNet冠军,结构与Alexnet基本一致,主要的工作在于....调参.
- VGG-Nets
该网络是2014年定位任务的冠军,其实也是在AlexNet的基础上做的改进,因为前一年已经有人调参改了,所以这一年...他们把网络结构加深了, 研究人员真是鸡贼.当然为了训练在当时看来非常深度的网络,他们也在这里提出了预训练的方法,也就是先训练一部分的网络,等这部分稳定之后再训练后面的网络.
至于2014年分类任务的冠军,则是GoogleNet, 该网络在加深层数的同时也做了层的创新,引入Inception结构代替了单纯的卷积+激活的传统操作,并且后面的全连接层全部替换为简单的全局平均pooling.
- ResNet
这个网络是2015年由何恺明推出的,层数已经由GoogleNet的22层,提升到100多层, 还在网络结构上做了很大的创新,引入了残差单元来解决退化问题. - DenseNet
自Resnet提出以后,ResNet的变种网络层出不穷,都各有其特点,网络性能也有一定的提升。本文介绍的最后一个网络是CVPR 2017最佳论文DenseNet,论文中提出的DenseNet(Dense Convolutional Network)主要还是和ResNet及Inception网络做对比,思想上有借鉴,但却是全新的结构,网络结构并不复杂,却非常有效,在CIFAR指标上全面超越ResNet
可以看出,随着网络层数的增长,近年来的网络结构的优化也主要针对于梯度消失等问题进行改进.
在NLP中的应用
NLP任务的输入并非像素点,但是经过词嵌入之后,词可以变成固定维度的向量,句子则可以变成矩阵,这个矩阵也就可以看成一个图像,作为CNN的输入.私以为从特征提取上来说,图像分类与文本分类也有相似之处,图像分类着重于提取组合的边缘特征, 而文本分类任务中,词的组合也具有非常重要的意义,所以使用CNN进行处理文本分类任务也具有可行性.
近年来比较有名的论文如下(摘自知乎):
我个人接触比较多的是这一篇, 平时工作中使用的也是基于该论文的改进.后序再补充论文的阅读笔记.
参考文献
[1]蒋竺波.CNN 入门讲解:什么是卷积(Convolution)[EB/OL].https://zhuanlan.zhihu.com/p/30994790,2018-04-20.
[2]Madcola.CNN网络架构演进:从LeNet到DenseNet[EB/OL].https://www.cnblogs.com/skyfsm/p/8451834.html,2018-02-17.
[3]jeyzhang.卷积神经网络(CNN)在句子建模上的应用[EB/OL].http://www.jeyzhang.com/cnn-apply-on-modelling-sentence.html,2016-03-11.