在深度学习中,归一化(Normalization)技术被广泛用于提升模型训练的稳定性和收敛速度。本文将详细介绍几种常见的归一化方式,并重点分析它们在 Stable Diffusion 模型中的实际使用场景。
一、常见的归一化技术
名称 | 归一化维度 | 应用场景 | 简要说明 |
---|---|---|---|
LayerNorm | 对每个样本的所有特征进行归一化 | NLP、Transformer | 与 batch 无关,适合变长序列建模 |
BatchNorm | 对 batch 内同一通道归一化 | CNN、分类任务 | 对 batch size 敏感,推理需处理均值/方差 |
InstanceNorm | 对每个样本的每个通道归一化 | 图像生成、风格迁移 | 类似 BatchNorm,但作用于单样本 |
GroupNorm | 将通道分组后归一化 | 图像生成、小 batch 任务 | 不依赖 batch size,稳定性强 |
RMSNorm | 仅使用标准差归一化 | 大语言模型(LLM) | 简化版 LayerNorm,计算高效 |
PixelNorm | 对每个像素位置的通道归一化 | GAN 中使用较多 | 提升生成图像稳定性 |
二、Stable Diffusion 中的归一化方式分析
Stable Diffusion 是一种基于 U-Net + Transformer + CLIP 的扩散模型,不同模块中使用了不同的归一化策略:
1. GroupNorm —— Stable Diffusion 中最常见的归一化方式
- 应用位置:U-Net 中的 DownBlock、UpBlock、ResNetBlock 等
- 示例代码:
self.norm = nn.GroupNorm(num_groups=32, num_channels=in_channels)
• 原因:
• BatchNorm 对 batch size 非常敏感,但 SD 的训练往往使用 较小的 batch size(如 GPU 限制)。
• GroupNorm 在小 batch 下也能保持稳定性。
• 效果:
• 保持特征分布稳定,促进训练收敛。
• 比 InstanceNorm 表现更好,尤其在高分辨率任务中。
2. LayerNorm —— 用于 Transformer 和文本编码器(CLIP)
- 应用位置:CLIPTextTransformer(文本编码器)、交叉注意力模块(Cross-Attention)
- 示例代码:
self.layer_norm = nn.LayerNorm(hidden_size)
• 特点:
• 不依赖 batch,适合处理变长文本输入
• Transformer 架构中标准配置
3. InstanceNorm —— 在 Stable Diffusion 中很少使用
• 说明:
• 主要出现在早期的图像生成模型(如风格迁移)
• 在 SD 的主干结构中几乎未使用
4. BatchNorm —— 不适合 Stable Diffusion
• 原因:
• 对 batch size 敏感
• 推理时存在均值/方差不一致的问题
• 在 SD 中已被 GroupNorm 替代
三、各模块归一化使用对比表
模块名称 | 使用归一化类型 | 理由与说明 |
---|---|---|
U-Net 主干 | ✅ GroupNorm | 稳定性高,不依赖 batch size,适合高分辨率图像训练 |
CLIP 文本编码器 | ✅ LayerNorm | 变长文本输入友好,标准 Transformer 配置 |
VAE 模块 | ✅ GroupNorm / ⚠️ LayerNorm | 编码器多为 GroupNorm,部分结构中可能引入 LayerNorm |
Cross-Attention 模块 | ✅ LayerNorm | 常用于融合图像-文本信息前的标准化处理 |
InstanceNorm | ❌ 极少使用 | 早期图像风格迁移常用,SD 中效果一般 |
BatchNorm | ❌ 基本不用 | 对小 batch size 不友好,推理阶段稳定性差 |
四、Stable Diffusion 源码结构中的归一化分析
以 HuggingFace diffusers
实现为例,Stable Diffusion 的核心网络模块及其归一化使用情况如下:
├── UNet2DConditionModel (图像生成核心网络)
│ ├── DownBlock2D / UpBlock2D
│ │ └── ResnetBlock2D --> 使用 GroupNorm
│ ├── CrossAttentionBlock --> 使用 LayerNorm
├── AutoencoderKL (VAE 编码器/解码器)
│ └── 使用 GroupNorm(部分 block 中有 LayerNorm)
├── CLIPTextModel (文本编码器)
│ └── Transformer --> 使用 LayerNorm
五、网络结构图(可视化归一化位置)
接下来是 Stable Diffusion U-Net 的简化结构图,我们用 ✅ 标出使用 GroupNorm 的地方,用 🧠 标出使用 LayerNorm 的地方:
┌────────────┐│ Text Input │└─────┬──────┘│🧠 CLIPTextModel (LayerNorm)│Cross-Attention Block🧠 LayerNorm + Attention│┌──── Encoder (DownBlocks) ────┐│ ResNetBlock2D + GroupNorm ││ ResNetBlock2D + GroupNorm │└────────────┬───────────────┘│MiddleBlock: ResNet + Attn✅ GroupNorm + 🧠 LayerNorm│┌──── Decoder (UpBlocks) ─────┐│ ResNetBlock2D + GroupNorm ││ ResNetBlock2D + GroupNorm │└────────────┬───────────────┘│Final conv layer
总结
- Stable Diffusion 主要采用 GroupNorm 和 LayerNorm,分别用于图像(U-Net、VAE)和文本(CLIP)处理模块;
- 避免使用 BatchNorm 和 InstanceNorm,主要因为对 batch size 敏感或表达能力受限;
- 归一化策略是 SD 成功的稳定性关键之一,合理选择不同模块的归一化方式有助于模型更高效、更稳定地训练和推理;
- 如果你在构建自己的扩散模型或进行微调(如 LoRA、ControlNet),建议保留原有归一化配置,避免误用 BN 或 IN 导致生成质量下降。
欢迎关注我持续更新关于 Stable Diffusion、扩散模型、图像生成的系列干货文章!