基础概念
1. 卷积(Convolution)
卷积是一种运算。函数f,g是定义在Rn上的可测函数,f与g的卷积记作f*g,它是其中一个函数翻转并平移后与另一个函数的乘积的积分,是一个对平移量的函数,也就是:
离散卷积定义为,对于定义在整数Z上的函数f,g
2. 卷积神经网络(Convolutional Neural Network, CNN)
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做 内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
用CNN卷积神经网络识别图片,一般需要的步骤有:
- 卷积层初步提取特征
- 池化层提取主要特征
- 全连接层将各部分特征汇总
- 产生分类器,进行预测识别
3. 梯度(gradient)
一般来说,梯度可以定义为一个函数的全部偏导数构成的向量,一般将函数f的梯度记为∇f。梯度向量的方向即为函数值增长最快的方向。
4. 反向传播(Backpropagation)
当我们使用前馈神经网络接收输入x 并产生输出 y^\hat{y}y^ 时,信息通过网络向前流动。输入x 提供初始信息,然后传播到每一层的隐藏单元,最终产生输出 y^\hat{y}y^。这称之为 前向传播(forward propagation)。在训练过程中,前向传播可以持续向前直到它产生一个标量代价函数 J(θ)J(\theta)J(θ)。
反向传播是一种算法,允许来自代价函数的信息通过网络向后流动,以便计算梯度。实际上,它可以计算任何函数的导数。
5. 优化器(SGD)
深度学习算法在许多情况下都涉及到优化,一个主要的方向是寻找神经网络上的一组参数 θ\thetaθ,它能显
著地降低代价函数J(θ)J(\theta)J(θ),该代价函数通常包括整个训练集上的性能评估和额外的正则化项。
随机梯度下降(SGD)及其变种很可能是一般机器学习中应用最多的优化算法,特别是在深度学习中。按照数据生成分布抽取m 个小批量(独立同分布的)样本,通过计算它们梯度均值,我们可以得到梯度的无偏估计。
6. 残差设计思想
深度学习对于网络深度遇到的主要问题是梯度消失和梯度爆炸,传统对应的解决方案则是数据的初始化(normlized initializatiton)和正则化(batch normlization),但是这样虽然解决了梯度的问题,深度加深了,却带来了另外的问题,就是网络性能的退化问题,深度加深了,错误率却上升了,而残差用来设计解决退化问题,其同时也解决了梯度问题,更使得网络的性能也提升了。
论文阅读
1. 深度卷积神经网络AlexNet
结构
5层卷积,3层全连接,由于参数过多,通道分为两个显卡计算,在第三层卷积和全连接层会进行通道的合并。
全连接层
CNN中的全连接层与浅层神经网络中的作用是一样的,负责逻辑推断,所有的参数都需要学习得到。有一点区别在于第一层的全连接层用于链接卷积层的输出,它还有一个作用是去除空间信息(通道数),是一种将三维矩阵变成向量的过程。
创新
-
成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
-
训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
-
在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
-
提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
2. 深度卷积网络VGG
VGG是牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司研究员一起研发的深度卷积神经网络。
VGGNet 探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3x3的小型卷积核和2x2的最大池化层,VGGNet 成功地构筑了16~19层深的卷积神经网络。VGGNet 相比之前 state-of-the-art 的网络结构,错误率大幅下降,并取得了 ILSVRC 2014 比赛分类项目的第2名和定位项目的第1名。
同时 VGGNet 的拓展性很强,迁移到其他图片数据上的泛化性非常好。VGGNet 的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。
如下图所示,两个3x3的卷积层串联相当于1个5x5的卷积层,即一个像素会跟周围5x5的像素产生关联,可以说感受野大小为5x5。而3个3x3的卷积层串联的效果则相当于1个7x7的卷积层。除此之外,3个串联的3x3的卷积层,拥有比1个7x7的卷积层更少的参数量,只有后者的一半。最重要的是,3个3x3的卷积层拥有比1个7x7的卷积层更多的非线性变换(前者可以使用三次 ReLU 激活函数,而后者只有一次),使得 CNN 对特征的学习能力更强。
3. 深度残差网络ResNet
残差块
假设现有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。
假定某段神经网络的输入是x,期望输出是H(x),即H(x)是期望的复杂潜在映射,如果是要学习这样的模型,则训练难度会比较大;如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。
在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
1*1 卷积
1x1卷积在大多数情况下它作用是升/降特征的维度,这里的维度指的是通道数(厚度),而不改变图片的宽和高。ResNet在3×3卷积层的前后都使用了1x1卷积,不仅进行了降维,还进行了升维,参数数量进一步减少,如下图的结构。
其中右图又称为”bottleneck design”,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量。