卷积神经网络(Convolutional Neural Network)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
概述
CNN具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
卷积神经网络默认输入是图像,可以让我们把特定的性质编码入网络结构,使我们的前馈函数更加有效率,并减少了大量参数。
人工神经网络
神经元
神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。
激活过程就像神经传输一样,一个激活然后传下去,每个神经元如下:

可以看出,这是 基本wx + b的形式,具体某个参数的含义也很明显了,其中b为偏置bias,可以理解成为更好达到目标而做调整的偏置项。。
举个例子:参照感知器。
激活函数
常用的非线性激活函数有sigmoid、tanh、relu等等,sigmoid函数我们前面介绍过了,但是把值域限制在0,1区间有什么好处呢?就是更好的分类。这里我们可以感受到偏置的作用:

神经网络
将多个神经元组织在一起就成了神经网络了,下面是一个简单的三层神经网络:

从左至右分别为输入层(输入向量)、隐藏层(是输入层和输出层之间众多神经元和链接组成的各个层面,含有激活函数)、输出层(输出向量)。
同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。
下面是张量形式的一种表现,偏置项:x0、a0:

层次结构
下面是cs231中给出的层次结构的例子:

- 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
然后是中间:
- CONV:卷积计算层,线性乘积求和。
- RELU:激活函数的一种。
- POOL:池化层,简言之,即取区域平均或最大。
最右边是全连接层。
你应该能想到卷积计算层是CNN的核心。
卷积计算层
卷积:对图像(不同的数据窗口数据)和滤波矩阵(因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
下面Z的形成便是非严格意义上用了滤波器
总之是每个神经元的权重问题
图像上的卷积
左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。
我们很自然的想到,在滤波的过程中有下面几个参数:
a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
b. 步长stride:决定滑动多少步可以到边缘。 c. 填充值zero-padding:在外围边缘补充若干圈0,使能滑倒末尾
下面是一个例子:

左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
中间部分是两个不同的滤波器
最右边则是两个不同的输出
我们可以看到,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制,因为一下子接受不了那么多信息,但是局部也是有侧重的,比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。
与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。
- 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。
激励层
上次我们介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化,我们可以尝试ReLU。
ReLU的优点是收敛快,求梯度简单。
池化pool层
前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n),很好理解。

参考资料: