Skip to content
Published on

Diffusion Models Deep Dive — DDPM、Latent Diffusion、Classifier-Free Guidance、DDIM、Stable Diffusion 完全攻略 (2025)

Authors

TL;DR

  • Diffusion Modelは「段階的なノイズ除去を学習する」生成モデル。Forward processが画像に徐々にノイズを加え、Reverse process (ニューラルネットワーク) がそれを戻す。
  • DDPM (2020, Ho et al.): 現代diffusionの出発点。Variational lower boundをnoise prediction lossひとつに単純化。
  • Score Matching: 同じ発想を別の言葉で。Reverse diffusion = score function推定。
  • U-Net: Diffusionの標準バックボーン。Skip connection付きencoder-decoder。入力と同じサイズのnoiseを出力。
  • Latent Diffusion Model (LDM, 2021): VAEで画像をlatent空間に圧縮し、その中でdiffusion。48倍の計算削減 → コンシューマGPUで可能に。
  • Stable Diffusion = LDM + CLIP text encoder + オープンソース公開 (2022 Stability AI)。
  • Classifier-Free Guidance: 条件付き/無条件モデルを組み合わせてprompt忠実度を調整。Text-to-image品質の秘訣。
  • DDIM: 決定論的sampling。1000 step → 20 stepに加速。
  • Consistency Model: 1-4 stepで生成。リアルタイム級。
  • Conditional Generation: ControlNet、LoRA、InstructPix2Pixなどで制御可能。
  • Video & 3D: Sora、Stable Video Diffusion、DreamFusion。Diffusionが画像を超えて広がる。

1. 生成モデルの進化

1.1 GANの時代 (2014-2020)

2014年 Ian GoodfellowのGAN (Generative Adversarial Network)。Generatorが画像を作り、Discriminatorが「本物 vs 偽物」を判別。2つのネットワークが競争しながら学習。

長所:

  • 一度でサンプル生成 (速い)。
  • 高品質な画像。

短所:

  • Mode collapse: 一部のモードしか生成しない。
  • Training instability: ハイパーパラメータに非常に敏感。
  • スケーリングが難しい: データを増やしたときに不安定。

StyleGAN (2019) まで進化したが、複雑なシーン (テキストを含む) には限界。

1.2 VAEの限界

VAE (Variational Autoencoder) は安定だが結果がぼやける。Encoderがlatent codeの分布を学習し、Decoderが復元。生成は可能だが品質でGANに劣った。

1.3 Autoregressiveの限界

PixelRNN、PixelCNN、iGPT: ピクセルを順次生成。品質は良いが非常に遅い (ピクセル一つひとつを予測)。1024×1024の画像生成 = 100万回のforward pass。

1.4 Diffusionの登場 (2020)

2020年DDPM (Ho, Jain, Abbeel)。「奇妙なほど単純な」方法:

  1. 画像に段階的にノイズを追加 (forward)。
  2. ニューラルネットワークにノイズを予測させる。
  3. 生成時はランダムノイズから始め、繰り返しノイズ除去。

結果: GANより品質が良く、安定し、多様なサンプル。コミュニティが沸いた。

1.5 スケーリングの成功

2021: Dhariwal & Nicholが「Diffusion Beats GANs」を発表。画像品質SOTA。

2021 GLIDE: OpenAIによるtext-to-image diffusion。ただし遅く重かった。

2021 LDM: Rombach et al.のLatent Diffusion。流れを変えた。ピクセル空間ではなくlatent空間でdiffusion → 50倍高速。

2022 DALL-E 2: OpenAIの強力なtext-to-image。

2022 Stable Diffusion: Stability AIがLDMをオープンソース化。ローカルGPUで実行可能。生成AIの大衆化

2022 Imagen: Google。text encoderの重要性を証明。

2024 Sora: OpenAIのビデオdiffusion。分単位の高品質ビデオ。

1.6 なぜDiffusionは成功したか

核心: 学習が単純で安定。GANのmin-maxゲームではなく単純なMSE loss。スケールに応じて一貫して改善。より多くのデータ + 大きなモデル = より良い結果。「単純なものがスケールする」。


2. Forward Process — ノイズの追加

2.1 アイデア

画像 x_0 にノイズを段階的に追加:

x_0 (原本) → x_1 → x_2 → ... → x_T (ほぼ純粋なノイズ)

各stepで少しずつガウシアンノイズ。T = 1000 (DDPM)。

2.2 数式

各stepの遷移:

q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t I)

意味:

  • x_tsqrt(1 - beta_t) * x_{t-1} を平均、beta_t を分散とするガウシアンからサンプリング。
  • beta_tnoise schedule — 各stepでどれだけノイズを加えるか。
  • 序盤は小さい beta (画像を保持)、終盤は大きい beta (ノイズが支配)。

2.3 Noise Schedule

Linear (DDPM原本):

beta_1 = 0.0001
beta_T = 0.02
beta_t = 線形補間

Cosine (Nichol & Dhariwal, 2021):

alpha_t = cos^2(pi/2 * (t/T + s) / (1 + s))
beta_t = 1 - alpha_t / alpha_{t-1}

Cosineは序盤はゆっくりノイズを加えるため低解像度で有利。現代のほとんどのモデルはcosineまたはその変種。

2.4 Closed Form

連鎖適用時に便利な性質: 任意の t における x_t を直接計算可能

定義:

αt=1βt,αˉt=s=1tαs\alpha_t = 1 - \beta_t, \quad \bar{\alpha}_t = \prod_{s=1}^{t} \alpha_s

すると:

q(xtx0)=N(xt;αˉtx0,(1αˉt)I)q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I)

あるいはsamplable form:

xt=αˉtx0+1αˉtϵ,ϵN(0,I)x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)

Forward processは学習なしに数学で計算される。原本 x_0 とランダムノイズ epsilon さえあれば、任意の時点の x_t を即座に生成できる。

2.5 終端状態

T が十分に大きければ alpha_bar_T はほぼ 0 で x_T はほぼ N(0, I)原本と無関係な純粋ガウシアンノイズ

ここが核心: どんな画像から始めても終端状態は同じ。Reverse processは純粋ノイズから始めても画像に到達可能


3. Reverse Process — 学習が必要な部分

3.1 目標

Forward processを「逆に戻したい」:

pθ(xt1xt)=?p_\theta(x_{t-1} | x_t) = ?

真の逆過程はBayesで表現できるが扱いにくい。ニューラルネットが近似する。

3.2 パラメータ化

2つの方法:

1. 平均 mu_theta(x_t, t) を予測:

pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))

2. ノイズ epsilon_theta(x_t, t) を予測:

Ho et al.が示した — ノイズを直接予測するほうがはるかに良く機能する。平均は次式で導出:

μθ(xt,t)=1αt(xtβt1αˉtϵθ(xt,t))\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right)

3.3 Lossの単純化

Variational Lower Boundを導出すると複雑だが、Ho et al.の洞察: 単純なMSE lossでもほぼ同じ効果:

Lsimple=Et,x0,ϵ[ϵϵθ(αˉtx0+1αˉtϵ,t)2]L_{\text{simple}} = \mathbb{E}_{t, x_0, \epsilon} \left[ \| \epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t) \|^2 \right]

つまり:

  1. ランダムな原本画像 x_0
  2. ランダムな時点 t。
  3. ランダムなノイズ epsilon
  4. Forwardで x_t を計算。
  5. ニューラルネットに x_t を与え epsilon を予測させる。
  6. MSEで学習。

驚くほど単純。GANのmin-maxはない。純粋なsupervised learning。

3.4 Sampling (Inference)

学習完了後の生成:

def sample(model, T=1000):
    # 開始: 純粋ノイズ
    x_t = torch.randn(shape)
    
    for t in reversed(range(T)):
        # ノイズ予測
        epsilon = model(x_t, t)
        
        # 平均を計算
        alpha_t = alphas[t]
        alpha_bar_t = alpha_bars[t]
        beta_t = betas[t]
        
        mu = (1 / sqrt(alpha_t)) * (x_t - beta_t / sqrt(1 - alpha_bar_t) * epsilon)
        
        # 次stepをサンプル
        if t > 0:
            z = torch.randn_like(x_t)
            sigma = sqrt(beta_t)
            x_t = mu + sigma * z
        else:
            x_t = mu
    
    return x_t  # 生成画像

各stepでモデルを1回呼び出す → 次のstep。1000 step = 1000回のforward pass。非常に遅い。

3.5 なぜ機能するのか

直感: クリーンな画像からノイズの多い画像への変換は確率的。逆もまた然り。十分に小さいstepであればガウシアンで近似可能。モデルは「現在のノイズ水準から一歩だけクリーンにする方向」を学べばよい。

数学的には diffusion SDE の離散化。連続SDEの形式:

dx=f(x,t)dt+g(t)dWdx = f(x, t)dt + g(t)dW

Reverse SDE (Anderson 1982):

dx=[f(x,t)g(t)2xlogpt(x)]dt+g(t)dWˉdx = [f(x, t) - g(t)^2 \nabla_x \log p_t(x)] dt + g(t) d\bar{W}

grad_x log p_t(x)score function — これが次のセクション。


4. Score-Basedの視点

4.1 Score Function

分布 p(x) の score は:

xlogp(x)\nabla_x \log p(x)

「この点で確率が増える方向」。高確率領域へ向かうgradient。

4.2 Score Matching = Diffusion

驚くべき等価性: DDPMのノイズ予測 = score推定

証明のスケッチ: x_t ~ N(sqrt(alpha_bar_t) x_0, (1 - alpha_bar_t) I) のとき、

xtlogp(xtx0)=ϵ1αˉt\nabla_{x_t} \log p(x_t | x_0) = -\frac{\epsilon}{\sqrt{1 - \bar{\alpha}_t}}

つまり scoreはノイズに比例。ノイズ予測とscore推定は同じ問題の別表現。

4.3 Song & Ermonの視点

Yang Songの研究 (2019-2020) は score-based generative model を先に提案。DDPMとは独立だが数学的には同等。

長所: 連続SDEフレームワークのほうがきれい。ODE形式 (probability flow ODE) でも表現可能。

4.4 統合フレームワーク

Song et al. 2021 "Score-Based Generative Modeling through SDEs": DDPM、NCSNなどはすべて同じSDEフレームワークの特殊ケース。

現代のdiffusion研究は SDE の視点と DDPM の視点を自在に行き来する。実用的には DDPM 表記が直感的、理論的には SDE が優雅。


5. U-Netアーキテクチャ

DiffusionモデルのバックボーンはほとんどがU-Net。

5.1 なぜU-Netなのか

Diffusionモデルの要件:

  • 入力と出力が同じ空間サイズ (画像 → ノイズ)。
  • マルチスケール特徴が必要 (globally coherent + locally detailed)。
  • 位置情報の保存。

U-Net (もともと医療画像セグメンテーション用、2015):

  • Encoder: 解像度↓、チャンネル↑。
  • Decoder: 解像度↑、チャンネル↓。
  • Skip connection: encoderとdecoderの同レベルを直接接続。

完璧な相性。

5.2 構造

Input (例: 64x64x3)
   |
   v
Conv -> ResBlock -> Attention
   |      |
   |   Downsample (-> 32x32)
   |      |
   |   ResBlock -> Attention
   |      |
   |   Downsample (-> 16x16)
   |      |
   |   ResBlock -> Attention    <- Bottleneck
   |      |
   |   Upsample (-> 32x32)
   |      ^ (skip from encoder)
   |   ResBlock -> Attention
   |      ^
   |   Upsample (-> 64x64)
   |      ^ (skip)
   v
Output (64x64x3) — 予測されたノイズ

5.3 Timestep Embedding

U-Netは現在の時点 t を知る必要がある。同じ画像でも「初期diffusion (少しノイズ)」vs「後期 (多くのノイズ)」でdenoisingは異なる。

Sinusoidal position embedding:

PE(t,2i)=sin(t/100002i/d)\text{PE}(t, 2i) = \sin(t / 10000^{2i/d})

その後 MLP → ResBlock に bias として加算。

5.4 Attention Layer

Diffusion U-Netには self-attention が含まれる。長距離依存関係 (遠いピクセル間の相関) を捉える。特にbottleneck付近。

5.5 Conditioning

テキスト条件付き生成では cross-attention を追加:

Image features -> Query
Text features (CLIP) -> Key, Value

U-Netがテキストと画像の間を学習する。これが「promptに従う」核心。

5.6 2025: Diffusion Transformer (DiT)

2023年 William Peebles et al. が Diffusion Transformer (DiT) を提案。U-Netの代わりに純粋なTransformer

  • パッチ単位入力 (ViTのように)。
  • スケーリング特性が優秀。
  • Soraの基盤。

DiTは大規模でU-Netを上回る → 2024-2025のトレンドはDiTへ移行中。


6. DDIM — 高速Sampling

6.1 DDPMの遅さ

DDPMは1000 step sampling。超高品質だが遅すぎる。1分以上。

6.2 DDIMの洞察

Song et al. 2021: DDPMのreverse processを決定論的にしてstepをスキップ可能にできる。

核心の数式 (簡略化):

xt1=αˉt1x^0+1αˉt1ϵθ(xt,t)x_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \hat{x}_0 + \sqrt{1 - \bar{\alpha}_{t-1}} \epsilon_\theta(x_t, t)

ここで:

x^0=xt1αˉtϵθ(xt,t)αˉt\hat{x}_0 = \frac{x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon_\theta(x_t, t)}{\sqrt{\bar{\alpha}_t}}

x_hat_0 は「現時点での最良予測」 — 「今すぐクリーンな画像を出すならこれ」。

6.3 高速Sampling

DDPMは1000 stepが必要。DDIMは任意のサブシーケンスが使える:

timesteps = [0, 50, 100, 150, 200, ..., 950]  # 20 steps

50倍高速。品質はわずかに落ちるがほぼ同じ。

6.4 各種Sampler

DDIM以降、多くのvariant:

  • Euler: ODE視点のEuler integrator。
  • Heun: 2次のRunge-Kutta。
  • DPM-Solver: diffusion向けの特殊ODE solver。10-25 step。
  • DPM-Solver++: さらに改良。現在Stable Diffusionのデフォルト。
  • UniPC: unified predictor-corrector。

すべて同じ発想: samplingをODE問題と捉え、効率的なsolverを適用。


7. Classifier-Free Guidance

Text-to-imageの最も重要なトリック

7.1 問題

素朴な条件付き生成:

x_t -> model(x_t, text) -> noise

問題: モデルがテキストを無視しうる。学習中にテキストは弱いシグナル。

7.2 Classifier Guidance (旧)

元はDhariwal & Nicholの提案。別途classifierを学習して:

scorecond=xlogp(xy)=xlogp(x)+xlogp(yx)\text{score}_{\text{cond}} = \nabla_x \log p(x | y) = \nabla_x \log p(x) + \nabla_x \log p(y | x)

grad_x log p(y|x) が classifier gradient。問題: 別のclassifierの学習が必要で複雑。

7.3 Classifier-Free Guidance (新)

Ho & Salimans 2022: classifierなしで同じ効果。

学習時:

  1. 10-20%の確率でテキストを null (空の条件) に置き換える。
  2. 同じモデルが条件付きと無条件の両方を学習。

推論時:

noise_cond = model(x_t, text)         # 条件付き予測
noise_uncond = model(x_t, null)       # 無条件予測

# Extrapolation!
guided_noise = noise_uncond + scale * (noise_cond - noise_uncond)

scale = 1 は単純な条件付き。scale > 1条件方向へ強化。一般値: 5-12。

7.4 なぜ機能するのか

直感: 「条件付きから無条件を引けば条件の効果だけが残る」。これを拡大 → 条件を強調。まるで「テキストにもっと忠実であれ」と強制するように。

実用的には text-to-image の prompt忠実度 を決める。これがないと promptは無視される。

7.5 Trade-off

scale を上げると:

  • 良い点: promptにより正確。
  • 悪い点: 画像の多様性が減少。
  • 悪い点: artifactが増加 (scaleが過大だと)。

通常 7-12 が sweet spot。


8. Latent Diffusion Model

8.1 ピクセル空間の問題

原DDPMはピクセル空間でdiffusion。512×512×3 = 786,432 次元。各stepでこのすべての次元を処理 → 非常に高コスト。

8.2 LDMのアイデア (Rombach et al. 2021)

「ピクセル空間は無駄が多い。ほとんどのピクセルは近傍と似ており、意味のある情報はもっと少ない次元にある。VAEで圧縮してその空間でdiffusionしよう」。

構造:

Image (512x512x3)
     |
   VAE Encoder
     |
   Latent (64x64x4)  <- ここでdiffusion
     |
   VAE Decoder
     |
   Image (512x512x3)

Latent空間は 64×64×4 = 16,384 次元。原本の1/48。計算を48倍削減。

8.3 VAEの学習

LDMは事前学習済みのVAEを使う。VAEは別途学習:

  • Encoder: 画像 → latent。
  • Decoder: latent → 画像。
  • Loss: reconstruction + KL + perceptual (LPIPS) + adversarial (discriminator)。

一度学習すればすべてのdiffusionで再利用。

8.4 Diffusion in Latent Space

VAEは固定。その上で標準DDPM:

latent = vae.encode(image)  # 画像 -> latent
noisy_latent = forward_diffusion(latent, t)
predicted_noise = unet(noisy_latent, t, text)
# Loss: MSE between predicted_noise and actual noise

生成時:

noise = torch.randn(1, 4, 64, 64)  # latent size
for t in reversed(timesteps):
    noise = denoise_step(unet, noise, t, text)
image = vae.decode(noise)

8.5 利点のまとめ

  • 計算: 48倍高速。
  • メモリ: 同じく48倍少ない。
  • 高解像度が可能: 1024×1024も現実的。
  • Semantic abstraction: latent空間が意味のある表現を学習 → より良い汎化。

8.6 限界

  • VAE損失: 細部の情報損失 (テキスト、顔など)。
  • VAE artifact: わずかなぼかし、微妙な歪み。
  • それでも圧倒的に価値がある。

9. Stable Diffusion

9.1 構成

Stable Diffusion (2022 Stability AI) = LDM + CLIP + オープンソース。

コンポーネント:

  1. VAE: 画像 ↔ 8倍圧縮されたlatent。
  2. CLIP text encoder: テキスト → 768次元ベクトル。
  3. U-Net: latent空間のdiffusion。Cross-attentionでテキスト条件。
  4. Scheduler: DDIM、DPM-Solverなど。

9.2 CLIP Text Encoder

OpenAI CLIP (Contrastive Language-Image Pre-training, 2021)。大規模な画像-テキストペアで学習されたテキスト/画像encoder。

役割:

  • prompt → 高次元embedding。
  • U-Netのcross-attentionがこのembeddingを参照。

CLIPが良いほどprompt理解が良い。Stable DiffusionはCLIP ViT-L/14を使用。

9.3 学習データ

LAION-5B: ウェブからクロールした50億の画像-テキストペア。Openなので再現可能。著作権論争もここから。

9.4 バージョンの進化

SD 1.x (2022): 最初のリリース。512×512。OpenAI CLIP。

SD 2.x (2022): aestheticsの改善。OpenCLIPを使用。

SDXL (2023): より大きなモデル、refiner。1024×1024ネイティブ。大幅に良い品質。

SD 3 (2024): Rectified flowを採用。Diffusion Transformerベース。

Flux (2024 Black Forest Labs): SD3を受け継ぐ強者。オープンソースSOTA。

9.5 オープンソース vs クローズド

Stable Diffusion: オープンソース。ローカル実行、fine-tuning、改変が可能。

DALL-E 3、Midjourney: APIのみ。品質はより良いかもしれないがブラックボックス。

研究/カスタマイズはSDが主流。商用品質はクローズド。


10. Conditional Generationのテクニック

10.1 Text-to-Image (基本)

上で説明済み。テキストprompt → 画像。

10.2 Image-to-Image (img2img)

初期latentをランダムノイズではなく既存画像のlatentから開始。

input_latent = vae.encode(input_image)
noisy = forward_diffuse(input_latent, strength)  # partial noise
output = denoise(noisy, text)

strength が 0.3 なら少しだけ変わり、0.9 ならほぼ再生成。「この絵をこう変えて」のパターン。

10.3 Inpainting

マスクの内側だけ再生成。マスクされた部分はノイズ、残りは原本を維持。

mask = user_drawn_mask
latent = vae.encode(image)
for t in reversed(timesteps):
    # ノイズ予測
    noise = unet(noisy, t, text)
    # マスク外は原本で置換 (毎step)
    noisy = noisy * mask + forward_diffuse(latent, t) * (1 - mask)

特定領域のみ修正。Photoshopの「generative fill」がこれ。

10.4 ControlNet

Lvmin Zhang et al. 2023。追加条件で構造を制御。

アイデア: U-Netを複製した「control」ネットワークを学習。Controlネットワークがedge、pose、depthのようなヒント画像を受け取り、U-Netに影響を与える。

Input image (pose skeleton)
   |
ControlNet copy of U-Net
   |
Influence on main U-Net
   |
Output: promptに合うがposeに従う

ControlNetのバリエーション:

  • Canny: edgeベース。
  • Depth: depth mapベース。
  • OpenPose: 人間のposeベース。
  • Scribble: 手描きスケッチ。
  • Segmentation: semantic mask。

「特定の構図 + 自由なスタイル」パターン。非常に有用。

10.5 LoRA (Low-Rank Adaptation)

事前学習済みモデルを小さなパラメータで特化。

アイデア: 各レイヤーの重み W に low-rank update を追加。

W=W+ΔW=W+BAW' = W + \Delta W = W + BA

BR^{d x r}AR^{r x k}r << min(d, k)

AB のみ学習。元の W は固定。結果:

  • はるかに少ないパラメータ: 数百MB → 数MB。
  • 高速な学習: 数千画像で特定のスタイル/キャラクタを学習。
  • 切り替え可能: 複数のLoRAをon/off。

Civitai のようなサイトに数万のLoRA。「このアニメキャラのスタイル」「このアーティストのスタイル」など。

10.6 DreamBooth

特定の被写体 (自分の犬、特定の人物) を学習。5-10枚の写真だけで。

入力: 犬の写真数枚
学習: "sks dog" のような固有tokenをこの犬に結びつける
出力: "sks dog on the beach" -> 自分の犬が海辺に

LoRAと組み合わせた軽量DreamBoothが主流。

10.7 Textual Inversion

新しい単語を学習。単語のembeddingのみ学習しモデルは固定。

"<new_concept>" というtokenを学習
このtokenのembeddingが特定のスタイル/被写体を表現

より軽量だが制限的。

10.8 InstructPix2Pix

自然言語命令で編集。

入力: 画像 + "remove the person"
出力: 人が消された画像

ChatGPTスタイルの編集インターフェイス。


11. Consistency Models — リアルタイム生成

11.1 問題

DDIMでも20-50 stepが必要。リアルタイム (100ms未満) には不足。

11.2 Consistency Model (Song et al. 2023)

「DiffusionはODE軌道をたどる。その軌道の任意の点から直接 x_0 へジャンプできるように学習しよう」。

学習後、1-4 stepで高品質生成が可能。

11.3 Latent Consistency Model

LCM (2023): LDM + Consistency Distillation。Stable Diffusionを2-4 stepに加速。

従来のSDXL: 25 step x 150ms = 3.75s
LCM SDXL: 4 step x 150ms = 600ms

リアルタイム対話的生成が可能。ユーザがpromptを入力するにつれ結果がリアルタイム更新。

11.4 SDXL Turbo

Stability AIの2023年リリース。SDXLを1 stepで生成。品質はわずかに落ちるがほぼ即時。

11.5 Progressive Distillation

元モデル (teacher) の複数stepを1 stepで学習する手法。繰り返しstep数を半分に。

1000 → 500 → 250 → ... → 1 step。

各段階でstudentモデルがteacherのn stepを1 stepで近似。


12. ビデオDiffusion

12.1 素朴なアプローチ

各フレームを独立にdiffusion → フレーム間の一貫性がない。ちらつき、キャラクタが変わる。

12.2 Temporal Attention

U-Netに temporal attention layer を追加。時間軸に沿ってattentionをかけて一貫性を維持。

Spatial Attention (画像内の位置)
Temporal Attention (フレーム間)

12.3 Video Diffusion Models

Stable Video Diffusion (2023): 画像 → 短いビデオ (2-4秒)。

Sora (2024 OpenAI): 分単位の高品質。Diffusion Transformerベース。Patch単位で空間×時間を統合処理。

Soraの秘訣:

  • DiTアーキテクチャ (U-Netではない)。
  • Spacetime patches: 3D volumetric処理。
  • 巨大なスケール (モデル + データ)。
  • 高品質なキャプション (GPT-4でビデオ説明を生成)。

13. 3D Diffusion

13.1 DreamFusion

2D diffusion modelを使って3Dオブジェクトを生成。

アイデア: SDS (Score Distillation Sampling)。3Dオブジェクトのパラメータ (NeRF) を最適化。2D diffusionが「このビューはこのpromptに忠実か」を評価。

結果: 数時間の学習後「テキスト → 3D mesh」。

13.2 Gaussian Splatting + Diffusion

2023+ Gaussian Splattingが3D表現の基本に。DiffusionがGaussianパラメータを生成。

13.3 限界

2Dよりはるかに難しい。学習データ不足、品質の限界。現在活発な研究領域。


14. 実装実践

14.1 Hugging Face Diffusers

Pythonライブラリ。Stable Diffusionなどを3行で:

from diffusers import StableDiffusionPipeline
import torch

pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16
).to("cuda")

image = pipe("a photograph of an astronaut riding a horse").images[0]
image.save("astronaut.png")

14.2 Schedulerの差し替え

from diffusers import DPMSolverMultistepScheduler

pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    pipe.scheduler.config
)

# これで20 stepでも高品質
image = pipe(prompt, num_inference_steps=20).images[0]

14.3 LoRAのロード

pipe.load_lora_weights("path/to/lora", weight_name="my_style.safetensors")
pipe.fuse_lora(lora_scale=0.7)

image = pipe("a cat in my_style style").images[0]

14.4 ControlNet

from diffusers import StableDiffusionControlNetPipeline, ControlNetModel

controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/sd-controlnet-canny"
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    controlnet=controlnet
)

from PIL import Image
edge_image = Image.open("canny_edges.png")
image = pipe(prompt="a modern house", image=edge_image).images[0]

14.5 Inference最適化

  • FP16: torch_dtype=torch.float16。メモリ半減、速度改善。
  • Memory-efficient attention: pipe.enable_xformers_memory_efficient_attention() または PyTorch 2+ の scaled_dot_product_attention
  • VAE tiling: 大きな画像生成時のメモリ超過を防止。
  • TensorRT / OpenVINO: コンパイル最適化。2-3倍の加速。

15. 倫理と法的課題

15.1 著作権

LAION-5Bには著作権画像が含まれる。学習の合法性が議論されている。

  • Getty Images: Stability AIを相手取った訴訟 (2023)。
  • Andersen v. Stability AI: アーティストによる集団訴訟。

2025年現在、判決が進行中。結果がAI産業全体に影響する。

15.2 Deepfakes

Face swap、わいせつ合成。Diffusionの品質向上とともに悪用が増加。

対策:

  • Content credentials (C2PA): 画像にメタデータでAI生成を表示。
  • Watermarking: Stable Signatureのようなinvisible watermark。
  • Detection: AI生成検出モデル。

15.3 バイアス

学習データのバイアスが出力に反映。特定の職業 = 男性、特定の外見 = 優位。研究と緩和が活発。

15.4 雇用

イラストレーター、デザイナーの懸念。「AIが絵を描くなら私は?」新しいツールへの適応 vs 規制の議論。


16. 今後の方向性

16.1 高品質 + 高速生成

Consistency modelのさらなる発展。1 stepでの高品質生成。

16.2 コントロール

単純なテキストを超えた精密な制御 — pose、構図、色調、スタイル。

16.3 一貫性

複数の画像/フレーム間の一貫性。キャラクタの同一性の維持。

16.4 Multimodal

テキスト + 画像 + 音声 + ビデオの統合生成。

16.5 小型モデル

LCM、Turboのような加速 + モデル縮小。モバイル/エッジでの実行。

16.6 Physical Simulation

Soraが示した可能性: diffusionが物理法則を「暗黙的に」学習。「world model」への拡張。


17. 学習リソース

論文:

  • DDPM (Ho et al. 2020) — 必読。
  • Latent Diffusion (Rombach et al. 2021)。
  • Classifier-Free Guidance (Ho & Salimans 2022)。
  • DDIM (Song et al. 2020)。
  • Stable Diffusion (2022 Stability AI)。
  • DiT (Peebles & Xie 2023)。
  • Consistency Model (Song et al. 2023)。

書籍/ガイド:

  • "Hands-On Machine Learning" — Aurelien Geron (拡張版にdiffusion追加)。
  • Lilian Wengのブログ: "What are Diffusion Models?"。
  • Jay Alammarの可視化ブログ。

コード:

  • Hugging Face Diffusersライブラリ (Python)。
  • Stability AI公式リポ (stability-ai/generative-models)。
  • AUTOMATIC1111 Stable Diffusion Web UI。

講義:

  • Yang SongのMIT講義 (score-based models)。
  • Andrew Ngの生成AIコース。

18. 要約 — 1ページまとめ

+-----------------------------------------------------+
|          Diffusion Models Cheat Sheet                |
+-----------------------------------------------------+
| 核心アイデア:                                          |
|   ノイズ追加 -> ネットがノイズ予測 -> 戻す             |
|                                                       |
| Forward Process:                                      |
|   x_t = sqrt(alpha_bar_t) * x_0 + sqrt(1-abar) * eps |
|   学習なしで計算可能                                    |
|   Noise schedule: linear, cosine                      |
|                                                       |
| Reverse Process:                                      |
|   ネット eps_theta(x_t, t) を学習                       |
|   Loss: MSE(eps, eps_theta)                           |
|   Simple, stable, scalable                            |
|                                                       |
| 数学的視点:                                             |
|   DDPM: variational bound                             |
|   Score matching: grad log p(x)                       |
|   SDE: dx = f dt + g dW                               |
|   ODE: probability flow                               |
|                                                       |
| U-Netアーキテクチャ:                                    |
|   Encoder-decoder + skip                              |
|   Timestep embedding (sinusoidal)                     |
|   Self-attention + Cross-attention (text)             |
|   2024+: Diffusion Transformer (DiT)                 |
|                                                       |
| Sampling:                                             |
|   DDPM: 1000 step、遅い                                |
|   DDIM: 決定論的、20-50 step                           |
|   DPM-Solver++: 10-25 step                            |
|   Consistency Model: 1-4 step                         |
|                                                       |
| Latent Diffusion (LDM):                               |
|   VAE encoder: image -> latent                        |
|   latentでdiffusion (48x削減)                         |
|   VAE decoder: latent -> image                        |
|   Stable Diffusionの基盤                               |
|                                                       |
| Classifier-Free Guidance:                             |
|   学習: 10% null condition                             |
|   推論: uncond + scale*(cond - uncond)                 |
|   scale 7-12 = prompt忠実                              |
|                                                       |
| 条件付き制御:                                           |
|   Text: CLIP + cross-attention                        |
|   Image: img2img                                      |
|   Structure: ControlNet (canny, pose, depth)          |
|   Style: LoRA                                         |
|   Subject: DreamBooth                                 |
|   Edit: InstructPix2Pix, inpainting                   |
|                                                       |
| Production:                                           |
|   Stable Diffusion (オープン)                          |
|   DALL-E 3, Midjourney (クローズド)                    |
|   Flux (2024+, SOTAオープン)                           |
|                                                       |
| 拡張:                                                  |
|   Video: Sora, Stable Video Diffusion                 |
|   3D: DreamFusion                                     |
|   Audio: AudioLDM                                     |
+-----------------------------------------------------+

19. クイズ

Q1. DDPMの学習lossが単純なMSEである理由は?

A. Ho et al. (2020) の核心的な洞察 — variational lower boundを数学的に単純化すると、各stepで「実際のノイズと予測ノイズのMSE」に帰着する。元々は複雑なKL divergence項があるが、reparameterizationと巧みな導出の後、ほとんどが消えてノイズ予測誤差だけが残る。これがDiffusionの学習をGANのような不安定なmin-maxゲームではなく純粋なsupervised learningにした核心理由。lossが単純なのでスケールに応じて一貫して改善し、ハイパーパラメータに対する敏感さが低い。「単純なものがスケールする」原則の典型例。

Q2. Latent Diffusionが計算を48倍削減した方法は?

A. VAEで画像を圧縮した後、latent空間でdiffusion。原本の512×512×3 = 786,432次元のピクセル空間の代わりに、64×64×4 = 16,384次元のVAE latent空間でdenoisingを実行。各stepが48倍小さいtensorを処理 → 計算とメモリの両方が48倍削減。VAEは事前学習済みでdiffusion学習中は固定。損失は軽微 (VAEの再構成品質が良いため)。この単純な変更で「データセンターが必要」から「コンシューマGPUで実行可能」になり、それがStable Diffusionがオープンソースで大衆化できた背景。小さな構造変更が社会的影響をもたらした事例。

Q3. Classifier-Free Guidanceはどのように機能するのか?

A. 学習時には10-20%の確率でテキスト条件をnull (空の条件) に置き換えることで、同じモデルが条件付き生成と無条件生成の両方を学習。推論時には2つの予測を計算: noise_cond = model(x, text)noise_uncond = model(x, null)。そのあとextrapolation: guided = uncond + scale * (cond - uncond)scale > 1 なら「条件方向に誇張」 → テキストpromptにより忠実。直感的には「条件付きから無条件を引けば条件の純粋な効果が残る」を拡大したもの。scale 7-12がsweet spot。この単純なトリックがtext-to-imageの実用品質を決定 — これがないとpromptが無視される。

Q4. Score-basedの視点とDDPMの視点の関係は?

A. 数学的に等価。Yang Songのscore-based generative model (2019) とHoのDDPM (2020) は独立に開発されたが、同じものの異なる表現。Score function grad_x log p(x) を推定することと「ノイズ epsilon を予測すること」が定数倍で関係する: grad_{x_t} log p(x_t) = -epsilon / sqrt(1 - alpha_bar_t)。Song et al. 2021が2つを統合SDEフレームワークで証明。実用的にはDDPM表記が直感的でコードが単純、理論的にはSDE/scoreが優雅で連続極限を扱いやすい。2つの視点を自在に行き来できれば論文読解がはるかに容易になる。

Q5. DDIMがDDPMより50倍速い理由は?

A. 決定論的samplingを可能にしてstepをスキップできるようにする。DDPMのreverse processは確率的 (毎stepランダムノイズを追加) なので、必ず1000 stepを順次踏まねばならない。DDIMは同じ学習済みモデルを違うように解釈して決定論的ODE軌道と見なす — 「現在の x_t から x_{t-1} へ行く方向」が数学的に定まる。決定論的なのでサブシーケンス (例: [0, 50, 100, ..., 950] 20 step) にジャンプしても数学的に合理的。品質は少し落ちるがほぼ同じ。以後DPM-Solver、DPM-Solver++などがより効率的なODE solverで10-25 stepまで削減。すべて「DDIMの決定論的経路」アイデアに基づく。

Q6. ControlNetが従来の条件付き生成と異なる点は?

A. 構造的制御のためにU-Netの複製を追加学習する。既存のcross-attentionテキスト条件は「スタイル/内容」を制御するが、「正確な構図/pose」は調整しにくい。ControlNetはU-Net encoderの複製を作り、新しい入力 (canny edge、pose skeleton、depth mapなど) を受けて元のU-Netの各レイヤーに影響を与える。元のU-Netは固定、ControlNet部分のみ学習 → 小さなデータでも可能。結果: 「このスケッチの構図 + promptの内容」が正確に結合。実写写真のposeをマンガ風に変換する、建物のレイアウトからレンダリング生成など。精密な制御が必要な実務で必須。2023年以降SDの標準機能。

Q7. Consistency Modelが1-4 stepで生成できる理由は?

A. 軌道の任意の点から直接 x_0 にジャンプするようモデルを学習する。一般のdiffusionは「現在stepから一歩クリーンに」学習するが、Consistency Modelは「現在stepから完全にクリーンな画像に直接」を学習する。これが可能な理由は、diffusionのprobability flow ODE軌道が決定論的だから — 同じ軌道上のすべての点が同じ x_0 に収束すべきというconsistency条件をlossに追加。学習後は1 stepでかなり良い結果、2-4 stepで高品質。Latent Consistency Model (LCM) はこれをLDMに適用しSDXLを4 stepで回す。リアルタイム対話的生成 (ユーザのタイピングに合わせてリアルタイム更新) を可能にした技術。


この記事が役に立った方は、次の記事もチェックしてみてください:

  • "Transformer Architecture Deep Dive" — DiTの基盤。
  • "LLVM Compiler Infrastructure" — MLIRがAIコンパイラの基盤となった背景。
  • "RDMA & NCCL" — 大規模diffusionモデル学習のネットワーク基盤。
  • "CUDA & GPU Kernels" — diffusion推論の加速。