卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。
经典神经网络的结构:
LeNet-5
AlexNet
上图为DNN神经网络图,DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,一般来说第一层是输出层,最后一层是输出层,而中间的层数都是隐藏层。
上图为CNN神经网络
【总结】
(1)DNN是一种最简单的神经网络。各个神经元分别属于不同的层,每个神经元和前一层的所有神经元相连接,信号从输入层向输出层单向传播。
(2)CNN是一种通过卷积计算的前馈神经网络,其是受生物学上的感受野机制提出的,具有平移不变性,使用卷积核,最大的应用了局部信息,保留了平面结构信息。
(3)DNN以向量形式输入,未考虑平面的结构信息,而在图像领域和自然语言处理领域,平面信息很重要,因此CNN比DNN处理结果更好。由于DNN、CNN的输入、输出长度固定,而自然语言处理中的语句长度通常不固定,所以DNN、CNN处理这种问题效率较低,且无法处理时序相关的序列问题.为了解决这些问题,出现了循环神经网络RNN。(RNN本文暂不讲解,后续文章会讲到)
1、输入层
在处理图像的CNN中,输入层一般代表了一张图片的像素矩阵。可以用三维矩阵代表一张图片。三维矩阵的长和宽代表了图像的大小,而三维矩阵的深度代表了图像的色彩通道。比如黑白图片的深度为1,而在RGB色彩模式下,图像的深度为3。
2、卷积层(Convolution Layer)
卷积层是CNN最重要的部分。它与传统全连接层不同,卷积层中每一个节点的输入只是上一层神经网络的一小块。卷积层被称为过滤器(filter)或者内核(kernel),Tensorflow的官方文档中称这个部分为过滤器(filter)。
【注意】在一个卷积层中,过滤器(filter)所处理的节点矩阵的长和宽都是由人工指定的,这个节点矩阵的尺寸也被称为过滤器尺寸。常用的尺寸有3x3或5x5,而过滤层处理的矩阵深度和当前处理的神经层网络节点矩阵的深度一致。
下图为卷积过程
3、池化层(Pooling Layer)
池化层不会改变三维矩阵的深度,但是它可以缩小矩阵的大小。通过池化层,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络参数的目的。使用池化层既可以加快计算速度也可以防止过拟合。池化层filter的计算不是节点的加权和,而是采用最大值或者平均值计算。使用最大值操作的池化层被称之为最大池化层(max pooling)(最大池化层是使用的最多的磁化层结构)。使用平均值操作的池化层被称之为平均池化层(mean pooling)。
下图分别表示不重叠的4个2x2区域的最大池化层(max pooling)、平均池化层(mean pooling)
4、全连接层
在经过多轮卷积层和池化层的处理之后,在CNN的最后一般会由1到2个全连接层来给出最后的分类结果。经过几轮卷积层和池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征。我们可以将卷积层和池化层看成自动图像特征提取的过程。在提取完成之后,仍然需要使用全连接层来完成分类任务。
5、Softmax层
通过Softmax层,可以得到当前样例属于不同种类的概率分布问题。
1、边缘检测示例
如下图所示,原图是一个6 * 6的矩阵,卷积核是一个3 * 3的矩阵,经过卷积后得到一个4 * 的矩阵。
2、更多边缘检测例子
垂直边缘检测不仅可以检测垂直方向的边缘,还可以区分该边是从亮到暗(正边)还是从暗到亮(负边)。
3、Padding(在边缘是否填充)
对于之前介绍的卷积方式,其存在两个缺陷:
一是当一个6 * 6的图像经过3 * 3的卷积核卷积后会变成一个4 * 4的图像,这使图像经过卷积后变小了;
二是原矩阵边缘处只被运算一次,而中心处会被运算多次,导致边缘处大部分信息被丢失了。
下图是两种卷积方式:
Valid卷积是令padding为0;
Same卷积是通过添加padding使卷积前和卷积后图像的大小相同(p=(f-1)/2)。
引入padding后维数的公式为n+2p-f+1。
4、卷积步长stride(filer每次移动的长度)
当步长为2时,每进行一次运算后都要向左或者下移动两个像素点,如下图。
有步长的情况下维数的计算公式:
n×n * f×f =(n+2p-f)/s+1 × (n+2p-f)/s+1
4、镜像操作(mirroring operation):
| 3 | 0 | 1 | | 2 | 8 | 1 |
| 1 | 5 | 8 | ========> | 7 | 5 | 0 |
| 2 | 7 | 2 | | 2 | 1 | 3 |
沿着对角线进行对称交换数值。
5、三维卷积
对三维图像进行卷积时,卷积核的通道数要与三维图像的通道数相等。当我们想对图像的多个边缘特征进行检测时,我们可以使用多个卷积核,这样卷积后生成图像的通道数为使用的卷积核的个数。
对于三维卷积具体运算的实例如下:如果使用的是下图3 * 3* 3的卷积核,则一共有27个参数,进行卷积运算时让数值与相应的参数相乘后求和,这就是最后4 * 4 * 1矩阵中的一个值。
6、池化层
下图是最大池化,在每个作用区域内选择值最大的一个放在输出的方格上。当输入有多层时,对每一层都采用相同的操作,这样输入和输出的层数是相同的。最大池化的功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大池化的输出里。最大池化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值,如果没有提取的这个特征,那么其最大值也是很小的。
7、Max pooling
8、average pooling
需要注意的是,池化过程中的参数都是静态的,不需要进行学习。并且,卷积过程中计算维数的公式也可以应用在池化过程中。池化层的主要作用是特征降维,提高模型的鲁棒性。
n_h[l] × n_w[l] × n_c[l]----> (n_h-f)/s+1 × (n_w-f)/s+1
9、为什么使用卷积
与只使用全连接层相比,卷积层有两个优势:参数共享和稀疏连接。这样可以有效减少参数的数量。
对于激活函数,主要作用是防止线性化,因为每次卷积的目的就是为了是每次的输出结果不同,不同越深的卷积层那么输出的特征图也更加明显,但是如果没有激活函数,那么多次的输出特征图都可以用一层卷积来代替,那么这就与深度学习的思想相违背,为了非线性而选择出来了不同的激活函数,每个激活函数的作用也不相同。
1.Sigmoid
sigmoid函数也称为Logistic函数,因为Sigmoid函数可以从Logistic回归(LR)中推理得到,也是LR模型指定的激活函数。具体推理参考:Datartisan:机器学习系列-广义线性模型
sigmod函数的取值范围在(0, 1)之间,可以将网络的输出映射在这一范围,方便分析。
Sigmoid公式及导数:
Sigmoid作为激活函数的特点:
优点:平滑、易于求导。
缺点:
激活函数计算量大(在正向传播和反向传播中都包含幂运算和除法);
反向传播求误差梯度时,求导涉及除法;
Sigmoid导数取值范围是[0, 0.25],由于神经网络反向传播时的“链式反应”,很容易就会出现梯度消失的情况。例如对于一个10层的网络, 根据[公式],第10层的误差相对第一层卷积的参数[公式]的梯度将是一个非常小的值,这就是所谓的“梯度消失”。
Sigmoid的输出不是0均值(即zero-centered);这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布。
2. tanh
tanh为双曲正切函数,其英文读作Hyperbolic Tangent。tanh和 sigmoid 相似,都属于饱和激活函数,区别在于输出值范围由 (0,1) 变为了 (-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。
tanh公式:
从第二个公式中,可以更加清晰看出tanh与sigmoid函数的关系(平移+拉伸)。
tanh作为激活函数的特点:
相比Sigmoid函数,
ReLU在x>0下,导数为常数1的特点:
导数为常数1的好处就是在“链式反应”中不会出现梯度消失,但梯度下降的强度就完全取决于权值的乘积,这样就可能会出现梯度爆炸问题。解决这类问题:一是控制权值,让它们在(0,1)范围内;二是做梯度裁剪,控制梯度下降强度,如ReLU(x)=min(6, max(0,x))
ReLU在x<0下,输出置为0的特点:
描述该特征前,需要明确深度学习的目标:深度学习是根据大批量样本数据,从错综复杂的数据关系中,找到关键信息(关键特征)。换句话说,就是把密集矩阵转化为稀疏矩阵,保留数据的关键信息,去除噪音,这样的模型就有了鲁棒性。ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征。
但是ReLU 强制将x<0部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用ReLU的网络,学习率不能设置太大。
ReLU作为激活函数的特点:
相比Sigmoid和tanh,ReLU摒弃了复杂的计算,提高了运算速度。
解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数,但要防范ReLU的梯度爆炸
容易得到更好的模型,但也要防止训练中出现模型‘Dead’情况。
4. Leaky ReLU, PReLU(Parametric Relu), RReLU(Random ReLU)
为了防止模型的‘Dead’情况,后人将x<0部分并没有直接置为0,而是给了一个很小的负数梯度值α。
Leaky ReLU中的[公式]为常数,一般设置 0.01。这个函数通常比 Relu 激活函数效果要好,但是效果不是很稳定,所以在实际中 Leaky ReLu 使用的并不多。
PRelu(参数化修正线性单元) 中的[公式]作为一个可学习的参数,会在训练的过程中进行更新。
RReLU(随机纠正线性单元)也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aji是从一个均匀的分布U(I,u)中随机抽取的数值。
ReLU及其变体图像: