• AlexNet


    原文:ImageNet Classification with Deep ConvolutionalNeural Networks

    一、LeNet局限

    在很长时间里,LeNet虽然在小规模的问题上,如手写数字,取得过当时世界最好结果,但一直没有取得巨大成功。这主要原因是,LeNet在大规模图像上效果不好,比如像素很多的自然图片内容理解,所以没有得到计算机视觉领域的足够重视。而这就是AlexNet出现的原因,不仅如此,AlexNet出现的同时还引入了gpu提升计算能力。

    二、AlexNet结构介绍

    1.relu

    常用的激活函数是sigmoid,tanh函数,此类函数在x很大或者很小的时候处于饱和状态,而relu:max(0,x)是非线性的非饱和函数。在训练时间上,非饱和函数比饱和函数训练更快。而且这种扭曲线性函数,不但保留了非线性的表达能力,而且由于其具有线性性质(正值部分),相比tanh和sigmoid函数在误差反向传递时,不会有由于非线性引起的梯度弥散形象(顶层误差较大,由于逐层递减误差传递,引起低层误差很小,导致深度网络地层权值更新量很小,导致深度网络局部最优)。ReLU的这些性质可以让我们训练更深的网络。

    从生物学角度来看,relu满足生物学上细胞激活的三大特性:①单侧抑制 ②相对宽阔的兴奋边界 ③稀疏激活性(大脑同时被激活的神经元只有1~4%,神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征)

    相比之下,同一时间段提出的softplus,具有了前两个特性,而在稀疏激活性方面略逊一筹。

    关于稀疏性的观点:

    1.信息解离:当前,深度学习一个明确的目标是从数据变量中解离出关键因子。原始数据(以自然数据为主)中通常缠绕着高度密集的特征。原因是这些特征向量是相互关联的,一个小小的关键因子可能牵扰着一堆特征,有点像蝴蝶效应,牵一发而动全身。基于数学原理的传统机器学习手段在解离这些关联特征方面具有致命弱点。然而,如果能够解开特征间缠绕的复杂关系,转换为稀疏特征,那么特征就有了鲁棒性(去掉了无关的噪声)。

    2.线性可分性:稀疏特征有更大可能线性可分,或者对非线性映射机制有更小的依赖。因为稀疏特征处于高维的特征空间上(被自动映射了)从流形学习观点来看(参见降噪自动编码器),稀疏特征被移到了一个较为纯净的低维流形面上。线性可分性亦可参照天然稀疏的文本型数据,即便没有隐层结构,仍然可以被分离的很好。

    3. 稠密分布但是稀疏:稠密缠绕分布着的特征是信息最富集的特征,从潜在性角度,往往比局部少数点携带的特征成倍的有效。而稀疏特征,正是从稠密缠绕区解离出来的,潜在价值巨大。

     

    潜在问题:

    强制引入稀疏零的合理性?

    诚然,稀疏性有很多优势。但是,过分的强制稀疏处理,会减少模型的有效容量。即特征屏蔽太多,导致模型无法学习到有效特征。论文中对稀疏性的引入度做了实验,理想稀疏性(强制置0)比率是70%~85%。超过85%,网络就容量就成了问题,导致错误率极高。对比大脑工作的95%稀疏性来看,现有的计算神经网络和生物神经网络还是有很大差距的。庆幸的是,ReLu只有负值才会被稀疏掉,即引入的稀疏性是可以训练调节的,是动态变化的。只要进行梯度训练,网络可以向误差减少的方向,自动调控稀疏比率,保证激活链上存在着合理数量的非零值。

    参考文献:Deep Sparse Rectifier Neural Networks

    2.局部响应归一化(LRN)

    局部归一化的动机:在神经生物学有一个概念叫做侧抑制(lateral inhibition),指的是被激活的神经元抑制相邻神经元。归一化(normalization)的目的是“抑制”,局部响应归一化就是借鉴了侧抑制的思想来实现局部抑制,尤其当我们使用relu的时候这种“侧抑制”很管用。

    好处:有利于增加泛化能力,做了平滑处理,识别率提高1~2%

    LRN层模仿生物神经系统的侧抑制机制,对局部神经元的活动创建竞争机制,使响应比较大的值相对更大,提高模型泛化能力。

    这里k,n,α,β都是超参数,一般设置k=2,n=5,α=1*e-4,β=0.75。

    公式中i表示第i个核在位置(x,y)运用激活函数Relu后的输出,n是同一位置上邻近的kernel map的数目,N是kernel的总数。

    参考:What Is Local Response Normalization In Convolutional Neural Networks?

    后期有争议,LRN基本不起作用,参考Very Deep Convolutional Networks for Large-Scale Image Recognition。

    3.重叠Pooling

    通常我们采用的都是一般的Pooling,如果设pooling的窗口大小为size*size,那么stride>size,即相邻两个pooling窗口之间是不重合的。

    而这里提到的重叠Pooling,就是stride<size,因此会造成重叠。称为重叠Pooling.

     

    另外,还有一种Pooling叫空金字塔池化(Spatial Pyramid Pooling)。参考:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。

    一般的CNN都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有作者提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把CNN扩展到任意大小的图像。

    空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征,我们可以得到1X1,2X2,4X4的池化结果,由于conv5中共有256个过滤器,所以得到1个256维的特征,4个256个特征,以及16个256维的特征,然后把这21个256维特征链接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征。

    对于不同的图像要得到相同大小的pooling结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为a*a,需要得到n*n大小的池化结果,可以让窗口大小sizeX为,步长为 。下图以conv5输出的大小为13*13为例。

    疑问:如果conv5输出的大小为14*14,[pool1*1]的sizeX=stride=14,[pool2*2]的sizeX=stride=7,这些都没有问题,但是,[pool4*4]的sizeX=5,stride=4,最后一列和最后一行特征没有被池化操作计算在内。

    SPP其实就是一种多个scale的pooling,可以获取图像中的多尺度信息;在CNN中加入SPP后,可以让CNN处理任意大小的输入,这让模型变得更加的flexible。

    4.Dropout(类似ensemble 思想)

    结合许多不同模型的预测是一种非常成功的减少测试误差的方式,但它先前训练花了好几天时间,似乎对于大型神经网络来说太过昂贵。然而,有一个非常有效的模型组合版本,它在训练中只花费两倍于单模型的时间。最近推出的叫做“dropout”的技术,它做的就是以0.5的概率将每个隐层神经元的输出设置为零。以这种方式“dropped out”的神经元既不参与前向传播,也不参与反向传播。所以每次提出一个输入,该神经网络就尝试一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,要被迫学习更为鲁棒的特征,这些特征在结合其他神经元的一些不同随机子集时有用。在测试时,我们将所有神经元的输出都仅仅只乘以0.5,对于获取指数级dropout网络产生的预测分布的几何平均值,这是一个合理的近似方法。
    前两个全连接层使用dropout。如果没有dropout,我们的网络会表现出大量的过拟合。dropout使收敛所需的迭代次数大致增加了一倍。

    理解:每次选择一半的节点进行连接构成网络,只在被选中参与连接的节点上进行正向和反向传播,如下图,左侧是全连接形式,右边是一半节点构成的网络:

    为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。

    5.数据扩充(强化数据)

    对于图像数据来说,减少过拟合问题,最早使用的同时也是最常用的方法就是,在保持数据标签不变的情况下增大数据集。这里我们使用了两种不同的方法,它们都只需要很少的计算量,因此变换后的图像并不需要存储在硬盘中,而只需要存放在内存中即可。

    (1)图像平移和翻转

    (2)调整RGB像素值

    6.在多个GPU上训练

    三、总体结构

    该网络包括八个带权层;前五层是卷积层,剩下三层是全连接层。最后一个全连接层的输出被送到一个1000-way的softmax层,其产生一个覆盖1000类标签的分布。我们的网络使得多分类的Logistic回归目标最大化,这相当于最大化了预测分布下训练样本中正确标签的对数概率平均值。

    第二、第四和第五个卷积层的核只连接到前一个卷积层也位于同一GPU中的那些核映射上(见图2)。第三个卷积层的核被连接到第二个卷积层中的所有核映射上。全连接层中的神经元被连接到前一层中所有的神经元上。响应归一化层跟在第一、第二个卷积层后面。最大Pooling层,跟在响应归一化层以及第五个卷积层之后。ReLU非线性应用于每个卷积层及全连接层的输出。
    第一个卷积层利用96个大小为11×11×3、步长为4个像素(这是同一核映射中邻近神经元的感受野中心之间的距离)的核,来对大小为224×224×3的输入图像进行滤波。第二个卷积层需要将第一个卷积层的(响应归一化及池化的)输出作为自己的输入,且利用256个大小为5×5×48的核对其进行滤波(注:48对应第一层得到的48个map,即第一层的所有map卷积生成第二层的一个map图)。第三、第四和第五个卷积层彼此相连,没有任何介于中间的pooling层与归一化层。第三个卷积层有384个大小为3×3×256的核被连接到第二个卷积层的(归一化的、池化的)输出。第四个卷积层拥有384个大小为3×3×192的核,第五个卷积层拥有256个大小为3×3×192的核。全连接层都各有4096个神经元。

    各层运算、维度和参数

  • 相关阅读:
    fastjson异常(字符串集合转成字符串数组)
    从url中下载资源(目前测试只有照片,文件类的没有进行测试)
    springboot+mybatisplus进行整合并且使用逆向工程
    maven使用
    maven-相关配置
    【深入】java 单例模式(转)
    jdbcTemplate的配置
    Spring JdbcTemplate 的使用与学习(转)
    spring 第一篇(1-1):让java开发变得更简单(下)转
    context:exclude-filter 与 context:include-filter 转
  • 原文地址:https://www.cnblogs.com/yifdu25/p/8531682.html
Copyright © 2020-2023  润新知