什么是批归一化?

批归一化是一种在神经网络训练过程中对每一层激活值(或中间输出)进行归一化的方法,通常在卷积层或全连接层激活函数之前应用。它的核心目标是稳定和加速神经网络训练,通过规范化每层的输入分布。

定义:

批归一化是针对每一个批次的数据(mini-batch),在每一个特征维度进行如下操作:

$$ \mu_B = \frac{1}{N}\sum_{i=1}^m{x_i} $$

其中, $N$是批次大小, $x_i$是当前批次中第 $i$ 个样本的特征

$$ \sigma B^2=\frac{1}{N}\sum{i=1}^m{(x_i-\mu_B)^2} $$

$$ \hat x_i = \frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} $$

$$ y_i = \gamma \hat x_i+\beta $$

其中, $\gamma ,\beta$是可学习的参数。

值得注意的是,上述减去均值,然后在除以方差,这个操作实质上也就是标准化的过程。 标准化和归一化

上述是在训练阶段,均值和方差都是根据当前批次的数据进行动态计算的,每一个批次所用的均值和方差是不同的,在使用当前批次的均值和方差进行归一化的时候,还会维护一个全局的移动均值和方差(用于推理)。但是在推理阶段,BN所用的方差和均值是在训练阶段累积的移动均值和方差。

批归一化经常应用在神经网络的每一层(卷积层或全连接层)的激活值(就是该层神经网络的输出),在激活函数(如ReLU)之前或之后。

批归一化有什么用?

批归一化和传统归一化 标准化和归一化 的区别:

特性 批归一化(Batch Normalization) 传统归一化(Min-Max、L2、标准化)
应用对象 神经网络每层激活值(中间输出) 输入特征(数据集的列)
归一化时机 训练过程中,针对每个mini-batch 训练前,作为数据预处理
归一化方式 均值0,方差1(类似标准化),但有可学习的 γ、β Min-Max到[0,1],L2到单位模,标准化到均值0、方差1
动态性 动态计算批次均值和方差,推理时用全局统计量 静态计算,基于整个训练集统计量
目的 稳定训练、加速收敛、减少协变量偏移 统一量纲、提高模型性能
适用场景 深度神经网络(CNN、RNN等) 通用机器学习(包括非神经网络算法)
对异常值 较不敏感(基于批次统计) 敏感(尤其Min-Max归一化)

注意事项:

什么是层归一化(Layer Normalization)?

层归一化(LN)是针对单个样本进行归一化,而不同于批归一化是针对一个批次进行归一化。所以层归一化所依赖的统计量是单个样本的特征维度进行计算均值和方差。也就时候说LN是但个样本的多个维度特征计算统计量,而BN是不同样本的同一个特征维度计算统计量。

LN:

$$ \mu =\frac{1}{d}\sum_{i=1}^d{x_i},\space \space \sigma^2=\frac{1}{d}\sum _{i=1}^d{(x_i-\mu)^2} $$

$$ \hat{x_i} = \frac{x_i-\mu}{\sqrt{\sigma^2+\epsilon}},\space \space y_i = \gamma\hat{x_i}+\beta $$

$d$是单个样本特征的维度。