深度学习中的多种Normalization模型

知识图谱,【A】深度学习中的Normalization模型

转载算法

做者 :张俊林网络

架构

张俊林,中国中文信息学会理事,中科院软件所博士,目前在新浪微博AI Lab担任资深算法专家。在此以前,张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队,以及在百度和用友担任技术经理及技术总监等职务。同时他是技术书籍《这就是搜索引擎:核心技术详解》(该书荣获全国第十二届输出版优秀图书奖)、《大数据日知录:架构与算法》的做者。框架

机器学习

编者按函数

无论是传统机器学习,仍是当前火热的的深度学习,Normalization技术都是可以提高算法性能的大杀器。本文以很是宏大和透彻的视角分析了深度学习中的多种Normalization模型,包括你们熟悉的Batch Normalization (BN)和可能不那么熟悉 的Layer Normalization (LN)、Instance Normalization (IN) 及Group Normalization (GN)模型;用生动形象的例子阐述了这些Normalization模型之间的区别和联系;并在一个统一的数学框架下分析了它们的性质;最后从一个新的数学视角分析了BN算法为何有效。性能

文章转自做者知乎专栏学习

1测试

从Mini-Batch SGD提及大数据

咱们先从Mini-Batch SGD的优化过程讲起,由于这是下一步理解Batch Normalization中Batch所表明具体含义的知识基础。

咱们知道,SGD是不管学术圈写文章作实验仍是工业界调参跑模型最经常使用的模型优化算法,可是有时候容易被忽略的一点是:通常提到的SGD是指的Mini-batch SGD,而非原教旨意义下的单实例SGD。

知识图谱,【A】深度学习中的Normalization模型图1. Mini-Batch SGD 训练过程(假设Batch Size=2)

所谓“Mini-Batch”,是指的从训练数据全集T中随机选择的一个训练数据子集合。假设训练数据集合T包含N个样本,而每一个Mini-Batch的Batch Size为b,因而整个训练数据可被分红N/b个Mini-Batch。在模型经过SGD进行训练时,通常跑完一个Mini-Batch的实例,叫作完成训练的一步(step),跑完N/b步则整个训练数据完成一轮训练,则称为完成一个Epoch。完成一个Epoch训练过程后,对训练数据作随机Shuffle打乱训练数据顺序,重复上述步骤,而后开始下一个Epoch的训练,对模型完整充分的训练由多轮Epoch构成(参考图1)。

在拿到一个Mini-Batch进行参数更新时,首先根据当前Mini-Batch内的b个训练实例以及参数对应的损失函数的偏导数来进行计算,以得到参数更新的梯度方向,而后根据SGD算法进行参数更新,以此来达到本步(Step)更新模型参数并逐步寻优的过程。

知识图谱,【A】深度学习中的Normalization模型图2. Mini-Batch SGD优化过程

具体而言,若是咱们假设机器学习任务的损失函数是平方损失函数:

知识图谱,【A】深度学习中的Normalization模型

那么,由Mini-Batch内训练实例可得出SGD优化所需的梯度方向为:

知识图谱,【A】深度学习中的Normalization模型

知识图谱,【A】深度学习中的Normalization模型

根据梯度方向便可利用标准SGD来更新模型参数:

知识图谱,【A】深度学习中的Normalization模型

其中,知识图谱,【A】深度学习中的Normalization模型是学习率。

由上述过程(参考图2)能够看出,对于Mini-Batch SGD训练方法来讲,为了可以参数更新必须得先求出梯度方向,而为了可以求出梯度方向,须要对每一个实例得出当前参数下映射函数的预测值,这意味着若是是用神经网络来学习映射函数的话,Mini-Batch内的每一个实例须要走一遍当前的网络,产生当前参数下神经网络的预测值,这点请注意,这是理解后续Batch Normalization的基础。

至于Batch Size的影响,目前能够实验证明的是:batch size 设置得较小训练出来的模型相对大batch size训练出的模型泛化能力更强,在测试集上的表现更好,而太大的batch size每每不太Work,并且泛化能力较差。可是背后是什么缘由形成的,目前还未有定论,持不一样见解者各持己见。由于这不是文本的重点,因此先略过不表。

2

Normalization究竟是在作什么

Normalization的中文翻译通常叫作“规范化”,是一种对数值的特殊函数变换方法,也就是说假设原始的某个数值是x,套上一个起到规范化做用的函数,对规范化以前的数值x进行转换,造成一个规范化后的数值,即:

知识图谱,【A】深度学习中的Normalization模型

所谓规范化,是但愿转换后的数值知足必定的特性,至于对数值具体如何变换,跟规范化目标有关,也就是说f()函数的具体形式,不一样的规范化目标致使具体方法中函数所采用的形式不一样。

其实咱们生活中也有不少相似的规范化操做,知乎里面有个热帖,主题是:“为何人大附中的学生那么爱穿校服?”,里面有人打趣地问:“请问人大附中的学生洗澡的时候脱不脱校服?”。这个问题我回答不了,要我猜大几率夏天洗澡的时候是会脱的,要否则洗澡的时候天太热人受不了,冬天则未必,穿着洗可能更保暖。跑题了,其实我想说的是:学校要求学生穿校服就是一种典型的规范化操做,学校的规范化目标是要求学生着装整齐划一,显得干练有风貌,因此定义了一个规范化函数:

知识图谱,【A】深度学习中的Normalization模型

就是说不论哪一个学生,不论你日常的着装变量x=”香奈儿”仍是x=“麻袋片”,通过这个规范化函数操做,统一都换成校服。这样就达到了学校的规范化目的。

知识图谱,【A】深度学习中的Normalization模型图3. 神经元

在介绍深度学习Normalization前,咱们先普及下神经元的活动过程。深度学习是由神经网络来体现对输入数据的函数变换的,而神经网络的基础单元就是网络神经元,一个典型的神经元对数据进行处理时包含两个步骤的操做(参考图3):

步骤一:对输入数据进行线性变换,产生净激活值

知识图谱,【A】深度学习中的Normalization模型

其中,x是输入,w是权重参数,b是偏置,w和b是须要进过训练学习的网络参数。

步骤二:套上非线性激活函数,神经网络的非线性能力来自于此,目前深度学习最经常使用的激活函数是Relu函数

知识图谱,【A】深度学习中的Normalization模型

如此一个神经元就完成了对输入数据的非线性函数变换。这里须要强调下,步骤一的输出通常称为净激活(Net Activation),第二步骤通过激活函数后获得的值为激活值。为了描述简洁,本文后续文字中使用激活的地方,其实指的是未经激活函数的净激活值,而非通常意义上的激活,这点还请注意。

至于深度学习中的Normalization,由于神经网络里主要有两类实体:神经元或者链接神经元的边,因此按照规范化操做涉及对象的不一样能够分为两大类,一类是对第L层每一个神经元的激活值或者说对于第L+1层网络神经元的输入值进行Normalization操做,好比BatchNorm/LayerNorm/InstanceNorm/GroupNorm等方法都属于这一类;另一类是对神经网络中链接相邻隐层神经元之间的边上的权重进行规范化操做,好比Weight Norm就属于这一类。广义上讲,通常机器学习里看到的损失函数里面加入的对参数的的L1/L2等正则项,本质上也属于这第二类规范化操做。L1正则的规范化目标是形成参数的稀疏化,就是争取达到让大量参数值取得0值的效果,而L2正则的规范化目标是有效减少原始参数值的大小。有了这些规范目标,经过具体的规范化手段来改变参数值,以达到避免模型过拟合的目的。

本文主要介绍第一类针对神经元的规范化操做方法,这是目前DNN作Normalization最主流的作法。

知识图谱,【A】深度学习中的Normalization模型图4. Normalization加入的位置

那么对于第一类的Normalization操做,其在什么位置发挥做用呢?目前有两种在神经元中插入Normalization操做的地方(参考图4),第一种是原始BN论文提出的,放在激活函数以前;另一种是后续研究提出的,放在激活函数以后,很多研究代表将BN放在激活函数以后效果更好。本文在讲解时仍然遵循BN原始论文,后续讲解均可以当作是将Normalization操做放在激活函数以前进行。

对于神经元的激活值来讲,不论哪一种Normalization方法,其规范化目标都是同样的,就是将其激活值规整为均值为0,方差为1的正态分布。即规范化函数统一都是以下形式:

知识图谱,【A】深度学习中的Normalization模型

写成两步的模式是为了方便讲解,若是写成一体的形式,则是以下形式:

知识图谱,【A】深度学习中的Normalization模型

其中,知识图谱,【A】深度学习中的Normalization模型为某个神经元原始激活值,知识图谱,【A】深度学习中的Normalization模型为通过规范化操做后的规范后值。整个规范化过程能够分解为两步,第一步参考公式(1),是对激活值规整到均值为0,方差为1的正态分布范围内。其中,知识图谱,【A】深度学习中的Normalization模型是经过神经元集合S(至于S如何选取读者能够先不用关注,后文有述)中包含的m个神经元各自的激活值求出的均值,即:

知识图谱,【A】深度学习中的Normalization模型

为根据均值和集合S中神经元各自激活值求出的激活值标准差:

知识图谱,【A】深度学习中的Normalization模型

其中,知识图谱,【A】深度学习中的Normalization模型是为了增长训练稳定性而加入的小的常量数据。

第二步参考公式(2),主要目标是让每一个神经元在训练过程当中学习到对应的两个调节因子,对规范到0均值,1方差的值进行微调。由于通过第一步操做后,Normalization有可能下降神经网络的非线性表达能力,因此会以此方式来补偿Normalization操做后神经网络的表达能力。

目前神经网络中常见的第一类Normalization方法包括Batch Normalization/Layer Normalization/Instance Normalization和Group Normalization,BN最先由Google研究人员于2015年提出,后面几个算法算是BN的改进版本。不管是哪一个方法,其基本计算步骤都如上所述,大同小异,最主要的区别在于神经元集合S的范围怎么定,不一样的方法采用了不一样的神经元集合定义方法。

为何这些Normalization须要肯定一个神经元集合S呢?缘由很简单,前面讲过,这类深度学习的规范化目标是将神经元的激活值限定在均值为0方差为1的正态分布中。而为了可以对网络中某个神经元的激活值 规范到均值为0方差为1的范围,必须有必定的手段求出均值和方差,而均值和方差是个统计指标,要计算这两个指标必定是在一个集合范围内才可行,因此这就要求必须指定一个神经元组成的集合,利用这个集合里每一个神经元的激活来统计出所需的均值和方差,这样才能达到预约的规范化目标。

知识图谱,【A】深度学习中的Normalization模型图5. Normalization具体例子

图5给出了这类Normalization的一个计算过程的具体例子,例子中假设网络结构是前向反馈网络,对于隐层的三个节点来讲,其原初的激活值为[0.4,-0.6,0.7],为了能够计算均值为0方差为1的正态分布,划定集合S中包含了这个网络中的6个神经元,至于如何划定集合S读者能够先不用关心,此时其对应的激活值如图中所示,根据这6个激活值,能够算出对应的均值和方差。有了均值和方差,能够利用公式3对原初激活值进行变换,若是r和b被设定为1,那么能够获得转换后的激活值[0.21,-0.75,0.50],对于新的激活值通过非线性变换函数好比RELU,则造成这个隐层的输出值[0.21,0,0.50]。这个例子中隐层的三个神经元在某刻进行Normalization计算的时候共用了同一个集合S,在实际的计算中,隐层中的神经元可能共用同一个集合,也可能每一个神经元采用不一样的神经元集合S,并不是一成不变,这点还请留心与注意。

针对神经元的全部Normalization方法都遵循上述计算过程,惟一的不一样在于如何划定计算统计量所需的神经元集合S上。读者能够本身思考下,若是你是BN或者其它改进模型的设计者,那么你会如何选取集合S?

3

Batch Normalization如何作

咱们知道,目前最经常使用的深度学习基础模型包括前向神经网络(MLP),CNN和RNN。目前BN在这些基础网络结构都有尝试,整体而言,BN在MLP和CNN是很是成功的,在RNN上效果不明显。下面咱们分述前向神经网络以及CNN中如何应用BN,而后谈谈BN面临的一些困境。正是这些困境引起了后续的一系列改进模型的提出。

3.1

前向神经网络中的BN

知识图谱,【A】深度学习中的Normalization模型图6. 前向神经网络中的BatchNorm

对于前向神经网络来讲,BatchNorm在计算隐层某个神经元k激活的规范值的时候,对应的神经元集合S范围是如何划定呢?图6给出了示意。由于对于Mini-Batch训练方法来讲,根据Loss更新梯度使用Batch中全部实例来作,因此对于神经元k来讲,假设某个Batch包含n个训练实例,那么每一个训练实例在神经元k都会产生一个激活值,也就是说Batch中n个训练实例分别经过同一个神经元k的时候产生了n个激活值,BatchNorm的集合S选择入围的神经元就是这n个同一个神经元被Batch不一样训练实例激发的激活值。划定集合S的范围后,Normalization的具体计算过程与前文所述计算过程同样,采用公式3便可完成规范化操做 。

3.2

CNN网络中的BN

了解了前向神经网络中的BatchNorm ,接下来介绍CNN中的BatchNorm,读者能够先自行思考下若是由你来主导设计,在CNN中究竟应该如何肯定神经元集合S的势力范围。

咱们知道,常规的CNN通常由卷积层、下采样层及全链接层构成。全链接层形式上与前向神经网络是同样的,因此能够采起前向神经网络中的BatchNorm方式,而下采样层自己不带参数因此能够忽略,因此CNN中主要关注卷积层如何计算BatchNorm。

知识图谱,【A】深度学习中的Normalization模型图7. CNN中的卷积核

CNN中的某个卷积层由m个卷积核构成,每一个卷积核对三维的输入(通道数*长*宽)进行计算,激活及输出值是个二维平面(长*宽),对应一个输出通道(参考图7),因为存在m个卷积核,因此输出仍然是三维的,由m个通道及每一个通道的二维平面构成。

知识图谱,【A】深度学习中的Normalization模型图8. CNN中的BatchNorm过程

那么在卷积层中,若是要对通道激活二维平面中某个激活值进行Normalization操做,怎么肯定集合S的范围呢?图8给出了示意图。相似于前向神经网络中的BatchNorm计算过程,对于Mini-Batch训练方法来讲,反向传播更新梯度使用Batch中全部实例的梯度方向来进行,因此对于CNN某个卷积层对应的输出通道k来讲,假设某个Batch包含n个训练实例,那么每一个训练实例在这个通道k都会产生一个二维激活平面,也就是说Batch中n个训练实例分别经过同一个卷积核的输出通道k的时候产生了n个激活平面。假设激活平面长为5,宽为4,则激活平面包含20个激活值,n个不一样实例的激活平面共包含20*n个激活值。那么BatchNorm的集合S的范围就是由这20*n个同一个通道被Batch不一样训练实例激发的激活平面中包含的全部激活值构成(对应图8中全部标为蓝色的激活值)。划定集合S的范围后,激活平面中任意一个激活值都需进行Normalization操做,其Normalization的具体计算过程与前文所述计算过程同样,采用公式3便可完成规范化操做。这样即完成CNN卷积层的BatchNorm转换过程。

知识图谱,【A】深度学习中的Normalization模型图9. CNN中Batch Norm的另一种角度的理解

描述起来彷佛有些复杂,可是从概念上,其实能够把CNN中的卷积层想象成前向神经网络中的一个隐层,而后把对应的某个卷积核想象成MLP隐层中的一个神经元节点,无非其输出是个二维激活平面而不像MLP的神经元输出是一个激活值,另一个不一样是这个神经元覆盖的输入部分不一样,CNN的卷积核是局部覆盖输入,经过滑动窗口来实现输入的全覆盖,而MLP的神经元则是一步到位全局覆盖输入而已(参考图9示意)。若是从这个角度思考CNN和MLP中的BatchNorm的话,其实二者的作法是一致的。

从理论上讲,相似的BatchNorm操做也能够应用在RNN上,事实上也有很多研究作了尝试,可是各类实验证实其实这么作没什么用,因此本文就不展开讲RNN中的BN了。

BatchNorm目前基本已经成为各类网络(RNN除外)的标配,主要是由于效果好,好比能够加快模型收敛速度,再也不依赖精细的参数初始化过程,能够调大学习率等各类方便,同时引入的随机噪声可以起到对模型参数进行正则化的做用,有利于加强模型泛化能力。

可是,BatchNorm这么好用的大杀器,仍然存在不少问题。

3.3

Batch Norm的四大罪状

局限1:若是Batch Size过小,则BN效果明显降低。

BN是严重依赖Mini-Batch中的训练实例的,若是Batch Size比较小则任务效果有明显的降低。那么多小算是过小呢?图10给出了在ImageNet数据集下作分类任务时,使用ResNet的时候模型性能随着BatchSize变化时的性能变化状况,能够看出当BatchSize小于8的时候开始对分类效果有明显负面影响。之因此会这样,是由于在小的BatchSize意味着数据样本少,于是得不到有效统计量,也就是说噪音太大。这个很好理解,这就相似于咱们国家统计局在作年均收入调查的时候,正好把你和马云放到一个Batch里算平均收入,那么当你为下个月房租发愁之际,忽然听到你所在组平均年薪1亿美金时,你是什么心情,那小Mini-Batch里其它训练实例就是啥心情。

知识图谱,【A】深度学习中的Normalization模型

图10. BN的Batch Size大小对ImageNet分类任务效果的影响(From GN论文)

BN的Batch Size大小设置是由调参师本身定的,调参师只要把Batch Size大小设置大些就能够避免上述问题。可是有些任务比较特殊,要求batch size必须不能太大,在这种情形下,普通的BN就无能为力了。好比BN没法应用在Online Learning中,由于在线模型是单实例更新模型参数的,难以组织起Mini-Batch结构。

局限2:对于有些像素级图片生成任务来讲,BN效果不佳;

对于图片分类等任务,只要可以找出关键特征,就能正确分类,这算是一种粗粒度的任务,在这种情形下一般BN是有积极效果的。可是对于有些输入输出都是图片的像素级别图片生成任务,好比图片风格转换等应用场景,使用BN会带来负面效果,这极可能是由于在Mini-Batch内多张无关的图片之间计算统计量,弱化了单张图片自己特有的一些细节信息。

局限3:RNN等动态网络使用BN效果不佳且使用起来不方便

对于RNN来讲,尽管其结构看上去是个静态网络,但在实际运行展开时是个动态网络结构,由于输入的Sequence序列是不定长的,这源自同一个Mini-Batch中的训练实例有长有短。对于相似RNN这种动态网络结构,BN使用起来不方便,由于要应用BN,那么RNN的每一个时间步须要维护各自的统计量,而Mini-Batch中的训练实例长短不一,这意味着RNN不一样时间步的隐层会看到不一样数量的输入数据,而这会给BN的正确使用带来问题。假设Mini-Batch中只有个别特别长的例子,那么对较深时间步深度的RNN网络隐层来讲,其统计量不方便统计并且其统计有效性也很是值得怀疑。另外,若是在推理阶段遇到长度特别长的例子,也许根本在训练阶段都没法得到深层网络的统计量。综上,在RNN这种动态网络中使用BN很不方便,并且不少改进版本的BN应用在RNN效果也通常。

局限4:训练时和推理时统计量不一致

对于BN来讲,采用Mini-Batch内实例来计算统计量,这在训练时没有问题,可是在模型训练好以后,在线推理的时候会有麻烦。由于在线推理或预测的时候,是单实例的,不存在Mini-Batch,因此就没法得到BN计算所需的均值和方差,通常解决方法是采用训练时刻记录的各个Mini-Batch的统计量的数学指望,以此来推算全局的均值和方差,在线推理时采用这样推导出的统计量。虽然说实际使用并没大问题,可是确实存在训练和推理时刻统计量计算方法不一致的问题。

上面所列BN的四大罪状,表面看是四个问题,其实深刻思考,都指向了幕后同一个黑手,这个隐藏在暗处的黑手是谁呢?就是BN要求计算统计量的时候必须在同一个Mini-Batch内的实例之间进行统计,所以造成了Batch内实例之间的相互依赖和影响的关系。如何从根本上解决这些问题?一个天然的想法是:把对Batch的依赖去掉,转换统计集合范围。在统计均值方差的时候,不依赖Batch内数据,只用当前处理的单个训练数据来得到均值方差的统计量,这样由于再也不依赖Batch内其它训练数据,那么就不存在由于Batch约束致使的问题。在BN后的几乎全部改进模型都是在这个指导思想下进行的。

可是这个指导思路尽管会解决BN带来的问题,又会引起新的问题,新的问题是:咱们目前已经没有Batch内实例可以用来求统计量了,此时统计范围必须局限在一个训练实例内,一个训练实例看上去孤零零的无依无靠没有组织,怎么看也没法求统计量,因此核心问题是对于单个训练实例,统计范围怎么算?

4

Layer Normalization、Instance Normalization及Group Normalization

4.1

Layer Normalization

为了可以在只有当前一个训练实例的情形下,也能找到一个合理的统计范围,一个最直接的想法是:MLP的同一隐层本身包含了若干神经元;同理,CNN中同一个卷积层包含k个输出通道,每一个通道包含m*n个神经元,整个通道包含了k*m*n个神经元;相似的,RNN的每一个时间步的隐层也包含了若干神经元。那么咱们彻底能够直接用同层隐层神经元的响应值做为集合S的范围来求均值和方差。这就是Layer Normalization的基本思想。图十一、图12和图13分示了MLP、CNN和RNN的Layer Normalization的集合S计算范围,由于很直观,因此这里不展开详述。

知识图谱,【A】深度学习中的Normalization模型图11. MLP中的LayerNorm

知识图谱,【A】深度学习中的Normalization模型图12. CNN中的LayerNorm

知识图谱,【A】深度学习中的Normalization模型图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操做的,这个很好理解。

知识图谱,【A】深度学习中的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这么作的话,分组内包含神经元太少,估计缺少统计有效性,猜想效果不会太好。

知识图谱,【A】深度学习中的Normalization模型图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理发师。

5

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。

知识图谱,【A】深度学习中的Normalization模型图16. 权重向量Re-Scaling

对于网络中某个神经元i来讲,其对应的边权重向量假设为,所谓权重向量(Weight Vector)Re-Scaling,就是将乘上一个缩放因子,若是神经元i在进行权重向量 Re-Scaling以前和以后两种不一样状况下作Normalization操做,若Normalization以后神经元i对应的激活值没发生变化,咱们就说这种Normalization具有权重向量Re-Scaling不变性(参考图16)。

知识图谱,【A】深度学习中的Normalization模型图17. 数据Re-Scaling

所谓数据Re-Scaling,指的是把输入X乘上一个缩放因子,一样的,若是对输入作缩放先后两种状况下进行Normalization操做,若Normalization以后全部隐层神经元对应的激活值没发生变化,咱们说这种Normalization具有数据Re-Scaling不变性(参考图17)。

知识图谱,【A】深度学习中的Normalization模型图18. 权重矩阵 Re-Scaling

而权重矩阵 Re-Scaling指的是:对于某两个隐层(L层vs L+1层)之间的全部边的权重参数同时乘上相同的缩放因子,若是在权重矩阵 Re-Scaling以前和以后两种情形下对(L+1)层隐层神经元作Normalization操做,若两种状况下隐层全部神经元激活值没有变化,咱们说这种Normalization具有权重矩阵 Re-Scaling不变性(参考图18)。

在了解了三种Re-Scaling的含义及Normalization对应的三种不变性特性后,咱们先概括各类Normalization操做所对应的三种Re-Scaling的不变性特性以下表所示(Layer Normalization原始论文分析了LayerNorm及BatchNorm的Re-Scaling不变性,本文做者补充了InstanceNorm及GroupNorm的状况以及细化了推导过程):

知识图谱,【A】深度学习中的Normalization模型

由表中可见,这四种不一样的Normalization操做都同时具有权重矩阵Re-Scaling不变性和数据Re-Scaling不变性,可是不一样的操做在权重向量Re-Scaling不变性这方面有差别,Batch Norm和Instance Norm具有权重向量Re-Scaling不变性,而另外两种Normalization不具有这个特性。

知识图谱,【A】深度学习中的Normalization模型

咱们以Batch Normalization为例来讲明为什么BN具有权重向量Re-Scaling不变性。

对于某个神经元i的激活a来讲,其值为:

(对于MLP和CNN来讲,是同样的,都是这个公式,区别在于CNN是局部链接,MLP是全局链接,也就是说只有知识图谱,【A】深度学习中的Normalization模型的数量规模不一样而已。)

其中,知识图谱,【A】深度学习中的Normalization模型是与神经元i相连的边权重向量(Weight Vector),X是输入数据或是多层网络中前一层的输出向量,知识图谱,【A】深度学习中的Normalization模型是偏置。咱们能够把偏置看做输入数据值为1的特殊边的权重,因此能够并入前项,简写上述公式为:

知识图谱,【A】深度学习中的Normalization模型

如今假设咱们开始re-scale边权重向量知识图谱,【A】深度学习中的Normalization模型,使得这些边的权重缩放因子为知识图谱,【A】深度学习中的Normalization模型,其对应的新的激活获得相同的缩放比例:

知识图谱,【A】深度学习中的Normalization模型

而边的权重缩放后对应的均值变为:

知识图谱,【A】深度学习中的Normalization模型

也就是说均值也被同比例缩放,这里的关键是由于BN的统计量取值范围是来自于同一个Mini-Batch的实例,因此通过的是用一个神经元,因而对应了相同的边权重向量,那么缩放因子相同,就能够提到求和公式以外。

相似的,若是咱们忽略噪音因子,边权重缩放后对应的方差变为:

知识图谱,【A】深度学习中的Normalization模型

可见方差也被同比例缩放,由于:

知识图谱,【A】深度学习中的Normalization模型

这是为什么说BN具有权重向量Re-Scaling不变性的缘由。

相似的,BN也具有数据Re-Scaling不变性,其推导过程与上述推导过程基本同样。由于若是将原始输入X乘以缩放因子,等价于某个神经元i的激活变为

知识图谱,【A】深度学习中的Normalization模型

其他推导相似上述的权重向量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对应的边权重向知识图谱,【A】深度学习中的Normalization模型缩放因子是知识图谱,【A】深度学习中的Normalization模型,神经元j对应的边权重向量知识图谱,【A】深度学习中的Normalization模型缩放因子是知识图谱,【A】深度学习中的Normalization模型。因而得出各自通过缩放后的激活值为:

知识图谱,【A】深度学习中的Normalization模型

对应的缩放后的均值为:

知识图谱,【A】深度学习中的Normalization模型

均值是没法提出公共缩放因子的,相似的方差也提不出公共缩放因子,因此不具有权重向量Re-Scaling不变性。那这又是为何呢?根本缘由是要进行求统计量计算的范围不是同一个神经元,而是不一样的神经元,而每一个神经元对应权重向量缩放因子不一样,因此难以抽出公共缩放因子并相互抵消。除非同一隐层全部隐层神经元共享相同的缩放因子,这个情形其实就是权重矩阵 Re-Scaling可以知足的条件,因此能够看出Layer Norm具有权重矩阵 Re-Scaling不变性而不具有权重向量Re-Scaling不变性。Group Norm也是相似状况。

6

Batch Normalization为什么有效

正如上文所述,BN在提出后得到了巨大的成功,目前在各类深度学习场景下普遍应用,由于它能加快神经网络收敛速度,再也不依赖精细的参数初始化过程,能够使用较大的学习率等不少好处,可是咱们应该意识到,所讲的这些好处仅仅是引用BN带来的结果,那么更深层次的问题是:为何BN可以给深度学习带来如此多的优势呢?它背后起做用的深层缘由是什么呢?上文尽管从Normalization操做的Re-Scaling不变性角度有所说明,但其实还有更深层或更本质的缘由。

原始的BN论文给出的解释是BN能够解决神经网络训练过程当中的ICS(Internal Covariate Shift)问题,所谓ICS问题,指的是因为深度网络由不少隐层构成,在训练过程当中因为底层网络参数不断变化,致使上层隐层神经元激活值的分布逐渐发生很大的变化和偏移,而这很是不利于有效稳定地训练神经网络。

知识图谱,【A】深度学习中的Normalization模型图19. BN和ICS问题的关系

可是可以解决ICS问题其实并非BN为什么有效背后真正的缘由,最近有一些研究对此做了探讨。那么ICS问题真实存在吗?ICS问题在较深的网络中确实是广泛存在的,可是这并不是致使深层网络难以训练的根本缘由。另外,BN解决了ICS问题了吗?其实也没有。实验一方面证实:即便是应用了BN,网络隐层中的输出仍然存在严重的ICS问题;另外一方面也证实了:在BN层输出后人工加入噪音模拟ICS现象,并不妨碍BN的优秀表现(参考图19)。这两方面的证据互相佐证来看的话,其实侧面说明了BN和ICS问题并没什么关系。

知识图谱,【A】深度学习中的Normalization模型图20. 损失曲面

那么BN有效的真正缘由究竟是什么呢?这还要从深度网络的损失曲面(Loss Surface)提及,在深度网络叠加大量非线性函数方式来解决非凸复杂问题时,损失曲面形态异常复杂,大量空间坑坑洼洼至关不平整(参考图20),也有不少空间是由平坦的大量充满鞍点的曲面构成,训练过程就是利用SGD在这个复杂平面上一步一步游走,指望找到全局最小值,也就是曲面里最深的那个坑。因此在SGD寻优时,在如此复杂曲面上寻找全局最小值而不是落入局部最小值或者被困在鞍点动弹不得,可想而知难度有多高。

有了损失曲面的基本概念,咱们回头来看为什么BN是有效的。研究代表,BN真正的用处在于:经过上文所述的Normalization操做,使得网络参数重整(Reparametrize),它对于非线性非凸问题复杂的损失曲面有很好的平滑做用,参数重整后的损失曲面比未重整前的参数损失曲面平滑许多。咱们能够用L-Lipschitz函数来评估损失曲面的平滑程度,L-Lipschitz函数定义以下:

知识图谱,【A】深度学习中的Normalization模型

含义也很直观,对于定义区间内的任意取值知识图谱,【A】深度学习中的Normalization模型知识图谱,【A】深度学习中的Normalization模型,用它们的距离去和通过函数映射后的值(就是深度网络表达的损失函数)的距离进行比较,若是存在值L知足上述公式条件,也就是说函数映射后的距离必定在任意两个x差值的L倍之内,那么这个函数称为L-Lipschitz函数。而L的大小表明了函数曲面的平滑程度,很明显,L越小曲面越平滑,L越大,则曲面越凹凸不平,时而高峰时而波谷不断颠倒跳跃。举个例子,假设你一出门迈出一步才1米

知识图谱,【A】深度学习中的Normalization模型

就忽然掉到一个100米深的深沟

知识图谱,【A】深度学习中的Normalization模型

那么要知足公式条件,L最小得是100;而假设你一出门迈出一步

知识图谱,【A】深度学习中的Normalization模型

踏上了一个0.3米的小台阶

知识图谱,【A】深度学习中的Normalization模型

那么L最小等于0.3便可。

知识图谱,【A】深度学习中的Normalization模型图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寻优找到问题好的解决方案。固然这只是本文做者根据几方面研究现状作出的推测,目前并无相关实证研究,还请读者谨慎对待此观点。

7

结束语

本文概括了目前深度学习技术中针对神经元进行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模型。还等什么,赶忙去发现它们吧。

参考文献:

  1. Sergey Ioffe etc. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. 2015.

  2. Jimmy Lei Ba etc. Layer Normalization. 2016.

  3. Dmitry Ulyanov etc. Instance Normalization: The Missing Ingredient for Fast Stylization. 2016.

  4. Yuxin Wu etc. Group Normalization.2018.

  5. Tim Salimans etc. Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks.2016.

  6. Shibani Santurkar etc. How Does Batch Normalization Help Optimization? 2018.

  7. Johan Bjorck etc. Understanding Batch Normalization. 2018

来源商业新知网,原标题:【A】深度学习中的Normalization模型

相关文章
相关标签/搜索