Skip to content

Root Mean Square Normalization——用均方根归一化替代 LayerNorm,去掉均值计算,更快更简单。

为什么需要 RMSNorm

Transformer 中每层前向需要两次归一化(Attention 前、MoE/FFN 前)。LayerNorm 计算均值和方差,两轮遍历;RMSNorm 只计算均方根,一轮遍历,且不需要均值偏移。

核心原理

LayerNorm: y = (x - mean) / sqrt(var + ε) × γ + β
           需要 mean 和 var 两个统计量,有可学习偏移 β

RMSNorm:   y = x / rms(x) × γ
           rms(x) = sqrt(mean(x²) + ε)
           只有可学习缩放 γ,无偏移项

RMSNorm 去掉了均值减法和偏移项,实验表明对 Transformer 效果几乎无影响。现代 LLM(LLaMA、DeepSeek、Mistral)都使用 RMSNorm。

在 ds4.c 中的实现

c
// RMSNorm(ds4.c 约 4577 行)
float rms = 0.0f;
for (int i = 0; i < n; i++) rms += x[i] * x[i];
rms = sqrtf(rms / n + DS4_RMS_EPS);  // ε 默认 1e-6,从 GGUF 元数据加载
for (int i = 0; i < n; i++) out[i] = x[i] / rms * weight[i];

每层前向调用两次 RMSNorm:一次在 Attention 前,一次在 MoE 前。

相关概念

  • softmax — Attention 中 softmax 前的归一化(RMSNorm 是 QKV 投影前的归一化)
  • moe — MoE Router 前也使用 RMSNorm
  • swiglu — 专家激活前的归一化

详见 Part 3Part 4