专栏算法工具链读懂深度学习中的 Normalization :从 BatchNorm 到 InstanceNorm

读懂深度学习中的 Normalization :从 BatchNorm 到 InstanceNorm

Huanghui2025-10-30
40
0
💬 最近在处理算法工具链相关问题时,我遇到了一个关于 InstanceBatchNorm 支持 的兼容性问题。
借这个机会,我也系统学习并梳理了各类 Normalization 算法 的原理、差异,以及在不同芯片(特别是地平线 BPU)上的支持情况。
本文算是一次总结与分享,也希望能为正在做模型部署、调优或量化的同学提供一个完整参考。

一、引论:为什么深度学习离不开 Normalization?

在深度学习模型的训练与推理中,Normalization(归一化) 几乎是所有神经网络架构中不可或缺的组件。
它的核心目标是——让特征分布更稳定、更容易被网络学习。

我们可以从两个层面理解它的重要性:

  1. 训练层面
    • 不同层输出的数值范围差异可能巨大,导致梯度消失或爆炸;

    • 归一化后,网络在不同 batch 间分布更稳定,使得训练更快、收敛更稳。

  2. 推理层面
    • 保证特征在不同输入样本之间的可比性;

    • 避免过度依赖特定输入分布,提高泛化能力。

简单一句话:Normalization 让网络“更好训练、更好泛化、更好部署”。

二、常见的几种 Normalization 算法

类型

归一化维度

是否依赖 Batch

是否可学习参数

常见场景

BatchNorm

跨样本、按通道

✅ 是

✅ γ, β

CNN 主干、分类任务

LayerNorm

单样本、全通道

❌ 否

✅ γ, β

Transformer、NLP

InstanceNorm

单样本、单通道

❌ 否

✅ γ, β

生成任务(GAN、风格迁移)

GroupNorm

单样本、分组通道

❌ 否

✅ γ, β

小 batch CNN


三、直观理解:它们到底在“归一化”什么?

假设一个输入张量形状为 [N, C, H, W]:

操作

计算方式

特征

BatchNorm

对整个 batch 内每个通道统计 mean/var

稳定训练,加速收敛;但依赖 batch 大小

InstanceNorm

每个样本、每个通道独立统计

去除样本风格差异,适合生成模型

LayerNorm

每个样本的所有通道一起归一化

适合序列模型(Transformer)

GroupNorm

每个样本将通道分组后归一化

小 batch 时效果稳定

Description{{{width="800" height="auto"}}}

这些图形让我们更清楚地看到:

  • BatchNorm 在 batch 维度上求统计量;
  • LayerNorm / InstanceNorm / GroupNorm 则在样本内部求统计量;
  • 本质区别在于 “均值与方差的计算维度”

用一场考试举例(一个班级有很多人,每个人有不同的科目,每个科目有期中、期末等多场考试):

  • BatchNorm 归一化“全班成绩”,可以用于评测班级一年的整体成绩情况,比如评选优秀班级等
  • InstanceNorm 归一化“个人表现”,每个人每个科目的,多次考试来看的的整体情况,比如评选单科状元。
  • LayerNorm 平衡“每个人的所有科目”,每个人的平均成绩,比如评选优秀学生等。
  • GroupNorm 则介于两者之间, 课程按一定标准分组后各组平均成绩,比如理科课程、文科课程的情况。

四、核心数学公式

所有 Normalization 的基本形式几乎一致:
Description
只是每种 Norm 的 计算范围不同

类型

均值方差的计算范围

BatchNorm

全 batch 同通道 (N×H×W)

LayerNorm

单样本所有通道 (C×H×W)

InstanceNorm

单样本单通道 (H×W)

GroupNorm

单样本每 G 个通道一组 (G×H×W)


五、差异分析与应用场景

维度

BatchNorm

LayerNorm

InstanceNorm

GroupNorm

归一化范围

跨 batch 的每通道

单样本所有通道

单样本单通道

单样本分组通道

依赖 batch size

✅ 高度依赖

❌ 不依赖

❌ 不依赖

❌ 不依赖

训练收敛速度

🚀 极快

⚙️ 稳定

🧘 稳定

🚀 稳定快速

推理阶段一致性

❌(需移动平均)

✅ 一致

✅ 一致

✅ 一致

量化友好性

⚠️ 一般(需特殊融合)

✅ 友好

✅ 友好

✅ 友好

硬件加速可行性(BPU/NPU)

✅ 优化良好

✅ 良好

⚙️ 中等

✅ 良好

典型任务

图像分类、检测

Transformer、LLM

风格迁移、GAN

小 batch CNN

PyTorch 模块

nn.BatchNorm2d

nn.LayerNorm

nn.InstanceNorm2d

nn.GroupNorm


六、BPU支持情况、应用场景 和 部署建议

  • 🧠 支持情况

在模型部署到地平线芯片(如 J5/J6/NASH 系列)时,部分 Normalization 算子可直接在 BPU 上执行,部分需要由 CPU 代跑或替换。

Operator

BPU

CPU

量化友好性

备注

BatchNormalization

推荐

支持融合到 Conv,可减少额外计算, 性能最佳

GroupNormalization

中等

原生支持,对 batch 小的网络量化友好

InstanceNormalization

一般

支持良好,适合生成模型

LayerNormalization

稳定

支持常见形式(Transformer中常见)

LpNormalization

不支持

暂不支持

MeanVarianceNormalization

不支持

暂不支持

RandomNormal / NormalLike

不支持

属于随机张量生成,非推理阶段算子

StringNormalizer

不支持

文本预处理相关,CPU侧处理

  • 🔧 部署建议

场景

推荐归一化方式

理由

图像分类、检测(大 batch)

BatchNorm

稳定、成熟、融合好

小 batch 训练

GroupNorm

不依赖 batch 统计

Transformer / NLP / LLM

LayerNorm

适合序列特征

图像生成(GAN/风格迁移)

InstanceNorm

去除个体风格差异

BPU 量化部署

Conv+BatchNorm 融合

性能最优、量化友好

  • 🏁 应用总结

  • 训练中:优先使用 BatchNorm 或 GroupNorm;
  • 导出部署时:让工具链自动融合 BN → Conv;
  • 自定义结构(如注意力模块):优先使用 LayerNorm;
  • 生成类模型:InstanceNorm 效果更佳。

七、PyTorch 代码示例

这些算子在 地平线工具链 中均能正确识别,部分可自动融合。

八、常见注意事项

  1. BatchNorm 推理模式需固定统计量

  2. InstanceNorm 在小 batch 下稳定性好(不依赖 batch)
  3. LayerNorm 在序列模型(Transformer)中最常见

  4. GroupNorm 在小 batch 的 CNN 中常替代 BatchNorm

  5. 量化部署前会融合或替换 BN,否则量化后 scale 不一致会带来偏差
  6. inplace 运算注意:Norm 层一般不应 inplace 操作,否则反向传播会报错。

九、结语

Normalization 虽是基础算子,却贯穿了深度学习从训练到部署的全生命周期,是训练阶段的“调味料”。
它是一块性能与稳定性的基石,理解它不仅能优化模型训练的稳定性,更能在 地平线 BPU 平台 上充分发挥算力潜力。
🌟 一句话总结:
  • BatchNorm → 跨样本稳定
  • LayerNorm → 样本内部平衡
  • InstanceNorm → 风格独立
  • GroupNorm → 小 batch 优选
选择合适的 Normalization,就是在算力与泛化之间找到最优解。
让每一次归一化,都为模型的性能与稳定性加分。

算法工具链
技术深度解析杂谈
评论0
0/1000