論文紹介: High-Resolution Image Synthesis with Latent Diffusion Models

<!-- 論文紹介: High-Resolution Image Synthesis with Latent Diffusion Models -->

## はじめに
今回は **High-Resolution Image Synthesis with Latent Diffusion Models** という論文を紹介します。  
この論文では、高解像度画像生成のために **Latent Diffusion Model (LDM)** という手法を提案し、従来の Diffusion Model の計算コストを大幅に削減しつつ高品質な生成を実現しています。  

参考文献:  
R. Rombach, A. Blattmann, D. Lorenz, P. Esser, and B. Ommer. ["High-Resolution Image Synthesis with Latent Diffusion Models."](https://arxiv.org/abs/2112.10752) arXiv preprint, 2022.  

> 🐣 Models と Model (LDMs と LDM) の使い分けが煩雑なので LDM で統一しますね

---

## 0 時間がない人向けの概要
この論文では **Latent Diffusion Model (LDM)** を提案し、画像生成タスクにおいて高解像度かつ高品質な結果を達成しました。 後に本論文の知見を活かした実用的なモデルとして公開されたのが Stable Diffusion です。

- **主な特徴**  
  - **計算コスト削減**：従来の Diffusion Model をピクセル空間ではなく低次元な潜在空間で実行することでコストを大幅に削減  
  - **高品質な画像生成**：画像品質を維持しつつ、効率的なトレーニングを実現。
  - **柔軟な条件付き生成**：テキスト、レイアウト、セマンティックマップに対応した柔軟な条件付けを導入  
  - GitHub: [https://github.com/CompVis/latent-diffusion](https://github.com/CompVis/latent-diffusion)

> 🐣 現在の画像生成 AI の標準基盤技術ですね

---

## 1 はじめに
この論文では、従来の Diffusion Model が高解像度画像生成で必要とする計算コストの高さに着目し、その改善として **Latent Diffusion Model (LDM)** を提案しています。  
Diffusion Model は画像合成で高い性能を示す一方、ピクセル空間で直接処理を行うため、計算量と訓練時間が膨大になります。LDM は、これを潜在空間に移すことで効率化を図り、計算コストを削減しつつ高品質な生成を実現しました。

必要な予備知識:
- 拡散モデル (Diffusion Model): ノイズを少しずつ除去して画像を生成する生成モデル
- オートエンコーダ: 入力を圧縮・復元する機械学習モデル 
- 潜在空間 (Latent Space): データを低次元で表現する空間
- クロスアテンション: Transformerで用いられる、他の入力との注意機構。自身の入力に対するものはセルフアテンション

---

## 2 関連研究
従来の高解像度画像生成モデルには以下の手法があります。  

- **GANs (Generative Adversarial Networks)**  
  効率的な生成が可能ですが、学習の安定性に課題があります。  
> 🐣 モード崩壊ですね

- **Autoregressive Model**  
  優れた密度推定が可能ですが、計算コストが高く、低解像度画像に限定されます。  

- **Diffusion Model**  
  高品質な生成が可能ですが、ピクセル空間での訓練が重いという問題があります。  

---

## 3 数式を使わない提案手法の紹介
### 基本アイデア
LDM は、**Diffusion Model** を直接ピクセル空間ではなく、事前訓練済みのオートエンコーダによる低次元の潜在空間で訓練します。  

- **ステップ 1**：オートエンコーダを用いて、入力画像を潜在空間に圧縮  
- **ステップ 2**：Diffusion Model をこの潜在空間で訓練  
- **ステップ 3**：生成された潜在ベクトルをデコーダで元の高解像度画像に復元  

この手法により、計算コストが削減され、効率的な学習が可能になります。

---
## 4 提案手法の詳細

以下は LDM の全体像を示しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/450de2a0-0587-16f9-495b-37ea4a91ed73.png" width=80%>

**図 1:** LDM の全体像（出典：参考文献 Fig. 3）

図 1 より LDM が U-NET 構造を用いていることがわかります。図中の **Denoising U-NET $\epsilon_\theta$** は、潜在空間での拡散過程においてノイズ付き潜在表現 $z_t$ を入力として、各ステップでノイズを除去しながら次の状態 $z_{t-1}$ を予測する役割を担っています。さらに、U-NET の中間層では **クロスアテンション機構** を通じて条件情報（テキストやセマンティックマップなど）を統合し、生成過程を柔軟に制御しています。

LDM（Latent Diffusion Model）は以下の 2 つの主要なステージから構成されます。
1. **知覚的圧縮ステージ**（Stage 1）  
   オートエンコーダによる潜在空間への圧縮
2. **潜在拡散モデルステージ**（Stage 2）  
   潜在空間上で拡散モデルを学習

図 1 左側のピンク色部分は **ピクセル空間（Stage 1）**、中央の緑色部分は **潜在空間（Stage 2）**、右側の灰色部分は **条件付け** の部分です。例えば、ユーザがプロンプトとして入力した条件テキストデータは、エンコーダ $ \tau_\theta $ によって **特徴ベクトル** に変換され、U-NET の中間層において **クロスアテンション** が適用されます。それ以降の処理では、潜在空間内部の情報を精緻化するために **セルフアテンション** が適用されます。なお、**$ \tau_\theta $** としては **CLIP のテキストエンコーダ** が使われています。CLIP に関する詳細については、以下をご参照ください。

[論文紹介： Learning Transferable Visual Models From Natural Language Supervision](https://qiita.com/hiyoko1729/items/459fb2b2444fccf30273)

### 補足: switch
図下部の **switch** は外部情報付加を**クロスアテンションを用いるか単純な concat を用いるかの切り替え** を示しています。論文中ではクロスアテンションの優位性が示されていました。ここで注意したいのは、switch　が適用されるのは U-NET が外部情報を取り込む部分だけです。それ以降はセルフアテンションが適用されるため、concat の場合でも取り込み以外の層における $QVK$ は必要です。

### **知覚的圧縮ステージ**（Stage 1）  
高解像度の画像を、エンコーダ $\mathcal{E}$ で低次元の潜在表現に圧縮し、デコーダ $\mathcal{D}$ で再構成します。

- **エンコード**:  
  画像 $x \in \mathbb{R}^{H \times W \times 3}$ を潜在表現 $z = \mathcal{E}(x)$ に変換  
  （ダウンサンプリング率 $f = H/h = W/w$）

- **デコード**:  
  潜在表現をもとに再構成 $\tilde{x} = \mathcal{D}(z)$

学習には、**知覚損失**（Perceptual Loss）と**敵対的損失**（Adversarial Loss）を組み合わせ、視覚的に自然な再構成を実現します。

#### 補足: 知覚損失と敵対的損失
- **知覚損失**:  
  画像のピクセル単位の誤差ではなく、ニューラルネットワーク（例: VGG）の中間特徴マップを用いて、**視覚的な類似度** を重視する損失です。これにより、再構成画像が人間の目で見て自然な品質になります。

- **敵対的損失**:  
  GAN の仕組みを用いて、**生成画像のリアリティ** を向上させる損失です。識別器（Discriminator）と競い合うことで、再構成画像が本物の画像のようにリアルになります。

> 🐣 オートエンコーダの学習部では GAN の技術が使われているのですね

### **潜在拡散モデルステージ**（Stage 2）  

エンコーダで圧縮された潜在空間上で拡散モデルを最適化するステージです。具体的には、以下の損失関数を最小化します。

```math
L_{\text{LDM}} := \mathbb{E}_{\mathcal{E}(x),\epsilon \sim \mathcal{N}(0,1),t}\left[\|\epsilon - \epsilon_\theta(z_t, t)\|_2^2\right]
```

ここで  
- $z_t$: 時刻 $t$ におけるノイズ付き潜在表現  
- $\epsilon \sim \mathcal{N}(0,1)$: 真のガウスノイズサンプル  
- $\epsilon_\theta(z_t, t)$: U-NET ベースモデルが予測するノイズ

この損失は、モデルがノイズ付き潜在表現 $z_t$ から元の表現（すなわち潜在画像）へ逆方向に戻す操作を通じて、真のノイズ $\epsilon$ に一致するよう予測ノイズ $\epsilon_\theta$ を合わせ込む役割を担います。つまり、この学習過程を繰り返すことで、U-NET は「与えられた潜在表現を、どのようなノイズから、どれだけ除去すれば元画像に近づけるか」を学習し、高品質な生成を可能にします。
さらに、潜在空間はオートエンコーダ学習時に知覚的損失や敵対的損失を使って整形されており、元画像空間に比べて構造的・視覚的に意味のある特徴が凝縮された表現になっています。この整った潜在空間で拡散モデルを学習することで、ピクセル空間で直接拡散モデルを学ぶよりも、より効率的かつ解釈しやすい生成プロセスが可能になります。

#### **条件付き生成のための拡張**
Stage 2 では生成過程を制御するために、**クロスアテンション機構** を導入します。クロスアテンションは、入力潜在表現 $ z_t $ と条件 $ y $ の対応を学習します。

```math
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V
```

- **$ Q $**: U-NETの中間表現 $ \phi_i(z_t) $  
- **$ K, V $**: 条件 $ y $ をエンコードした $ \tau_\theta(y) $  

> 🐣 出ました Transformer の $ Q $、$ V $、$ K $ 形式！これはクロスアテンションなので *Attention Is All You Need* におけるエンコーダとデコーダが融合する部分に相当します。

また、クロスアテンションによって外部条件が取り込まれた後、**セルフアテンション** が適用され、U-NET の中間層で潜在表現内部のトークン同士の関連性が処理されます。セルフアテンションは以下のように定義されます:

```math
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V
```

ここで、**$ Q, K, V $** は同じ中間表現 $ \phi_i(z_t) $ に由来します。これにより、U-NET 内部の表現が自己一貫性を保ちつつ空間的構造を効率的に学習します。

> 🐣 クロスアテンションで外部情報を取り込み、セルフアテンションで自己の潜在表現を洗練させる流れですね！

条件付き生成の損失関数は以下のようになります:

```math
L_{\text{LDM}} := \mathbb{E}_{\mathcal{E}(x),y,\epsilon \sim \mathcal{N}(0,1),t}\left[\|\epsilon - \epsilon_\theta(z_t, t, \tau_\theta(y))\|_2^2\right]
```

ここで新たに追加された項は：
- $\tau_\theta(y)$: 条件データ（テキスト等）のエンコード結果
- $\epsilon_\theta(z_t,t,\tau_\theta(y))$: 条件を考慮したノイズ予測

> 🐣 条件 $y$ の導入により、指定された特徴に沿った画像生成が可能になっています

#### 補足: CLIP との関係
上の説明で出てくる $z_t$ と $y$ とは具体的には以下の内容を示しています。

$z_t$: 潜在空間での中間的なノイズ付き表現（画像生成のプロセスを経る状態）
$y$: 画像生成を制御するための条件（文章、セマンティックマップ、画像など）

ノイズ空間から画像に相当する分散表現を目指す $z_t$ の道案内を $y$ がするというイメージでしょうか？ この $y$ は CLIP の優秀なテキストエンコーダを利用しています。

1. テキストプロンプト（例: "A pretty cat"）を入力
2. CLIP のテキストエンコーダで埋め込み表現 $\tau_\theta(y)$ を生成
3. $\tau_\theta(y)$ をクロスアテンションを通じて、拡散プロセスの潜在表現 $z_t$ に統合
4. 条件 $y$ に沿った画像が生成される

#### 疑問 1: CLIP が作った画像の潜在空間を使わないのはなぜ？
CLIP は画像テキスト双方を表現できる潜在空間を生成します。しかしながら LDM ではわざわざ画像用のオートエンコーダを学習しています。ここで CLIP が作った潜在空間を画像の方でも利用できないのか？という疑問が生じます。
実は以下の理由で CLIP の画像潜在空間は使うことができません。

- CLIP が作った潜在空間ではテキストと画像が密接に関係しているため拡散過程に適さない
- 生成過程では単に CLIP によるテキストベクトルに似たベクトルを生成してしまうため柔軟性が損なわれる

このため、 LDM では独自に画像の潜在空間を作成し、生成画像の十分な柔軟性を確保した上で、テキストの潜在空間と切り離されてしまった画像の潜在空間を Transformer のクロスアテンションを利用して再び結合しているのです。つまり CLIP の潜在空間は「テキストと画像の意味的な対応」に特化していますが、LDM の潜在空間は「高解像度画像を効率よく表現する」ことを目的としています。この違いが、独自の画像潜在空間を構築する本質的な理由です。

### 疑問 2: LDM が U-NET 構造を用いたのはなぜ？ 
LDM で **U-NET構造** が採用された理由は、その効率性と柔軟性にあると考えられます。
U-NETは、**エンコーダ-デコーダ構造**と**スキップ接続**を特徴とし、画像データの**空間的な情報**と**高次元の特徴**の両方を効果的に扱えるネットワークです。具体的には、エンコーダでデータを抽象化し、デコーダで元の解像度に復元する過程でスキップ接続を活用することで、情報の損失を抑えつつ高品質な生成が可能になります。
LDM では、この U-NET 構造を潜在空間の**ノイズ除去**に適用しました。潜在空間上における拡散過程では、U-NET の構造が非常に適していたのです。さらに、中間層に**クロスアテンション機構**を追加することで、テキストやセマンティックマップなどの条件情報を柔軟に統合でき、生成プロセスを制御する能力も強化されました。U-NET 構造は LDM において、**計算効率**、**情報保持**、そして**条件付けの柔軟性**を同時に実現する要となっています。

### LDM 全体の処理の流れ

### LDM 全体の処理の流れ

```mermaid
graph TB
    subgraph MainFlow[Main Flow]
        direction TB
        subgraph PixelSpace[Pixel Space]
            style PixelSpace fill:#ffb6c1
            direction LR
            A[入力画像] -->|エンコーダE| B[潜在表現]
            AA[損失計算] --> A
            AA -->|知覚損失| VGG[VGG]
            AA -->|敵対的損失| Disc[GAN]
        end

        subgraph LatentSpace[Latent Space]
            style LatentSpace fill:#90EE90
            direction TB
            B -->|Forward| H[ノイズ付きz_t]
            H --> I1[Encoder]
            I1 --> I2[Bottleneck]
            I2 --> I3[Decoder]
            I1 -.->|Skip| I3
            I3 --> L[ノイズ予測]
            L -->|Reverse| O[最終潜在表現]
        end

        O -->|デコーダD| P[生成画像]
    end

    subgraph Conditioning[Conditions]
        style Conditioning fill:#D3D3D3
        direction TB
        J1[テキスト入力] -->|"CLIP τθ"| K1[テキスト特徴]
        J2[セマンティックマップ] -->|CNN| K2[マップ特徴]
        J3[レイアウト] -->|Encoder| K3[構造特徴]
    end

    K1 -->|クロスアテンション| I1
    K1 -->|クロスアテンション| I2
    K2 -->|concat| I1
    K3 -->|concat| I3

    I1 -->|セルフアテンション| I2
    I2 -->|セルフアテンション| I3

    classDef block fill:#fff,stroke:#333,stroke-width:2px
    class A,P,H,L,J1,J2,J3,VGG,Disc block
```

処理の流れを図に沿って詳説します：

1. **Pixel Space（上部ピンク部）での処理**
   - **エンコーダ E**: 入力画像を低次元の潜在表現に圧縮  
   - **2つの損失による学習**:
     - VGGNet: 知覚的な類似性を保証  
     - GAN: 生成画像のリアリティを向上  
   - **デコーダ D**: 生成の最終段階で潜在表現から高品質な画像を復元  

2. **Latent Space（中央緑部）での拡散プロセス**
   - **Forward Process**: 潜在表現 $ z $ にノイズを段階的に付加  
   - **U-NET による段階的処理**:
     - Encoder: 特徴抽出  
     - Bottleneck: 情報圧縮  
     - Decoder: 特徴復元  
   - **スキップ接続** で細かい特徴を保持  
   - **セルフアテンション**: U-NET の各層において潜在表現内部のトークン同士の関連性を学習し、空間的構造の一貫性を保つ  
   - **Reverse Process**: ノイズ予測と除去により画像特徴を復元  

3. **Conditions（右側灰色部）からの制御**
   - **多様な入力形式に対応**:
     - **テキスト** → CLIP $ \tau_\theta $ で意味的特徴を抽出  
     - **セマンティックマップ** → CNN で空間的特徴を抽出  
     - **レイアウト** → 専用エンコーダで構造を抽出  
   - **特徴の統合方法**:
     - **クロスアテンション**: 条件入力と潜在表現の意味的な対応付け  
     - **セルフアテンション**: 内部の潜在表現を自己関連付けし、局所的およびグローバルな整合性を向上  
     - **concat**: 特徴の直接結合  


この構造により、計算効率を保ちながら、条件に応じた柔軟な高品質画像生成を実現しています。

---

## 5 数値実験と結果

### **評価タスク**
1. **無条件/条件付き画像生成**: CelebA-HQ、FFHQ、LSUN で評価  
2. **インペインティング**: Places365 データセットで評価  
3. **超解像**: ImageNet（64×64 → 256×256）で性能を測定  

### **実験結果**

#### **1. 画質と効率**
- **FFHQ** において、LDM-4 が FID スコア **5.11** を記録（従来手法を下回る結果）
- 潜在空間を用いることで、学習・サンプリングの計算効率が向上

#### **2. 超解像**
- **ImageNet** で FID スコア **2.8** を達成し、高品質な生成を実現

#### **3. インペインティング**
- **Places365** データセットで FID **9.39** を達成（40-50%欠損領域）


LDM は計算効率を向上させながら、画像生成、超解像、インペインティングなど多様なタスクで良好な性能を示しました。

---

## 6 まとめ
この論文では、Diffusion Model の計算効率を改善するために **Latent Diffusion Model (LDM)** を提案しました。LDM は以下の利点を持つことが示されました。 

1. **計算効率**：低次元の潜在空間での訓練により、学習と推論のコストを削減  
2. **高品質な生成**：従来の手法と同等以上の生成品質  
3. **柔軟な条件付き生成**：テキストやレイアウトなど、多様な条件での生成に対応  

## おまけ
Google Colab で **Stable Diffusion** を動かしてみました。  
いくつか注意点がありますので、動作確認の際に参考にしてください。

- **画像サイズの調整**  
  無課金プランの GPU でも動作するよう、画像サイズをデフォルトの **512×512** から **256×256** に下げています。ただし、このサイズではディテールが荒くなり、画像生成がうまくいかない場合もあります。 GPU として T4 以上を利用できる場合は、`pipe` 内の `height` と `width` を調整して解像度を上げてください。

- **再現性の確保**  
  シード値を固定（`torch.manual_seed(1729)`）することで、毎回同じ条件で画像を生成できます。

- **テキストプロンプトの簡略化**  
  現在はシンプルなプロンプト（例: `"A photo of a chick"`）を使用していますが、画像サイズを大きくすると、複雑なプロンプト（例: `"A photorealistic chick in a futuristic environment"`）にも対応しやすくなります。

- **Hugging Face トークンの登録**  
  Hugging Face のトークンが必要です。Google Colab を利用する場合は、左側の鍵アイコン（**シークレット**）から `HUGGINGFACE_TOKEN` を登録してください。トークンが登録されていない場合、エラーが発生します。

<details>

<summary>🐣note: Hugging Face トークンの取得方法</summary>

1. **Hugging Face のアカウント作成**  
   [Hugging Face](https://huggingface.co/) の公式サイトでアカウントを作成します。

2. **トークンの生成**  
   - トップ右上のアイコンから **"Settings"** を選択
   - 左メニューから **"Access Tokens"** をクリックし、**"New token"** を作成
   - トークン名を設定し、**"Role"** を `Read` に設定
   - 生成されたトークンをコピー

> 🐣トークンは一度しか見えないので、必ずコピーを保存してください。

3. **Google Colab のシークレットに登録**  
   Colab の鍵アイコンをクリックし、**"HUGGINGFACE_TOKEN"** という名前でトークンを登録します。  
   登録後はコード内で環境変数から読み取ることができます。

</details>

### 実行コード

```python
# 必要なライブラリをインストール
!pip -q install diffusers transformers accelerate scipy

# ライブラリのインポート
import os
from huggingface_hub import login
from diffusers import StableDiffusionPipeline
import torch
from google.colab import userdata
from IPython.display import display

# Colab のシークレット環境変数からトークンを取得
token = userdata.get("HUGGINGFACE_TOKEN")

# Hugging Face トークンで認証
login(token)

# Stable Diffusion パイプラインをロード（半精度設定）
model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda" if torch.cuda.is_available() else "cpu"

pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to(device)

# テキストプロンプトと画像サイズの設定
prompt = "A photo of a chick"
generator = torch.manual_seed(1729)  # 再現性のためにシードを固定

# 画像生成: 256x256サイズ (動くなら 512x512 奨励)
image = pipe(prompt, num_inference_steps=50, height=256, width=256, guidance_scale=7.5, generator=generator).images[0]

# 生成画像を Colab 上で表示
display(image)

# 生成画像を保存
image.save("generated_image.png")
```

生成された画像はこちら。

![generated_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/4c3955f8-aae8-62c2-a7ad-33d37ef2be0f.png)

> 🐣 めっちゃ見られてる～～

これで無課金 Colab 環境でも動作確認できるはずです！必要に応じてプロンプトや設定を変更し、異なる画像を生成してみてください。

---

## おわりに
LDM は計算効率と品質を両立した強力な生成モデルです。LDM による実用モデルとして Stable Diffusion が公開されたことで一気に脚光を浴びた手法でもあります。私的には LDM が U-NET、GAN、CLIP、Transformer といった有名どころの技術を所々で採用しているのが印象的でした。優れた手法というのは応用も効くといういい例ですね。ではまた次の記事でお会いしましょう。