Skip to content
Published on

DDPM論文完全分析:ノイズから画像を生み出す拡散モデルの数学と原理

Authors
  • Name
    Twitter

1. 論文概要

「Denoising Diffusion Probabilistic Models」(DDPM)は2020年のNeurIPSで発表された論文で、UC BerkeleyのJonathan HoAjay JainPieter Abbeelが共同執筆した。この論文は拡散確率モデル(Diffusion Probabilistic Model)を通じて高品質な画像合成が可能であることを実証的に示した記念碑的な研究である。

核心アイデアは驚くほどシンプルだ。データに段階的にガウシアンノイズを追加するForward Processと、このノイズを段階的に除去して元のデータを復元するReverse Processを学習するのである。最終的な学習目標は「モデルが予測したノイズ」と「実際に追加されたノイズ」間の単純なMSE損失に帰結する。

DDPMはCIFAR-10でFID 3.17Inception Score 9.46を達成し、当時のGANベースモデルと同等以上の性能を示した。さらに重要なのは、この論文がその後のDALL-E 2ImagenStable DiffusionMidjourneyなど現代の画像生成AIの土台となったという事実である。

論文情報

  • タイトル: Denoising Diffusion Probabilistic Models
  • 著者: Jonathan Ho, Ajay Jain, Pieter Abbeel
  • 学会: NeurIPS 2020
  • arXiv: 2006.11239
  • 公式コード: hojonathanho/diffusion

2. 背景:熱力学から生成モデルへ

2.1 非平衡熱力学からのインスピレーション

Diffusion Modelの知的起源は非平衡統計力学(Non-equilibrium Thermodynamics)にある。物理学における拡散(Diffusion)とは、粒子が濃度の高い場所から低い場所へランダムに移動し、最終的に熱的平衡状態(最大エントロピー)に到達する過程を指す。この過程の核心的な洞察は以下の通りである。

  • Forward:複雑な構造を持つ状態 \rightarrow 無秩序な平衡状態(情報の破壊)
  • Reverse:平衡状態 \rightarrow 構造を持つ状態への復元(情報の生成)

Sohl-Dickstein et al.(2015)がこのアイデアを初めて機械学習に適用し、「Deep Unsupervised Learning using Nonequilibrium Thermodynamics」を発表した。複雑なデータ分布をシンプルな既知の分布(ガウシアン)に変換する拡散過程を定義し、その逆過程を学習すれば生成モデルになるというものである。

2.2 Score Matchingとの接続

Diffusion Modelのもう一つの理論的支柱はScore Matchingである。Score functionは対数確率密度の勾配として定義される。

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

このscore functionを推定できれば、Langevin Dynamicsを通じてサンプルを生成できる。

xt+1=xt+ϵ2xlogp(xt)+ϵz,zN(0,I)x_{t+1} = x_t + \frac{\epsilon}{2} \nabla_x \log p(x_t) + \sqrt{\epsilon} \, z, \quad z \sim \mathcal{N}(0, I)

Yang SongとStefano Ermon(2019)は「Generative Modeling by Estimating Gradients of the Data Distribution」でNoise Conditional Score Networks(NCSN)を提案し、さまざまなノイズレベルでのscore functionを推定する方法を提示した。Ho et al.のDDPMはこのScore Matching観点と深く結びついており、論文でも「denoising score matching with Langevin dynamicsとの新たな接続」を核心的貢献として言及している。

2.3 SDE観点:統一フレームワーク

Song et al.(2021)は「Score-Based Generative Modeling through Stochastic Differential Equations」でDDPMとScore Matchingを確率微分方程式(SDE)という統一フレームワークで結びつけた。Forward Processを連続時間SDEで記述すると以下の通りである。

dx=f(x,t)dt+g(t)dwdx = f(x, t) \, dt + g(t) \, dw

ここでffはdrift coefficient、ggはdiffusion coefficient、wwは標準Wiener processである。このSDEに対応する逆時間SDEが存在する。

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

核心は、逆方向SDEを解くために必要なものが時間に依存するscore function xlogpt(x)\nabla_x \log p_t(x)のみであるという点だ。DDPMのノイズ予測ネットワークϵθ\epsilon_\thetaは、実質的にこのscore functionを推定することと等価である。

ϵθ(xt,t)1αˉtxtlogp(xt)\epsilon_\theta(x_t, t) \approx -\sqrt{1 - \bar{\alpha}_t} \, \nabla_{x_t} \log p(x_t)

この関係がDDPMとScore Matchingを理論的に統合する核心的なつながりである。


3. Forward Process:体系的にノイズを追加する

3.1 マルコフ連鎖としてのForward Process

Forward Process(またはDiffusion Process)は元のデータx0x_0に段階的にガウシアンノイズを追加する固定マルコフ連鎖である。学習可能なパラメータはなく、事前に定義されたVariance Schedule {β1,β2,...,βT}\{\beta_1, \beta_2, ..., \beta_T\}によって完全に決定される。

各時間ステップttでの遷移確率は以下のように定義される。

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)

これを展開すると、各ステップで前の時点のデータを1βt\sqrt{1 - \beta_t}倍に縮小し、分散βt\beta_tのガウシアンノイズを追加するということである。

xt=1βtxt1+βtϵt1,ϵt1N(0,I)x_t = \sqrt{1 - \beta_t} \, x_{t-1} + \sqrt{\beta_t} \, \epsilon_{t-1}, \quad \epsilon_{t-1} \sim \mathcal{N}(0, I)

**なぜ1βt\sqrt{1 - \beta_t}でスケーリングするのか?**各ステップで全体の分散が保存されるようにするためである。xt1x_{t-1}の分散が1であれば、1βtxt1\sqrt{1-\beta_t} \cdot x_{t-1}の分散は1βt1-\beta_tであり、分散βt\beta_tのノイズを加えると全体の分散は(1βt)+βt=1(1-\beta_t) + \beta_t = 1となる。

TTが十分に大きくβt\beta_tが適切に設定されると、xTx_Tはほぼ純粋な等方性ガウシアンノイズN(0,I)\mathcal{N}(0, I)に収束する。

3.2 全体Forward Process

TTステップにわたる全体Forward Processの結合分布は以下の通りである。

q(x1:Tx0)=t=1Tq(xtxt1)q(x_{1:T} | x_0) = \prod_{t=1}^{T} q(x_t | x_{t-1})

これはマルコフ性による もので、各ステップが直前のステップにのみ依存する。DDPMではT=1000T = 1000を使用し、β1=104\beta_1 = 10^{-4}からβT=0.02\beta_T = 0.02まで線形的に増加させる。


4. 核心数学:Reparameterization Trick

4.1 任意の時間ttへ一度にジャンプ

Forward Processの最も強力な数学的性質は、x0x_0から任意の時間ttでのxtx_t中間ステップを経ずに直接計算できるということである。これが学習を効率的にする核心である。

まず表記法を定義する。

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

αˉt\bar{\alpha}_tαs\alpha_sの累積積で、時間ttまで元の信号がどれだけ保存されているかを表す。

4.2 導出過程

x1x_1から始めて帰納的に導出してみよう。

x1=α1x0+1α1ϵ0x_1 = \sqrt{\alpha_1} \, x_0 + \sqrt{1 - \alpha_1} \, \epsilon_0 x2=α2x1+1α2ϵ1x_2 = \sqrt{\alpha_2} \, x_1 + \sqrt{1 - \alpha_2} \, \epsilon_1

x1x_1x2x_2に代入すると、

x2=α2(α1x0+1α1ϵ0)+1α2ϵ1x_2 = \sqrt{\alpha_2} \left( \sqrt{\alpha_1} \, x_0 + \sqrt{1 - \alpha_1} \, \epsilon_0 \right) + \sqrt{1 - \alpha_2} \, \epsilon_1 =α1α2x0+α2(1α1)ϵ0+1α2ϵ1= \sqrt{\alpha_1 \alpha_2} \, x_0 + \sqrt{\alpha_2(1-\alpha_1)} \, \epsilon_0 + \sqrt{1-\alpha_2} \, \epsilon_1

ここで独立ガウシアンの和の法則を適用する。2つの独立ガウシアンN(0,σ12I)\mathcal{N}(0, \sigma_1^2 I)N(0,σ22I)\mathcal{N}(0, \sigma_2^2 I)の和はN(0,(σ12+σ22)I)\mathcal{N}(0, (\sigma_1^2 + \sigma_2^2)I)に従う。

ノイズ項の分散を合算すると、

α2(1α1)+(1α2)=α2α1α2+1α2=1α1α2=1αˉ2\alpha_2(1-\alpha_1) + (1-\alpha_2) = \alpha_2 - \alpha_1\alpha_2 + 1 - \alpha_2 = 1 - \alpha_1\alpha_2 = 1 - \bar{\alpha}_2

したがって、

x2=αˉ2x0+1αˉ2ϵ,ϵN(0,I)x_2 = \sqrt{\bar{\alpha}_2} \, x_0 + \sqrt{1 - \bar{\alpha}_2} \, \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)

これを一般化すると以下の通りである。

4.3 最終結果:閉形式表現

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

すなわち、任意の時間ttでのxtx_tを以下のように一度にサンプリングできる。

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)

この式の意味を直感的に解釈すると以下の通りである。

意味時間に伴う変化
αˉtx0\sqrt{\bar{\alpha}_t} \, x_0元の信号(signal)tt \uparrow なら αˉt\bar{\alpha}_t \downarrow、信号減少
1αˉtϵ\sqrt{1 - \bar{\alpha}_t} \, \epsilon追加ノイズtt \uparrow なら 1αˉt1-\bar{\alpha}_t \uparrow、ノイズ増加

t=0t = 0のときαˉ0=1\bar{\alpha}_0 = 1なのでx0x_0そのままであり、t=Tt = TのときαˉT0\bar{\alpha}_T \approx 0なのでほぼ純粋なノイズとなる。この**Signal-to-Noise Ratio(SNR)**の段階的な減少がForward Processの本質である。

SNR(t)=αˉt1αˉt\text{SNR}(t) = \frac{\bar{\alpha}_t}{1 - \bar{\alpha}_t}

5. Reverse Process:ノイズから画像を復元する

5.1 Reverse Processの定義

Reverse Processは純粋なノイズxTN(0,I)x_T \sim \mathcal{N}(0, I)から始めて段階的にノイズを除去しながらデータx0x_0を生成する過程である。Forward Processの各ステップが小さなガウシアン摂動であるなら、その逆過程もガウシアンで近似できるというのが核心的な仮定である。(βt\beta_tが十分に小さいとき)

pθ(x0:T)=p(xT)t=1Tpθ(xt1xt)p_\theta(x_{0:T}) = p(x_T) \prod_{t=1}^{T} p_\theta(x_{t-1} | x_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))

ここでμθ\mu_\thetaΣθ\Sigma_\thetaはニューラルネットワークが学習すべき平均分散である。DDPMでは分散Σθ\Sigma_\thetaを学習せずσt2I\sigma_t^2 Iに固定し、σt2=βt\sigma_t^2 = \beta_tまたはσt2=β~t=1αˉt11αˉtβt\sigma_t^2 = \tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t} \beta_tを使用する。

5.2 Posterior q(xt1xt,x0)q(x_{t-1}|x_t, x_0)の導出

学習の核心は、x0x_0が与えられたときの逆方向条件付き分布(posterior)が閉形式で計算可能だという点にある。ベイズの定理を適用すると、

q(xt1xt,x0)=q(xtxt1,x0)q(xt1x0)q(xtx0)q(x_{t-1} | x_t, x_0) = \frac{q(x_t | x_{t-1}, x_0) \, q(x_{t-1} | x_0)}{q(x_t | x_0)}

マルコフ性によりq(xtxt1,x0)=q(xtxt1)q(x_t|x_{t-1}, x_0) = q(x_t|x_{t-1})なので、3項すべてがガウシアンである。ガウシアンの積もガウシアンなので、指数部分を展開してxt1x_{t-1}に対する二次式で整理すると以下を得る。

q(xt1xt,x0)=N(xt1;μ~t(xt,x0),β~tI)q(x_{t-1} | x_t, x_0) = \mathcal{N}(x_{t-1}; \tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I)

ここでposterior平均は、

μ~t(xt,x0)=αˉt1βt1αˉtx0+αt(1αˉt1)1αˉtxt\tilde{\mu}_t(x_t, x_0) = \frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t

posterior分散は、

β~t=1αˉt11αˉtβt\tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \beta_t

5.3 x0x_0ϵ\epsilonに置換

モデルはx0x_0を直接知ることができないので、Reparameterization公式xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilonを逆に解いてx0x_0を表現する。

x0=1αˉt(xt1αˉtϵ)x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}} \left( x_t - \sqrt{1-\bar{\alpha}_t} \, \epsilon \right)

これをposterior平均μ~t\tilde{\mu}_tに代入すると、

μ~t=1αt(xtβt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}} \, \epsilon \right)

モデルがノイズϵ\epsilonを予測するネットワークϵθ(xt,t)\epsilon_\theta(x_t, t)を学習すれば、Reverse Processの平均は以下のように計算される。

μθ(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)

これがDDPMのReverse Processにおいてノイズ予測が平均予測と等価になる理由である。


6. 学習目標の導出:ELBOからSimplified Lossへ

6.1 最大尤度とELBO

生成モデルの究極的な目標はデータの対数尤度logpθ(x0)\log p_\theta(x_0)を最大化することである。しかしこれを直接計算することは困難なので、変分下限(Evidence Lower Bound, ELBO)を最適化する。

Jensenの不等式を適用すると、

logpθ(x0)Eq(x1:Tx0)[logpθ(x0:T)q(x1:Tx0)]=ELBO\log p_\theta(x_0) \geq \mathbb{E}_{q(x_{1:T}|x_0)} \left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)} \right] = \text{ELBO}

6.2 ELBOの分解

ELBOをKL divergence項に分解すると以下の通りである。

ELBO=Eq[logpθ(x0x1)]L0:復元項DKL(q(xTx0)p(xT))LT:事前分布一致項t=2TEq[DKL(q(xt1xt,x0)pθ(xt1xt))]Lt1:ノイズ除去一致項\text{ELBO} = \underbrace{\mathbb{E}_q[\log p_\theta(x_0 | x_1)]}_{L_0: \text{復元項}} - \underbrace{D_{\text{KL}}(q(x_T | x_0) \| p(x_T))}_{L_T: \text{事前分布一致項}} - \sum_{t=2}^{T} \underbrace{\mathbb{E}_q \left[ D_{\text{KL}}(q(x_{t-1}|x_t, x_0) \| p_\theta(x_{t-1}|x_t)) \right]}_{L_{t-1}: \text{ノイズ除去一致項}}

各項の意味を分析すると以下の通りである。

LTL_T(Prior Matching)q(xTx0)q(x_T|x_0)が事前分布p(xT)=N(0,I)p(x_T) = \mathcal{N}(0, I)とどれだけ一致するかを測定する。TTが十分に大きければこの項は0に収束し、学習可能なパラメータがないため定数として無視する。

L0L_0(Reconstruction)x1x_1からx0x_0を復元する能力を測定する。x0x_0x1x_1が非常に類似しているため、全体の学習に及ぼす影響は小さい。

Lt1L_{t-1}(Denoising Matching):モデルのReverse遷移pθ(xt1xt)p_\theta(x_{t-1}|x_t)が実際のposterior q(xt1xt,x0)q(x_{t-1}|x_t, x_0)とどれだけ一致するかを測定する核心的な学習信号である。

6.3 KL Divergenceの計算

2つのガウシアン間のKL divergenceは閉形式で計算可能である。q(xt1xt,x0)=N(μ~t,β~tI)q(x_{t-1}|x_t, x_0) = \mathcal{N}(\tilde{\mu}_t, \tilde{\beta}_t I)かつpθ(xt1xt)=N(μθ,σt2I)p_\theta(x_{t-1}|x_t) = \mathcal{N}(\mu_\theta, \sigma_t^2 I)なので、

DKL(qpθ)=12σt2μ~t(xt,x0)μθ(xt,t)2+CD_{\text{KL}}(q \| p_\theta) = \frac{1}{2\sigma_t^2} \|\tilde{\mu}_t(x_t, x_0) - \mu_\theta(x_t, t)\|^2 + C

ここでCCは分散関連の定数項である。分散を固定すれば平均の差だけが学習目標となる。

6.4 ノイズ予測への再パラメータ化

先に導出したμ~t\tilde{\mu}_tμθ\mu_\thetaの表現を代入すると、

μ~tμθ2=βt2(1αˉt)αtϵϵθ(xt,t)2\|\tilde{\mu}_t - \mu_\theta\|^2 = \frac{\beta_t^2}{(1-\bar{\alpha}_t)\alpha_t} \|\epsilon - \epsilon_\theta(x_t, t)\|^2

重み係数を除去したSimplified Lossは以下の通りである。

Lsimple=Et,x0,ϵ[ϵϵθ(xt,t)2]\boxed{L_{\text{simple}} = \mathbb{E}_{t, x_0, \epsilon} \left[ \|\epsilon - \epsilon_\theta(x_t, t)\|^2 \right]}

ここでtUniform({1,...,T})t \sim \text{Uniform}(\{1, ..., T\})x0q(x0)x_0 \sim q(x_0)ϵN(0,I)\epsilon \sim \mathcal{N}(0, I)である。

これがDDPMの最も重要な貢献である。複雑なELBOから出発して、最終的に**「実際のノイズϵ\epsilonと予測ノイズϵθ\epsilon_\thetaのMSE」**という機械学習で最もシンプルな損失関数に到達した。実験的にもこのsimplified lossが重み付きのvariational boundよりも良いサンプル品質を生成する。

6.5 学習アルゴリズムの要約

Algorithm 1: Training
─────────────────────────────────
repeat
    x_0 ~ q(x_0)                    # データセットからサンプル
    t ~ Uniform({1, ..., T})         # ランダム時間ステップを選択
    ε ~ N(0, I)                      # 標準ガウシアンノイズをサンプル
    x_t = √ᾱ_t · x_0 + (1-ᾱ_t) · ε   # ノイズ画像を生成
    ∇_θ ||ε - ε_θ(x_t, t)||²        # 勾配計算と更新
until converged

7. ノイズスケジューリング:βt\beta_tの設計

7.1 Linear Schedule(DDPMオリジナル)

Ho et al.はβt\beta_tβ1=104\beta_1 = 10^{-4}からβT=0.02\beta_T = 0.02まで線形的に増加させるスケジュールを使用した。

βt=β1+t1T1(βTβ1)\beta_t = \beta_1 + \frac{t-1}{T-1}(\beta_T - \beta_1)

このスケジュールの直感は、初期には小さなノイズを追加してデータ構造を徐々に破壊し、後半にはより大きなノイズを追加して素早くガウシアンに収束させるというものである。

7.2 Linear Scheduleの問題点

Nichol & Dhariwal(2021、「Improved Denoising Diffusion Probabilistic Models」)はLinear Scheduleの2つの問題を指摘した。

第一に、初期に情報が早く破壊されすぎる。αˉt\bar{\alpha}_tが初期に急激に減少するため、ttの低い値でもすでにかなりのノイズが追加される。これは特に高解像度画像で問題となる。

第二に、後半の時間ステップが浪費される。ttが大きい値ではαˉt0\bar{\alpha}_t \approx 0で、xtx_tがすでに純粋なノイズに近く、学習に有意義な寄与をしない。

7.3 Cosine Schedule

Nichol & Dhariwalが提案したCosine Scheduleαˉt\bar{\alpha}_tを直接定義する。

αˉt=f(t)f(0),f(t)=cos(t/T+s1+sπ2)2\bar{\alpha}_t = \frac{f(t)}{f(0)}, \qquad f(t) = \cos\left(\frac{t/T + s}{1 + s} \cdot \frac{\pi}{2}\right)^2

ここでs=0.008s = 0.008は小さなオフセットで、t=0t=0付近でβt\beta_tが小さくなりすぎるのを防ぐ。

Cosine Scheduleの核心的な特性は以下の通りである。

  • αˉt\bar{\alpha}_t中盤でほぼ線形に減少し、すべての時間ステップで均等に有用な学習信号を提供する
  • 初期に過剰なノイズが追加されるのを防ぎ、細かいディテールが保存される
  • 後半部でも完全なノイズへの遷移が滑らかに行われる
import torch
import math

def cosine_beta_schedule(timesteps, s=0.008):
    """Cosine schedule as proposed in Nichol & Dhariwal (2021)."""
    steps = timesteps + 1
    t = torch.linspace(0, timesteps, steps) / timesteps
    alphas_cumprod = torch.cos((t + s) / (1 + s) * math.pi * 0.5) ** 2
    alphas_cumprod = alphas_cumprod / alphas_cumprod[0]
    betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1])
    return torch.clip(betas, 0.0001, 0.9999)

def linear_beta_schedule(timesteps, beta_start=1e-4, beta_end=0.02):
    """Linear schedule as proposed in Ho et al. (2020)."""
    return torch.linspace(beta_start, beta_end, timesteps)

7.4 スケジュール比較

属性Linear ScheduleCosine Schedule
αˉt\bar{\alpha}_t減少パターン初期急激、後半緩やか中盤でほぼ線形
初期の情報保存低い高い
後半時間ステップの活用非効率的(すでに純粋ノイズ)効率的
高解像度画像への適合性低い高い
オリジナルDDPM使用OX
Improved DDPM使用XO

8. サンプリングアルゴリズム

8.1 DDPM Sampling

学習完了後、新しい画像を生成するDDPMサンプリングアルゴリズムは以下の通りである。

Algorithm 2: Sampling
─────────────────────────────────
x_T ~ N(0, I)                          # 純粋ノイズから開始
for t = T, T-1, ..., 1:
    z ~ N(0, I)  if t > 1, else z = 0  # 最終ステップではノイズ追加なし
    x_{t-1} = 1/√α_t · (x_t - β_t/(1-ᾱ_t) · ε_θ(x_t, t)) + σ_t · z
return x_0

8.2 ステップごとの解釈

Step 1: 初期化。xTN(0,I)x_T \sim \mathcal{N}(0, I)から純粋なガウシアンノイズをサンプリングする。これが生成プロセスの出発点である。

**Step 2: ノイズ予測。**現在のノイズ画像xtx_tと時間ステップttをネットワークϵθ\epsilon_\thetaに入力し、xtx_tに含まれるノイズを予測する。

**Step 3: 平均計算。**予測されたノイズを使用してReverse遷移の平均を計算する。

μθ(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)

**Step 4: 確率的遷移。**計算された平均にスケーリングされたガウシアンノイズσtz\sigma_t zを追加してxt1x_{t-1}を生成する。最終ステップ(t=1t=1)ではノイズを追加しない。

Step 5: 反復。t=Tt = Tからt=1t = 1まで上記の過程を繰り返す。

8.3 サンプリングの限界

DDPMサンプリングの最大の欠点は速度である。T=1000T = 1000ステップの逐次的ノイズ除去が必要なため、単一画像の生成にも1000回のニューラルネットワーク順伝播が必要である。これはGANの単一順伝播に比べて極めて遅く、以降DDIM、DPM-Solverなどの高速サンプラー研究を促した。


9. アーキテクチャ:Time-conditioned U-Net

9.1 U-Netベース設計

DDPMのノイズ予測ネットワークϵθ(xt,t)\epsilon_\theta(x_t, t)U-Netアーキテクチャを基盤としている。U-Netはもともと医療画像セグメンテーションのためにRonneberger et al.(2015)が提案した構造で、Encoder-Decoder構造にSkip Connectionを追加してさまざまな解像度の特徴を結合するのが特徴である。

DDPMのU-NetはPixelCNN++の構造を基盤とし、以下の修正を加えた。

9.2 核心構成要素

Time Embedding:時間ステップttをネットワークに注入するためにTransformerのSinusoidal Positional Encodingを使用する。

TE(t)2i=sin(t100002i/d),TE(t)2i+1=cos(t100002i/d)\text{TE}(t)_{2i} = \sin\left(\frac{t}{10000^{2i/d}}\right), \quad \text{TE}(t)_{2i+1} = \cos\left(\frac{t}{10000^{2i/d}}\right)

このembeddingはMLPを経て各ResNet Blockに注入される。具体的には、time embeddingを線形変換した後、ResNet Blockの中間feature mapに加算する(additive)かスケーリングする(FiLM conditioning)方式で適用する。

ResNet Block:各ブロックは以下の順序で構成される。

  1. Group Normalization
  2. SiLU(Swish)Activation
  3. Convolution
  4. Time Embedding注入
  5. Group Normalization
  6. SiLU Activation
  7. Dropout
  8. Convolution
  9. Residual Connection

Self-Attention16×1616 \times 16解像度のfeature mapでMulti-Head Self-Attentionを適用する。空間次元(h,w)(h, w)を系列長h×wh \times wに展開して標準的なScaled Dot-Product Attentionを実行する。

Group Normalization:Batch Normalizationの代わりにGroup Normalizationを使用する。バッチサイズに依存せず、生成モデルでより安定した学習を提供する。

9.3 具体的なアーキテクチャ仕様

入力: x_t ∈ R^(C×H×W), t ∈ {1,...,T}

Encoder:
  [128][128] → ↓2  [256][256] → ↓2  [256][256] → ↓2       (+ Self-Attention at 16×16)
  [512][512] → ↓2

Bottleneck:
  [512]Self-Attention[512]

Decoder (with skip connections):
  [512][512] → ↑2  [256][256] → ↑2       (+ Self-Attention at 16×16)
  [256][256] → ↑2  [128][128] → ↑2

出力: ε_θ ∈ R^(C×H×W)       (入力と同一次元の予測ノイズ)

DDPMは256×256256 \times 256解像度で約114Mパラメータを使用した。


10. 実験結果

10.1 定量的評価

DDPMは以下のベンチマークで評価された。

CIFAR-10(Unconditional, 32×3232 \times 32

モデルFID (\downarrow)IS (\uparrow)
DDPM3.179.46
StyleGAN2 + ADA2.929.83
NCSN25.328.87
ProgressiveGAN15.528.80
NVAE23.5-

DDPMは当時のunconditional生成モデルの中でSOTA FIDを達成し、GANベースのStyleGAN2と比較可能な水準の品質を示した。

LSUN (256×256256 \times 256)

データセットFID
LSUN Bedroom4.90
LSUN Cat-
LSUN Church7.89

10.2 定性的分析

DDPMのサンプルはGANと比較していくつかの顕著な特性を示した。

高い多様性:GANはmode collapse問題により生成の多様性が制限されるのに対し、DDPMはデータ分布のさまざまなモードをバランスよくカバーする。

段階的生成:ノイズから画像への段階的な変換過程を可視化でき、モデルがまず全体構造を形成し、その後細部ディテールを追加するcoarse-to-fine生成パターンを確認できる。

安定した学習:GANの慢性的な問題である学習不安定性(mode collapse、training oscillation)がなく、シンプルなMSE損失で安定的に収束する。

10.3 Progressive Lossy Compression解釈

Ho et al.はDDPMが自然に段階的損失圧縮スキーム(Progressive Lossy Decompression)を実装すると解釈した。各Reverseステップで段階的に情報が追加され、これはAutoregressive Decodingの一般化と見なすことができる。Rate-Distortion曲線分析で、大部分のビットが知覚的に無意味な細部よりも全体構造に割り当てられることを確認した。


11. 後続研究の総整理:Diffusionの進化

11.1 DDIM(Denoising Diffusion Implicit Models)

Song et al., 2021 | arXiv: 2010.02502

DDPMの最大の限界である遅いサンプリング速度を解決した研究。核心アイデアはForward ProcessをNon-Markovianに一般化することである。

DDIMは同一の学習済みモデルϵθ\epsilon_\thetaを使用しながら、サンプリング過程のみを変更する。

xt1=αˉt1(xt1αˉtϵθ(xt,t)αˉt)predicted x0+1αˉt1σt2ϵθ(xt,t)+σtϵtx_{t-1} = \sqrt{\bar{\alpha}_{t-1}} \underbrace{\left( \frac{x_t - \sqrt{1-\bar{\alpha}_t} \, \epsilon_\theta(x_t, t)}{\sqrt{\bar{\alpha}_t}} \right)}_{\text{predicted } x_0} + \sqrt{1-\bar{\alpha}_{t-1} - \sigma_t^2} \cdot \epsilon_\theta(x_t, t) + \sigma_t \epsilon_t

σt=0\sigma_t = 0に設定すると完全に決定論的なサンプリングとなり、以下を得る。

  • 高速サンプリングT=1000T=1000ステップの代わりに50〜100ステップで同等品質の画像を生成(10〜20倍の高速化)
  • 意味論的補間:決定論的マッピングのおかげでlatent spaceでの補間が意味のある画像変換につながる
  • 一貫性:同一の初期ノイズから常に同一の画像を生成し、再現可能な結果を保証する

11.2 Improved DDPM

Nichol & Dhariwal, 2021 | arXiv: 2102.09672

オリジナルDDPMの2つを改善した研究。

学習可能な分散:DDPMはσt2\sigma_t^2βt\beta_tまたはβ~t\tilde{\beta}_tに固定したが、Improved DDPMはこれを学習可能にした。具体的には、σt2\sigma_t^2βt\beta_tβ~t\tilde{\beta}_tの補間としてパラメータ化する。

Σθ(xt,t)=exp(vlogβt+(1v)logβ~t)\Sigma_\theta(x_t, t) = \exp(v \log \beta_t + (1-v) \log \tilde{\beta}_t)

ここでvvはネットワークが出力する値である。

Cosine Schedule:先述のCosine Variance Scheduleを導入し、特に高解像度画像での学習効率を大幅に改善した。

Hybrid LossLsimpleL_\text{simple}にvariational lower bound LvlbL_\text{vlb}を少量追加してlog-likelihoodも改善した。

Lhybrid=Lsimple+λLvlbL_\text{hybrid} = L_\text{simple} + \lambda L_\text{vlb}

11.3 Classifier Guidance

Dhariwal & Nichol, 2021 | arXiv: 2105.05233

「Diffusion Models Beat GANs on Image Synthesis」で提案された技法で、事前学習された分類器の勾配をReverse Processに注入して条件付き生成を行う。

ϵ^θ(xt,t,y)=ϵθ(xt,t)s1αˉtxtlogpϕ(yxt)\hat{\epsilon}_\theta(x_t, t, y) = \epsilon_\theta(x_t, t) - s \cdot \sqrt{1-\bar{\alpha}_t} \cdot \nabla_{x_t} \log p_\phi(y|x_t)

ここでssはguidance scale、pϕp_\phiはノイズ画像に対して学習された分類器である。ssを増加させると多様性は減少するが特定クラスへの忠実度(fidelity)は向上する。この論文でDiffusion Modelが初めてFIDでGANを凌駕した(CIFAR-10 FID 2.97、ImageNet 256x256 FID 4.59)。

限界:別途の分類器をノイズデータに対して学習する必要があり、学習パイプラインが複雑になる。

11.4 Classifier-Free Guidance(CFG)

Ho & Salimans, 2022 | arXiv: 2207.12598

別途の分類器なしでguidance効果を得る革新的な技法で、現代のDiffusion Modelの事実上の標準となった。

核心アイデアは1つのネットワークが条件付き無条件の生成を両方学習することである。学習時に一定確率(通常10〜20%)で条件情報ccをnullトークン\varnothingに置換する。

推論時、条件付き予測と無条件予測を線形結合する。

ϵ^θ(xt,t,c)=(1+w)ϵθ(xt,t,c)wϵθ(xt,t,)\hat{\epsilon}_\theta(x_t, t, c) = (1 + w) \cdot \epsilon_\theta(x_t, t, c) - w \cdot \epsilon_\theta(x_t, t, \varnothing)

ここでwwはguidance weightである。w=0w = 0なら標準的な条件付き生成、w>0w > 0なら条件への忠実度が増加する。

これを再配列すると以下のように解釈できる。

ϵ^θ=ϵθ(xt,t,)+(1+w)(ϵθ(xt,t,c)ϵθ(xt,t,))条件方向への移動\hat{\epsilon}_\theta = \epsilon_\theta(x_t, t, \varnothing) + (1 + w) \cdot \underbrace{(\epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing))}_{\text{条件方向への移動}}

無条件予測から条件方向に押し出すものとして解釈でき、wwが大きいほどこの押し出す力が強くなる。DALL-E 2、Stable Diffusion、Imagenなどほぼすべての最新Text-to-ImageモデルがCFGを使用している。

11.5 Latent Diffusion Models(LDM)/ Stable Diffusion

Rombach et al., 2022 | arXiv: 2112.10752

LDMはDiffusion Processを**ピクセル空間ではなく潜在空間(Latent Space)**で実行することで計算効率を劇的に改善した研究。

核心構造:

  1. Perceptual Compression:事前学習されたAutoencoder(VQ-VAEまたはKL-regularized VAE)のEncoder E\mathcal{E}で画像xxを低次元latent z=E(x)z = \mathcal{E}(x)に圧縮する。一般的に256×256×3256 \times 256 \times 3の画像が32×32×432 \times 32 \times 4のlatentに圧縮される(約48倍の次元削減)。

  2. Latent Diffusion:このlatent spaceでDDPMのForward/Reverse Processを実行する。計算量がピクセル空間対比で大幅に削減される。

  3. Cross-Attention Conditioning:テキスト、セグメンテーションマップなどの条件情報をCross-Attentionを通じてU-Netに注入する。テキストの場合CLIPまたはBERTの埋め込みを使用する。

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

ここでQ=WQφ(zt)Q = W_Q \cdot \varphi(z_t)K=WKτθ(y)K = W_K \cdot \tau_\theta(y)V=WVτθ(y)V = W_V \cdot \tau_\theta(y)であり、τθ(y)\tau_\theta(y)は条件情報のエンコーディングである。

Stable DiffusionはこのLDMアーキテクチャにCLIP text encoderと大規模データセット(LAION-5B)を組み合わせて学習したもので、オープンソースText-to-Imageモデルの事実上の標準となった。

11.6 Score SDE

Song et al., 2021 | arXiv: 2011.13456

ICLR 2021 Oral発表のこの研究は、DDPMとScore Matchingを確率微分方程式(SDE)という統一フレームワークで接続した。

核心的な貢献は以下の通りである。

  • Variance Exploding(VE)SDE:NCSN/SMLD系列に対応
  • Variance Preserving(VP)SDE:DDPMに対応
  • Sub-VP SDE:より良いlikelihoodを提供する変形
VP-SDE:dx=12β(t)xdt+β(t)dw\text{VP-SDE}: \quad dx = -\frac{1}{2}\beta(t) x \, dt + \sqrt{\beta(t)} \, dw

連続時間への拡張を通じて、正確なlog-likelihood計算(ODEを通じて)、より柔軟なサンプラー設計、およびInpainting、Colorizationなどの条件付き生成が可能になった。

11.7 Consistency Models

Song et al., 2023 | arXiv: 2303.01469

OpenAIのYang Songが提案したConsistency Modelsは、Diffusion Modelの多段階サンプリング問題を根本的に解決しようとする試みである。

核心アイデアはODE trajectory上のすべての点を同一の出発点(元のデータ)にマッピングする関数fθf_\thetaを学習することである。

fθ(xt,t)=x0,t[0,T]f_\theta(x_t, t) = x_0, \quad \forall t \in [0, T]

このself-consistency特性により、任意の時間ttのノイズサンプルから1回のネットワーク評価でデータを復元できる。すなわち、1ステップ生成が可能である。

2つの学習方式がある。

  • Consistency Distillation(CD):事前学習されたDiffusion Modelから蒸留
  • Consistency Training(CT):事前学習なしで独立に学習

2024年には**Easy Consistency Models(ECM)**が登場し、iCT対比33%の学習コストでより良い2ステップ生成性能を達成した。

11.8 Flow Matching / Rectified Flow

Lipman et al., 2023; Liu et al., 2023 | arXiv: 2210.02747, arXiv: 2209.03003

Flow MatchingはDiffusion Modelの代替的アプローチで、データ分布とノイズ分布を接続する**確率フロー(Probability Flow)**を直接学習する。

核心アイデア:ノイズx1N(0,I)x_1 \sim \mathcal{N}(0, I)からデータx0x_0への直線経路(straight path)を定義する。

xt=(1t)x0+tϵ,t[0,1]x_t = (1-t) x_0 + t \, \epsilon, \quad t \in [0, 1]

この経路に沿う速度場(velocity field)vθ(xt,t)v_\theta(x_t, t)を学習する。

LFM=Et,x0,ϵ[vθ(xt,t)(x0ϵ)2]L_{\text{FM}} = \mathbb{E}_{t, x_0, \epsilon} \left[ \| v_\theta(x_t, t) - (x_0 - \epsilon) \|^2 \right]

Rectified Flowはこの直線経路を「まっすぐにする」過程を反復(reflow)し、少ないステップでも高品質のサンプルを生成する。

Stable Diffusion 3がRectified Flowを採用し、U-NetからTransformerへの転換とともにDiffusion Modelの新たなパラダイムを提示した。

11.9 DiT(Diffusion Transformer)

Peebles & Xie, 2023 | arXiv: 2212.09748

DiTはDiffusion ModelのbackboneをU-Netから**Vision Transformer(ViT)**に置き換えた研究である。

核心的な設計選択:

  • 画像をパッチに分割してトークンとして処理
  • 時間ステップttとクラスラベルyyを**Adaptive Layer Normalization(adaLN-Zero)**で注入
  • LL層のTransformer Blockで構成

DiTはLatent Diffusionと組み合わせて、ImageNet 256×256256 \times 256 class-conditional生成でFID 2.27を達成し、以前のすべてのDiffusion Modelを凌駕した。

DiTの意義:Transformerのscaling lawをDiffusion Modelに適用できることを実証した。モデルサイズと学習コンピュートを増加させると一貫して性能が向上する。この発見はSora(OpenAI、Video生成)、Stable Diffusion 3など最新の大規模生成モデルのアーキテクチャ選択に直接的な影響を与えた。


12. PyTorchコード例:簡単なDDPM実装

以下はDDPMの核心構成要素をPyTorchで実装した簡素化された例である。実際の学習にはより精巧なU-Netとハイパーパラメータチューニングが必要である。

12.1 Noise ScheduleとForward Process

import torch
import torch.nn as nn
import torch.nn.functional as F
import math

class DDPMScheduler:
    """DDPMのForward Processを管理するスケジューラ。"""

    def __init__(self, num_timesteps=1000, beta_start=1e-4, beta_end=0.02, schedule='linear'):
        self.num_timesteps = num_timesteps

        if schedule == 'linear':
            self.betas = torch.linspace(beta_start, beta_end, num_timesteps)
        elif schedule == 'cosine':
            self.betas = self._cosine_schedule(num_timesteps)
        else:
            raise ValueError(f"Unknown schedule: {schedule}")

        # 核心変数の事前計算
        self.alphas = 1.0 - self.betas
        self.alphas_cumprod = torch.cumprod(self.alphas, dim=0)          # ᾱ_t
        self.alphas_cumprod_prev = F.pad(self.alphas_cumprod[:-1], (1, 0), value=1.0)

        # Forward process係数
        self.sqrt_alphas_cumprod = torch.sqrt(self.alphas_cumprod)        # √ᾱ_t
        self.sqrt_one_minus_alphas_cumprod = torch.sqrt(1.0 - self.alphas_cumprod)  # √(1-ᾱ_t)

        # Reverse process係数
        self.sqrt_recip_alphas = torch.sqrt(1.0 / self.alphas)           # 1/√α_t
        self.posterior_variance = (
            self.betas * (1.0 - self.alphas_cumprod_prev) / (1.0 - self.alphas_cumprod)
        )  # β̃_t

    def _cosine_schedule(self, timesteps, s=0.008):
        steps = timesteps + 1
        t = torch.linspace(0, timesteps, steps) / timesteps
        alphas_cumprod = torch.cos((t + s) / (1 + s) * math.pi * 0.5) ** 2
        alphas_cumprod = alphas_cumprod / alphas_cumprod[0]
        betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1])
        return torch.clip(betas, 0.0001, 0.9999)

    def add_noise(self, x_0, t, noise=None):
        """Forward process: q(x_t | x_0)を一度に計算。"""
        if noise is None:
            noise = torch.randn_like(x_0)

        sqrt_alpha_cumprod = self.sqrt_alphas_cumprod[t].view(-1, 1, 1, 1)
        sqrt_one_minus_alpha_cumprod = self.sqrt_one_minus_alphas_cumprod[t].view(-1, 1, 1, 1)

        # x_t = √ᾱ_t · x_0 + √(1-ᾱ_t) · ε
        x_t = sqrt_alpha_cumprod * x_0 + sqrt_one_minus_alpha_cumprod * noise
        return x_t

12.2 簡素化されたU-Net

class SinusoidalPositionEmbedding(nn.Module):
    """TransformerスタイルのSinusoidal Time Embedding。"""

    def __init__(self, dim):
        super().__init__()
        self.dim = dim

    def forward(self, t):
        device = t.device
        half_dim = self.dim // 2
        emb = math.log(10000) / (half_dim - 1)
        emb = torch.exp(torch.arange(half_dim, device=device) * -emb)
        emb = t[:, None].float() * emb[None, :]
        emb = torch.cat([emb.sin(), emb.cos()], dim=-1)
        return emb


class ResBlock(nn.Module):
    """Time-conditioned Residual Block。"""

    def __init__(self, in_ch, out_ch, time_emb_dim):
        super().__init__()
        self.norm1 = nn.GroupNorm(8, in_ch)
        self.conv1 = nn.Conv2d(in_ch, out_ch, 3, padding=1)
        self.time_mlp = nn.Sequential(
            nn.SiLU(),
            nn.Linear(time_emb_dim, out_ch),
        )
        self.norm2 = nn.GroupNorm(8, out_ch)
        self.conv2 = nn.Conv2d(out_ch, out_ch, 3, padding=1)
        self.skip = nn.Conv2d(in_ch, out_ch, 1) if in_ch != out_ch else nn.Identity()

    def forward(self, x, t_emb):
        h = self.conv1(F.silu(self.norm1(x)))
        h = h + self.time_mlp(t_emb)[:, :, None, None]  # Time embedding注入
        h = self.conv2(F.silu(self.norm2(h)))
        return h + self.skip(x)                           # Residual connection


class SimpleUNet(nn.Module):
    """DDPM学習のための簡素化されたU-Net。"""

    def __init__(self, in_channels=3, base_channels=64, time_emb_dim=256):
        super().__init__()

        # Time embedding
        self.time_mlp = nn.Sequential(
            SinusoidalPositionEmbedding(base_channels),
            nn.Linear(base_channels, time_emb_dim),
            nn.SiLU(),
            nn.Linear(time_emb_dim, time_emb_dim),
        )

        # Encoder
        self.enc1 = ResBlock(in_channels, base_channels, time_emb_dim)
        self.enc2 = ResBlock(base_channels, base_channels * 2, time_emb_dim)
        self.enc3 = ResBlock(base_channels * 2, base_channels * 4, time_emb_dim)
        self.pool = nn.MaxPool2d(2)

        # Bottleneck
        self.bot = ResBlock(base_channels * 4, base_channels * 4, time_emb_dim)

        # Decoder (with skip connections)
        self.dec3 = ResBlock(base_channels * 8, base_channels * 2, time_emb_dim)
        self.dec2 = ResBlock(base_channels * 4, base_channels, time_emb_dim)
        self.dec1 = ResBlock(base_channels * 2, base_channels, time_emb_dim)
        self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)

        # Output
        self.out = nn.Conv2d(base_channels, in_channels, 1)

    def forward(self, x, t):
        t_emb = self.time_mlp(t)

        # Encoder
        e1 = self.enc1(x, t_emb)
        e2 = self.enc2(self.pool(e1), t_emb)
        e3 = self.enc3(self.pool(e2), t_emb)

        # Bottleneck
        b = self.bot(self.pool(e3), t_emb)

        # Decoder with skip connections
        d3 = self.dec3(torch.cat([self.up(b), e3], dim=1), t_emb)
        d2 = self.dec2(torch.cat([self.up(d3), e2], dim=1), t_emb)
        d1 = self.dec1(torch.cat([self.up(d2), e1], dim=1), t_emb)

        return self.out(d1)  # 予測ノイズ ε_θ

12.3 学習ループ

def train_ddpm(model, dataloader, scheduler, epochs=100, lr=2e-4, device='cuda'):
    """DDPM学習ループ(Algorithm 1の実装)。"""
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    model.train()

    for epoch in range(epochs):
        total_loss = 0
        for batch_idx, (x_0, _) in enumerate(dataloader):
            x_0 = x_0.to(device)

            # 1. ランダム時間ステップ選択: t ~ Uniform({1, ..., T})
            t = torch.randint(0, scheduler.num_timesteps, (x_0.shape[0],), device=device)

            # 2. ノイズサンプリング: ε ~ N(0, I)
            noise = torch.randn_like(x_0)

            # 3. Forward process: x_t = √ᾱ_t · x_0 + √(1-ᾱ_t) · ε
            x_t = scheduler.add_noise(x_0, t, noise)

            # 4. ノイズ予測: ε_θ(x_t, t)
            noise_pred = model(x_t, t)

            # 5. Simplified loss: L = ||ε - ε_θ(x_t, t)||²
            loss = F.mse_loss(noise_pred, noise)

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            total_loss += loss.item()

        avg_loss = total_loss / len(dataloader)
        print(f"Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}")

12.4 サンプリング

@torch.no_grad()
def sample_ddpm(model, scheduler, image_shape, device='cuda'):
    """DDPMサンプリング(Algorithm 2の実装)。"""
    model.eval()

    # x_T ~ N(0, I)
    x = torch.randn(image_shape, device=device)

    for t in reversed(range(scheduler.num_timesteps)):
        t_batch = torch.full((image_shape[0],), t, device=device, dtype=torch.long)

        # ノイズ予測
        predicted_noise = model(x, t_batch)

        # Reverse process係数
        alpha_t = scheduler.alphas[t]
        alpha_cumprod_t = scheduler.alphas_cumprod[t]
        beta_t = scheduler.betas[t]

        # 平均計算: μ_θ = 1/√α_t · (x_t - β_t/√(1-ᾱ_t) · ε_θ)
        mean = (1.0 / torch.sqrt(alpha_t)) * (
            x - (beta_t / torch.sqrt(1.0 - alpha_cumprod_t)) * predicted_noise
        )

        if t > 0:
            # 確率的ノイズの追加(最終ステップを除く)
            noise = torch.randn_like(x)
            sigma_t = torch.sqrt(scheduler.posterior_variance[t])
            x = mean + sigma_t * noise
        else:
            x = mean

    return x

12.5 使用例

# ハイパーパラメータ
device = 'cuda' if torch.cuda.is_available() else 'cpu'
image_size = 32
batch_size = 128
num_timesteps = 1000

# スケジューラおよびモデルの初期化
scheduler = DDPMScheduler(num_timesteps=num_timesteps, schedule='cosine')
model = SimpleUNet(in_channels=3, base_channels=64).to(device)

# データセット(例:CIFAR-10)
from torchvision import datasets, transforms
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),  # [-1, 1]正規化
])
dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 学習
train_ddpm(model, dataloader, scheduler, epochs=100, device=device)

# サンプリング
samples = sample_ddpm(model, scheduler, (16, 3, image_size, image_size), device=device)
# samples: [-1, 1]範囲の生成画像16枚

13. Diffusion Model vs GAN vs VAE:比較分析

13.1 総合比較表

特性Diffusion Model(DDPM)GANVAE
学習方式ノイズ予測(MSE)敵対的学習(Min-Max)変分推論(ELBO)
学習安定性非常に安定不安定(mode collapse、oscillation)安定
生成品質非常に高い非常に高い普通(blurry)
多様性高い(分布全体をカバー)低い(mode collapseリスク)高い
生成速度遅い(1000ステップ)非常に速い(1ステップ)速い(1ステップ)
Log-likelihood計算可能(ELBO)計算不可計算可能(ELBO)
Latent Space暗黙的なし(または制限的)明示的、連続的
モードカバレッジ高い低い高い
条件付き生成CFGで非常に効果的cGANで可能条件付きVAE可能
解像度拡張LDMで効率的段階的学習が必要階層的VAEが必要
理論的基盤熱力学、Score Matchingゲーム理論変分ベイズ
代表モデルStable Diffusion, DALL-E 2StyleGAN, BigGANVQ-VAE-2, NVAE
CIFAR-10 FID~2.0(最新)~2.9(StyleGAN2)~23.5(NVAE)

13.2 いつどのモデルを選択すべきか?

Diffusion Modelを選択する場合:

  • 生成品質と多様性の両方が重要なとき
  • テキスト-画像生成など複雑な条件付き生成が必要なとき
  • 学習安定性が重要なとき
  • 生成速度が最優先でないとき

GANを選択する場合:

  • リアルタイム生成が必要なとき
  • 特定ドメインの高品質画像が必要なとき(顔、風景など)
  • データセットが比較的小さく均一なとき

VAEを選択する場合:

  • 意味のあるLatent Space操作が必要なとき
  • Likelihoodベースの異常値検出が必要なとき
  • 高速なエンコード/デコードが必要なとき
  • 半教師あり学習または表現学習が主な目的のとき

14. Diffusion Modelの現在と未来

14.1 2024〜2025年の主要な流れ

**アーキテクチャ転換:U-NetからTransformerへ。**Stable Diffusion 3、FLUX、Soraなどの最新モデルはDiTベースアーキテクチャを採用している。TransformerのScaling LawがDiffusion Modelにも適用されることが確認され、モデル規模の拡張(8B以上のパラメータ)が活発に進行中である。

**サンプリング効率化。**Consistency Models、Flow Matching、DPM-Solverなどの発展により1〜4ステップの生成が可能になった。Rectified Flowは直線経路を学習して少ないステップでも高品質を達成する。

マルチモーダル拡張。Diffusion Modelは画像を超えて動画(Sora、Runway Gen-3)、オーディオ(AudioLDM)、3D(DreamFusion、Zero-1-to-3)、ロボティクス(Diffusion Policy)などさまざまなドメインに拡張されている。

**高速化と最適化。**Distillation、Quantization、Cachingなどの技法で推論速度が大幅に向上し、リアルタイム画像生成が可能な水準に近づいている。

14.2 DDPMの歴史的意義

DDPMは以下の点で生成モデル史の転換点である。

  1. GANが支配していた画像生成分野でLikelihoodベースモデルの競争力を実証した
  2. 極めてシンプルな学習目標(LsimpleL_\text{simple})で高品質生成が可能であることを示した
  3. 熱力学とScore Matchingを接続する理論的フレームワークを確立した
  4. Stable Diffusion、DALL-E 2、Midjourneyなど現代AI革命の直接的な土台となった

15. References

  1. Ho, J., Jain, A., & Abbeel, P. (2020). Denoising Diffusion Probabilistic Models. NeurIPS 2020. arXiv:2006.11239

  2. Sohl-Dickstein, J., Weiss, E., Maheswaranathan, N., & Ganguli, S. (2015). Deep Unsupervised Learning using Nonequilibrium Thermodynamics. ICML 2015. arXiv:1503.03585

  3. Song, J., Meng, C., & Ermon, S. (2021). Denoising Diffusion Implicit Models (DDIM). ICLR 2021. arXiv:2010.02502

  4. Nichol, A. & Dhariwal, P. (2021). Improved Denoising Diffusion Probabilistic Models. ICML 2021. arXiv:2102.09672

  5. Dhariwal, P. & Nichol, A. (2021). Diffusion Models Beat GANs on Image Synthesis. NeurIPS 2021. arXiv:2105.05233

  6. Ho, J. & Salimans, T. (2022). Classifier-Free Diffusion Guidance. NeurIPS Workshop 2021. arXiv:2207.12598

  7. Rombach, R., Blattmann, A., Lorenz, D., Esser, P., & Ommer, B. (2022). High-Resolution Image Synthesis with Latent Diffusion Models. CVPR 2022. arXiv:2112.10752

  8. Song, Y., Sohl-Dickstein, J., Kingma, D.P., Kumar, A., Ermon, S., & Poole, B. (2021). Score-Based Generative Modeling through Stochastic Differential Equations. ICLR 2021. arXiv:2011.13456

  9. Song, Y., Dhariwal, P., Chen, M., & Sutskever, I. (2023). Consistency Models. ICML 2023. arXiv:2303.01469

  10. Lipman, Y., Chen, R.T.Q., Ben-Hamu, H., Nickel, M., & Le, M. (2023). Flow Matching for Generative Modeling. ICLR 2023. arXiv:2210.02747

  11. Peebles, W. & Xie, S. (2023). Scalable Diffusion Models with Transformers (DiT). ICCV 2023. arXiv:2212.09748

  12. Song, Y. & Ermon, S. (2019). Generative Modeling by Estimating Gradients of the Data Distribution. NeurIPS 2019. arXiv:1907.05600

  13. Weng, L. (2021). What are Diffusion Models? lilianweng.github.io

  14. Hugging Face. The Annotated Diffusion Model. huggingface.co/blog/annotated-diffusion