神经网络设计中关于BN归一化(Normalization)的讨论
在神经网络的结构中,我们常常可以看见归一化(Normalization)如BN的出现,无论是模型的backbone或者是neck的设计都与它有着重大的关系。
因此引发了我对它的思考,接下来我将从
是什么(知识领域,诞生来源),为什么(解决了什么问题),怎么做(公式原理,未来如何使用和设计)的三个哲学维度去讨论它。
是什么
从整体到局部 — 先说“属于哪个研究方向 / 框架
归一化(Normalization)在深度学习里的位置
研究领域 / 交叉学科:
优化理论(改变梯度分布、条件数、收敛性)
表征学习/归一化技术(稳定内部表示、减少训练敏感性)
统计估计(如何准确地估计均值/方差、样本数对估计方差的影响)
分布式系统工程(SyncBN 涉及跨设备通信)
核心问题:网络训练中各层输入分布随训练迭代变化(所谓“internal covariate shift” 的实践问题)、训练稳定性、梯度尺度与收敛速度、以及隐式正则化。
解决思路家族:按“聚合域”可分——跨样本(Batch-based,如 BN / SyncBN)、逐样本但分组(GroupNorm)、逐样本全部通道(LayerNorm)、逐通道逐样本空间上(InstanceNorm)等。每种方法在统计样本数、耦合程度、计算/通信开销上有不同折中。
这些名词可能现在绝对有些晦涩难懂,不过后面我会一一解释。
BN的来源
我现在会扮演一个合适的角色,从0到1带着你推演为什么需要BN里面的数学操作去解决什么问题
那我们就从**“还没有 BN 时代”**开始推演,像个深度学习数理侦探一样,一步步锁定问题,然后自然推导出 BN 的数学操作。
1️⃣ 案件背景:还没有 BN 的深度网络
在早期(2014 年以前),深度神经网络(尤其是 CNN、RNN)在训练时会遇到几个老大难问题:
1 梯度消失 / 梯度爆炸
网络层数一多,梯度在反向传播中会被不断乘上权重的导数。
如果导数平均值 < 1 → 梯度指数级衰减(梯度消失);
如果导数平均值 > 1 → 梯度指数级放大(梯度爆炸)。
2 内部协变量偏移(Internal Covariate Shift)
当我们更新前面层的参数时,后面层的输入分布就会改变。
这意味着后面层在每个训练 step 面对的不是一个稳定的任务,而是“每次输入分布都不同”的任务。
概念
“协变量”是指模型中某一层的输入(对这一层来说,输入就是它的特征分布)。
“偏移”是指输入的分布发生了变化。
在深度网络中,每一层的输入分布并不是固定的,因为前面层的参数在训练中不断变化。
内部协变量偏移:训练过程中,深层网络的中间层输入分布(均值、方差、形状)会不断变化。
影响
如果某一层输入分布一直变化,那么这一层需要不断“重新适应”新的输入分布,训练起来就很慢。
这相当于你在学做饭,但每天给你的食材味道、大小都不一样,你需要不断调整调料用量 → 学习速度慢。
3 学习速度极慢
分布漂移(Distribution Shift)
概念
更宽泛的概念,指训练数据分布与测试数据分布不一致。
例如:训练时图片都在晴天拍,测试时大部分是雨天 → 模型性能下降。
ICS 是一种特殊的分布漂移,只不过它发生在网络内部层与层之间,不是训练集与测试集之间。
关系
分布漂移:外部视角,通常是数据集问题。
内部协变量偏移:内部视角,是训练过程中网络自身制造的“数据分布变化”。
因为分布漂移,学习率不敢设太高,否则容易发散。
想加速收敛很困难。
以上这就是归一化的定位以及来源,它属于表征学习,优化理论的领域,来源于神经网络训练时遇到的传统的几个问题,梯度爆炸/消失,内部协变量偏移(Internal Covariate Shift),学习速度极慢
理解了是什么,其实我们也就引出了为什么,为什么其实就是去解决它诞生来源的几个问题
为什么
抽象和解决问题
2️⃣ 侦探分析:输入分布的“统计混乱”
我们先盯着一个中间层的输入特征 𝑥看:
假设该层有 100 个神经元,输入来自上一层输出。
每个 batch 输入时,
x 的均值(mean)和标准差(std)会随 batch 波动。
如果上游权重刚更新过,这些统计量就可能发生明显变化。
这就像你教一个学生解方程,每次题目里的数字分布都完全变样,他很难学到稳定的解法。
数学上,这种不稳定性会导致梯度更新方向变化剧烈,训练过程震荡。
3️⃣ 第一个线索:标准化能稳定分布
在传统机器学习(比如 SVM、KNN)中,我们早就知道特征标准化可以让优化更快:
为什么特征标准化可以加快优化
假设我们有一个简单的模型:
如果 xxx 的均值很偏(比如都在 500 左右),那么偏置 b 就要去抵消这个大偏移,浪费了很多学习能力。当时我就想到
这句话如何理解,如果样本的数据整体均值比较偏,那模型不就应该是解决这个偏的问题,学习这个 偏 吗,为什么说是浪费了很多学习能力。
1. “偏”有两种来源
(a) 有意义的偏
偏本身携带了任务相关的信息,模型需要去捕捉它。
例子:识别黑夜 vs 白天的照片,亮度均值的偏移是关键信息。
这种偏是 语义性的,不能被 BN 抹掉,否则会丢失有效特征。
(b) 无意义的偏(数据分布的偶然偏移)
偏的产生可能是因为采集方式、批次差异、传感器参数等,和任务标签没有直接关系。
例子:同一类猫的照片,有的拍摄时曝光偏高,有的偏低,这个亮度变化与“猫”的类别无关。
模型如果直接学习这种无关的偏,就等于浪费参数去“拟合无关信号”,还可能降低泛化能力。
2. 为什么“浪费学习能力”
模型是有限容量的(参数有限,优化能力有限)。
如果早期层需要去适配这种无意义的偏:
一部分参数会被迫去调节不同 batch/样本间的均值和方差差异
这些参数的更新会因为数据批次差异而震荡(优化不稳定)
真正与任务有关的模式(如形状、纹理、结构信息)会被延迟学习
简单来说:
如果模型花了很多梯度和迭代去修正这些批次间的“量纲偏差”,那它能用来学习语义特征的“精力”就被分走了。
3. 怎么判断“偏”要不要学?
这在理论上很难提前知道,但可以有经验判断:
如果偏是全局一致且标签相关 → 需要保留(BN 就要小心设计)
如果偏是批次/样本之间不稳定且与标签无关 → 适合用 BN 去消除
实践中,我们很难精确分类,所以 BN 这种方法是基于“假设大部分批次间均值/方差偏移是无关的”来设计的
4️⃣ 关键问题:深度网络的标准化该怎么做(以BN为例)?
侦探的推理来到关键一步:
在深度网络中,我们不能只在输入层做一次标准化,因为中间层的分布也会漂移。
那我们能不能在每一层的每个训练 step都做一次标准化,把漂移控制住?
于是,BN 的核心想法出现了:
以上其实就是为什么的整个思考,它与前面的BN 的诞生逻辑串起来了
痛点:早期网络没有 BN,内部协变量偏移 + 输入特征分布不稳定 → 训练慢、难收敛
关键假设:均值/方差的批次波动多数与任务无关
操作:对每个 batch 的特征做标准化,让它的均值 ≈ 0,方差 ≈ 1
好处:
梯度更新更稳定(步长不用太小)
不用浪费参数去适配输入量纲差异
网络可以更快进入学习“形状/模式”等更有意义的特征阶段
怎么做
公式推演
接下来我会带着你进行归一化数学公式上的推演,推演遵循每个操作都讲清楚,是什么(参数的意义),为什么(通过参数解决什么问题),怎么做(通过什么公式用参数去解决问题)
每个操作的「一句话总结」
常见问题
问题 1:为什么把特征强制为 0-mean,1-var 会限制网络表达能力?γ,β 为什么解决这个问题?
直觉理解
BN 前的标准化:
问题 2:推理阶段没有 batch 的概念或 batch 很小是什么意思?
问题 3:标准化消除了输入尺度对激活的影响,减小参数尺度与优化耦合,有哪些地方被标准化了?
未来如何使用和设计归一化
实践设计示例
场景 | 建议归一化 | 理由 |
---|---|---|
ImageNet 分类,大 batch | BN | 批内统计稳定,加速收敛 |
单张图像生成 / 风格迁移 | IN 或 GN | 不依赖 batch |
多 GPU 小 batch | SyncBN 或 GN | BN 单卡统计不稳,GN 可替代 |
移动端轻量模型 | GN | 稳定且无需 batch,硬件友好 |
Transformer | LN | 序列长度不固定,适合逐样本标准化 |
多任务 / 自适应 | SN | 学习动态选择归一化方式 |