1.神经网络:
经典的神经网络-------------输入层 中间层 输出层
Ps:
1.设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
2.拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
3.结构图里的关键是神经元之间的连接。每个连接线对应一个不同的权重,需要训练得到。
Ps:训练
单层神经网络,使用的激活函数是sgn函数
两层神经网络,使用的最多的是sigmoid函数
多层神经网络,ReLU函数在训练多层神经网络时,更易收敛,预测性能更好
ReLU函数是分段线性函数,y=max(x,0)。
在多层神经网络中,训练的主题仍然是优化和泛化。在深度学习中,泛化技术变的比以往更加的重要。这主要是因为很容易出现过拟合现象。当使用足够强的计算芯片时,梯度下降算法以及反向传播算法在多层神经网络中的训练中工作的很好。
方法一:尽量减少选取变量的数量:具体而言,我们可以人工检查每一项变量,并以此来确定哪些变量更为重要,然后,保留那些更为重要的特征变量。
方法二:正则化:正则化中我们将保留所有的特征变量,但是会减小特征变量的数量级。
2.卷积神经网络层级结构
• 数据输入层/ Input layer
对原始图像数据进行预处理(去均值、归一化、PCA/白化)
• 卷积计算层/ CONV layer
有两个关键操作:
• 局部关联。每个神经元看做一个滤波器(filter)
• 窗口滑动, filter对局部数据计算
- 卷积的计算
- 参数共享机制
• 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
• 需要估算的权重个数减少: AlexNet 1亿 => 3.5w
• 一组固定的权重和不同窗口内数据做内积: 卷积
• ReLU激励层/ ReLU layer
把卷积层输出结果做非线性映射
CNN采用的激励函数一般为ReLU,它的特点是收敛快,求梯度简单,但较脆弱
Ps:①不要用sigmoid!② 首先试RELU,因为快,但要小心点
③ 如果2失效,请用Leaky ReLU或者Maxout
④ 某些情况下tanh倒是有不错的结果,但是很少
• 池化层 / Pooling layer
压缩数据和参数的量,减小过拟合(如果输入是图像的,那么最主要作用就是压缩图像。)
1. 特征的尺度不变性,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
2. 特征降维,把这类冗余信息去除,把最重要的特征抽取出来
3. 在一定程度上防止过拟合,更方便优化。
池化层用的方法有Max pooling(用的较多) 和 average pooling
• 全连接层 / FC layer
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。
卷积神经网络的常用框架
Caffe • 源于Berkeley的主流CV工具包,支持C++,python,matlab
• Model Zoo中有大量预训练好的模型供使用
Torch • Facebook用的卷积神经网络工具包
• 通过时域卷积的本地接口,使用非常直观
• 定义新网络层简单
TensorFlow • Google的深度学习框架
• TensorBoard可视化很方便
• 数据和模型并行化好,速度快
3.Googlenet 网络模型
用到了辅助分类器(充当正则化器),Inception Net有22层深,除了最后一层的输出,其中间节点的分类效果也很好。因此在Inception Net中,还使用到了辅助分类节点,即将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中。这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个Inception Net的训练很有裨益。 pooling的结果是使得特征减少,参数减少,目的是为了保持某种不变性(旋转、平移、伸缩等)
1 . 显然GoogLeNet采用了模块化的结构,方便增添和修改;
2 . 网络最后采用了average pooling来代替全连接层,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家微调;
3 . 虽然移除了全连接,但是网络中依然使用了Dropout(防止过拟合,在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃) ;
4 . 为了避免梯度消失,网络额外增加了2个辅助的softmax,用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax(最后一层全连接层会用softmax层处理输出的y值,将输出变成一个概率分布,在这里用交叉熵作为代价函数)会被去掉。
4.GoogLeNet思想
一般来说,提升网络性能最直接的方式就是增加网络的大小:
1.增加网络的深度2.增加网络的宽度
这样简单的解决办法有两个主要的缺点:
1.网络参数的增多,网络容易陷入过拟合中,这需要大量的训练数据,而在解决高粒度分类的问题上,高质量的训练数据成本太高;
2.简单的增加网络的大小,会让网络计算量增大,而增大计算量得不到充分的利用,从而造成计算资源的浪费
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,这也就意味着巨量的参数。但是,巨量参数容易产生过拟合也会大大增加计算量。
文章认为解决上述两个缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。一方面现实生物神经系统的连接也是稀疏的,另一方面有文献表明:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化。 虽然数学证明有着严格的条件限制,但Hebbian准则有力地支持了这一点:fire together,wire together。
早些的时候,为了打破网络对称性和提高学习能力,传统的网络都使用了随机稀疏连接。但是,计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet中又重新启用了全连接层,目的是为了更好地优化并行运算。所以,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,据此论文提出了名为Inception 的结构来实现此目的。
inception架构的主要思想
是建立在找到可以逼近的卷积视觉网络内的最优局部稀疏结构,并可以通过易实现的模块实现这种结构。
将Hebbian原理应用在神经网络上,如果数据集的概率分布可以被一个很大很稀疏的神经网络表达,那么构筑这个网络的最佳方法是逐层构筑网络:将上一层高度相关的节点聚类,并将聚类出来的每一个小簇连接到一起。
1 . 什么是Hebbian原理?
神经反射活动的持续与重复会导致神经元连续稳定性持久提升,当两个神经元细胞A和B距离很近,并且A参与了对B重复、持续的兴奋,那么某些代谢会导致A将作为使B兴奋的细胞。总结一下:“一起发射的神经元会连在一起”,学习过程中的刺激会使神经元间突触强度增加
2.这里我们先讨论一下为什么需要稀疏的神经网络是什么概念?
人脑神经元的连接是稀疏的,研究者认为大型神经网络的合理的连接方式应该也是稀疏的,稀疏结构是非常适合神经网络的一种结构,尤其是对非常大型、非常深的神经网络,可以减轻过拟合并降低计算量,例如CNN就是稀疏连接。
3.为什么CNN就是稀疏连接?
在符合Hebbian原理的基础上,我们应该把相关性高的一簇神经元节点连接在一起。在普通的数据集中,这可能需要对神经元节点做聚类,但是在图片数据中,天然的就是临近区域的数据相关性高,因此相邻的像素点被卷积操作连接在一起(符合Hebbian原理),而卷积操作就是在做稀疏连接。
4. 怎样构建满足Hebbian原理的网络?
在CNN模型中,我们可能有多个卷积核,在同一空间位置但在不同通道的卷积核的输出结果相关性极高。我们可以使用1*1的卷积很自然的把这些相关性很高的、在同一空间位置但是不同通道的特征连接在一起。