深度学习之卷积神经网络
传统的神经网络:
多层感知器神经网络和人工神经网路,DNN,MLP等,
图片数据,比如:32*32*3,展开大概是4000维的向量,如果每层神经元是1024个那么每层会有400W个参数w和b,100 层会有4千万个参数,参数过多会导致过拟合的,,而且学习很慢,硬件方面也需要从cpu->Gpu!
我们对模型不但需要有好的学习能力,而且需要参数量不那么大,就引出了CNN卷积神经网络结构!
卷积神经网络,
1.层次结构:
数据输入层/input layer
:数据的预处理,类别型编码,数值型标准化(图像数据乘1/255),PCA降维.....
:数值型去均值(每个值都减去,均值),为了不让样本随着非线性变换,有越来越大的偏移度!(一定要做)
:1.Alexnet是对于所有输入图片计算图片的各个样本点上的均值,得到一个mean矩阵,在处理!
:2.VGG是对3个颜色通道计算均值,每次计算的时候只需要减去颜色通道的均值即可!
:需要注意,测试集减去的均值一定是训练集上的均值,在ML里也一样,标准化的计算的系数要相同!
:总结:对于图像数据,去均值,标准化是都会做的,PCA是在降维后进行白化(就是标准化)!
卷积计算层/CONV layer
:神经元叫做filter/kernel,通过窗口滑动来遍历所有数据
:深度(depth)是神经元的个数,步长stride是滑窗滑动的格数(比如3*3的矩阵每次滑动两格),矩阵的padd填充 值为0!
:对图片的每个滑窗都对应一个神经元计算得到值!
:参数共享机制,一个神经元对应图片每个滑窗的权重一样,但是不同神经元的权重是不同的
:通过这个机制,很大幅度的降低了参数数量,神经元数量不变,原来在整个图片维度上计算的参数变为了在滑窗维 度计算的参数,参数数量变化:(32*32*3*1024---->3*3*3*1024)
:每个神经元都会对特定的特征进行记忆学习,权重固定,通过滑窗抽取信息,来探索一种模式!
:总结:第一,卷积层像是在捕捉一种图像上的模式(在遍历图像嘛),第二,能够把参数量降低下来,主要是能获取高维特征,不同操作的卷积层可以获得不同大小的图像!
激励层/Activation layer(通常卷积层后面会默认跟一个激励层)
:把卷积层的的输出结果做一个非线性映射
:**函数
:梯度消失和梯度弥散,就是因为sigmod和tanh函数图向上斜率会趋近于零,让梯度趋近于零还有当网络很深,利 用BP进行误差反传,数值会无限趋近于零的,就是误差传递不过去的!
:ReLu是修正线性单元,大于0就有斜率,小于0就为0,可以达到随机失活(dropout)!
:Leakly ReLu 是对ReLu斜率的线性修正,斜率不为零,但是小于零效率小一点。
:Maxout,是用两条线段进行组合,不同的值在哪条线上斜率大就取谁。
:ELu,是对ReLu的一种修正,是指数修正
:总结:切记不用sigmoid函数,ReLu是最快的,可以用但是需要小心防止欠拟合损失下降不了了,如果不行,可 以使用Leaky ReLu或着Maxout或者ELU,特殊情况tanh会有效果但是很少!!
池化层/pooling layer(下采样层)
:夹在连续卷积层的中间,起到压缩数据和参数数量
:在每个特征上进行采样,而不会再神经元上进行采样
:Max Pooling最大池化:保留数据当中最明显的特征(用的最多)
:Average Pooling平均池化:保留数据中的平均值嘛(用的不多)
:池化层并不是会在所有卷积神经网络都会用的,一般会在图片分类里使用!
:总结:永远会使图片缩小一半!!!! 1.降维, 来降低过拟合的风险 2.特征不变性,我们只关注很特定的一些 模式,而不是特征的具体位置,使用池化层可以把这些位置信息去除掉保留,很重要的那个模式!
全连接层/FC layer
:两层之间所有的神经元都有权重连接,
:通常全连接层在卷积神经网络尾部
:全连接层,必须把图像展开成一维向量,然后与权重相乘来实现全连接!
典型的CNN结构为:卷积层+**层来若干个后接池化层,这样的结构来若干个,末尾接上全连接层!
Batch Normalization层/(可能会有)
卷积神经网络训练方法:
:BP+SGD
:**层的求导就是求导的链式法则,f(g(h(x)))’ = f ’ * g’ * h’
:池化层的求导就是对分段函数求导
:卷积层也是类似分段函数求导
:卷积层,**层,池化层,都是可以求偏导的,只是多层感知机全部是全连接层求导比较统一而已!本质无区别!
卷积神经网络优缺点:
优点:
:共享卷积核,可以很大幅度的减少参数的数量
:不需要手动选择特征,训练好权重,即是特征
:深层次的网络抽取图像信息丰富,表达效果很好
缺点:
:需要调参,大量样本,GPU等硬件依赖
:黑箱操作,物理含义不明确
正则化与Dropout:
神经网络学习能力很强,经常会过拟合,而ML里的L1和L2正则项却不能很好地处理这方面问题,在这里引出了随机失活思路!
:每一轮训练中,在每一层中的神经元会有一个开关,有概率失活也有概率打开
:开关是闭合的该怎么算就怎摸算,当开关一旦打开,不管前面算到的甚么结果都会失效,值为零,从新进行学习!
:训练数据加随机失活,但是测试数据不进行随机失活,但是会点乘进行约束(两点分布嘛),也就是保持了数学期望!
:预测阶段的时间转移到训练阶段,直接在训练的时候对神经元除一个p即可!
:就是把工作全部放在训练阶段,进行随机失活加概率缩放!
防止过拟合的理解:
:第一种,神经网络可能学到很多冗余信息,可以对他进行丢弃,别记住那麽多东西,可以保持泛化能力!
:第二种,每轮训练都关掉一部分感知器,就会得到一个新模型,相当于是进行模型融合!
典型的卷积神经网络(CNN)
解决梯度消失这一问题,首先梯度消失是因为当网络层数很深,BP反向传播误差传播导数连乘就会越来越小到最后无限趋近于零,就传递不了了,这一问题就是把乘法换成加法,就解决了,然后ResNet就出世了!
这个网络的连接不是一层扣一层的,每层都会有一个高速通道(算是一条捷径),尽管你网络很深,或许你可能不会过拟合的!