在深度學習中,歸一化(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、擴散模型、圖像生成的系列干貨文章!