参考公众号文章:https://mp.weixin.qq.com/s/xIEB8bzhhKJDCkwoyq_cMg
Batch Normalization
一、操作对象:
- 1.放在激活函数之前
- 2.放在激活函数之后
二、主要操作:
(此处以论文原始形式,BN放在激活函数之前
讲解)
主要包括两步:
合并起来后的形式:
变量代表意义
a
i
a_i
ai : 某个神经元原始激活值(即未经过激活函数
)
a
i
n
o
r
m
a_i^{norm}
ainorm : 规范化操作后的规范后值
三、过程
-
(1)规整到均值为0,方差为1的正态分布范围内
- 1.其中U是通过神经元集合S中包含的m个神经元各自激活值求出的均值
- 2.为根据均值和集合S中神经元各自激活值求出的激活值标准差
- ε 是为了增加训练稳定性而加入的小的常量数据
- 1.其中U是通过神经元集合S中包含的m个神经元各自激活值求出的均值
-
(2)让每个神经元在训练过程中学习到对应的两个调节因子,对规范到0均值,1方差的值进行微调
- 经过第一步操作后,Normalization有可能降低神经网络的非线性表达能力,所以会以此方式来补偿Normalization操作后神经网络的表达能力
- 经过第一步操作后,Normalization有可能降低神经网络的非线性表达能力,所以会以此方式来补偿Normalization操作后神经网络的表达能力
Normalization
一、类型
神经网络里主要有两类实体:神经元
或者连接神经元的边
所以按照规范化操作涉及对象的不同
可以分为两大类:
- **(1) 是对
第L层每个神经元的激活值
或者说对于第L+1层网络神经元的输入值
进行Normalization操作 **- 如:BatchNorm/LayerNorm/InstanceNorm/GroupNorm等方法都属于这一类;
- 不论是哪个方法,其基本计算步骤都如上所述,大同小异,最主要的区别在于
神经元集合S的范围怎么定
,不同的方法采用了不同的神经元集合定义方法。 - 为了能够对网络中某个神经元的激活值
a
i
a_i
ai 规范到均值为0方差为1的范围,必须有一定的手段
求出均值和方差
,而均值和方差是个统计指标,要计算这两个指标一定是在一个集合范围内才可行,所以这就要求必须指定一个神经元组成的集合,利用这个集合里每个神经元的激活来统计出所需的均值和方差,这样才能达到预定的规范化目标。
- **(2) 对神经网络中
连接相邻隐层神经元之间的边上的权重
进行规范化操作 ** - 如:Weight Norm
- 广义上讲,一般机器学习里看到的损失函数里面加入的对参数的的L1/L2等正则项,本质上也属于这第二类规范化操作。
- L1正则的规范化目标是造成参数的稀疏化,就是争取达到让大量参数值取得0值的效果,
- 而L2正则的规范化目标是有效减小原始参数值的大小。有了这些规范目标,通过具体的规范化手段来改变参数值,以达到避免模型过拟合的目的。
二、具体应用
1.前向神经网络
对于神经元k来说,假设某个Batch包含n个训练实例,那么每个训练实例在神经元k都会产生一个激活值,也就是说Batch中n个训练实例分别通过同一个神经元k的时候产生了n个激活值,BatchNorm的集合S选择入围的神经元就是这n个同一个神经元被Batch不同训练实例激发的激活值
。划定集合S的范围后,Normalization的具体计算过程与前文所述计算过程一样
2.CNN
- 常规的CNN一般由卷积层、下采样层及全连接层构成。
- 全连接层形式上与前向神经网络是一样的,所以可以采取前向神经网络中的BatchNorm方式
- 而下采样层本身不带参数所以可以忽略
- 所以CNN中主要关注
卷积层如何计算BatchNorm
。- 对于CNN某个卷积层对应的输出通道k来说,假设某个Batch包含n个训练实例,那么每个训练实例在这个通道k都会产生一个二维激活平面,也就是说Batch中
n个训练实例分别通过同一个卷积核的输出通道k的时候产生了n个激活平面。假设激活平面长为5,宽为4,则激活平面包含20个激活值,n个不同实例的激活平面共包含20*n个激活值
。那么BatchNorm的集合S的范围就是由这20*n个同一个通道被Batch不同训练实例激发的激活平面中包含的所有激活值构成(对应图8中所有标为蓝色的激活值)。划定集合S的范围后,激活平面中任意一个激活值都需进行Normalization操作
- 对于CNN某个卷积层对应的输出通道k来说,假设某个Batch包含n个训练实例,那么每个训练实例在这个通道k都会产生一个二维激活平面,也就是说Batch中
3.RNN
从理论上讲,类似的BatchNorm操作也可以应用在RNN上,事实上也有不少研究做了尝试,但是各种实验证明其实这么做没什么用,所以本文就不展开讲RNN中的BN了。
三、优点与局限
(1)优点
1.效果好
2.加快模型收敛速度
3.不再依赖精细的参数初始化过程
4.可以调大学习率等各种方便
5.同时引入的随机噪声能够起到对模型参数进行正则化的作用,有利于增强模型泛化能力。
(2)缺点
1.batch size过小,BN效果明显下降
2.像素级别任务,BN后效果明显变差(弱化图片本身信息)
3.动态网络如RNN,BN效果不佳(每个时间步都需要维护,但是长短不一导致不同时间步隐层会看到不同数量的输入数据)
4.训练和推导时刻统计量不同(在线推导时不存在batch)
Layer Normalization
为了能够在只有当前一个训练实例
的情形下,也能找到一个合理的统计范围,一个最直接的想法是:MLP的同一隐层自己包含了若干神经元;同理,CNN中同一个卷积层包含k个输出通道,每个通道包含mn个神经元,整个通道包含了km*n个神经元;类似的,RNN的每个时间步的隐层也包含了若干神经元。那么我们完全可以直接用同层隐层神经元的响应值
作为集合S的范围来求均值和方差。这就是Layer Normalization的基本思想。
Instance Normalization(CNN)
Layer Normalization在抛开对Mini-Batch的依赖目标下,为了能够统计均值方差,很自然地把同层内所有神经元的响应值作为统计范围,那么我们能否进一步将统计范围缩小?
对于CNN明显是可以的,因为同一个卷积层内每个卷积核会产生一个输出通道,而每个输出通道是一个二维平面,也包含多个激活神经元,自然可以进一步把统计范围缩小到单个卷积核对应的输出通道内部
。图14展示了CNN中的Instance Normalization,对于图中某个卷积层来说,每个输出通道内的神经元会作为集合S来统计均值方差。对于RNN或者MLP,如果在同一个隐层类似CNN这样缩小范围,那么就只剩下单独一个神经元,输出也是单值而非CNN的二维平面,这意味着没有形成集合S,所以RNN和MLP是无法进行Instance Normalization操作的,这个很好理解。
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这么做的话,分组内包含神经元太少,估计缺乏统计有效性,猜测效果不会太好
归纳
至于各种Normalization的适用场景,可以简洁归纳如下:
对于RNN
的神经网络结构来说,目前只有LayerNorm是相对有效的;
如果是GAN
等图片生成或图片内容改写类型的任务,可以优先尝试InstanceNorm;
如果使用场景约束BatchSize必须设置很小
,无疑此时考虑使用GroupNorm;
而其它任务情形应该优先考虑使用BatchNorm。