传统神经网络:
是全连接形式,即样本的每个特征属性都通过所有的隐藏层节点映射,最后输出数据。由于是全连接,所以计算极为复杂,且模型不易学习。
卷积神经网络:卷积神经网络(Convolutional Neural Networks, CNN), CNN可以有效的降低反馈神经网络(传统神经网络)的复杂性,常见的CNN结构有LeNet-5、AlexNet、ZFNet、VGGNet、 GoogleNet、 ResNet等等 ,其中在LVSVRC2015冠军ResNet网络深度是AlexNet的20多倍,是VGGNet的8倍;从这些结构来讲CNN发展的一个方向就是层次的增加,通过这种方式可以利用增加的非线性得出目标函数的近似结构,同时得出更好的特征表达,但是这种方式导致了网络整体复杂性的增加,使网络更加难以优化,很容易过拟合或模型退化。CNN的应用主要是在图像分类、人脸识别、和物体识别、语义分割等应用比较多。
首要步骤:数据预处理:
需要进行预处理的主要原因是:
◆输入数据单位不-样,可能会导致神经网络收敛速度慢, 训练时间长
◆数据范围大(方差大)的输入在模式分类中的作用可能偏大,而数据范围小的作用就有可能偏小
◆由于神经网络中存在的激活函数是有值域限制的,因此需要将网络训练的目标数据映射到激活函数的值域
◆S形激活函数在(-4, 4)区间以外区域很平缓,区分度太小。例如S形函数f(X), f(100)与f(5)只相差0.0067
常见3种数据预处理方式:
◆去均值
将输入数据的各个维度中心化到0
◆归一化
将输入数据的各个维度的幅度归一化到同样的范围
◆PCA/白化(不常用)
用PCA降维(去掉特征与特征之间的相关性)
白化是在PCA的基础上,对转换后的数据每个特征轴.上的幅度进行归一化
cnn的统计学原理
1、统计不变性:指基本不会随着时间和空间改变的事物。
2、无论猫处在什么位置,检测出来都应该是猫,这称为平移不变性。
3、所以如果网络从左上角学到了猫咪的特征,那么这部分特征应该可以被重复利用,而不需要重复学习去识别图右下角的猫咪。这种学习方法就称为:权重共享(weights sharing)---进而引出了:卷积神经网络CNN (空间. 上共享参数的神经网络)
4、这种思想应用到自然语言处理,就产生了embeding嵌入和RNN网络
问题: CNN为什么具备平移不变性?尺度不变性?
因为共享权重值
CNN具备旋转不变性?不具备。(但是通过数据增强, 人为旋转图片喂入模型,让模型学会)
第二个首要步骤:
■在卷积神经网络中,可以看到神经元之间的连接是通过权重w以及偏置b实现的。在具
体的神经网络之前,我们还有一个任务需要做,那就是初始化参数
◆权重的初始化
一般方式:很小的随机数(对于多层深度神经网络,太小的值会导致回传的梯度非常小), -般随机
数是服从均值为0,差末知(建议: 2/n. n为权重数量, https://arxiv.org/pdf/1502.01852.pdf)
的高斯分布随机数列。
错误方式:全部初始化为0,全部设置为0,在反向传播的时候是一样的梯度值, 那么这个网络的
权重是没有办法差异化的,也就没有办法学习到东西。
◆偏置项的初始化
一般直接设置为0,在存在ReLU激活函数的网络中,也可以考虑设置为一个很小的数字
CNN的流程:输入层
[卷积层+批归一化+relu之类的激活函数+ dropout(可选)]
*N池化层*M-拉平层-[FC+ 批归一化+激活]*K
输出层
激活函数(分类用:softmax或sigmoid)
input层:首先一个数据输入进来,假设为一张图片,rgb格式,三通道,长宽是32*32
卷积层:设定一个卷积核,又称滤波器。这里设定为5*5*3,通道数3要和上一步骤的通道数一样,此处为输入图片的通道数。一个卷积核提取的是一个特征,设定多个卷积提取的是多个不同特征
设定一个步长。步长意为滤波器每次走的步数,步长为1时,最后得到的矩阵大小一样,为2时,矩阵大小就成了原矩阵的二分之一。
进行卷积运算(原始图像是真实图像,其经过卷积运算后的矩阵,称为特征图像,feature_map):
步长也分横向纵向的
很多时候为了避免图像内的像素点的特征总是被重复提取,以及边缘的特征的值总是很少被提取,所以可以在原始图片数据矩阵四周填充几圈0,称为padding填充。
此例是三个通道的原始图像,所以有三层的滤波器,卷积操作后生成了三个特征图。
我们通过第一个卷积核进行的操作提取了(原图第一层通道)的不同位置的同样特征,由于所有位置都是用的统一卷积核,即神经元之间连接的权重不变
我们通过第2个卷积核进行的操作提取了(原图第2层通道)的不同位置的同样特征,然后第三层。
最后,三个通道的总共三个特征图加一起,再加个偏置项,组成卷积层的输出的矩阵(矩阵数就是想提取的特征数),见过程演示
过程演示:http://cs231n.qithub.io/assets/conv-demo/index.html
激活:
将卷积层的输出结果做一次非线性的映射,也就是做一次“激活”
如果输入变化很小,导致输出结构发生截然不同的结果,这种情况是我们不希望看到的,为了模拟更细微的变化,输入和输出数值不只是0到1,可以是0和1之间的任何数,
激活函数是用来加入非线性因素的,因为线性模型的表达力不够
这句话字面的意思很容易理解,但是在具体处理图像的时候是什么情况呢?我们知道在神经网络中,对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。
常用非线性激活函数:
◆Sigmoid(S形函数)
◆Tanh(双曲正切,双S形函数)
◆ReLU
◆Leaky ReLU
◆ELU
其中前两个s形激活函数需要先对输入数据归一化,否则激活后的值都会进入平坦区,使隐层的输出全部趋同
激活之后可选用dropout来解决过拟合问题:
神经网络的学习能力受神经元个数与神经网络层次的深度影响,个数越多,层数越深,学习能力越强,越容易造成过拟合。为解决过拟合,有两种方法,一是正则化,通过在损失函数上加L1,或L2正则项。二是dropout方法,Dropout:通过随机删除神经网络中的神经元来解决vefting问题,在每次迭代的时候,只使用部分神经元训练模型获取W和d的值一般情况下, 对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。
Dropout就是利用这个原理 ,每次丢掉一半左右的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其它的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其它神经元之间的更加健壮robust (鲁棒性)的特征。另外Dropout不仅减少overfitting, 还能提高测试集准确率。(训练数据集有时会降低)
池化层:
池化的目的是为了缩小图像(或称为下采样(subsampled)或降采样(downsampled)),其主要目的有两个:
1、使得图像符合显示区域的大小;
2、生成对应图像的缩略图。
■在连续的卷积层中间存在的就是池化层,可以说每卷积计算后加上偏置项后就池化一次
主要功能是:通过逐步减小表征的空间尺寸来减小参数量和网络中的计算;池化层在每个特征图上独立操作。使用池化层替代卷积层可以达到压缩数据和参数的量,减小过拟合。
拉平层:将池化后的特征图,拉伸成向量,
# 拉平层 [N, 28/4, 28/4, 64] ---> [N, 7*7*64] shape = pool2.get_shape() # [N, 7, 7, 64] flatten_shape = shape[1] * shape[2] * shape[3] flatted = tf.reshape(pool2, shape=[-1, flatten_shape])
全连接层:最后进行全连接,卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。全连接是用来解决最后的分类问题,因为用到了所有的局部特征,所以叫全连接。 而最后全连接层是否可以用其他分类方法替代呢?比如随机森林,是可以的。
也可以俗气的理解:假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了。全连接层就是这个蚂蚁大会~
简单来说:它把特征representation整合到一起,输出为一个值。这样做,有一个什么好处:就是大大减少特征位置对分类带来的影响。
注:样本标记空间也叫样本输出空间。
再举个例子说明上述的过程:
从上图我们可以看出,猫在不同的位置,输出的feature值相同,但是位置不同。对于电脑来说,那分类结果也可能不一样。
而这时全连接层filter的作用就相当于:猫在哪我不管,只要找到猫就可以,于是让全连接层filter去把这个猫找到,实际就是把feature map 整合成一个值。
这个值大,有猫,这个值小,那就可能没猫,这和猫在哪关系不大了,鲁棒性大大增强了!
因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找模式的任务,比如分割。
全连接层为什么大部分是两层?
只用一层fully connected layer 有时候没法解决非线性问题,而如果有两层或以上fully connected layer就可以很好地解决非线性问题了。
批归一化:
梯度消失原因:是链式求导法则,导致梯度逐层递减,我们BP第一节推倒公式时就是通过链式求导把各层连接起来的,但是因为激活函数是SIGMOD函数,取值在1和-1之间,因此每次求导都会比原来小,当层次较多时,就会导致求导结果也就是梯度接近于0。
以前在神经网络训练中,为解决梯度消散,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。
BN的流程:
1.求每一个训练批次数据的均值
2.求每一个训练批次数据的方差
3.使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中εε是为了避免除数为0时所使用的微小正数。
4.重构(尺度变换和偏移):将xi乘以γ调整数值大小,再加上β增加偏移后得到yi,这里的γ是尺度因子,β是平移因子。这一步是BN的精髓,由于归一化后的xi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γ,β。 γ和β是在训练时(梯度反向传播更新,即BP)网络自己学习得到的。
卷积神经网络优缺点:
■优点
◆共享卷积核(共享参数),对高维数据的处理没有压力
◆无需选择特征属性,只要训练好权重,即可得到特征值
◆深层次的网络抽取图像信息比较丰富,表达效果好
■缺点
◆需要调参,需要大量样本,训练迭代次数比较多,最好使用GPU训练
◆黑箱:物理含义不明确,从每层输出中很难看出含义来
反向传播求梯度值,从而用梯度下降去更新模型参数
全连接层反向传播 求w与b的梯度
卷积层反向传播 求w与b的梯度
池化层反向传播 没有w与b,也用不着求w与b的梯度
最后得到w与b的梯度
关于各层反向传播,这位博主写的很好,可以引用。https://blog.csdn.net/kyang624823/article/details/78633897
事实上,梯度下降时,是可以对梯度下降法进行优化的。
动量梯度下降法(Momentum)
- 另一种成本函数优化算法,优化速度一般快于标准的梯度下降算法.
-
基本思想:计算梯度的指数加权平均数并利用该梯度更新你的权重
-
假设图中是你的成本函数,你需要优化你的成本函数函数形象如图所示.其中红点所示就是你的最低点.使用常规的梯度下降方法会有摆动这种波动减缓了你训练模型的速度,不利于使用较大的学习率,如果学习率使用过大则可能会偏离函数的范围.为了避免摆动过大,你需要选择较小的学习率.
- 而是用Momentum梯度下降法,我们可以在纵向减小摆动的幅度在横向上加快训练的步长.
基本公式
RMSprop(均方根)
RMSprop (root mean square prop),也可以加速梯度下降.
- 对于梯度下降,横轴方向正在前进,但是纵轴会有大幅度的波动.我们现将横轴代表参数W,纵轴代表参数b.横轴也可以代表但是为了便于理解,我们将其称之为b和W
- w的在横轴上变化变化率很小,所以dw的值十分小,所以也小,而b在纵轴上波动很大,所以斜率在b方向上特别大.所以这些微分中,db较大,dw较小.这样W除数是一个较小的数,总体来说,W的变化很大.而b的除数是一个较大的数,这样b的更新就会被减缓.纵向的变化相对平缓.
- 注意:这里的W和b标记只是为了方便展示,在实际中这是一个高维的空间,很有可能垂直方向上是W1,W2,W5..的合集而水平方向上是W3,W4,W6...的合集.
- 实际使用中公式建议为:
为了保证实际使用过程中分母不会为0.
- 主要目的是为了减缓参数下降时的摆动,并允许你使用一个更大的学习率,从而加快你的算法速率.
Adam算法
Adam 算法基本原理是将Momentum和RMSprop结合在一起.
算法原理
超参数取值