导入:本章介绍的神经网络是将人类直觉和相关数学见解结合后,经过大量研究试错后的结晶。本章按时间顺序介绍这些模型,在追寻历史的脉络的同时,帮助培养对该领域发展的直觉(炼丹的直觉),这有助于研究开发自己的架构。
深度卷积神经网络(AlexNet)
- 经典机器学习的流水线:
- 获取一个有趣的数据集(在早期,收集这些数据集需要昂贵的传感器)(在当时最先进的图像也就100万像素)
- 根据光学,几何学,其他知识以及偶然的发现(原来炼丹早就有啊,哈哈哈),手工对特征数据集进行预处理
- 通过标准的特征提取算法,eg:SIFT(尺度不变特征变换),SURF(加速鲁棒特征)或其他手动调整的流水线来输入数据
- 将提取的特征送入最喜欢的分类器中(eg:线性模型/其他核方法),以训练分类器。
学习表征
CV研究人员认为推动领域进步是数据特征而不是学习算法,从对最终模型精度的影响来说,更大/更干净的数据集或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。
另一个预测这个领域发展的方法---观察图像特征的提取方法。
图像特征提取方法的历史:
- 2012年前,图像特征都是机械地计算出来的;SIFT,SURF,HOG(定向梯度直方图)和类似的特征提取方法占据了主导地位
- 而包括Yann LeCun,Geoff Hinton,Yoshua Bengio,Andrew Ng, Shun ichi Amari和Juergen Schmidhuber在内的另一组研究人员认为:特征本身应该被学习;在合理的复杂性前提下,特征应该由多个共同学习的神经网络层组成,每个层都有可学习的参数。在机器视觉中,最底层可能检测边缘,颜色和纹理。
- 在2012年ImageNet挑战赛中,Alex Krizhevsky, Ilya Sutskever和Geoff Hinton提出了一种新的卷积神经网络变体AlexNet,AlexNet在这个比赛中取得了轰动一时的成绩
- 在AlexNet网络最底层,模型学习到了一些类似传统滤波器的特征抽取器,下图是AlexNet第一层学习到的特征抽取器
AlexNet的更高层建立在这些底层表示的基础上,以表示更大的特征,eg:眼睛,鼻子,草叶等等;更高层的可以检测整个物体,eg:人,飞机,狗或飞盘;最终的隐藏神经元可以学习图像的综合表示,使属于不同类别的数据易于区别
尽管一直有一群执着的searcher不断钻研,试图学习视觉数据的逐级表征,但是很长一段时间这些尝试都未有突破(这就是所谓的不可解释性吧)。
深度卷积神经网络的突破出现在2012年,可归因于2个关键因素:
- 数据:包含许多特征的深度模型需要大量有标签数据,才能显著优于基于凸优化的传统方法,但是,早期计算机存储有限,90年代研究预算有限,大部分研究只能基于小的公开数据集。这一状况在2010年前后兴起的大数据浪潮中得到改善:2009年ImageNet数据集发布。
- 硬件:深度学习需要GPU的原因:深度学习对计算资源要求很高,训练可能需要数百个迭代轮数,每次迭代都需要通过代价高昂的许多线性代数层传递数据。 GPU的优点:1,加速图形处理;2,可优化高吞吐量的 4 x 4矩阵和向量乘法,以服务于基本的图形任务;3,这些数学运算与卷积层的计算惊人的相似, NVIDIA和ATI就开始为通用计算操作优化gpu,甚至把它们作为通用GPU来销售。
- 了解CPU和GPU:
- CPU:
- CPU的每个核心:高时钟频率的运行能力,高达数MB的三级缓存(L3Cache);~功能:非常适合执行各种指令,具有分支预测器,深层流水线,其他使CPU能够运行各种程序的功能;致命缺点:通用核心的制造成本非常高,需要大量的芯片面积,复杂的支持结构(内存接口,内核之间的缓存逻辑,高速互连等等);在任何单个任务上的性能都相对较差(现代笔记本电脑最多有4核,即使是高端服务器也很少超过64核,因为性价比不高)
- GPU:
- 由100~1000个小的处理单元组成(NVIDIA,ATI,ARM和其他芯片供应商之间的细节稍有不同),通常被分成更大的组(NVIDIA称之为warps)。ps:虽然每个GPU核心都相对较弱,有时甚至以低于1GHz的时钟频率运行,但庞大的核心数量使GPU比CPU快几个数量级(原因是:1,功耗往往会随着时钟频率呈二次方增长,如果一个CPU核心运行速度比GPU快4倍,但可以使用16个GPU核代替,那么GPU的综合性能就是CPU的16 x 1/4 = 4 倍。2,GPU内核更简单,使得GPU更节能。3,深度学习中的许多操作需要相对较高的内存带宽,而GPU拥有10倍于CPU的带宽
回到2012年的重大突破,当AlexKrizhevsky和Ilya Sutskever实现了可以在GPU硬件上运行的深度卷积神经网络时,一个重大突破出现了。他们意识到卷积神经网络中的计算瓶颈:卷积和矩阵乘法,都是可以在硬件上并行化的操作。于是,他们使用两个显存为3GB的NVIDIAGTX580 GPU实现了快速卷积运算。他们的创新cuda-convnet89几年来它一直是行业标准,并推动了深度学习热潮。
AlexNet
- 它首次证明了学习到的特征可以超越手工设计的特征,一举打破计算机视觉研究的现状
- 下图是一个稍微精简版的AlexNet(去除了当年需要2个小型GPU同时运算的设计特点):
模型设计细节
- AlexNet的第一层:卷积窗口的形状是11 x 11 (因为ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,所以第一层的卷积窗口比较大)
- AlexNet的第二层:卷积窗口的形状是 5 x 5
- AlexNet剩下的层:卷积窗口的形状是 3 x 3
- 在第一层,第二层,第五层卷积层之后,加入窗口形状为 3 x 3,步幅为2的最大汇聚层
- 在最后一个卷积层后有2个全连接层,分别有4096个输出,这2个全连接层共拥有将近1GB的模型参数
- 早期GPU显存有限,原版的AlexNet采用双数据流设计,使得每个GPU只负责存储和计算模型的一半参数,现在,GPU显存相对充裕,所以现在很少需要跨GPU分解模型
- AlexNet通过暂退法控制全连接层的模型复杂度
- AlexNet在训练时增加了大量的图像增强数据,eg:翻转,裁切,变色;进一步扩充数据,使得模型更健壮,更大的样本量有效减少了过拟合
- 激活函数:使用ReLU激活函数,原因如下:
- 计算更简单,不需要如sigmoid激活函数那样复杂的求幂运算
- 当使用不同的参数初始化方法时,ReLU激活函数使模型训练更加容易
- ReLU激活函数在正区间的梯度总是1
小知识:
- AlexNet通过Sequentical顺序控制全连接层的模型复杂度dropout,而LeNet只使用权重衰减
- 为了进一步增强数据,AlexNet的训练循环添加了大量的图像增强,eg:翻转,剪切和颜色变化(这样,可以使得模型更稳健,样本量更大,有效减少过拟合)
- AlexNet有个致命的缺点:最后2个隐藏层太大了,支出就大,故而被后来的框架取代
- 具体代码如下:
使用块的网络(VGG)
- 牛津大学的视觉几何组的VGG网络是第一个使用块的想法
- 经典卷积神经网络的基本组成部分(是下面这个序列):
- 带填充以保持分辨率的卷积层
- 非线性激活函数,eg:ReLU
- 汇聚层,eg:最大汇聚层
- 一个VGG块和经典卷积神经网络类似:第一部分:一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层;第二部分:全连接层组成
- 在最初的VGG论文中,作者使用了带有3 x 3卷积核,填充为1(保持高度和宽度)的卷积层,带有 2 x 2 汇聚窗口,步幅为2(每个块后的分辨率减半)的最大汇聚层
- VGG网络架构
- 原始VGG网络架构:5个卷积块
- 前2个块,各有一个卷积层,后三个块各包含2各卷积层
- 第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,知道该数字达到512
- 该VGG也被称为VGG-11,因为该网络使用8个卷积层,3个全连接层
- 具体代码如下:
网络中的网络(NiN)
- NiN思想:在每个像素位置(针对每个高度和宽度)应用一个全连接层,将空间维度中的每个像素视为单个样本,将通道维度视为不同特征(feature)
- 下图是VGG和NiN及它们的块之间主要架构差异
含并行连结的网络(GoogleLeNet)
- GoogleLeNet在NiN的基础上做了改进: NiN的串联网络思想+使用不同大小的卷积核组合 ,连接了多分支卷积
(本节介绍的是一个稍微简化的GoogleLeNet版本)
- 在GoogLeNet中,基本的卷积块:Inception块(Inception block)
- 下图是Inception块的架构:
- 对上述架构的解释:
- 前三条路径使用卷积层:从不同空间大小中提取信息
- 中间2条路径在输入上执行 1x1卷积:减少通道数
- 第4条路径使用1x1卷积层:改变通道数
- 4条路径都使用了合适的填充使输入和输出的高和宽一致
- 在Inception块中超参数是:每层输出通道数
- 具体代码如下:
- GoogleNet模型架构如下:
小结:
- Inception块相当于一个有4条路径的子网络,它通过不同窗口形状的卷积层和最大汇聚层,并行抽取信息,使用1x1卷积层减少每像素级别上的通道维数,降低模型复杂度
- GoogLeNet的Inception块中的通道数分配之比是在ImageNet数据集上,通过大量实验得来的
- GoogLeNet和它的后继者们一度是mageNet上最有效的模型之一:它以较低的计算复杂度提供了类似的测试精度。
批量规范化(Batch Normalization)
- batch normalization可以加速深层网络的收敛速度。
- 需要 batch normalization的原因:
- 数据预处理方式通常对最终结果产生巨大影响
- 在模型训练时,参数更新变化莫测,其中的变量分布的偏移可能会阻碍网络的收敛,需要对学习率进行补偿调整
- 更深层的网络很复杂,容易过拟合
- batch normalization的范围:单个可选层;所有层。
- batch normalization原理:在每次的训练迭代中,先规范化输入:通过减去其均值并除以其标准差(均值,标准差都基于当前小批量处理),然后,应用比例系数和比例偏移(这2个基于批量统计的标准化)(这是批量规范化名称的由来)
- 在应用batch normalization时,批量大小的选择可能没有批量规范化时更重要。
- 批量规范化BN转换输入x的表达式,如下: xB:x是来自一个小批量的输入;:小批量B的样本均值;是小批量B的样本标准差;
- 应用该式子,生成的小批量的平均值为0,单位方差为1;:拉伸参数;:偏移参数;,的形状和x相同,且是需要学习的参数
- batch normalization常常应用到中间层,因为中间层的变化幅度不能过于剧烈,batch normalization将每层主动居中,并重新调整每一层的平均值和大小为自定的平均值和大小(通过,)
- ,的计算方法如下:
其中的>0,在这个式子中添加的原因:确保永远不会除以0,即使在经验方差(样本方差)估计值可能消失的情况也是这样。 ,通过使用平均值和方差的噪声估计抵消缩放问题(这个噪声在这个式子中的有益的)
小tips:
- 优化中的各种噪声源通常会导致更快的训练和较少的过拟合:这种变化似乎也是一种正则化的形式。
- batch normalization最适合50~100范围的中等批量大小的问题。
- batch normalization在训练模式下是:通过小批量统计数据规范化,不能使用整个数据集来估计平均值和方差;在预测模式下是:通过数据集统计规范化:根据整个数据集精确计算批量规范化所需的平均值和方差。
batch normalization在深度学习中的实际使用:
训练模式:
- 在应用batch normalization时,不能忽略批量大小(因为批量规范化在完整的小批量上运行)
- 全连接层:将batch normalization置于全连接层中的仿射变换(对输入数据进行线性变换和偏移的操作)和激活函数之间,具体公式如下:
x:全连接层的输入;W:权重参数;b:偏置函数;BN:批量规范化的运算符;均值,方差都在该应用变换的相同小批量上计算。
- 卷积层:在卷积层之后,非线性激活函数之间应用batch normalization:对卷积层的每个输出通道执行batch normalization,每个通道都有自己的拉伸和偏移参数(这2个参数都是标量)
预测模式:
通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。
- 具体代码如下:
ResNet(残差网络)
引入
逼近最优解的模型的训练方向:应该是下图中的嵌套类
最优解和架构之间的关系:
综上可知,只有当较复杂的函数类包含较小的函数类时,我们才能确保性能是在向最优解靠近,所以在深度神经网络中,将新添加的层训练成恒等映射(identity function) f(x) = x,使得新模型同原模型一样有效,同时,新模型更可能得出更优的解来拟合数据集(故而,添加层似乎更容易降低训练误差)
正文
ResNet网络就依据上述思维构造的,核心思想是:每个附加层都应该更容易包含原始函数作为其元素之一。由此,残差块(residual blocks)诞生了。
残差块
- 理想映射f(x)是恒等映射。
- 经实践证明,残差映射f(x)-x在现实中更容易优化,当理想映射f(x)极接近于恒等映射,残差映射也易于捕捉恒等映射的细微波动。
- 只需将加权运算(eg:仿射)的权重和偏置参数设成0。
- 在残差块中,输入可通过跨层数据线路更快地向前传播。
ResNet网络思路:
- 沿用了VGG完整的3x3卷积层
- 残差块:2个有相同输出通道数的3x3卷积层,每个卷积层后接一个批量规范化层,ReLU激活函数,通过跨层数据通路,跳过残差块中的卷积运算,将输入直接加在最后的ReLU激活函数前,每个卷积层的输入和输出形状一样(这样才能使得它们可以相加);如果想要改变通道数,就需要引入一个额外的1x1卷积层将输入换成需要的形状后再做相加运算。
- ResNet-18架构:
- 具体代码如下:
DenseNet(稠密连接网络)
- DenseNet是ResNet的逻辑扩展。=>DenseNet比ResNet更加复杂罢了。
- ResNet仅仅需要2项,DenseNet是ResNet的扩展,输出是连接(图中[,])是展开式的映射(类想泰勒展开式)
- 最后再将这些展开式结合到多层感知机中,再次减少特征的数量。如下图:
- 稠密网络的构成:稠密块(dense block):定义如何连接输入和输出,过渡层(transition layer) :控制通道数量,使其不会太复杂。
- 具体代码如下: