GroupNorm 和 InstanceNorm:在什么场景下比 LayerNorm 更适合?

我最早做图像分类时,BatchNorm 就像默认配置,谁都没想过换。直到一次目标检测任务里,我把 batch size 从 32 降到 2,模型的 loss 直接变成 NaN。我以为是学习率问题,调了半天,后来才发现是 BatchNorm 在小 batch 下统计量估计不准。当时很多人建议用 LayerNorm 替代,我也照做了,结果训练稳定了,但最终 mAP 反而掉了不少。

AI technology illustration

这个问题困扰了我很久——为什么 LayerNorm 在 NLP 里那么好使,在视觉任务上却表现平庸?直到我搞懂了 GroupNorm 和 InstanceNorm 的原理,才算彻底想明白。今天这篇文章,就用我的踩坑经历,把这三种归一化方法掰开揉碎讲清楚。

先搞懂一件事:你在哪些维度上做归一化?

归一化听起来很简单:给一坨数据减去均值,再除以标准差。但真正的关键是——你在哪些维度上做这个操作?不同选择,决定了模型能学到什么,也会直接决定它适不适合你的任务。

假设你的 feature map 是四维张量:N 是 batch,C 是通道,H 和 W 是空间尺寸。四大归一化方法的区别,就是它们统计均值和方差的范围不同。

方法 统计范围 典型用途
BatchNorm 对每个通道,在 batch 和空间上统计 大 batch 的 CNN 分类
LayerNorm 对每个样本,在通道和空间上统计 NLP / Transformer
InstanceNorm 对每个样本的每个通道,只在空间上统计 风格迁移 / 图像生成
GroupNorm 对每个样本的每组通道,在组内和空间上统计 小 batch 目标检测 / 分割

表格里的“统计范围”听着只是取数范围不同,但就是这一点,导致了它们在各自场景里的巨大差异。

LayerNorm 在 NLP 是神,在视觉里为什么像渣?

LayerNorm 的做法是:对一个样本的所有特征(通道、高度、宽度全算在一起)做一次归一化。这在 NLP 里很自然——一个 token 的 embedding 向量就相当于一个样本,把它拉平到均值 0 方差 1,相当于把这个 token 的绝对尺度抹掉,保留相对关系。而且句子长度可变,LayerNorm 不依赖 batch,所以天然适合。

但到了视觉任务,问题就来了。一张图片有 C 个通道,每个通道可能代表完全不同的语义——比如 RGB 三通道,或者 CNN 中低层的边缘、纹理。LayerNorm 把这些通道全部混在一起计算均值和方差,等于强行让所有通道拥有相同的统计分布,这会抹掉通道间的差异性。比如某个通道整体很暗,另一个很亮,归一化后它们被拉成同样的尺度,模型就难以区分通道间的相对强度了。

我当时只想着解决 batch 小的问题,没意识到 LayerNorm 的设计初衷就不是视觉。后来读了 LayerNorm 原论文,才发现作者关注的是 RNN 和 Transformer。

InstanceNorm:洗掉风格,留下结构

InstanceNorm 走了另一个极端:每个样本的每个通道独立做归一化。每个通道都有自己的均值和方差,互不干扰。这个设计最初就是为了风格迁移——你想让一张照片变成梵高的画,但不想改变内容结构,只改变颜色、对比度这些风格信息。InstanceNorm 把每个通道的统计量强行拉平,相当于把风格信息洗掉,保留空间上的纹理结构。

所以如果你做的是图像生成、风格迁移这类任务,InstanceNorm 几乎是标配。在这里,LayerNorm 完全不合适,因为它混合通道,导致风格和内容纠缠在一起,生成结果会出现奇怪的颜色偏移。

GroupNorm:折中不是妥协,而是更好的先验

GroupNorm 的思路:把通道分成若干组,然后每组内做归一化。它既不学 LayerNorm 把所有通道混为一谈,也不学 InstanceNorm 完全隔离通道。组数 G 是一个超参数,G=1 时 GroupNorm 就是 LayerNorm,G=C 时它就成了 InstanceNorm。换句话说,这两种方法其实是 GroupNorm 的极端特例。

你可能会问:为什么分组比整体或独立更好?因为 CNN 的通道之间既不是完全独立,也不是完全同分布。比如在特征图里,相邻的通道往往编码相近的特征(例如不同方向的边缘),它们共享类似的统计量。把它们分成一组做归一化,既能利用组内的共性,又能保留组间的差异。这就像整理班级成绩:既不像全班混着算(掩盖班级差异),也不像一个人算一个人的(没法比较),而是分小组算。

Group Normalization 论文里,作者把 GN 用在 batch size 只有 2 的目标检测任务上,比 BatchNorm 高了大约 2.6 mAP,而且明显优于 LayerNorm。这才是它真正擅长的场景。

一张表说清:什么场景该用哪个

场景 推荐 为什么不推荐 LayerNorm
NLP / Transformer LayerNorm 它就是为此设计的,通道间关系重要
风格迁移 / 图像翻译 InstanceNorm LN 会混合通道,破坏风格与内容的分离
小 batch 视觉检测 / 分割 GroupNorm LN 统计范围太宽,抹掉通道间差异
大 batch 图像分类 BatchNorm 或 GroupNorm LN 可能不如 BN 好,但也可用

注意这里的推荐不是绝对的。比如在视觉 Transformer 中,也有人用 LayerNorm,因为输入已经是 patch embedding 序列,与 NLP 结构相似。但在小 batch 视觉任务中,GroupNorm 几乎是最稳妥的选择。

关于 GroupNorm 的组数,给你一个默认值

使用 GroupNorm 时,组数 G 一般取 32,或者让每组通道数在 16 到 32 之间。如果通道数不是 G 的倍数,可以调整让每组的通道数尽量均匀。论文里的实验显示,G=32 是个安全默认值。太小时接近 InstanceNorm,太大时接近 LayerNorm,你需要根据任务微调。

几个常见问题的快问快答

既然 GroupNorm 这么好,为什么 Transformer 不用它?

因为 Transformer 的输入是序列,每个位置是一个向量,向量内部的特征语义相对均匀,没有明显的分组结构。LayerNorm 按整个向量归一化,简单有效。GroupNorm 需要先有通道和空间的概念,在视觉上才有意义。

InstanceNorm 能不能用于图像分类?

基本不行。图像分类需要保留通道间的对比度信息,而 InstanceNorm 会把每个通道的统计量完全抹平,导致模型丢失判别性信息。除非你是在跨域分类,特意要去掉风格差异。

BatchNorm 和 GroupNorm 能一起用吗?

可以。比如在 backbone 前面用 BatchNorm,后面用 GroupNorm,关键是想清楚各自的职责。实际应用中,只要实验效果更好,组合方式没有禁忌。

我的真实建议

如果你正在做视觉任务,而且 batch size 很小,我的建议是:别犹豫,直接用 GroupNorm。如果你做的是风格迁移,就用 InstanceNorm。如果你在调 Transformer,LayerNorm 就是正确答案。

更重要的是,不要无脑照搬默认配置。我现在拿到一个新任务,会先问自己:这个任务里,哪些变化是我不想要的?如果我不想要不同样本之间的亮度差异,就用 InstanceNorm;不想要不同样本的整体尺度差异,就用 LayerNorm;不想要每个样本每个通道的单独漂移,就用 GroupNorm。

归一化层就这么点东西,但它背后是对任务结构的先验假设。想清楚这一点,你就不再容易踩坑了。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/653.html

(0)
上一篇 11小时前
下一篇 11小时前

相关推荐