Diffusion Models: DDPMサンプリングプロセスの詳細解説

Tech

Diffusion Models: DDPMサンプリングプロセスの詳細解説

要点(3行)

  • DDPM(Denoising Diffusion Probabilistic Models)は、ノイズから高品質なデータを生成する確率的生成モデルであり、その中核は「逆拡散過程」にある。

  • サンプリングプロセスは、学習済みのノイズ予測ネットワーク(U-Netなど)が各ステップでノイズを除去し、純粋なガウスノイズから徐々に明確な画像を再構築するマルコフ連鎖として機能する。

  • 課題は生成に多数のステップ(例:1000ステップ)を要し、計算コストが高いことだが、高品質な画像生成能力は広く評価されている。

背景(課題/先行研究/最新動向)

画像生成タスクにおいて、Generative Adversarial Networks (GANs) は長らくSOTAの性能を示してきましたが、学習の不安定性やモード崩壊といった課題を抱えていました。これに対し、Diffusion Modelsは、安定した学習と多様な画像生成能力により注目を集めています。

DDPMは、画像を徐々にノイズ化する「拡散過程(Forward Process)」と、ノイズから画像を復元する「逆拡散過程(Reverse Process)」という2つのプロセスで構成される生成モデルです[1]。サンプリングとは、この逆拡散過程を実行してノイズから新しいデータを生成するフェーズを指します。

最新動向(直近90日):

  • 拡散モデルの効率化: DDPMの登場(2020年6月19日[1])以来、サンプリング速度の改善が主要な研究課題となっています。DhariwalとNicholは、2021年5月11日発表の論文で、DDPMの構造やサンプリング戦略を改良し、GANsを超える画像品質を実現しました[2]。また、NicholとDhariwalは、2021年2月18日発表の論文で、より効率的なサンプリングや対数尤度向上手法を提案しています[3]。

  • 多様なアプリケーション: 拡散モデルは、画像生成だけでなく、動画生成、音声合成、3Dデータ生成など、幅広い分野で応用が進んでいます。2022年6月1日に発表されたKarrasらの研究では、サンプリング効率を向上させるための様々な設計空間を体系的に調査しています[4]。

  • 条件付き生成の進化: テキストから画像への生成(Text-to-Image)における拡散モデルの利用は、ユーザーの具体的な指示に基づいて高品質なコンテンツを生成する能力を飛躍的に向上させました。 、このDDPMの中核である逆拡散過程、すなわちサンプリングプロセスに焦点を当て、その詳細なメカニズムを解説します。

提案手法 / モデル構造

DDPMのサンプリングプロセスは、純粋なガウスノイズから開始し、学習済みのノイズ予測ネットワークを用いて繰り返しノイズを除去することで、最終的に目的の画像を生成します。

DDPMサンプリングプロセスの概要図

graph TD
    A["開始: 純粋なガウスノイズ x_T"] --> |最初の状態| B{"時刻 t = T-1 から開始"};
    B --> |現在の状態| C["現在のノイズデータ x_t"];
    C --> |ノイズ予測| D["ノイズ予測ネットワーク ε_θ(x_t, t)"];
    D --> |推定ノイズ ε_θ| E{"ノイズ除去とx_{t-1"}の計算};
    E --> |計算結果| F["次のステップのデータ x_{t-1}"];
    F --> |tをデクリメント| G{"t >= 0?"};
    G -- はい --> |次の時刻へ| B;
    G -- いいえ --> |プロセス終了| H["最終生成画像 x_0"];

この図は、DDPMの逆拡散過程(サンプリング)の流れを示しています。ステップ T (最もノイズが多い状態) から 0 (ノイズがない状態) へと時間を逆行しながら、各ステップで学習済みのニューラルネットワーク ε_θ がノイズを予測し、そのノイズを取り除くことで画像を徐々に明確にしていきます。

DDPMサンプリングアルゴリズムの擬似コード/最小Python

以下は、DDPMのサンプリングプロセスを模倣したPythonの擬似コードです。ここでは、ノイズ予測ネットワーク ε_θ(x_t, t) が既に学習済みであることを前提としています。

import torch
import torch.nn as nn
import numpy as np

# 仮定: ノイズ予測ネットワーク ε_θ(x_t, t) が既に学習済み


# 実際にはU-Netのような複雑な構造を持つ

class NoisePredictor(nn.Module):
    def __init__(self, img_channels, time_embedding_dim=256):
        super().__init__()

        # 簡易的なU-Net様の構造を想定 (実際はもっと複雑)

        self.conv1 = nn.Conv2d(img_channels, 64, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(64, img_channels, kernel_size=3, padding=1)
        self.time_embed_layer = nn.Linear(time_embedding_dim, 64)

    def forward(self, x_t, t_embed):

        # x_t: ノイズを含む画像データ (batch_size, channels, H, W)


        # t_embed: 時刻 t の埋め込みベクトル (batch_size, time_embedding_dim)

        # 時間埋め込みを空間次元に拡張し、画像特徴に加算


        # unsqueeze(-1).unsqueeze(-1) で (batch_size, dim, 1, 1) に変換

        time_features = self.relu(self.time_embed_layer(t_embed)).unsqueeze(-1).unsqueeze(-1)

        h = self.relu(self.conv1(x_t))
        noise_pred = self.conv2(h + time_features) # 時間情報を加算してノイズを予測
        return noise_pred # 予測されたノイズ ε_θ

# 時刻 t を埋め込む関数(Sinusoidal Positional Embeddingを模倣)

def get_time_embedding(t_batch, embedding_dim=256):
    half_dim = embedding_dim // 2
    emb = np.log(10000) / (half_dim - 1)
    emb = torch.exp(torch.arange(half_dim, dtype=torch.float32) * -emb)

    # t_batch は (batch_size,) のTensorを想定

    emb = t_batch.float().unsqueeze(1) * emb.unsqueeze(0)
    emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=-1)
    return emb

def ddpm_sampling(
    noise_predictor: NoisePredictor,
    T: int, # 拡散ステップの総数 (例: 1000)
    img_size: tuple = (3, 64, 64), # 生成画像のチャネル、高さ、幅 (C, H, W)
    betas: torch.Tensor = None, # 拡散過程のノイズスケジュール β_t
    device: torch.device = torch.device("cpu")
) -> torch.Tensor:
    """
    DDPMのサンプリングプロセスをシミュレートする擬似コード。
    学習済みのノイズ予測ネットワーク ε_θ を使用し、純粋なノイズから画像を生成する。

    入力:
        noise_predictor (NoisePredictor): 学習済みのノイズ予測ネットワーク ε_θ。
        T (int): 拡散ステップの総数。
        img_size (tuple): 生成する画像のサイズ (C, H, W)。
        betas (torch.Tensor): 拡散スケジュールのβ値のテンソル (T,)。
                              指定しない場合は論文[1]の線形スケジュールを生成。
        device (torch.device): 実行デバイス (CPU/GPU)。

    出力:
        torch.Tensor: 生成された画像 x_0_hat。ピクセル値は[-1, 1]の範囲。

    前提:

        - noise_predictorは `forward(x_t, t_embedding)` を持つ。

        - get_time_embeddingは時刻tから埋め込みベクトルを生成する。

        - betas (β_t) は、論文 [1] の定義に従う。

        - アルファ値 (α_t = 1 - β_t) と累積アルファ値 (α_bar_t = Π α_s) はbetasから計算される。

    計算量:

        - T回のループ。各ループでnoise_predictorのフォワードパスが1回。

        - noise_predictorの計算量は画像のピクセル数とモデルの複雑さに依存。
          典型的なU-Netの場合、O(N * C * H * W * log(N)) (Nはパラメータ数) または O(N * C * H * W) 。
          総計算量は O(T * Model_Computation_Cost)。

        - メモリ: 主にnoise_predictorのモデルパラメータと、中間で保持するx_t。
          O(Model_Parameters_Memory + Image_Memory)。
    """
    if betas is None:

        # Ho et al., 2020 [1] の線形スケジュールを模倣

        betas = torch.linspace(0.0001, 0.02, T, device=device)

    alphas = 1.0 - betas
    alphas_cumprod = torch.cumprod(alphas, dim=0) # α_bar_t = Π_{s=1}^t α_s

    # x_T は純粋なガウスノイズから開始


    # バッチサイズ1で例示

    x_t = torch.randn(1, *img_size, device=device) 

    print(f"Sampling started with T={T} steps (JST: 2025年10月19日).")

    for t in reversed(range(T)):
        t_tensor = torch.tensor([t], dtype=torch.long, device=device)
        t_embedding = get_time_embedding(t_tensor).to(device)

        # 1. ノイズ予測ネットワーク ε_θ でノイズを予測

        predicted_noise = noise_predictor(x_t, t_embedding)

        # 2. DDPMの逆拡散ステップの平均 μ_θ(x_t, t) と分散 Σ_θ(x_t, t) を計算


        # 論文 [1] の Algorithm 2 (Sampling) を参照

        alpha_t = alphas[t]
        alpha_bar_t = alphas_cumprod[t]
        beta_t = betas[t]

        # μ_θ(x_t, t) の計算 (Eq. 11 から導出される)


        # x_0_pred = (x_t - sqrt(1 - alpha_bar_t) * predicted_noise) / sqrt(alpha_bar_t)


        # mean = (x_t - (beta_t / sqrt(1 - alpha_bar_t)) * predicted_noise) / sqrt(alpha_t)


        # 上記は簡略化した形式で、Ho et al., 2020 のAlgorithm 2では以下のように記述される

        mean = (1 / torch.sqrt(alpha_t)) * (x_t - ((1 - alpha_t) / torch.sqrt(1 - alpha_bar_t)) * predicted_noise)

        # Σ_θ(x_t, t) の計算 (論文では β_tilde_t を使用)


        # β_tilde_t = (1 - alpha_cumprod_prev) / (1 - alpha_cumprod_t) * β_t


        # ただし、Ho et al., 2020 のAlgorithm 2では単に β_t でサンプリングする


        # ここでは後者の簡略化された形式を採用。


        # (厳密には Algorithm 2では σ_t^2 = β_t または β_tilde_t を選択できる)

        variance = beta_t 

        # 3. 新しいデータ x_{t-1} をサンプリング

        if t > 0:

            # x_{t-1} = μ_θ(x_t, t) + sqrt(Σ_θ(x_t, t)) * z, where z ~ N(0, I)

            z = torch.randn_like(x_t, device=device)
            x_t = mean + torch.sqrt(variance) * z
        else:
            x_t = mean # t=0ではノイズを加えない (最終出力)

    print("Sampling finished.")

    # 生成された画像は [-1, 1] の範囲に正規化されていると仮定

    return x_t

計算量/メモリ/スケーリング

DDPMのサンプリングプロセスは、拡散ステップ数 T に比例して計算コストが増加します。

  • 計算量: 各サンプリングステップにおいて、ノイズ予測ネットワーク(通常はU-Netのような大規模なニューラルネットワーク)のフォワードパスが1回実行されます。U-Netの計算量は、入力画像のピクセル数とモデルの層数、チャンネル数に大きく依存します。したがって、総計算量は O(T × U-Net_computation_cost) となります。DDPMの原論文では T=1000 ステップが一般的であり[1]、これはサンプリングに時間がかかる主要な理由です。

  • メモリ: モデルのパラメータ(U-Netの重み)が最も大きなメモリを占有します。加えて、現在の画像 x_t や中間計算結果が一時的にメモリに保持されます。画像の解像度が高くなるほど、これらのメモリ消費は増加します。O(U-Net_parameters_memory + Image_memory) と表現できます。

  • スケーリング: 高解像度の画像を生成するためには、U-Netのサイズを大きくしたり、より多くのステップ数を必要とする場合があります。これは計算コストとメモリ消費の線形的な増加に直結します。サンプリングの効率化は、DDIMs (Denoising Diffusion Implicit Models) [4] やその他の高速サンプラーの開発によって進められていますが、DDPMの基本的なサンプリングは依然として高コストです。

実験設定/再現性

DDPMの実験は、通常、以下のような設定で行われます。

  • データセット: CIFAR-10, CelebA, LSUNなどの標準的な画像データセット。

  • ネットワークアーキテクチャ: ノイズ予測ネットワークにはU-Netが用いられることが一般的です。U-Netは、ダウンサンプリングとアップサンプリングの経路を持ち、スキップコネクションによって異なる解像度での特徴を結合します。

  • 拡散スケジュール: ノイズスケジュールの β_t は、通常、0.0001から0.02までの線形スケジュールが用いられます[1]。このスケジュールは、拡散過程と逆拡散過程のノイズの強さを決定します。

  • ステップ数: T=1000 ステップが一般的な設定です[1]。

  • 最適化: AdamWオプティマイザがよく用いられます。

  • 乱数種: 実験の再現性を確保するために、乱数種を固定することが重要です。これにより、同じ入力から同じ生成結果を得ることが保証されます。

結果(表)

DDPMの評価には、FID (Fréchet Inception Distance) や IS (Inception Score) などの指標が用いられます。これらの指標は、生成された画像の品質と多様性を定量的に評価します。

| 評価項目 | DDPM (Ho et al., 2020 [1]) | 備考 “`

Diffusion Models: DDPMサンプリングプロセスの詳細解説

要点(3行)

  • DDPM(Denoising Diffusion Probabilistic Models)は、ノイズから高品質なデータを生成する確率的生成モデルであり、その中核は「逆拡散過程」にある。

  • サンプリングプロセスは、学習済みのノイズ予測ネットワーク(U-Netなど)が各ステップでノイズを除去し、純粋なガウスノイズから徐々に明確な画像を再構築するマルコフ連鎖として機能する。

  • 課題は生成に多数のステップ(例:1000ステップ)を要し、計算コストが高いことだが、高品質な画像生成能力は広く評価されている。

背景(課題/先行研究/最新動向)

画像生成タスクにおいて、Generative Adversarial Networks (GANs) は長らくSOTAの性能を示してきましたが、学習の不安定性やモード崩壊といった課題を抱えていました。これに対し、Diffusion Modelsは、安定した学習と多様な画像生成能力により注目を集めています。

DDPMは、画像を徐々にノイズ化する「拡散過程(Forward Process)」と、ノイズから画像を復元する「逆拡散過程(Reverse Process)」という2つのプロセスで構成される生成モデルです[1]。サンプリングとは、この逆拡散過程を実行してノイズから新しいデータを生成するフェーズを指します。

最新動向(直近90日):

  • 拡散モデルの効率化: DDPMの登場(2020年6月19日[1])以来、サンプリング速度の改善が主要な研究課題となっています。DhariwalとNicholは、2021年5月11日発表の論文で、DDPMの構造やサンプリング戦略を改良し、GANsを超える画像品質を実現しました[2]。また、NicholとDhariwalは、2021年2月18日発表の論文で、より効率的なサンプリングや対数尤度向上手法を提案しています[3]。

  • 多様なアプリケーション: 拡散モデルは、画像生成だけでなく、動画生成、音声合成、3Dデータ生成など、幅広い分野で応用が進んでいます。2022年6月1日に発表されたKarrasらの研究では、サンプリング効率を向上させるための様々な設計空間を体系的に調査しています[4]。

  • 条件付き生成の進化: テキストから画像への生成(Text-to-Image)における拡散モデルの利用は、ユーザーの具体的な指示に基づいて高品質なコンテンツを生成する能力を飛躍的に向上させました。

本記事では、このDDPMの中核である逆拡散過程、すなわちサンプリングプロセスに焦点を当て、その詳細なメカニズムを解説します。

提案手法 / モデル構造

DDPMのサンプリングプロセスは、純粋なガウスノイズから開始し、学習済みのノイズ予測ネットワークを用いて繰り返しノイズを除去することで、最終的に目的の画像を生成します。

DDPMサンプリングプロセスの概要図

graph TD
    A["開始: 純粋なガウスノイズ x_T"] --> |最初の状態| B{"時刻 t = T-1 から開始"};
    B --> |現在の状態| C["現在のノイズデータ x_t"];
    C --> |ノイズ予測| D["ノイズ予測ネットワーク ε_θ(x_t, t)"];
    D --> |推定ノイズ ε_θ| E{"ノイズ除去とx_{t-1"}の計算};
    E --> |計算結果| F["次のステップのデータ x_{t-1}"];
    F --> |tをデクリメント| G{"t >= 0?"};
    G -- はい --> |次の時刻へ| B;
    G -- いいえ --> |プロセス終了| H["最終生成画像 x_0"];

この図は、DDPMの逆拡散過程(サンプリング)の流れを示しています。ステップ T (最もノイズが多い状態) から 0 (ノイズがない状態) へと時間を逆行しながら、各ステップで学習済みのニューラルネットワーク ε_θ がノイズを予測し、そのノイズを取り除くことで画像を徐々に明確にしていきます。

DDPMサンプリングアルゴリズムの擬似コード/最小Python

以下は、DDPMのサンプリングプロセスを模倣したPythonの擬似コードです。ここでは、ノイズ予測ネットワーク ε_θ(x_t, t) が既に学習済みであることを前提としています。

import torch
import torch.nn as nn
import numpy as np

# 仮定: ノイズ予測ネットワーク ε_θ(x_t, t) が既に学習済み


# 実際にはU-Netのような複雑な構造を持つ

class NoisePredictor(nn.Module):
    def __init__(self, img_channels, time_embedding_dim=256):
        super().__init__()

        # 簡易的なU-Net様の構造を想定 (実際はもっと複雑)

        self.conv1 = nn.Conv2d(img_channels, 64, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(64, img_channels, kernel_size=3, padding=1)
        self.time_embed_layer = nn.Linear(time_embedding_dim, 64)

    def forward(self, x_t, t_embed):

        # x_t: ノイズを含む画像データ (batch_size, channels, H, W)


        # t_embed: 時刻 t の埋め込みベクトル (batch_size, time_embedding_dim)

        # 時間埋め込みを空間次元に拡張し、画像特徴に加算


        # unsqueeze(-1).unsqueeze(-1) で (batch_size, dim, 1, 1) に変換

        time_features = self.relu(self.time_embed_layer(t_embed)).unsqueeze(-1).unsqueeze(-1)

        h = self.relu(self.conv1(x_t))
        noise_pred = self.conv2(h + time_features) # 時間情報を加算してノイズを予測
        return noise_pred # 予測されたノイズ ε_θ

# 時刻 t を埋め込む関数(Sinusoidal Positional Embeddingを模倣)

def get_time_embedding(t_batch, embedding_dim=256):
    half_dim = embedding_dim // 2
    emb = np.log(10000) / (half_dim - 1)
    emb = torch.exp(torch.arange(half_dim, dtype=torch.float32) * -emb)

    # t_batch は (batch_size,) のTensorを想定

    emb = t_batch.float().unsqueeze(1) * emb.unsqueeze(0)
    emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=-1)
    return emb

def ddpm_sampling(
    noise_predictor: NoisePredictor,
    T: int, # 拡散ステップの総数 (例: 1000)
    img_size: tuple = (3, 64, 64), # 生成画像のチャネル、高さ、幅 (C, H, W)
    betas: torch.Tensor = None, # 拡散過程のノイズスケジュール β_t
    device: torch.device = torch.device("cpu")
) -> torch.Tensor:
    """
    DDPMのサンプリングプロセスをシミュレートする擬似コード。
    学習済みのノイズ予測ネットワーク ε_θ を使用し、純粋なノイズから画像を生成する。

    入力:
        noise_predictor (NoisePredictor): 学習済みのノイズ予測ネットワーク ε_θ。
        T (int): 拡散ステップの総数。
        img_size (tuple): 生成する画像のサイズ (C, H, W)。
        betas (torch.Tensor): 拡散スケジュールのβ値のテンソル (T,)。
                              指定しない場合は論文[1]の線形スケジュールを生成。
        device (torch.device): 実行デバイス (CPU/GPU)。

    出力:
        torch.Tensor: 生成された画像 x_0_hat。ピクセル値は[-1, 1]の範囲。

    前提:

        - noise_predictorは `forward(x_t, t_embedding)` を持つ。

        - get_time_embeddingは時刻tから埋め込みベクトルを生成する。

        - betas (β_t) は、論文 [1] の定義に従う。

        - アルファ値 (α_t = 1 - β_t) と累積アルファ値 (α_bar_t = Π α_s) はbetasから計算される。

    計算量:

        - T回のループ。各ループでnoise_predictorのフォワードパスが1回。

        - noise_predictorの計算量は画像のピクセル数とモデルの複雑さに依存。
          典型的なU-Netの場合、O(N * C * H * W * log(N)) (Nはパラメータ数) または O(N * C * H * W) 。
          総計算量は O(T * Model_Computation_Cost)。

        - メモリ: 主にnoise_predictorのモデルパラメータと、中間で保持するx_t。
          O(Model_Parameters_Memory + Image_Memory)。
    """
    if betas is None:

        # Ho et al., 2020 [1] の線形スケジュールを模倣

        betas = torch.linspace(0.0001, 0.02, T, device=device)

    alphas = 1.0 - betas
    alphas_cumprod = torch.cumprod(alphas, dim=0) # α_bar_t = Π_{s=1}^t α_s

    # x_T は純粋なガウスノイズから開始


    # バッチサイズ1で例示

    x_t = torch.randn(1, *img_size, device=device) 

    print(f"Sampling started with T={T} steps (JST: 2025年10月19日).")

    for t in reversed(range(T)):
        t_tensor = torch.tensor([t], dtype=torch.long, device=device)
        t_embedding = get_time_embedding(t_tensor).to(device)

        # 1. ノイズ予測ネットワーク ε_θ でノイズを予測

        predicted_noise = noise_predictor(x_t, t_embedding)

        # 2. DDPMの逆拡散ステップの平均 μ_θ(x_t, t) と分散 Σ_θ(x_t, t) を計算


        # 論文 [1] の Algorithm 2 (Sampling) を参照

        alpha_t = alphas[t]
        alpha_bar_t = alphas_cumprod[t]
        beta_t = betas[t]

        # μ_θ(x_t, t) の計算 (Eq. 11 から導出される)


        # x_0_pred = (x_t - sqrt(1 - alpha_bar_t) * predicted_noise) / sqrt(alpha_bar_t)


        # mean = (x_t - (beta_t / sqrt(1 - alpha_bar_t)) * predicted_noise) / sqrt(alpha_t)


        # 上記は簡略化した形式で、Ho et al., 2020 のAlgorithm 2では以下のように記述される

        mean = (1 / torch.sqrt(alpha_t)) * (x_t - ((1 - alpha_t) / torch.sqrt(1 - alpha_bar_t)) * predicted_noise)

        # Σ_θ(x_t, t) の計算 (論文では β_tilde_t を使用)


        # β_tilde_t = (1 - alpha_cumprod_prev) / (1 - alpha_cumprod_t) * β_t


        # ただし、Ho et al., 2020 のAlgorithm 2では単に β_t でサンプリングする


        # ここでは後者の簡略化された形式を採用。


        # (厳密には Algorithm 2では σ_t^2 = β_t または β_tilde_t を選択できる)

        variance = beta_t 

        # 3. 新しいデータ x_{t-1} をサンプリング

        if t > 0:

            # x_{t-1} = μ_θ(x_t, t) + sqrt(Σ_θ(x_t, t)) * z, where z ~ N(0, I)

            z = torch.randn_like(x_t, device=device)
            x_t = mean + torch.sqrt(variance) * z
        else:
            x_t = mean # t=0ではノイズを加えない (最終出力)

    print("Sampling finished.")

    # 生成された画像は [-1, 1] の範囲に正規化されていると仮定

    return x_t

計算量/メモリ/スケーリング

DDPMのサンプリングプロセスは、拡散ステップ数 T に比例して計算コストが増加します。

  • 計算量: 各サンプリングステップにおいて、ノイズ予測ネットワーク(通常はU-Netのような大規模なニューラルネットワーク)のフォワードパスが1回実行されます。U-Netの計算量は、入力画像のピクセル数とモデルの層数、チャンネル数に大きく依存します。したがって、総計算量は O(T × U-Net_computation_cost) となります。DDPMの原論文では T=1000 ステップが一般的であり[1]、これはサンプリングに時間がかかる主要な理由です。

  • メモリ: モデルのパラメータ(U-Netの重み)が最も大きなメモリを占有します。加えて、現在の画像 x_t や中間計算結果が一時的にメモリに保持されます。画像の解像度が高くなるほど、これらのメモリ消費は増加します。O(U-Net_parameters_memory + Image_memory) と表現できます。

  • スケーリング: 高解像度の画像を生成するためには、U-Netのサイズを大きくしたり、より多くのステップ数を必要とする場合があります。これは計算コストとメモリ消費の線形的な増加に直結します。サンプリングの効率化は、DDIMs (Denoising Diffusion Implicit Models) [4] やその他の高速サンプラーの開発によって進められていますが、DDPMの基本的なサンプリングは依然として高コストです。

実験設定/再現性

DDPMの実験は、通常、以下のような設定で行われます。

  • データセット: CIFAR-10, CelebA, LSUNなどの標準的な画像データセット。

  • ネットワークアーキテクチャ: ノイズ予測ネットワークにはU-Netが用いられることが一般的です。U-Netは、ダウンサンプリングとアップサンプリングの経路を持ち、スキップコネクションによって異なる解像度での特徴を結合します。

  • 拡散スケジュール: ノイズスケジュールの β_t は、通常、0.0001から0.02までの線形スケジュールが用いられます[1]。このスケジュールは、拡散過程と逆拡散過程のノイズの強さを決定します。

  • ステップ数: T=1000 ステップが一般的な設定です[1]。

  • 最適化: AdamWオプティマイザがよく用いられます。

  • 乱数種: 実験の再現性を確保するために、乱数種を固定することが重要です。これにより、同じ入力から同じ生成結果を得ることが保証されます。

結果(表)

DDPMの評価には、FID (Fréchet Inception Distance) や IS (Inception Score) などの指標が用いられます。これらの指標は、生成された画像の品質と多様性を定量的に評価します。

| 評価項目 | DDPM (Ho et al., 2020 [1]) | Improved DDPM (Nichol & Dhariwal, 2021 [3]) | 備考 “`

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました