批归一化是一种在神经网络训练过程中对每一层激活值(或中间输出)进行归一化的方法,通常在卷积层或全连接层的激活函数之前应用。它的核心目标是稳定和加速神经网络训练,通过规范化每层的输入分布。
定义:
批归一化是针对每一个批次的数据(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的均值和方差来调整数据,相当于将每一批数据都固定在原点附近(均值0和方差1),后续层只需要学习在这个范围内如何优化。无论前一层的变化如何大,通过BN,输入分布的变化大幅度减少。
另外,如果没有BN层,那么前一层的参数变化直接影响后层的输入分布变化,导致每一层都受到前面的层多多少少的影响,都要不断适应新的分布。而加上BN之后,每一层的输入都被规范化,也就是说每层的输入分布相对独立于前层的变化,降低了层之间的耦合。
可学习参数$\beta,\gamma$的作用是什么?
在经过BN的标准化之后,数据的分布都是0均值和1方差,但是如果每一批数据的都是这样(从个人感觉上来说也会觉得太死板,太固定),这种强制性的规范化行为可能限制模型的表达能力,因为某些任务或层可能需要非零均值或非单位方差的分布来更好地拟合数据。举个例子来说,对于激活函数ReLU( $f(x) = max(0,x)$) 来说,更适合正值 的输入,如果BN强制均值为0,就包含大量的负值,导致ReLU的输出变为0,降低网络性能,所以可以通过**$\beta$**将数据分布移动到正值区域, $\gamma$再调整输出值的范围,这样就确保激活函数的有效工作。总的来说,通过BN,将每一层的输入分布的变化幅度减小,使输入更规范化的同时,也能通过两个参数微调分布,使数据更适合某些层,增强模型的表达能力。
下图:上面一行是原始数据分布,下面一行是批归一化(这里没有使用 $\gamma ,\beta$参数,可以看到数据保持原来的分布状态,但是总体均值调整为0,数据点分散程度在x和y方向是近似的,也就是是方差为1.

下面这个图:增加了缩放参数和平移参数的作用,可以看到,在使用了两个参数之后,会将数据的分布进行调整,可以使其更好的适应激活函数(例如调整之后负值的数量更少了)

来首音乐放松一下,哈哈
https://open.spotify.com/track/5UdGdvMKypQtqJnHz6T47F?si=00752907dd6b4cd3
什么是层间耦合?
在神经网络中,层间耦合指的是每一层的输入分布直接依赖于前层输出的现象。前层参数(如权重 w 、偏置 b)的变化会改变后层输入的分布(均值、方差等),高耦合意味着后层的学习目标(输入分布)随着前层参数更新而频繁变化。
说白了就是,前面层参数的变化会较大程度的影响到后面的层,后层需要不断调整以适应新的输入分布。
高耦合带来的问题:
减少对初始化参数的敏感
如果没有BN,层与层之间都是高耦合的,前层初始化的微小差异可能被后层不断放大,影响后层,而BN可以降低层与层之间的耦合性,减少对初始化参数的依赖。
正则化作用
因为每一个批次的均值和方差是不一样的,也就是说BN之后的分布是多种多样的(整体上都是0均值1方差,但是还是有一些区别的),迫使网络不过分的拟合某一个固定分布,相当于引入了随机噪声,鼓励网络学习泛化性更强的模式。当Batch-size较小的时候,均值和方差的波动更大,随机性更强,正则化效果更显著。
类似于Dropout训练过程中减少对某些特征神经元的依赖,BN也是在训练过程中为了减少对某些特定分布的依赖。而在最终的推测的时候,Dropout就不作用了,而BN则使用全局的移动均值和方差。可以说二者是相似的。
这里的正则化作用和L1/L2的正则化 正则化 是不同的正则化机制,都是为了减少过拟合。这里的正则化是BN的副产品,不是显式的。通过引入随机的噪声,给数据一些抖动,让模型学习多种模式,而L1/L2正则化则是显式给损失函数加上约束,强硬的限制模型的权重不要太大或者过于复杂,防止过拟合。也就是说:L1、L2是从限制模型学习能力的角度,而BN的正则化是从数据的角度,随机添加噪声,类似于随机数据增广。
| 特性 | 批归一化(Batch Normalization) | 传统归一化(Min-Max、L2、标准化) |
|---|---|---|
| 应用对象 | 神经网络每层激活值(中间输出) | 输入特征(数据集的列) |
| 归一化时机 | 训练过程中,针对每个mini-batch | 训练前,作为数据预处理 |
| 归一化方式 | 均值0,方差1(类似标准化),但有可学习的 γ、β | Min-Max到[0,1],L2到单位模,标准化到均值0、方差1 |
| 动态性 | 动态计算批次均值和方差,推理时用全局统计量 | 静态计算,基于整个训练集统计量 |
| 目的 | 稳定训练、加速收敛、减少协变量偏移 | 统一量纲、提高模型性能 |
| 适用场景 | 深度神经网络(CNN、RNN等) | 通用机器学习(包括非神经网络算法) |
| 对异常值 | 较不敏感(基于批次统计) | 敏感(尤其Min-Max归一化) |
层归一化(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$是单个样本特征的维度。