卷积神经网络CNN

卷积神经网络CNN可谓是深度学习领域中较为成功的一种网络,计算机视觉一直是人工智能领域的先锋部队。ILSVRC(ImageNet Large Scale Visual Recognition Challenge),又称ImageNet比赛,是近年来机器视觉领域最受追捧也是最具权威的学术竞赛之一。ImageNet数据集是ILSVRC竞赛使用的是数据集,由斯坦福大学李飞飞教授主导,包含了超过1400万张全尺寸的有标记图片。ILSVRC中,从2010年到2017年出现了几回重要突破,从传统CV时代进入Deep Learning时代,再到超越人类水平。html

因为深度学习技术的错误率已经低于人类视觉,继续举办ILSVRC已无心义,所以研究者的关注点由至关成熟的 image identification 转向尚待开发的 image understanding 。ILSVRC 2017 已经是最后一届举办。2018年起由WebVision竞赛(Challenge on Visual Understanding by Learning from Web Data)接棒。WebVision所使用的dataset爬取自网络,未经人工处理,难度大,更加贴近实际运用场景。算法

正是由于ILSVRC 2012挑战赛上的AlexNet横空出世,使得全球范围内掀起了一波深度学习热潮。这一年也被称做“深度学习元年”。网络

历届冠军的表现如图(摘自:ILSVRC 歷屆的深度學習模型):架构

 

要对CNN进行总结梳理,不是一件简单的事情,多少需借鉴、引用网上的一些观点(曾妄图梳理DNN的知识体系,最终以多方引用而潦草应付hhh)。本文假定读者已具有图像处理(包括卷积操做)、机器学习(包括梯度降低法)、神经网络(包括BP算法)的基本知识,笔者力图按本身的理解梳理CNN的知识体系,如有错误,烦请指出匡正。机器学习

 

基础版的CNN

最先期的CNN叫LeNet(又叫LeNet-5),是Yann LeCun等人在1998年提出。LeNet-5 这个网络虽然很小,可是它包含了深度学习的基本模块。ide

卷积网络的三明治结构

卷积网络结构为“卷积层(CONV),非线性层(ReLU),池化层(POOL)” C-R-P周期循环,最后由全链接层(FC)输出结果。wordpress

 

注:实际应用的过程当中经常不限于C-R-P循环,也有多是C-C-R-P等等。函数

卷积层

此处不详述卷积的概念(诸如卷积定理等等),大体梳理以下。性能

        

基本概念学习

卷积核:又叫过滤器。其操做如图所示,采用“席卷而积”的形式(卷积核与原图像对应位置相乘所得积相加,并遍历全图),对图像进行“滤镜处理”。卷积核其实就是一组权值(好比:3*3卷积核就是9个权值参数),须要让机器本身学出各个参数的值。

通道Channel:经过设置不一样的卷积核,能够过滤不一样的局部特征(如横线、竖线等)。所以每次卷积一般会设置多个卷积核。

卷积核大小KernelSize:通常为(2n+1)*(2n+1)大小(n为天然数),一般使用的卷积核大小为3*3和5*5(K为3或5)。GoogleNet的Inception采用了多种size的卷积核,即每次卷积让机器本身去选择合适大小的卷积核,是一个比较巧妙的方法。

步长Stride:是指卷积核每次移动的格子数。一般为移动一个像素,即S=1。

填充Padding:因为一轮卷积操做后,将会丢失边界一圈的像素信息。所以一般会事先在原图像周围填充适当大小的像素,如填充一圈0或1(P=1)。

若原图大小为M0,卷积后所得图像大小为M1,则知足如下公式:M1=(M0+P*2-K)/S+1。

 

卷积网络的特性

卷积网络的特性:稀疏链接(局部链接)、权值共享(共用卷积核)、平移不变性(空间不变、尺度不变)。

如何去理解这些特性?

咱们对一张图像的识别,会先判断局部是否具有某些特征,若是具有这些特征,咱们须要量化出来具有这种的可能性有多大(强度有多大),而过滤器(卷积核)能够帮助咱们实现这个任务。好比咱们想判断图片的某个区域是否有个“转角形状”,就把过滤器(卷积核)放在那个区域,若是过滤结果(运算结果)比较大,就说明具备“转角形状”的可能性大(结果越大,形状越匹配)。这即是局部视野的思想,也叫局部链接。

咱们的任务并非判断某个区域有没有某种形状(好比“转角形状”),由于当那个形状稍微往任意方向平移后,咱们这个过滤器就会判断失误,即便仅平移一个像素,过滤器的结果也会变小。最精确的作法是,咱们须要在任意一个区域(也就是以全部像素点为中心的区域;固然要求不那么精确的时候,咱们会加大步长 Stride)都进行相同的过滤运算(使用相同的卷积核,即便用相同的权值),这即是权值共享。

所谓的平移不变形,其实刚刚已经解释了,正是由于咱们对任意一个区域都进行了相同的过滤运算,那么不管目标在空间上怎么平移,咱们都能识别到,这就是空间上的平移不变形。另外,咱们须要可以识别不一样大小的某种形状(好比“大型的转角形状”),这个应该怎么实现呢?这种状况其实须要这么理解:在最初的几个卷积层,咱们让机器学习成“下采样”的变换层(好比卷积核的的全部参数值都为1 [好比3*3卷积核就是9个1],而且采用Stride=2 ),其实就实现了缩放,而以后的小卷积核就能顺利识别出特定的形状了。这种思想其实也是“视野”的思想,识别较大的形状(或图案),咱们须要较大的视野。

咱们从新梳理一下“视野”的思想。实际上,当咱们须要识别较复杂的图案时,咱们能够先在较小的视野(前几层)里先识别出这个图案的各个部分,而后在较大的视野(以后的几层)里综合。这其实就是:某个“较大的局部”里同时具有哪些“较小局部的特征”的组合,而且这种特定组合知足特定的空间关系。能够类比第一层的理解,以3*3卷积核为例:在某个3*3的像素区域内,同时具有哪些“像素里有较高的颜色值”,而且这些特定像素知足特定的空间关系。咱们能够看到,从第2层开始,对“局部特征提取”的理解,与第一层的理解几乎是等价的,能够用相同方式进行运算,即:都采用卷积运算。第一层和后面的几层,思想是相同的,惟一的不一样在于,视野不一样。越后面的层,视野越大,也就能识别出更宏观、更复杂的特征。

为何3*3卷积可靠?由于一切复杂的图案均可以先分红9个部分(其实4个部分就够了,也就是2*2卷积核,但3*3更方便运算,且通常认为效率更高),也就化解成了分别识别这9个部分(分解成了9个子问题),递归处理各个部分便可。这个思路有点像分治算法。其实能够认为,卷积神经网络,就是分治算法的逆运算的一个典型案例。

 

多通道、多卷积核的卷积运算

以前咱们的理解都是基于单通道、单卷积核。那么多通道、多卷积核是什么状况呢?

首先看看多通道的输入的状况。对于第一层来讲,多通道就是指多个颜色通道(RGB对应了3个通道),对于以后的层来讲,多通道就是指输入有多个特征图。对于同一个卷积核来讲,咱们须要对每一个通道都进行卷积运算,而后将全部通道的运算结果相加,获得一张特征图,做为输出。好比须要是被出一个“X”,咱们能够设计一个“对角线”卷积核;而图像中“X”的上面部分为红色,下面部分为绿色,若使用单通道,则没法识别出完整的“X”,此时若是将各个通道的结果相加汇总,则能够识别出目标。

而后看看多卷积核的状况。若是使用多个卷积核,都进行上述运算,则能够获得多张特征图的输出。特征图的数目,也就是下一层的通道数。为何同一层须要多个卷积核,由于咱们须要同时提取不一样类型的“形状”。所以,指定某个层的输出通道数(输出特征图数目),也就指定了该层的卷积核数,也就等价于指定了该层须要提取的特征的种类数目。

注意两种说法。第一种说法:咱们平时说卷积核是三维的,实际上是“三维复制”的,咱们为了方便运算,将二维的卷积核复制几层,就获得了三维卷积核(在不一样通道上进行相同的卷积运算)。也就是说,同一个卷积层具备多个三维卷积核。第二种说法:三维的卷积核不是“复制而来的”,而是多个不一样的卷积核组合而来,在这种说法下,同一层就是一个三维卷积核,卷积核的深度与输出通道数相等。两种说法是等价的,都没错,认真理解一下就知道了。为了不概念混淆,以后的内容中,本文统一采用第二种说法来说解。

 

1*1卷积核

在 ResNet 中,咱们会遇到 1*1卷积核,如何理解这种卷积核呢?

1*1卷积核不影响图像的长宽尺寸,只影响深度。1*1卷积核并非一层卷积核,而是有深度的,咱们设置不一样的深度(二维卷积核的个数),也就指定好了输出特征图的个数。所以1*1卷积核实际上对通道数进行了改变。但实际上并不仅是仅仅改变了通道数,1*1卷积核以后还会接一个非线性变换,所以信息的变换并不单调,有时候也会产生有意义的特征提取操做。可是,通常不会连续串联两个1*1卷积核,由于特征提取是低效的,毕竟特征提取仍是主要得依赖于3*3卷积核。

 

非线性层

又叫激活层,把卷积层输出结果作非线性映射。

CNN采用的激活函数通常为ReLU(Rectified Linear Unit,修正线性单元),它的特色是收敛快,求梯度简单,图像以下(小于0部分函数值为0,大于0部分为正比例函数)。ReLU是2012年AlexNet中开始使用,属于CNN进化的形式。ReLU这个激活层能够加速网络的训练,能够比sigmoid和tanh更利于梯度传播(sigmoid容易形成梯度消失。其实梯度消失也是与计算机的数值存储有关,当数字足够接近0时,计算机会直接断定为0)。

另外,我感受,ReLU有一个天然的特性,就是能够过滤信号噪声。怎么理解这个信号噪声呢?好比咱们要识别一个“转角形状”,采用“转角型”卷积核,卷积运算后,对于计算结果较大的区域,咱们认为这个形状极可能存在,而对于计算结果较小的,那么基本认为该区域不存在这个形状,保留这个信号是没有必要的,保留下来反而成为噪声,此时用ReLU就正好能够直接过滤掉这种状况。可是有人说,ReLU只过滤负数值啊,其实在卷积运算是有偏置项的(w0常数项),而且卷积核里的数也能够为负数,好比设定“须要有像素的位置”为正数权值,“不须要有像素的位置”为负数权值。这些参数都是须要让机器本身去学习的。

非线性层的实践经验:
  ①不要用sigmoid!不要用sigmoid!不要用sigmoid!
  ② 首先试 ReLU,由于快,但要当心点
  ③ 若是2失效,请用Leaky ReLU或者Maxout
  ④ 某些状况下 tanh 却是有不错的结果,可是不多

池化层

池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减少过拟合。
简而言之,若是输入是图像的话,那么池化层的最主要做用就是压缩图像。

池化层用的方法有Max pooling 和 Average pooling,而实际用的较多的是Max pooling。前辈们的既往训练经验来看,Max pooling的效果更好。其实这也是符合特征提取的思路的,由于我须要知道某个区域里是否有某种特征(只要某个局部存在激活值 [ 像素值 ] 大于某个阈值,咱们就认为极可能存在这种特征),而不须要知道某个区域内存在某个特征的平均几率(稍微琢磨下就能有这种感受)。另外,ReLU其实也有这种“阈值”的思想,这些“简单哲学思想”都是相通的(效果好也是有缘由的)。笔者喜欢把这种思想成为“CNN中的MAX思想”。

 

基本优化

防止过拟合

在机器学习中,防止过拟合也是一个很是重要的问题。最经典的是引入正则化(此处不赘述)、早停等方法,而深度学习中更经常使用的是Dropout策略(固然以后还有Batch Norm策略)。Dropout是借鉴bagging和ensembling思想,一个网络中集成多个网络,通常用在全链接层,防止网络过拟合,提高泛化性能。

在2012年,Alex、Hinton在其论文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止过拟合(Dropout最先是Hilton在其另外一篇论文中提出)。而且,这篇论文提到的AlexNet网络模型引爆了神经网络应用热潮,并赢得了2012年图像识别大赛冠军,使得CNN成为图像分类上的核心算法模型。

Dropout能够做为训练深度神经网络的一种trick供选择。在每一个训练批次中,经过忽略一半的特征检测器(让一半的隐层节点值为0),能够明显地减小过拟合现象。这种方式能够减小特征检测器(隐层节点)间的相互做用,检测器相互做用是指某些检测器依赖其余检测器才能发挥做用。

Dropout说的简单一点就是:咱们在前向传播的时候,让某个神经元的激活值以必定的几率p中止工做,这样可使模型泛化性更强,由于它不会太依赖某些局部的特征,如图所示。   
   

Dropout须要设置一个“屏蔽几率”P做为参数,通常设置为0.5或0.3。具体原理及实现,此处不展开。但注意,Dropout仅用于训练阶段,而测试阶段应恢复成标准网络。

 

优化算法

深度学习的优化算法主要有GD,SGD,Momentum,RMSProp、Adam和Adagrad算法等等。

 

GD和SGD是最基础的,此处不赘述。粗略讲讲其余几种优化方法。

Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在必定程度上保留以前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,能够在必定程度上增长稳定性,从而学习地更快,而且还有必定摆脱局部最优的能力。

既往的方法中,对于每个参数θi的训练都使用了相同的学习率α。Adagrad算法可以在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。所以,Adagrad很是适合处理稀疏数据。

RMSprop是Geoff Hinton提出的一种自适应学习率方法(调整学习率,咱们经常但愿学习率先大后小)。Adagrad会累加以前全部的梯度平方,而RMSprop仅仅是计算对应的平均值,所以可缓解Adagrad算法学习率降低较快的问题。

Adam(Adaptive Moment Estimation)是另外一种自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每一个参数的学习率。Adam的优势主要在于通过偏置校订后,每一次迭代学习率都有个肯定范围,使得参数比较平稳。Adam结合了Momentum和RMSprop的优势。在计算资源足够时,推荐使用Adam算法

具体的每种优化方法的原理和实现,请自行寻找资料。上面两个动图体现的是各类方法的优化过程的形象展现。

 

CNN进化史

 ILSVR竞赛中历年的算法表现,便是一部CNN的进化史:LeNet → AlexNet → ZFNet → GoogLeNet → ResNet → SENet。此处主要介绍影响重大的几个:AlexNet,GoogLeNet与VGGNet,和ResNet。

AlexNet是Alex和Hinton等人在2012年提出的,在ILSVRC2012中赢得第一,CV领域今后进入深度学习时代。该模型由5层卷积层和3层全链接层组成,其中还有池化层。该论文中有不少观点和技巧直到今天依然有用或者启发人们。分组卷积、数据加强、Dropout、ReLU这些,基本成为构建卷积网络的必要模块。
   

 

VGGNet-16/19是牛津大学VGG提出,是基于网络加深会加强表征能力的思路,得到ILSVRC2014亚军。VGG16包含16层,VGG19包含19层。一系列的VGG在最后三层的全链接层上彻底同样,总体结构上都包含5组卷积层,卷积层以后跟一个MaxPool。所不一样的是5组卷积层中包含的级联的卷积层愈来愈多。不近网络层数加深,VGG在训练的过程当中也比AlexNet收敛的要快一些。简而言之,VGG最大的特色就“更深”!

GoogLeNet是基于多尺度特征融合的思路,先设计Inception模块,后堆叠这些模块构成分类网络。论文中使用的辅助分类器(图中前两个黄色的矩形框)思路是为了解决深层网络网络难以训练的问题。Kaiming(ResNet的第一做者)总结了三点,第一点是Inception模块中的多分支(多种size的kernel);第二点是shortcuts:单独1*1卷积分支;第三点是bottlenecks:先进行1*1卷积降维,再升维。

ResNet由微软研究院Kaiming He等人提出,由Residual block构成。其经过使用ResNet Unit成功训练出了152层的神经网络,在ILSVRC2015中得到冠军。深度残差学习思想成为了学术界和工业界的标准。ResNet解决了深度学习中梯度消失这个大难题,使得深度大大加深,有效的上百层的网络成为现实,也进一步证实了“更深的网络确实能使模型的准确度更高”。下文将重点介绍ResNet的思想。

 

ResNet

残差网络已成为目前CNN的标配。DeepMind大名鼎鼎的AlphaZero亦采用了ResNet的策略。ResNet由微软研究院Kaiming He、Xiangyu Zhang、Shaoqing Ren和Jian Sun这4名华人提出。

ResNet的推广性很是好,甚至能够直接用到InceptionNet网络中。ResNet的主要思想是在网络中增长了直连通道,即Highway Network的思想。此前的网络结构是性能输入作一个非线性变换,而Highway Network则容许保留以前网络层的必定比例的输出。ResNet的思想和Highway Network的思想也很是相似,容许原始输入信息直接传到后面的层中。这样的话这一层的神经网络能够不用学习整个的输出,而是学习上一个网络输出的残差,所以ResNet又叫作残差网络。

咱们知道,在计算机视觉里,特征的“等级”随增网络深度的加深而变高,研究代表,网络的深度是实现好的效果的重要因素。然而梯度消失/爆炸成为训练深层次的网络的障碍,致使没法收敛。VGG网络达到19层后再增长层数就开始致使分类性能的降低。而Resnet做者则想到了常规计算机视觉领域经常使用的residual representation的概念,并进一步将它应用在了CNN模型的构建当中,因而就有了基本的residual learning的block。它经过使用多个有参层来学习输入输出之间的残差表示,而非像通常CNN网络(如Alexnet/VGG等)那样使用有参层来直接尝试学习输入、输出之间的映射。

 

残差网络的确解决了退化的问题,在训练集和校验集上,都证实了的更深的网络错误率越小。

Identity Block和 Convolutional Block

根据输入x和子网络F(x)输出维度的不一样,ResNet的模块设计(Skip Connetion 种类)可分为两种实现:Identity Block和Convolutional Block。

The idenetity block
当输入x和子网络F(x)输出维度相同时,能够直接将而两者进行相加,以下图所示。

上面那条路径就是shortcut或者说skip connection,下面是普通main path

The convolutional block
当输入x和子网络F(x)输出维度不一样时,经过一个卷积将两者维度转换为相同,网络结构如图所示。

 

论文中有两种Identity Block的设计,以下图所示。在训练浅层网络的时候,咱们选用左边这种,而若是网络较深(大于50层)时,会考虑使用右边这种(bottleneck),这两个设计具备类似的时间复杂度。

右边这种考虑到计算的成本,对残差块作了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1, 以下图。新结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减小了计算,而后在另外一个1x1的卷积层下作了还原,既保持了精度又减小了计算量。

左边是一种简单的实现被称做building block,每一个main path(原论文中称做plain network),这里有两层网络构成,都是 3 x 3 的卷积网络,第一个卷积以后紧跟着是一个Relu。
右边的网络是另外一种实现,称做bottleneck building block,为何称做bottleneck呢,由于这个plain network,先后两层用的是1 x 1卷积网络,这种卷积是最小、最细的结构,所以被称做bottleneck(我的看法)。这里 1 x 1卷积网络是用来下降和增长feature map维度。plain network中卷积以后(除了最后一个卷积)会跟着一个BN层,用来加速训练。

ResNet的架构

先看一张图和一个表

      

      

这两张图能够帮助咱们直观理解ResNet的架构。第一张图的“34-layer residual”对应的就是下面表格。咱们这里有“大层”和“小层”的区别,大层包含几个小层。好比上图中的不一样颜色表明不一样的“大层”,表格中的不一样行表明不一样的“大层”。图中的虚线表示convolutional block,实线表示idenetity blockconvolutional block能够出现图片尺寸的变换,而idenetity block则不会。由图可知,ResNet-34 其实的中间32层,其实只进行了3次尺寸的变换(图片的长和宽变换),通常这些convolutional block处于“大层”的第一层。另外,ResNet-50 中间的48层中,共出现了4个convolutional block,也就是那4个大层的第一小层。

 

Batch Normalization

这一部分摘自:Batch Normalization原理与实战详解深度学习中的Normalization,BN/LN/WN

Batch Normalization(简称Batch Norm或BN)是当前CNN中常常采用的技巧,本意是正规化(或数据归一化,区别于“正则化”),可是BN还具有防止过拟合的功能,采用BN技巧的网络甚至能够不使用Dropout策略。

问题的提出:

网络中层与层之间的关联性会致使以下的情况:随着训练的进行,网络中的参数也随着梯度降低在不停更新。一方面,当底层网络中参数发生微弱变化时,因为每一层中的线性变换与非线性激活映射,这些微弱变化随着网络层数的加深而被放大(相似蝴蝶效应);另外一方面,参数的变化致使每一层的输入分布会发生改变,进而上层的网络须要不停地去适应这些分布变化,使得咱们的模型训练变得困难。上述这一现象叫作Internal Covariate Shift。

Batch Normalization的原论文做者给了Internal Covariate Shift一个较规范的定义:在深层网络训练的过程当中,因为网络中参数变化而引发内部结点数据分布发生变化的这一过程被称做Internal Covariate Shift。(具体的解释清参考原论文或网上其余资料)

Internal Covariate Shift (ICS)带来的问题:

(1)上层网络须要不停调整来适应输入数据分布的变化,致使网络学习速度的下降;

(2)网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度。

解决ICS的两种思路:Whitening (白化) 和 Batch Normalization。白化是机器学习中的技巧,在深度网络中仍然存在缺陷(如反向传播是不必定可导),不是本文的重点,请自行查找资料。

在深度学习中,因为采用full batch的训练方式对内存要求较大,且每一轮训练时间过长;咱们通常都会采用对数据作划分,用mini-batch对网络进行训练。所以,Batch Normalization也就在mini-batch的基础上进行计算。

      

Normalization 的通用公式:

      h=f(g*\frac{x-\mu}{\delta }+b)

围绕这一公式,有四种规范化方法。

(1)Batch Normalization —— 纵向规范化

Batch Normalization 于2015年由 Google 提出,开 Normalization 之先河。其规范化针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元 x_i 的均值和方差,于是称为 Batch Normalization。

相对于一层神经元的水平排列,BN 能够看作一种纵向的规范化。因为 BN 是针对单个维度定义的,所以标准公式中的计算均为 element-wise 的。

      

BN 独立地规范化每个输入维度 x_i ,但规范化的参数是一个 mini-batch 的一阶统计量和二阶统计量。这就要求 每个 mini-batch 的统计量是总体统计量的近似估计,或者说每个 mini-batch 彼此之间,以及和总体数据,都应该是近似同分布的。分布差距较小的 mini-batch 能够看作是为规范化操做和模型训练引入了噪声,能够增长模型的鲁棒性;但若是每一个 mini-batch的原始分布差异很大,那么不一样 mini-batch 的数据将会进行不同的数据变换,这就增长了模型训练的难度。

所以,BN 比较适用的场景是:每一个 mini-batch 比较大,数据分布比较接近。在进行训练以前,要作好充分的 shuffle. 不然效果会差不少。

(2)Layer Normalization —— 横向规范化

层规范化就是针对 BN 的上述不足而提出的。与 BN 不一样,LN 是一种横向的规范化,如图所示。它综合考虑一层全部维度的输入,计算该层的平均输入值和输入方差,而后用同一个规范化操做来转换各个维度的输入。

      

LN 针对单个训练样本进行,不依赖于其余数据,所以能够避免 BN 中受 mini-batch 数据分布影响的问题,能够用于 小mini-batch场景、动态网络场景和 RNN,特别是天然语言处理领域。此外,LN 不须要保存 mini-batch 的均值和方差,节省了额外的存储空间。

可是,BN 的转换是针对单个神经元可训练的——不一样神经元的输入通过再平移和再缩放后分布在不一样的区间,而 LN 对于一整层的神经元训练获得同一个转换——全部的输入都在同一个区间范围内。若是不一样输入特征不属于类似的类别(好比颜色和大小),那么 LN 的处理可能会下降模型的表达能力。

(3)Weight Normalization —— 参数规范化

WN将规范化应用于线性变换函数的权重 \bold{w} ,这就是 WN 名称的来源。WN 提出的方案是,将权重向量 \bold{w} 分解为向量方向 \hat{\bold{v}} 和向量模 g 两部分。

      

BN 和 LN 是用输入的特征数据的方差对输入数据进行 scale,而 WN 则是用 神经元的权重的欧氏范式对输入数据进行 scale。虽然在原始方法中分别进行的是特征数据规范化和参数的规范化,但本质上都实现了对数据的规范化,只是用于 scale 的参数来源不一样。

(4)Cosine Normalization —— 余弦规范化

CN本文不展开叙述,简单提一下。

CN 经过用余弦计算代替内积计算实现了规范化。但成也萧何败萧何。原始的内积计算,其几何意义是 输入向量在权重向量上的投影,既包含 两者的夹角信息,也包含 两个向量的scale信息。去掉scale信息,可能致使表达能力的降低,所以也引发了一些争议和讨论。具体效果如何,可能须要在特定的场景下深刻实验。

 

从另外一个角度来看,Normalization可也分为:BatchNorm(2015年)、LayerNorm(2016年)、InstanceNorm(2017年)和GroupNorm(2018年)。

将输入的图像shape记为[N, C, H, W](如图),这几个方法主要的区别就是在:

  • BatchNorm是在batch上,对NHW作归一化,对小batchsize效果很差;
  • LayerNorm在通道方向上,对CHW归一化,主要对RNN做用明显;
  • InstanceNorm在图像像素上,对HW作归一化,用在风格化迁移;
  • GroupNorm将channel分组,而后再作归一化。

 

BN的优点:

(1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度

(2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定

(3)BN容许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题

(4)BN具备必定的正则化效果

 

对于第二个优点的理解:其实能够画一个二维参数的损失函数图(第三维 [ 损失值 ] 用等高线表示),当不一样变量的方差差距很大时,损失函数会显得很扁(很椭圆。当两者方差近似时接近正圆形)。因为梯度降低的方向是沿着切线的垂直方向,所以会先优先沿着短轴方向降低梯度,而长轴方向的降低比较慢,而且短轴方向会出现梯度降低的震荡效果,从而总体的梯度降低的效率很低。一个观点很重要:因为梯度降低的思想不可替代,所以不少优化都是围绕梯度降低来进行的。

 

基于如上技巧,最终ResNet的类型有以下几种:

附一张ResNet立体模式图:


 

 

参考治疗:

「Deep Learning」ILSVRC2012-2017图像分类经典卷积网络

ILSVRC 歷屆的深度學習模型

【深度学习】卷积神经网络的实现与理解

卷积神经网络CNN总结

resnet原理详解

Understanding Residual Network

Batch Normalization原理与实战

详解深度学习中的Normalization,BN/LN/WN