1. 概念
英文名:convolutional neural network
是一种前馈神经网络,即表明没有环路,普通神经网络的 BP 算法只是用于方便计算梯度,也是前馈神经网络。
是深度学习结构的一种,是一种深度、前馈神经网络。
可以使用 BP 算法进行训练
ConvNet architectures make the explicit assumption that the inputs are images, which allows us to encode certain properties into the architecture
卷积神经网络的前提:输入是二维结构或者三维结构,但起比较大作用的是空间维度(spacial),深度那一维并没有太明显的作用。
1.1 空间维度 spacial
是宽和高,不包含深度
1.2 什么是卷积
https://www.zhihu.com/question/22298352
这条知乎解释得非常清楚!
卷积的离散和连续解释,其实就是求和符号和积分符号换一下而已
CNN 中卷积的体现在于,在神经元的感受野里的输入和权重滤波器做点积,然后权重滤波器对整个输入在空间维度上一边移动一边做点积,然后求和,所以跟一般的卷积是在时间上移动不同的是,这里是在空间上移动。
这是二维离散卷积的表达方式,因为权重滤波器是在空间上移动,空间上是有高和宽两个维度的
1.3 滤波器和输出数据体
滤波器是权重滤波器,是待学习的参数
输出数据体才是卷积层神经元
不同的滤波器的权重不同,表达的是对图片要素的关注点不同,比如说如果某个滤波器对红色敏感,即对于红色的像素点会有正向输出,那么扫描一张大部分是红色的图片的时候,该滤波器得到的 activation map 会有大面积的正向输出。所以说,滤波器是不同的特征提取器。
1.4 卷积层的输出
滤波器在输入数据体空间上移动,得到一张 activation map,多个滤波器(个数是超参数)都与输入数据体进行卷积,会得到多张在深度方向上堆叠在一起的 activation maps,然后呢,下一层的滤波器会把这些 activation maps 的结果相结合作为输入,而不是把一个滤波器在空间移动后的点积结果相加,因为滤波器在扫描完整个输入体之后,得到的是一张 activation map,而不是一个值哦!所谓卷积中移动求和的概念,应该是体现在把点积的结果汇聚成一张 activation map,这也算是求了个和吧!然后一个卷积层的输出就是多个 maps 在深度方向上的叠加。
一张 activation map 其实就是滤波器权重参数与小块输入的点积+偏置,然后组在一起!
activation map 其实是这样的:
如图所示:28×28 个神经元的输出,每个神经元都只看它的感受野的输入,每个神经元的权重和偏置相同。神经元的输出也是 wx+b
上面的图只说明了一张 activation map,其实多张 activation maps 就是深度方向上堆叠在一起的神经元的输出,只不过深度方向上的神经元不会共享权重和偏置,但深度方向上重叠的神经元的感受野是一样的。
1.5 图片的表达转换
原始图像假如是一个 32×32×3 的输入数据体,经过一层卷积层的输出(假设有 6 个 3×3×3 的滤波器 with pading1),则变成了一个 32326 的输出数据体,也就是说,图片的表达由原来的输入数据体来表达,变成了现在的输出数据体来表达。
1.6 参数的个数
每一个卷积层的参数个数是(滤波器的感受野×输入深度+1)×滤波器个数,比如滤波器的感受野是 3×3×3,个数是 6,则这一层卷积层的参数个数是(9+1)×6=60 个,其中加的那个 1 是偏置,也就是说一个输出数据体的整个深度切片上的神经元共享同一个权重向量,和同一个偏置,不同的深度切片的权重和偏置不同
1.7 卷积层总结
卷积层接受 W1×H1×D1 的输入数据体(width, height, depth)
卷积层输出 W2×H2×D2 的输出数据体
需要 4 个超参数:K\F\S\P
K 代表滤波器个数,F 是神经元视野即滤波器大小,S 是 stride 步长,P 是 padding
根据超参数,可以由输入数据体的大小,计算出输出数据体的大小
W2=(W1-F+2P)/S+1
H2=(H1-F+2P)/S+1
D2=K
因为参数共享,因此总共有 F.F.D1.K 个权重和 K 个偏置参数
1.8 补充
sc231n 视频中补充了一些可以进行卷积层计算的 API,其中提到一些计算框架
Torch 是一个科学计算框架,内置大量的机器学习算法,GPU first 特性。LuaJIT 语言接口,底层是 C/CUDA 实现。Torch – provides a Matlab-like environment for state-of-the-art machine learning algorithms in lua (from Ronan Collobert, Clement Farabet and Koray Kavukcuoglu)
Caffe 是一个深度学习框架,Caffe -Caffe is a deep learning framework made with expression, speed, and modularity in mind
Lasagne 是 Theano 中的一个轻量级的库,用于建立和训练神经网络
Theano – CPU/GPU symbolic expression compiler in python (from MILA lab at University of Montreal)。Theano is a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently
2. 池化层 pooling layer
max pooling 和 average pooling 是两种常见的方法
输入的数据体是 W1×H1×D1,输出数据体是 W2×H2×D2
超参数有两个 F/S,F 是 spacial extent,S 是 stride 即步长
W2=(W1-F)/S+1
H2=(H1-F)/S+1
D2=D1
没有参数,因为 pooling layer 计算的是 a fixed function of the input
对 pooling layers,不常用 zero padding
3. full connecting layer
最后是一个 spacial size 减少,但深度依然是滤波器个数的全连接层,这一层的数据体会全部和输出进行全连接
4. ReLU 层
无论是教学视频还是学习资料里都提到了 ReLU 层,这其实让人难以理解,至少给我带来了困扰,因为 ReLU 只不过是一种神经元激活函数而已,后来经过和大家的讨论,得出的结论是:其实就是卷积层的神经元的激活函数是 ReLU 函数而已,即 f(W×X+b) 中的 f,其中 W 和 X 之间是卷积而不是传统 MLP 中的点积。
5. case study
AlexNet -> ZFNet -> VGGNet -> GoogLeNet -> ResNet
6. 趋势
目前的趋势是使用更小的 filter 和更深的结构
另外一个趋势是抛弃 pooling 和 FC 层,只留下 CONV 层
7. 讨论
根据另一个同学的学习结论,CNN 不但可以运用于图像,还可以运用于 NLP 即自然语言处理,不过在卷积层的参数设置,以及池化层的参数设置上有些不同,如下图所示。这是对自然语言语句进行二分类的 CNN 结构图,论文是《ASensitiveAnalysisOfCNNForSentenceClassification》。
①滤波器的空间视野,宽度需要与词向量的长度一致,高度可以自由调节,由高度的不同形成多个卷积层,同样的高度下可以由滤波器个数这个超参数形成多个 activation maps
②图中的步长为 1,因此绿色的高度为 3 的滤波器得到的 activation map 的高度就为 5,黄色的高度为 2 的滤波器得到的 activation map 的高度就为 6,这里的图像可以认为是侧面视角,宽度与滤波器宽度一致,看不到而已。
③池化层是 1-max pooling,即整张 activation map 中只选择一个最大值!因此从 6 张 activation map 中就产生了一个一元的特征向量
④最后的 softmax 层就是把这个一元的特征向量作为输入,用来得到句子的类别
除了这些参数外,论文中还提出了一些有趣的结论,这里不一一列举,具体看论文:
①滤波器的视野(高度)选择,最好选择效果最好值的紧邻值,比如说 7 效果最好,那么就没有必要尝试 2,应该尝试 6 和 8 作为下一个卷积层的视野高度