NO 2 卷积神经网络

卷积神经网络,Convolutional Neural Network,简称CNN。
主要知识点:
1)CNN的主要思想
2)CNN的前向传导算法
3)CNN的实现与可视化,从略

一、CNN的主要思想
CNN的主要思想概括为两点:局部连接(Sparse Connectivity)和权值共享(Shared Weights)
卷积神经网络(CNN)是神经网络(NN)的一种拓展。
CNN与NN的不同之处主要在以下两点:
1)接收的输入形式不同
2)层与层之间的连接方式不同

1、接收输入的方式
当输入是图像时,NN的处理方式是将图像拉直成一个列向量。
如3X3X3的图像会被拉直成一个27X1的列向量,然后再把他们合并,转置成一个NX27的大矩阵以当做输入。
CNN会直接以原始的数据作为输入。即CNN接收的是NX3X3X3的矩阵

NN在处理输入时是全连接的,亦即采用的是全局感受野,所以输入的所有信息都会直接输入给下一层的某个神经元。
CNN在处理输入时是局部连接、权值共享的,亦即采用的是局部视野,做法是给拆分后的每个“频道”分配一个共享的“局部视野”,并称之为一个Kernel或一个Filter。
总结NN和CNN的异同如下:
1)NN和CNN的主要结构都是层,但是NN的层结构是一维的,CNN的层结构是高维的;
2)NN处理的一般是“线性”的数据,CNN则从直观上更适合处理“结构性”的数据;
3)NN层结构间会有权值矩阵作为连接的桥梁,CNN则没有权值矩阵,取而代之的是层结构本身的局部视野。
该局部视野会在前向传导算法中与层结构进行卷积运算来得到结果,并会直接将这个结果(或将被激活函数作用后的结果)传给下一层。
因此,常称NN中的层结构为“普通层”,称CNN中拥有局部视野的层结构为“卷积层”。
实现卷积常用的解决方案:
*将卷积步骤变换成比较大规模的矩阵相乘
*利用快速傅里叶变换(Fast Fourier Transform,FFT)
具体叙述从略…
下面介绍CNN中两个特殊的概念:Stride和Padding
Stride可以翻译成“步长”,它描述了局部视野在频道上的“浏览速度”。Channel:频道,Kernel:局部视野,Stride:步长
Padding可以翻译成“填充”,它的存在能保持输入和输出的频道形状一致。
如果没有Padding,输入频道在被卷积之后,输出的频道都会“缩小”一点。经过相当有限的卷积操作后,输入就会变得过小而不适合再进行卷积,从而就会大大限制了整个网络结构的深度。
Padding会在输入频道进行卷积之前,先在频道的“周围”填充上若干圈的“0”,以保持输出的频道形状和输入的一致。

2、层与层之间的连接方式全连接层
全连接层常简称为FC,它是出现在CNN中的一个特殊的结构。
FC是连接卷积层和普通层的普通层,它将从父层(卷积层)那里得到的高维数据铺平以作为输入,进行一些非线性变换(用激活函数作用),然后将结果输进跟在它后面的各个普通层构成的系统中。
有了FC之后,可以将CNN拆分成两块结构:
1)自输入开始、至FC终止的“卷积块”,组成卷积块的都是卷积层;
2)自FC开始、至输出终止的“NN块”,组成NN块的都是普通层。
在许多常见的网络结构中,NN块里都只含有FC这个普通层。
卷积块被称为“特征提取器”,NN块被称为“决策分类器”,
将卷积块中的基本单元–局部视野,类比为人类的眼睛,将外界信息翻译成神经信号的工具,它能将接收的输入中的各个特征提取出来。
将NN块类比我们的神经网络(或者大脑),它能利用卷积块得到的信号(特征)来做出相应的决策。
CNN的强大之处就在于其卷积块强大的特征提取能力在,NN可以视为分类的一个附属品而已。

下面介绍另一个NN中完全没有的—池化(Pooling)
池化Pooling的本质是对局部信息的总结。常见的池化有两种:
1)极大池化(Max Pooling),它会输出接收到的所有输入中的最大值;
2)平均池化(Average Pooling),它会输出接收到的所有输入的均值。
池化过程与卷积过程类似,可以看成是局部视野对输入信息的转换。卷积做的是卷积运算,池化做的是极大或平均运算。
一般而言,池化的Stride会比卷积的Stride要大,以期将得到的信息进行某种“压缩处理”。

下面介绍NN留下的SubLayer,常见的两种:Dropout和Normalize
Dropout的核心思想在于提高模型的泛化能力:它会在每次迭代中依概率去掉对应Layer的某些神经元,从而每次迭代中训练的都是一个小的神经网络。
一般取drop_probt=50%,对其进行说明:
1)在训练过程中,由于Dropout后留下来的神经元可以理解为“在50%死亡概率下幸存”的神经元,所以将它们对应的输出进行“增幅”是合理的。
假设一个神经元的输出本来是o,如果它是被Dropout后留下来的,其输出应该变成o*1/drop_prob=2o。
换言之,应该让带Dropout的期望输出和原输出一致。
2)由于在训练时我们保证了神经网络的期望输出不变,所以在预测过程中我们还是应该让整个网络一起进行预测,而不进行Dropout。
Normalize的特殊层结构的学名叫Batch(分批) Normalization,常简称BN,顾名思义,它用于对每个Batch对应的数据进行规范化处理。
对于NN,CNN乃至任何机器学习分类器来说,其目的可以说都是从训练样本集中学出样本在样本空间中的分布,从而可以用这个分布来预测未知数据所属的类别。
如果不对每个Batch进行BN处理的话,各个Batch彼此对应的“极大似然分布(极大似然估计意义下的分布)”是各不相同的(因为训练集只是样本空间中的一个小抽样,而Batch又是训练集的一个小抽样)。
传统的做法是对输入X进行归一化处理(即标准化)。这种做法虽然能保证输入数据的质量,但是却无法保证NN里面中间层输出数据的质量。
BN打算解决的正是随着前向传导算法的推进,得到的数据的质量会不断变差的问题,它能通过对中间层数据进行某种规范化处理以达到类似对输入归一化处理的效果。
首先需要指出的是,简单地将每层得到的数据进行上述归一化操作显然是不可行的,因为这样会破坏掉每层自身学到的数据特征。
为了使得中心化之后不破坏Layer本身学到的特征,BN采取了一个简单却十分有效的方法:引入两个可以学习的“重构参数”,以期望能够从中心化的数据重构出Layer本身学到的特征。
用到了“动量”的思想:分别维护两个储存“运行均值(Running Mean)”和“运行方差(Running Variance”的变量。
三点注意事项:
1)BN的训练过程和预测过程的表现是不同的。具体来说,训练过程与算法中所叙述的一致,均值和方差都是根据当前Batch来计算的。但是测试过程中的均值和方差不能根据当前Batch来计算,而应该根据训练样本集的某些特征来进行计算。
2)对于Normalize这个特殊层结构来说,偏置量是个多余的变量。
3)Normalize层结构可以加在许多不同地方。
算法的Python实现之后再谈。

你可能感兴趣的:(神经网络,CNN)