卷积神经网络CNN可谓是深度学习领域中较为成功的一种网络,计算机视觉一直是人工智能领域的先锋部队。ILSVRC(ImageNet Large Scale Visual Recognition Challenge),又称ImageNet比赛,是近年来机器视觉领域最受追捧也是最具权威的学术竞赛之一。ImageNet数据集是ILSVRC竞赛使用的是数据集,由斯坦福大学李飞飞教授主导,包含了超过1400万张全尺寸的有标记图片。ILSVRC中,从2010年到2017年出现了几次重要突破,从传统CV时代进入Deep Learning时代,再到超越人类水平。
由于深度学习技术的错误率已经低于人类视觉,继续举办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 这个网络虽然很小,但是它包含了深度学习的基本模块。
卷积网络的三明治结构
卷积网络结构为“卷积层(CONV),非线性层(ReLU),池化层(POOL)” C-R-P周期循环,最后由全连接层(FC)输出结果。
注:实际应用的过程中常常不限于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 block。convolutional 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 的通用公式:
围绕这一公式,有四种规范化方法。
(1)Batch Normalization —— 纵向规范化
Batch Normalization 于2015年由 Google 提出,开 Normalization 之先河。其规范化针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元 的均值和方差,因而称为 Batch Normalization。
相对于一层神经元的水平排列,BN 可以看做一种纵向的规范化。由于 BN 是针对单个维度定义的,因此标准公式中的计算均为 element-wise 的。
BN 独立地规范化每一个输入维度 ,但规范化的参数是一个 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将规范化应用于线性变换函数的权重 ,这就是 WN 名称的来源。WN 提出的方案是,将权重向量 分解为向量方向 和向量模 两部分。
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图像分类经典卷积网络
Understanding Residual Network
详解深度学习中的Normalization,BN/LN/WN