本文主要是介绍深度学习中的Normalization模型(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
上次我们主要介绍了Batch Normalization,今天接下去介绍其他的正则化方法。
四.Layer Normalization、Instance Normalization及Group Normalization
4.1 Layer Normalization
为了能够在只有当前一个训练实例的情形下,也能找到一个合理的统计范围,一个最直接的想法是:MLP的同一隐层自己包含了若干神经元;同理,CNN中同一个卷积层包含k个输出通道,每个通道包含m*n个神经元,整个通道包含了k*m*n个神经元;类似的,RNN的每个时间步的隐层也包含了若干神经元。那么我们完全可以直接用同层隐层神经元的响应值作为集合S的范围来求均值和方差。这就是Layer Normalization的基本思想。图11、图12和图13分示了MLP、CNN和RNN的Layer Normalization的集合S计算范围,因为很直观,所以这里不展开详述。
图11. MLP中的LayerNorm
图12. CNN中的LayerNorm
图13. RNN中的LayerNorm
前文有述,BN在RNN中用起来很不方便,而Layer Normalization这种在同隐层内计算统计量的模式就比较符合RNN这种动态网络,目前在RNN中貌似也只有LayerNorm相对有效,但Layer Normalization目前看好像也只适合应用在RNN场景下,在CNN等环境下效果是不如BatchNorm或者GroupNorm等模型的。从目前现状看,动态网络中的Normalization机制是非常值得深入研究的一个领域。
4.2 Instance Normalization
从上述内容可以看出,Layer Normalization在抛开对Mini-Batch的依赖目标下,为了能够统计均值方差,很自然地把同层内所有神经元的响应值作为统计范围,那么我们能否进一步将统计范围缩小?对于CNN明显是可以的,因为同一个卷积层内每个卷积核会产生一个输出通道,而每个输出通道是一个二维平面,也包含多个激活神经元,自然可以进一步把统计范围缩小到单个卷积核对应的输出通道内部。图14展示了CNN中的Instance Normalization,对于图中某个卷积层来说,每个输出通道内的神经元会作为集合S来统计均值方差。对于RNN或者MLP,如果在同一个隐层类似CNN这样缩小范围,那么就只剩下单独一个神经元,输出也是单值而非CNN的二维平面,这意味着没有形成集合S,所以RNN和MLP是无法进行Instance Normalization操作的,这个很好理解。
图14 CNN中的Instance Normalization
我们回想下图8代表的CNN中的Batch Normalization,可以设想一下:如果把BN中的Batch Size大小设定为1,此时和Instance Norm的图14比较一下,是否两者是等价的?也就是说,看上去Instance Normalization像是Batch Normalization的一种Batch Size=1的特例情况。但是仔细思考,你会发现两者还是有区别的,至于区别是什么读者可自行思考。
Instance Normalization对于一些图片生成类的任务比如图片风格转换来说效果是明显优于BN的,但在很多其它图像类任务比如分类等场景效果不如BN。
4.3 Group Normalization
从上面的Layer Normalization和Instance Normalization可以看出,这是两种极端情况,Layer Normalization是将同层所有神经元作为统计范围,而Instance Normalization则是CNN中将同一卷积层中每个卷积核对应的输出通道单独作为自己的统计范围。那么,有没有介于两者之间的统计范围呢?通道分组是CNN常用的模型优化技巧,所以自然而然会想到对CNN中某一层卷积层的输出或者输入通道进行分组,在分组范围内进行统计。这就是Group Normalization的核心思想,是Facebook何凯明研究组2017年提出的改进模型。
图15展示了CNN中的Group Normalization。理论上MLP和RNN也可以引入这种模式,但是还没有看到相关研究,不过从道理上考虑,MLP和RNN这么做的话,分组内包含神经元太少,估计缺乏统计有效性,猜测效果不会太好。
图15. CNN中的Group Normalization
Group Normalization在要求Batch Size比较小的场景下或者物体检测/视频分类等应用场景下效果是优于BN的。
4.4 用一个故事来总结
为了能够更直观地理解四种Normalization的异同,大家可以体会下面的故事以做类比:
很久很久以前,在遥远的L国内有一个神奇的理发馆,理发馆里面有很多勤劳的理发师,来这里理发的顾客也很奇特,他们所有人都会要求理发师(神经元)理出和其他人差不多长的头发(求均值)。那么和其他人差不多长究竟是多长呢?这可难不倒我们可爱又聪明的理发师,于是理发师把自己最近24个小时服务过的顾客(Mini-Batch)进入理发店时的头发长度求个平均值,这个均值就是“和其他人差不多长”的长度。来这里的每个顾客都很满意,时间久了,人们尊称这些理发师为:BatchNorm理发师。
不幸总是突然的,有一天,理发馆里发生了一件怪事,所有理发师的记忆只能维持1分钟,他们再也记不住过去24小时中发生的事情了,自然也记不住过去服务客人的头发长度。但是每个顾客仍然要求剪出和其他人差不多长的头发长度,这可怎么办?聪明的理发师们又想出了一个办法:他们相互大声报出同一时刻在理发馆里自己手上客人的头发长度,每个理发师就可以用这些人的头发长度均值作为满足自己手上客人条件的长度。尽管这是一群得了失忆综合证的理发师,但是顾客对他们的服务仍然非常满意,于是人们改称他们为:LayerNorm理发师。
不幸总是突然的,有一天,理发馆里又发生了一件怪事,理发师们不仅得了失忆症,这次都突然失聪,再也听不到其它理发师的口头通知,而固执的客人仍然坚持要理出“和其他人差不多长”的头发。对了,忘了介绍了,理发馆是有隔间的,每个隔间有K个理发师同时给顾客理发,虽然我们可爱又聪明的理发师现在失忆又失聪,但是再大的困难也难不倒也叫不醒这群装睡的人,他们醒来后群策群力又发明了一个新方法:同一个隔间的理发师通过相互打手势来通知其它理发师自己手上顾客的头发长度。于是同一个隔间的理发师又可以剪出顾客满意的头发了。人们称这些身残志坚的理发师为:GroupNorm理发师。
不幸总是突然的,有一天,理发馆里又发生了一件怪事,不过这次不是天灾是人祸,理发馆老板出于好心,给每位理发师单独开个办公室给顾客理发,但是好心办了坏事,这样一来,失忆失聪又无法相互打手势的理发师们怎么应对顽固的顾客呢?怎样才能继续理出“和其他人差不多长”的头发呢?想必一般人这个时候基本无路可走了,但是我们可爱又聪明,同时失聪又失忆的理发师仍然想出了解决办法:他们看了看客人头上的头发,发现不同地方有长有短,于是就把同一个客人所有头发的平均长度作为难题的答案(CNN的InstanceNorm)。听起来这个解决方案匪夷所思,但是出人意料的是,有些客人居然仍然非常满意。人们管这些传说中的神奇理发师为:InstanceNorm理发师。
五.Normalization操作的Re-Scaling不变性
我们知道,当神经网络深度加深时,训练有较大困难,往往其原因在于随着网络加深,在反向传播训练模型时,存在梯度爆炸或者梯度消失问题,Loss信息不能有效传导到低层神经网络参数,所以导致参数无法更新,模型无法收敛或者收敛速度慢。而很多环节可能导致梯度爆炸或者梯度消失问题,比如非线性函数及其导数是什么形式以及网络参数是否过大过小等,以非线性函数来说,比如RELU是能极大缓解这个问题的(因为它的导数是个常数),这也是为何目前RELU大行其道的根本原因。从神经网络参数角度看,如果神经网络中的参数具备Re-Scaling 不变性,意味着参数值过大或者过小对神经元输出没什么影响,无疑这对缓解梯度爆炸或者梯度消失也有极大帮助作用,而Normalization确实具备几个不同角度的Re-Scaling不变性,这也许是Normalization为何应用在深度学习有效的原因之一,虽然可能并非本质原因。本节即讲述Normalization为何具备Re-Scaling 不变性这种优良特性。
我们考虑神经网络中的三种Re-Scaling情形:权重向量(Weight Vector)Re-Scaling,数据Re-Scaling和权重矩阵(Weight Matrix)Re-Scaling。
图16. 权重向量Re-Scaling
对于网络中某个神经元i来说,其对应的边权重向量假设为Wi,所谓权重向量(Weight Vector)Re-Scaling,就是将Wi乘上一个缩放因子φ,如果神经元i在进行权重向量 Re-Scaling之前和之后两种不同情况下做Normalization操作,若Normalization之后神经元i对应的激活值没发生变化,我们就说这种Normalization具备权重向量Re-Scaling不变性(参考图16)。
图17. 数据Re-Scaling
所谓数据Re-Scaling,指的是把输入X乘上一个缩放因子φ,同样的,如果对输入做缩放前后两种情况下进行Normalization操作,若Normalization之后所有隐层神经元对应的激活值没发生变化,我们说这种Normalization具备数据Re-Scaling不变性(参考图17)。
图18. 权重矩阵 Re-Scaling
而权重矩阵 Re-Scaling指的是:对于某两个隐层(L层vs L+1层)之间的所有边的权重参数Wi同时乘上相同的缩放因子φ,如果在权重矩阵 Re-Scaling之前和之后两种情形下对(L+1)层隐层神经元做Normalization操作,若两种情况下隐层所有神经元激活值没有变化,我们说这种Normalization具备权重矩阵 Re-Scaling不变性(参考图18)。
在了解了三种Re-Scaling的含义及Normalization对应的三种不变性特性后,我们先归纳各种Normalization操作所对应的三种Re-Scaling的不变性特性如下表所示(Layer Normalization原始论文分析了LayerNorm及BatchNorm的Re-Scaling不变性,本文作者补充了InstanceNorm及GroupNorm的情况以及细化了推导过程):
由表中可见,这四种不同的Normalization操作都同时具备权重矩阵Re-Scaling不变性和数据Re-Scaling不变性,但是不同的操作在权重向量Re-Scaling不变性这方面有差异,Batch Norm和Instance Norm具备权重向量Re-Scaling不变性,而另外两种Normalization不具备这个特性。
我们以Batch Normalization为例来说明为何BN具备权重向量Re-Scaling不变性。
对于某个神经元i的激活a来说,其值为:
(对于MLP和CNN来说,是一样的,都是这个公式,区别在于CNN是局部连接,MLP是全局连接,也就是说只有wi的数量规模不同而已。)
其中,Wi是与神经元i相连的边权重向量(Weight Vector),X是输入数据或是多层网络中前一层的输出向量,bi是偏置。我们可以把偏置看作输入数据值为1的特殊边的权重,所以可以并入前项,简写上述公式为:
现在假设我们开始re-scale边权重向量Wi,使得这些边的权重缩放因子为φ,其对应的新的激活得到相同的缩放比例:
而边的权重缩放后对应的均值变为:
也就是说均值也被同比例缩放,这里的关键是因为BN的统计量取值范围是来自于同一个Mini-Batch的实例,所以经过的是用一个神经元,于是对应了相同的边权重向量,那么缩放因子相同,就可以提到求和公式之外。
类似的,如果我们忽略噪音因子,边权重缩放后对应的方差变为:
可见方差也被同比例缩放,因为
这是为何说BN具备权重向量Re-Scaling不变性的原因。
类似的,BN也具备数据Re-Scaling不变性,其推导过程与上述推导过程基本一样。因为如果将原始输入X乘以缩放因子,等价于某个神经元i的激活变为
其余推导类似上述的权重向量ReScaling的后续推导过程,其对应的均值和方差也会同比例缩放,于是得到了BN的数据Re-Scaling不变性。
同样的,很容易推出BN也具备权重矩阵Re-Scaling不变性,因为权重矩阵中所有边权重会使用相同的缩放因子φ,意味着某个隐层所有神经元对应的权重向量都使用相同的缩放因子,而在进行BN操作时,同隐层内的神经元相互独立没什么关系,因为上面推导了对于某个神经元i来说,其具备权重向量Re-Scaling不变性,所以对于所有隐层神经元来说,整个权重矩阵缩放后,任意神经元的激活与未缩放时相同,所以BN具备权重矩阵Re-Scaling不变性。
对于其它三类Normalization,也就是Layer Norm/Instance Norm/Group Norm来说,都同时具备权重矩阵 Re-Scaling不变性及数据Re-Scaling不变性,推导过程也与上述推导过程类似,此处不赘述。
那么为何Layer Norm不具备权重向量Re-Scaling不变性呢?因为Layer Norm是在同隐层的神经元之间求统计量,我们考虑一种比较极端的情况,假设MLP的隐层只包含两个神经元:神经元i和神经元j,而神经元i对应的边权重向量Wi缩放因子是 φ ,神经元j对应的边权重向量Wi缩放因子是φ。于是得出各自经过缩放后的激活值为:
对应的缩放后的均值为:
均值是无法提出公共缩放因子的,类似的方差也提不出公共缩放因子,所以不具备权重向量Re-Scaling不变性。那这又是为什么呢?根本原因是要进行求统计量计算的范围不是同一个神经元,而是不同的神经元,而每个神经元对应权重向量缩放因子不同,所以难以抽出公共缩放因子并相互抵消。除非同一隐层所有隐层神经元共享相同的缩放因子,这个情形其实就是权重矩阵 Re-Scaling能够满足的条件,所以可以看出Layer Norm具备权重矩阵 Re-Scaling不变性而不具备权重向量Re-Scaling不变性。Group Norm也是类似情况。
六.Batch Normalization为何有效
正如上文所述,BN在提出后获得了巨大的成功,目前在各种深度学习场景下广泛应用,因为它能加快神经网络收敛速度,不再依赖精细的参数初始化过程,可以使用较大的学习率等很多好处,但是我们应该意识到,所讲的这些好处仅仅是引用BN带来的结果,那么更深层次的问题是:为什么BN能够给深度学习带来如此多的优点呢?它背后起作用的深层原因是什么呢?上文尽管从Normalization操作的Re-Scaling不变性角度有所说明,但其实还有更深层或更本质的原因。
原始的BN论文给出的解释是BN可以解决神经网络训练过程中的ICS(Internal Covariate Shift)问题,所谓ICS问题,指的是由于深度网络由很多隐层构成,在训练过程中由于底层网络参数不断变化,导致上层隐层神经元激活值的分布逐渐发生很大的变化和偏移,而这非常不利于有效稳定地训练神经网络。
图19. BN和ICS问题的关系
但是能够解决ICS问题其实并不是BN为何有效背后真正的原因,最近有一些研究对此作了探讨。那么ICS问题真实存在吗?ICS问题在较深的网络中确实是普遍存在的,但是这并非导致深层网络难以训练的根本原因。另外,BN解决了ICS问题了吗?其实也没有。实验一方面证明:即使是应用了BN,网络隐层中的输出仍然存在严重的ICS问题;另一方面也证明了:在BN层输出后人工加入噪音模拟ICS现象,并不妨碍BN的优秀表现(参考图19)。这两方面的证据互相佐证来看的话,其实侧面说明了BN和ICS问题并没什么关系。
图20. 损失曲面
那么BN有效的真正原因到底是什么呢?这还要从深度网络的损失曲面(Loss Surface)说起,在深度网络叠加大量非线性函数方式来解决非凸复杂问题时,损失曲面形态异常复杂,大量空间坑坑洼洼相当不平整(参考图20),也有很多空间是由平坦的大量充满鞍点的曲面构成,训练过程就是利用SGD在这个复杂平面上一步一步游走,期望找到全局最小值,也就是曲面里最深的那个坑。所以在SGD寻优时,在如此复杂曲面上寻找全局最小值而不是落入局部最小值或者被困在鞍点动弹不得,可想而知难度有多高。
有了损失曲面的基本概念,我们回头来看为何BN是有效的。研究表明,BN真正的用处在于:通过上文所述的Normalization操作,使得网络参数重整(Reparametrize),它对于非线性非凸问题复杂的损失曲面有很好的平滑作用,参数重整后的损失曲面比未重整前的参数损失曲面平滑许多。我们可以用L-Lipschitz函数来评估损失曲面的平滑程度,L-Lipschitz函数定义如下:
含义也很直观,对于定义区间内的任意取值x1和x2,用它们的距离去和经过函数映射后的值(就是深度网络表达的损失函数)的距离进行比较,如果存在值L满足上述公式条件,也就是说函数映射后的距离一定在任意两个x差值的L倍以内,那么这个函数称为L-Lipschitz函数。而L的大小代表了函数曲面的平滑程度,很明显,L越小曲面越平滑,L越大,则曲面越凹凸不平,时而高峰时而波谷不断颠倒跳跃。举个例子,假设你一出门迈出一步才1米
,就突然掉到一个100米深的深沟
,那么要满足公式条件,L最小得是100;而假设你一出门迈出一步(
)踏上了一个0.3米的小台阶
,那么L最小等于0.3即可。
图21. 带BN与不带BN操作的L-Lipschitz情况
图21展示了用L-Lipschitz函数来衡量采用和不采用BN进行神经网络训练时两者的区别,可以看出未采用BN的训练过程中,L值波动幅度很大,而采用了BN后的训练过程L值相对比较稳定且值也比较小,尤其是在训练的初期,这个差别更明显。这证明了BN通过参数重整确实起到了平滑损失曲面及梯度的作用。
前文提到了Normalization对参数的Re-Scaling不变性,这也是参数重整达到的效果之一,所以也许其Re-Scaling特性和Loss曲面平滑作用是Normalization的一体两面,共同发挥作用或者其实本身是一回事。事实的真相很可能是:Normalization通过对激活值进行正态分布化的参数重整,产生参数Re-Scaling不变的效果,因此缓解梯度消失或梯度爆炸问题,与其对应的重整后的损失曲面及梯度也因此变得更平滑,更有利于SGD寻优找到问题好的解决方案。当然这只是本文作者根据几方面研究现状做出的推测,目前并没有相关实证研究,还请读者谨慎对待此观点。
七.结束语
本文归纳了目前深度学习技术中针对神经元进行Normalization操作的若干种模型,可以看出,所有模型都采取了类似的步骤和过程,将神经元的激活值重整为均值为0方差为1的新数值,最大的不同在于计算统计量的神经元集合S的划分方法上。BN采用了同一个神经元,但是来自于Mini-Batch中不同训练实例导致的不同激活作为统计范围。而为了克服Mini-Batch带来的弊端,后续改进方法抛弃了Mini-Batch的思路,只用当前训练实例引发的激活来划分集合S的统计范围,概括而言,LayerNorm采用同隐层的所有神经元;InstanceNorm采用CNN中卷积层的单个通道作为统计范围,而GroupNorm则折衷两者,采用卷积层的通道分组,在划分为同一个分组的通道内来作为通道范围。
至于各种Normalization的适用场景,可以简洁归纳如下:对于RNN的神经网络结构来说,目前只有LayerNorm是相对有效的;如果是GAN等图片生成或图片内容改写类型的任务,可以优先尝试InstanceNorm;如果使用场景约束BatchSize必须设置很小,无疑此时考虑使用GroupNorm;而其它任务情形应该优先考虑使用BatchNorm。
看上去其实Normalization的各种改进模型思路都很直观,问题是:还有其它划分集合S的方法吗?很明显还有很多种其它方法,建议读者可以仔细思考下这个问题,如果你能找到一种新的集合划分方法且证明其有效,那么恭喜你,这意味着你找到了一种新的Normalization模型。还等什么,赶紧去发现它们吧。
参考文献:
Sergey Ioffe etc. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. 2015.
Jimmy Lei Ba etc. Layer Normalization. 2016.
Dmitry Ulyanov etc. Instance Normalization: The Missing Ingredient for Fast Stylization. 2016.
Yuxin Wu etc. Group Normalization.2018.
Tim Salimans etc. Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks.2016.
Shibani Santurkar etc. How Does Batch Normalization Help Optimization? 2018.
Johan Bjorck etc. Understanding Batch Normalization. 2018
本文可以任意转载,转载时请注明作者及原文地址。
作者简介:张俊林,中国中文信息学会理事,目前在新浪微博AI Lab担任资深算法专家。在此之前,张俊林曾经在阿里巴巴任资深技术专家,以及在百度和用友担任技术经理及技术总监等职务。同时他是技术书籍《这就是搜索引擎:核心技术详解》(该书荣获全国第十二届输出版优秀图书奖)、《大数据日知录:架构与算法》的作者。
这篇关于深度学习中的Normalization模型(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!