1、归一化技术概览:为什么NLP需要特殊的归一化?BatchNorm在CV的成功与在NLP的困境

1.1 归一化到底在解决什么问题?

先聊点基础的。归一化,说白了就是让数据分布变得规整。

你想想看,深度学习模型训练时,每层输入的数据分布一直在变。这叫“内部协变量偏移”。我刚开始接触这个概念时,也觉得有点绕。后来自己动手调模型,发现梯度爆炸、收敛慢,才真正理解它的厉害。

归一化的核心目标就两个:

  • 加速收敛——让梯度更新更稳定,不用小心翼翼调学习率
  • 缓解过拟合——引入一点噪声,起到正则化效果

嗯,这里要注意:不同领域的归一化,玩法完全不同。

1.2 BatchNorm在CV领域的辉煌战绩

BatchNorm(批归一化)是2015年提出的。我记得当时CV圈几乎人手一份,效果立竿见影。

它的思路很简单:对每个batch,在通道维度上做归一化。

比如一张图片,形状是 [B, C, H, W]。BatchNorm会在 BH, W 维度上算均值和方差,然后对每个通道单独归一化。

# BatchNorm伪代码
# 输入: x shape [B, C, H, W]
# 对每个通道c:
#   mean = mean(x[:, c, :, :])
#   std = std(x[:, c, :, :])
#   x[:, c, :, :] = (x[:, c, :, :] - mean) / sqrt(std^2 + eps)
#   再乘以gamma,加上beta

为什么在CV里这么好用?

  • 图像数据有空间结构,像素之间有局部相关性
  • batch size通常比较大(32、64甚至更大),统计量稳定
  • 每个通道的统计特性相对独立,归一化后特征更鲁棒

我在项目中遇到过,用ResNet训练图像分类,不加BatchNorm,学习率得调到1e-4才能勉强收敛。加上之后,直接上1e-2,训练速度快了不止一个量级。

关键点:BatchNorm依赖batch维度。batch越大,统计量越准,效果越好。

1.3 BatchNorm在NLP的困境——为什么水土不服?

好,问题来了。既然BatchNorm在CV这么成功,为什么NLP不用它?

我刚开始做NLP时,也试过把BatchNorm直接搬到Transformer上。结果呢?训练震荡,loss死活降不下去。后来查了很多资料,才明白问题出在哪。

第一个问题:batch size太小。

NLP任务里,尤其是Transformer模型,显存消耗巨大。batch size通常只有8、16,甚至4。你想想看,这么小的batch,算出来的均值和方差能准吗?

我试过batch size=4时,BatchNorm的统计量几乎就是噪声。训练时一个样,推理时另一个样,完全没法用。

第二个问题:序列长度变化。

NLP的输入是变长序列。不同句子长度不一样,padding之后,有效token数量不同。BatchNorm在batch维度上做归一化,会把padding位置也算进去,引入大量无效信息。

举个例子:

# 假设batch里有3个句子
# 句子1: "我 爱 NLP" (3个token)
# 句子2: "Transformer 很 强 大" (4个token)
# 句子3: "归一化 是 关键" (3个token)
# padding后: [3, 4, 3],统一补到4
# BatchNorm会把padding位置也参与计算均值
# 结果:有效token的统计被稀释了

第三个问题:各位置分布不同。

在NLP里,不同位置的token,语义分布差异很大。比如句首的“我”和句尾的“。”,统计特性完全不同。BatchNorm对所有位置一视同仁,反而破坏了这种位置特异性。

避坑指南:我曾经在Transformer的每个子层后加BatchNorm,结果训练了3天,验证集准确率还不如不加。后来换成LayerNorm,半天就收敛了。这个教训让我记住了:NLP里,别碰BatchNorm。

1.4 为什么LayerNorm更适合NLP?

LayerNorm的思路和BatchNorm正好相反。

它不是在batch维度上归一化,而是在特征维度上归一化。对于输入 [B, L, D](batch, 序列长度, 特征维度),LayerNorm对每个样本、每个位置,在 D 维度上算均值和方差。

# LayerNorm伪代码
# 输入: x shape [B, L, D]
# 对每个样本b,每个位置l:
#   mean = mean(x[b, l, :])
#   std = std(x[b, l, :])
#   x[b, l, :] = (x[b, l, :] - mean) / sqrt(std^2 + eps)
#   再乘以gamma,加上beta

这样做的好处很明显:

  • 不依赖batch size——batch=1也能正常工作
  • 对序列长度不敏感——每个位置独立计算,padding不影响有效token
  • 保持位置特性——每个位置有自己的归一化参数,不互相干扰

我个人习惯,在NLP模型里,只要涉及序列数据,第一反应就是LayerNorm。它就像为NLP量身定做的归一化方案。

1.5 两种归一化的对比总结

对比维度 BatchNorm LayerNorm
归一化维度 batch维度 (B, H, W) 特征维度 (D)
适用场景 CV(图像、视频) NLP(文本、序列)
batch size要求 大batch(≥16) 任意batch(1也行)
序列长度敏感 敏感(padding干扰) 不敏感(逐位置计算)
训练/推理一致性 不一致(需维护running stats) 一致(直接计算)
正则化效果 强(引入batch噪声) 弱(无batch依赖)

个人经验:如果你非要在NLP里用BatchNorm,可以试试把batch size开到64以上,并且对padding做mask处理。但说实话,效果还是不如LayerNorm。何必跟自己过不去呢?

1.6 小结

归一化技术,选对了是加速器,选错了是绊脚石。

BatchNorm在CV里大杀四方,靠的是图像数据的空间结构和稳定的大batch。但到了NLP,batch小、序列变长、位置分布各异,它就成了累赘。

LayerNorm则完美避开了这些坑。它不依赖batch,对序列友好,计算简单。这也是为什么Transformer、BERT、GPT这些模型,清一色都用LayerNorm。

下一章,我会深入LayerNorm的数学原理和实现细节。到时候咱们再聊,LayerNorm到底是怎么在Transformer里发挥作用的。