← 機械学習テキスト 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:オートエンコーダとVAE(潜在変数・変分の枠組み) | 数理:確率過程(マルコフ連鎖・ポアソン過程)(統計・マルコフ過程)

⚠️ 拡散モデルは現在もっとも動きの速い領域です。本ノートは廃れにくい原理(順過程・逆過程・ノイズ予測損失・スコア視点)を中心に書きます。具体的なアーキテクチャ・高速化・条件付け手法・最先端の生成品質は要最新確認とします。

要点(BLUF)


1. 発想:壊し方が分かれば、逆に作れる

考え方は驚くほど素朴です。

  1. きれいな画像 x0x_0 に、ガウスノイズをほんの少しずつ何百回も足していく。最後 xTx_T はほぼ純粋なノイズ(標準正規分布)になります。これを**順過程(forward / diffusion process)**と呼びます。
  2. もしこの逆向きの 1 ステップxtx_t から少しだけノイズを取り除いて xt1x_{t-1} にする」を学習できたら、純ノイズ xTN(0,I)x_T \sim \mathcal{N}(0,I) から出発して逆向きに TT 回たどることで、新しい画像 x0x_0 を生成できます。これが**逆過程(reverse process)**です。

要するに、「データの壊し方(順過程)」は人間が固定で決め、「壊れたものの直し方(逆過程)」だけを学習する、という分業です。順過程が単純なので、何を学べばいいかが数式できれいに定まります。

flowchart LR
    x0["x_0 (データ)"] -->|"順過程 q:+ノイズ(学習なし)"| x1["x_1"]
    x1 -->|"+ノイズ"| xdots1["…"]
    xdots1 -->|"+ノイズ"| xT["x_T (ほぼ純ノイズ)"]

    xT -.->|"逆過程 p_theta:-ノイズ(学習する)"| xdots2["…"]
    xdots2 -.->|"-ノイズ"| x1b["x_1"]
    x1b -.->|"-ノイズ"| x0b["x_0 (生成物)"]

    subgraph 順方向 ["順過程:データ → ノイズ(固定)"]
        x0
        x1
        xdots1
        xT
    end
    subgraph 逆方向 ["逆過程:ノイズ → データ(ニューラルネット)"]
        xdots2
        x1b
        x0b
    end

2. 順過程:固定のマルコフ連鎖

順過程は、1 ステップごとに「少し縮めてノイズを足す」マルコフ連鎖です(マルコフ過程の定義は 確率過程(マルコフ連鎖・ポアソン過程))。

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

要するに:各ステップは「元をちょっと薄め、ノイズをちょっと混ぜる」だけ。これを TT 回繰り返すと信号が消えて純ノイズになります。qq にパラメータはなく、学習しません

任意の tt への閉形式(最重要の性質)

毎回 1 ステップずつ足さなくても、x0x_0 から一気に xtx_t をサンプルできますαt:=1βt\alpha_t := 1-\beta_tαˉt:=s=1tαs\bar\alpha_t := \prod_{s=1}^{t}\alpha_s と置くと、

q(xtx0)=N ⁣(xt; αˉtx0, (1αˉt)I)xt=αˉtx0+1αˉtε,εN(0,I)q(x_t \mid x_0) = \mathcal{N}\!\left(x_t;\ \sqrt{\bar\alpha_t}\,x_0,\ (1-\bar\alpha_t) I\right) \quad\Longleftrightarrow\quad \boxed{\,x_t = \sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\varepsilon\,},\quad \varepsilon \sim \mathcal{N}(0,I)

導出の骨子:ガウスノイズを足す操作の合成はまたガウスです。xt=αtxt1+βtεtx_t=\sqrt{\alpha_t}\,x_{t-1}+\sqrt{\beta_t}\,\varepsilon_{t} を 1 段展開すると xt=αtαt1xt2+()x_t=\sqrt{\alpha_t\alpha_{t-1}}\,x_{t-2}+(\dots) となり、独立な 2 つのガウスノイズの和は分散が足し合わさって 1 本のガウスノイズにまとまります(再パラメータ化トリックは オートエンコーダとVAE と同じ)。これを繰り返すと、係数が αˉt\sqrt{\bar\alpha_t}、ノイズ分散が 1αˉt1-\bar\alpha_t にきれいに集約されます。

要するに:「時刻 tt のノイズ入りデータ」は、元データを αˉt\sqrt{\bar\alpha_t} 倍に薄めて、強さ 1αˉt\sqrt{1-\bar\alpha_t} のノイズ 1 発を足したもの。tt が大きいと αˉt0\bar\alpha_t\to 0 で、ほぼノイズだけになります。この閉形式があるおかげで、学習時に任意の tt を 1 回でサンプルでき、計算が一気に軽くなります


3. 逆過程:直し方をニューラルネットで学ぶ

生成に使いたいのは逆向き q(xt1xt)q(x_{t-1}\mid x_t) ですが、これは厳密にはデータ分布全体に依存して計算できません(扱いにくい)。そこでガウスで近似したものをニューラルネット θ\theta で表します。

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

生成は xTN(0,I)x_T\sim\mathcal{N}(0,I) から始め、この 1 ステップを t=T,T1,,1t=T,T-1,\dots,1 と適用して x0x_0 に到達します。問題は「μθ\mu_\theta(と分散)を何に合わせて学習するか」。ここで ELBO が効きます。


4. 学習目標:ELBO がノイズ予測に化ける

ステップ A:ELBO(VAE と同じ枠組み)

x1:Tx_{1:T} を潜在変数とみなせば、これは階層的な潜在変数モデルで、対数尤度の下界は オートエンコーダとVAE とまったく同じ形で書けます。

logpθ(x0)Eq ⁣[logpθ(x0:T)q(x1:Tx0)]=:L\log p_\theta(x_0) \ge \mathbb{E}_q\!\left[ \log \frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)} \right] =: -L

この LL を KL の和に整理すると、各時刻 tt について次の項が出ます。

Lt1=Eq[DKL ⁣(q(xt1xt,x0)pθ(xt1xt))]L_{t-1} = \mathbb{E}_q\big[\, D_{\mathrm{KL}}\!\big(q(x_{t-1}\mid x_t,x_0)\,\big\|\,p_\theta(x_{t-1}\mid x_t)\big) \,\big]

ポイントは、x0x_0 で条件付けた逆向き事後分布 q(xt1xt,x0)q(x_{t-1}\mid x_t,x_0) がガウスで閉じて計算できることです(ベイズの定理で q(xtxt1)q(x_t\mid x_{t-1})q(xt1x0)q(x_{t-1}\mid x_0) を掛けると、指数部が xt1x_{t-1} の 2 次式になり正規分布になる)。

q(xt1xt,x0)=N ⁣(xt1; μ~t(xt,x0), β~tI),β~t=1αˉt11αˉtβtq(x_{t-1}\mid x_t,x_0)=\mathcal{N}\!\left(x_{t-1};\ \tilde\mu_t(x_t,x_0),\ \tilde\beta_t I\right),\qquad \tilde\beta_t=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\,\beta_t

ガウス同士の KL は平均の差の二乗で書けるので、Lt1L_{t-1} は本質的に**「pθp_\theta の平均 μθ\mu_\theta を、正解の平均 μ~t\tilde\mu_t に合わせる回帰問題」**になります。

ステップ B:平均合わせを「ノイズ当て」に読み替える

ここが DDPM の鍵です。閉形式 xt=αˉtx0+1αˉtεx_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\varepsilon を使って x0x_0ε\varepsilon で書き換えると、正解の平均 μ~t\tilde\mu_t は次のようにノイズ ε\varepsilon だけで表せます。

μ~t=1αt(xt1αt1αˉtε)\tilde\mu_t = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\varepsilon\right)

そこで μθ\mu_\theta同じ形に固定し、未知なのは ε\varepsilon だけ、と決めてしまいます。

μθ(xt,t)=1αt(xt1αt1αˉtεθ(xt,t))\mu_\theta(x_t,t) = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\varepsilon_\theta(x_t,t)\right)

すると 2 つの平均の差は εεθ\varepsilon-\varepsilon_\theta に比例し、Lt1L_{t-1} は**「ネットワークが予測したノイズ εθ(xt,t)\varepsilon_\theta(x_t,t) を、実際に足したノイズ ε\varepsilon に合わせる二乗誤差」になります。係数(時刻ごとの重み)を実用上 1 に丸めたのが DDPM の単純損失**です。

Lsimple=Et,x0,ε[ εεθ(xt,t)2 ],xt=αˉtx0+1αˉtε\boxed{\,L_{\text{simple}}=\mathbb{E}_{t,\,x_0,\,\varepsilon}\Big[\ \big\|\,\varepsilon-\varepsilon_\theta(x_t,t)\,\big\|^2\ \Big]\,},\qquad x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\varepsilon

要するに:難しそうな変分下界が、結局は**「ノイズまみれの画像を見て、どれだけノイズが混ざっているかを当てる」回帰**に化けます。学習は驚くほど単純で安定です。

学習・生成の手順

flowchart TB
    subgraph 学習 ["学習(1 ステップ)"]
        a1["データ x_0 を 1 枚とる"] --> a2["時刻 t を一様にランダム選択"]
        a2 --> a3["ノイズ ε ~ N(0,I) を引く"]
        a3 --> a4["x_t = √ᾱ_t·x_0 + √(1-ᾱ_t)·ε を作る"]
        a4 --> a5["ネットで ε_θ(x_t, t) を予測"]
        a5 --> a6["損失 ‖ε - ε_θ‖² を下げる"]
    end
    subgraph 生成 ["生成(T ステップ)"]
        b1["x_T ~ N(0,I)"] --> b2["t = T,…,1 で 1 ステップずつ ε_θ で除ノイズ"]
        b2 --> b3["x_0 を出力"]
    end

生成 1 ステップの式(逆過程のサンプリング)は、上の μθ\mu_\theta にノイズを足し戻したものです。

xt1=1αt(xt1αt1αˉtεθ(xt,t))+σtz,zN(0,I)x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\varepsilon_\theta(x_t,t)\right) + \sigma_t\, z,\qquad z\sim\mathcal{N}(0,I)

ここで σt\sigma_t はステップごとの注入ノイズ強度(β~t\sqrt{\tilde\beta_t} など)。最後の t=1t=1 では z=0z=0 にします。要するに:「予測したノイズを引いて少し戻し、ほんの少し新しい揺らぎを足す」を繰り返すだけです。


5. スコアベースという別の顔

拡散モデルは、スコアベース生成モデル(score-based generative model)とまったく同じものを別角度から見たものです。スコアとは対数密度の勾配 xlogp(x)\nabla_x \log p(x) で、「データらしくなる方向」を指すベクトル場です。これを推定するのがスコアマッチング

閉形式 q(xtx0)=N(αˉtx0,(1αˉt)I)q(x_t\mid x_0)=\mathcal{N}(\sqrt{\bar\alpha_t}\,x_0,(1-\bar\alpha_t)I) のスコアを直接計算すると、

xtlogq(xtx0)=xtαˉtx01αˉt=ε1αˉt\nabla_{x_t}\log q(x_t\mid x_0) = -\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{1-\bar\alpha_t} = -\frac{\varepsilon}{\sqrt{1-\bar\alpha_t}}

つまりスコアは「足したノイズ ε\varepsilon」の符号付き定数倍です。したがってノイズ予測器とスコア推定器は

sθ(xt,t)εθ(xt,t)1αˉts_\theta(x_t,t) \approx -\frac{\varepsilon_\theta(x_t,t)}{\sqrt{1-\bar\alpha_t}}

で読み替えられ、ノイズを MSE で当てること=スコアを学ぶことになります。生成は「スコアの方向に少しずつ登りながら揺らぎを足す」ランジュバン動力学(連続時間では確率微分方程式)として書け、DDPM のサンプリングはその離散化に対応します。

要するに:「ノイズ除去」「変分下界」「スコア推定」は別物に見えて、同じ確率構造の違う言い換えです。どの言葉で話しても同じモデルにたどり着きます。


6. 実装:何で逆過程を作るか

ε~θ=εθ(xt,t,)+w(εθ(xt,t,c)εθ(xt,t,))\tilde\varepsilon_\theta = \varepsilon_\theta(x_t,t,\varnothing) + w\big(\varepsilon_\theta(x_t,t,c)-\varepsilon_\theta(x_t,t,\varnothing)\big)

ww(ガイダンス強度)を上げると条件に忠実になる一方、多様性が落ちるトレードオフがあります。具体的な条件付けの実装・テキストエンコーダ・ガイダンス係数の最適値は要最新確認です。


7. VAE・GAN との対比

観点拡散モデルVAE(オートエンコーダとVAEGAN(敵対的生成ネットワーク
学習の安定性高い(単純な回帰損失)高い低い(敵対的でモード崩壊しやすい)
サンプル品質非常に高いぼやけがち高い(鋭い)
多様性(モード網羅)高い高い低くなりがち
生成速度遅い(多ステップ)速い(1 回)速い(1 回)
尤度の扱い下界を最適化(明示的に近い)下界(ELBO)明示的尤度なし

最大の弱点は逆過程が多ステップで生成が遅いことです。サンプリングのステップ数を減らす手法(決定的サンプラーや蒸留など)や、画素ではなく VAE の潜在空間で拡散する潜在拡散で計算を軽くする方向が主流ですが、この領域は最も動きが速く、最新スペック・最良手法は要最新確認とします。


⚠️ よくある誤解・落とし穴


対応するシミュレーション

simulations/diffusion_process.py:二日月のデータに拡散の順過程を適用し、tt を進めるほどデータが少しずつガウスノイズに崩れ、最後は純粋な正規分布になる様子を可視化します。任意の時刻 tt は閉形式 xt=αˉtx0+1αˉtεx_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\varepsilon で一発サンプリングでき、信号の割合 αˉt\sqrt{\bar\alpha_t}101\to0 へ減ることを示します。拡散モデルの本体はこの崩しを逆にたどる(εεθ2\|\varepsilon-\varepsilon_\theta\|^2 を最小化)部分です。

拡散の順過程:データが徐々にノイズへ


関連ノート

生成モデル 目次オートエンコーダとVAE敵対的生成ネットワーク畳み込みニューラルネットワーク確率過程(マルコフ連鎖・ポアソン過程)機械学習テキスト 全体目次