CS231n简介
详见 CS231n课程笔记1:Introduction。
注:斜体字用于注明作者自己的思考,正确性未经过验证,欢迎指教。
课程笔记
因为卷积神经网络这个部分涉及繁多,也有不少无法用语言详细解释的细节,所以迟迟没有动笔。这次刚好帮老师做了这部分的PPT,就直接把PPT的部分转化过来,也保留了PPT的逻辑,只能说简单介绍了卷积神经网络,详细的部分会在以后的课程笔记中陆续的补充。
以下内容包括CNN的生物学基础、CNN的历史、CNN的结构元件(卷积层、激活层、池化层、全连接层、损失函数)、CNN的结构、CNN优于全连接前向网络的原因。
1. CNN的生物学基础
Hubel&Wisel在1960年左右做的一系列关于猫的视觉神经元的研究,有以下三个主要成果:
猫的大脑中第一层的视觉神经元(V1),只处理局部视觉中的简单基础结构信息(如某一方向的直线、点),且一类神经元只对一种特定的基础结构做出反应。(对应于CNN中的感受野和权值共享)
而且V1神经元是会保留拓扑结构信息的,即相邻的神经元的感受野在图像中也相邻。(对应于中的滑动窗口)
视觉神经元是有层次的,高层神经元处理更加复杂的特征(对应于CNN的层次化结构和降采样)。
2. CNN的历史
CNN的核心观点早在1980就被提出了,这么多年也经历了几次的起起伏伏。
最早提出并使用CNN的核心思想的是Fukushima在1980提出的Neurocognitron。这里面首次提出并使用了“三明治” 结构、局部感受野、池化层等思想。
而CNN在工业界的著名应用则是Lecun在1998年提出的LeNet-5,这个网络可以很好地识别手写数字,甚至可以识别手写字母。
之后的一段时间整个深度学习都进入低谷,因为其难以训练收敛,当时的计算能力和数据量都不足。到了2012年,AlexNet在ImageNet数据集上打败了当时所有的传统图像处理方法,并且一下子将准确率提高了很多,从而又大放异彩。AlexNet和LeNet并没有太多技术上的差别,更多的是因为计算能力有了很大的提高,可以使用GPU加速,而且数据量也提高了几个数量级。
3. CNN的结构元件
卷积神经网络的经典结构是层次化的,每层都是以下结构元件的一种。最近的GoogLeNet和ResNet打破了层次化的经典结构,但是也是几种结构元件的复杂组合。
结构元件包括:卷积层、池化层、激活层、全连接层、损失函数,如下图:
3.1. 卷积层
卷积层的python简单实现代码请参考CS231n作业笔记2.6:卷积层以及池化层的实现。
卷积层的输出由输入和滤波器组唯一确定,即
O=convolution(I,filters)
;其中输入和每个滤波器都唯一确定输出的一个通道(特征图, feature map),即
O={convolution(I,filter),for filter in filters}
。
输入
I
的形状是
滤波器组
filters
是
C2
个滤波器
filter
的集合。
滤波器的形状是
F∗F∗{C}
,附有参数
bias,P,S
,其中
F
是局部感受野的边长,
输出由输入和滤波器组唯一确定,其形状是
H′∗W′∗C2
,其中
H′=(H−F+2∗P)/S+1
,
W′=(W−F+2∗P)/S+1
,
C2=C2
。
卷积操作的部分可以把滤波器想象成窗口(形状是
F∗F∗{C}
),一次卷积操作是窗口内部的输入与滤波器的卷积(乘积的和)加上
bias
,窗口按照给定的步长
S
在输入上滑动,每次都进行一次卷积操作,即可得到输出的一个通道(特征图)。
卷积层共有
下图给出了
H=W=5,C1=1,C2=1,F=3,{C}=1,bias=0,S=1,P=0
情况下的例子。
下面又给出了
H=5
,
W=5
,
C1=3
,
C2=2
,
F=3
,
S=2
,
P=1
的例子:
3.2. 激活层
就是普通常见的激活函数作用于每个神经节点,即
O=f(I)
,其中输出
O
由激活函数
3.3. 池化层
池化层的python简单实现代码请参考CS231n作业笔记2.6:卷积层以及池化层的实现。
池化层和卷积层很类似,只不过每次窗口内部的操作不再是乘积的和,而变成了取最大值(最大池化层)、取均值(均值池化层)等操作。池化层只有超参数,没有参数,往往用于降采样。
其具有的超参数有
3.4. 全连接层
常见的前向传播网络,每个神经网络节点与前一层的所有节点连接。全连接层可以看做 F=H=W , P=0 的卷积层。大型网络中常用均值池化层替代全连接层,从而减少参数个数,防止过拟合。
3.5. 损失函数
常见的有交叉熵,hinge, 平均平方误差等。
4. CNN的结构
4.1. CNN的典型结构
常见的CNN结构范式是:
[(CONV−RELU)∗N−POOL?]∗M−(FC−RELU)∗K,SOFTMAX
,简单的说就是:
1. 每层卷积层之后都接激活层
2. 若干层卷积层之后接池化层
3. 最后使用全连接层+损失函数
LeNet, AlexNet, VGGNet都符合这一范式。
4.2. GoogLeNet
用Inception模块融合了卷积层和池化层,使得输出同时具有多个尺度的信息,也使用了BottleNeck的trick。
4.3. ResNet(151层)
其加入短路使得梯度可以有效传播,从而加深网络结构。Bottleneck使得卷积层用更少的参数得到相同感受野上的更多的非线性能力。
5. CNN VS 全连接前向网络
除却最近对于CNN的多种发展,CNN相对于全连接前向网络的三个主要特色如下:
1. 局部感受野
它保留了图像的拓扑结构,并且可以提取图像的基础特征。
2. 权值共享
2.1. 权值共享有效的减少了可训练参数,防止过拟合。
2.2. 因为滤波器被用于图像的所有位置,使得滤波器更能学习到适用于图像的所有位置的基础特征,得到平移、扭曲不变性。
3. 降采样
降采样有效的减少了具体位置信息,得到具有代表性的层次化特征,减少具体位置对于最终结果的影响,从而得到平移、扭曲不变性。
以上部分主要参考Lecun1998年的论文,详情请参考LeNet论文阅读:CNN设计原理, LeNet论文阅读:LeNet结构以及参数个数计算。
6. 参考资料
- Hubel, David H., and Torsten N. Wiesel. “Receptive fields, binocular interaction and functional architecture in the cat’s visual cortex.” The Journal of physiology 160.1 (1962): 106-154.
- Hubel, David H., and Torsten N. Wiesel. “Receptive fields of single neurones in the cat’s striate cortex.” The Journal of physiology 148.3 (1959): 574-591.
- Fukushima, Kunihiko, and Sei Miyake. “Neocognitron: A self-organizing neural network model for a mechanism of visual pattern recognition.” Competition and cooperation in neural nets. Springer Berlin Heidelberg, 1982. 267-285.
- LeCun, Yann, et al. “Gradient-based learning applied to document recognition.” Proceedings of the IEEE 86.11 (1998): 2278-2324.
- Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. “Imagenet classification with deep convolutional neural networks.” Advances in neural information processing systems. 2012.
- UNDERSTANDING CONVOLUTIONAL NEURAL NETWORKS FOR NLP
- CS231n: Convolutional Neural Networks for Visual Recognition
- Szegedy, Christian, et al. “Going deeper with convolutions.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.
- He, Kaiming, et al. “Deep residual learning for image recognition.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
- CS231n作业笔记2.6:卷积层以及池化层的实现
- LeNet论文阅读:CNN设计原理
- LeNet论文阅读:LeNet结构以及参数个数计算