Batch Normalization
Batch normalization是在batch上,对batch size(即样本数)、feature map特征图的高度、宽度做归一化,而保留通道数的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN。
GN是group normalization,将channel分组,然后再做归一化。
每个子图表示一个特征图,其中N为批量,C为通道,(H,W)为特征图的高度和宽度。通过蓝色部分的值来计算均值和方差,从而进行归一化。
如果把特征图 x ∈ R N × C × H × W x \in \mathbb{R}^{N \times C \times H \times W} x∈RN×C×H×W比喻成一摞书,这摞书总共有 N 本,每本有 C 页,每页有 H 行,每行 有W 个字符。
BN 求均值时,相当于把这些书按页码一一对应地加起来(例如第1本书第36页,第2本书第36页…),再除以每个页码下的字符总数:N×H×W,因此可以把 BN 看成求“平均书”的操作(注意这个“平均书”每页只有一个字),求标准差时也是同理。
为什么要进行BN呢?
- 在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。
- 在训练的过程中,激活函数会改变各层数据的分布,随着网络的加深,这种改变(差异)会越来越大,使模型训练起来特别困难,收敛速度很慢,会出现梯度消失的问题。
BN原理
针对每个神经元,使数据在进入激活函数之前,沿着通道计算每个batch的均值、方差,‘强迫’数据保持均值为0,方差为1的正态分布,避免发生梯度消失。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。求通道 1 的方差也是同理。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。
BN的使用位置:全连接层或卷积操作之后,激活函数之前。
BN算法过程
- 沿着通道计算每个batch的均值μ
- 沿着通道计算每个batch的方差σ²
- 做归一化
- 加入缩放和平移变量 γ 和 β
μ = 1 m ∑ i = 1 m z i μ = \frac{1}{m}\sum_{i=1}^{m}z^{i} μ=m1∑i=1mzi
σ 2 = 1 m ∑ i = 1 m ( z i − μ ) 2 σ^2 = \frac{1}{m}\sum_{i=1}^{m}{(z^{i}-μ)^2} σ2=m1∑i=1m(zi−μ)2
z N o r m ( i ) = z i − μ σ 2 + ε z_{Norm}^{(i)} = \frac{z^{i}-μ}{\sqrt{σ^2+\varepsilon}} zNorm(i)=σ2+εzi−μ
其中 ε 是一个很小的正值1e-8,比如 。加入缩放和平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。
BN的作用
我们希望训练数据和测试数据是满足相同分布的,这样我们从训练数据获得的模型能够在测试集获得好的效果。BatchNorm的作用就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
-
允许较大的学习率
-
减弱对初始化的强依赖性
-
保持隐藏层中数值的均值、方差不变,让数值更稳定,为后面网络提供坚实的基础
-
有轻微的正则化作用(相当于给隐藏层加入噪声,类似Dropout)
BN存在的问题
-
每次是在一个batch上计算均值、方差,如果batch size太小,则计算的均值、方差不足以代表整个数据分布。
-
batch size太大:会超过内存容量;需要跑更多的epoch,导致总训练时间变长;会直接固定梯度下降的方向,导致很难更新。
参考:
深入理解Batch Normalization批标准化
常用的归一化(Normalization) 方法:BN、LN、IN、GN
Batch Normalization原理总结