拡散モデルの数理:前向き拡散と逆向き生成
なぜノイズだけから画像が生まれるのか。前向きにデータを壊す過程と、その逆をたどる生成を数式の意味から理解し、ノイズ予測という学習目標の正体をつかめます。
- 1.前向き拡散はデータに少しずつガウスノイズを足す固定の過程で、t ステップ後の状態は元データから1発で計算できる(再パラメータ化)。
- 2.逆向き生成はその過程を1ステップずつ巻き戻す操作で、各ステップは「いま乗っているノイズの量」を当てるニューラルネットで近似する。
- 3.学習目標は実は単純で、加えたノイズεと予測ノイズの二乗誤差を最小化するだけ。サンプリングはこの予測で平均をずらしつつノイズを再注入して繰り返す。
全体像:壊す過程は固定、戻す過程だけを学ぶ
拡散モデルの直感(砂嵐から像が浮かぶ)は 拡散モデル で扱いました。ここではなぜそれが成立するのかを、確率過程として正確に追います。
中核となる構造は2つの過程の対です。
| 過程 | 向き | 中身 | 学習するか |
|---|---|---|---|
| 前向き拡散(forward / diffusion) | データ → ノイズ | ガウスノイズを少しずつ足し、最終的に純粋な正規分布へ | しない(固定の式) |
| 逆向き生成(reverse / denoising) | ノイズ → データ | 1ステップずつノイズを取り除き、元の分布へ戻す | する(ニューラルネットで近似) |
ポイントは、前向きは学習対象ではないこと。壊し方を人が決め打ちで固定し、ニューラルネットにはその逆をたどる方法だけを学ばせます。生成とは、学んだ逆向き過程を純粋なノイズから走らせることに他なりません。
前向き拡散:データを正規分布へ溶かす
データ x_0(例えば1枚の画像)から出発し、各ステップで少量のガウスノイズを加えます。ステップ t の遷移は次の正規分布で定義します。
q(x_t | x_{t-1}) = N(x_t ; √(1-β_t)·x_{t-1}, β_t·I)
β_t は ノイズスケジュール と呼ばれる小さな正の値(例: 0.0001→0.02 へ線形増加)で、各ステップでどれだけ壊すかを決めます。√(1-β_t) を掛けて元の信号を少し縮め、分散 β_t のノイズを足す——この縮小があるため、ステップを重ねても分散が発散せず、t を十分大きくすると x_T はほぼ標準正規分布 N(0, I) に収束します。
実装上の決定的に便利な性質が 再パラメータ化(reparameterization) です。α_t = 1-β_t、その累積積 ᾱ_t = α_1·α_2·…·α_t を置くと、x_0 から x_t を一発でサンプリングできます。
x_t = √(ᾱ_t)·x_0 + √(1-ᾱ_t)·ε, ε ~ N(0, I)
つまり任意ステップ t のノイズ画像を、途中の x_1…x_{t-1} を逐次計算せずに直接作れます。これは学習効率の要で、ミニバッチごとに t をランダムに選び、その x_t だけを即座に用意できます。
ガウス分布どうしの合成(畳み込み)は再びガウス分布になります。この再生性のおかげで、何ステップ重ねた結果も平均 √(ᾱ_t)·x_0・分散 (1-ᾱ_t) の単一のガウス分布に閉じ、上の1発サンプリング式が成り立ちます。ノイズにガウスを選ぶのは偶然ではなく、この解析的な扱いやすさが理由です。
逆向き過程:本当は何を予測しているのか
生成は前向きの逆、p(x_{t-1} | x_t) をたどる操作です。ここで重要な事実があります。前向きの各ステップが十分小さい(β_t が小さい)なら、逆向きの1ステップもガウス分布で近似できることが知られています。そこで逆向き過程をガウスとしてモデル化します。
p_θ(x_{t-1} | x_t) = N(x_{t-1} ; μ_θ(x_t, t), Σ_θ(x_t, t))
ニューラルネット(パラメータ θ)が、各 t での平均 μ_θ を出力します(分散は固定にする実装が一般的)。問題は「平均をどう学ぶか」ですが、ここがこの分野の鍵です。
真の逆向き分布 q(x_{t-1} | x_t, x_0) は、ベイズの定理で前向きの式から解析的に書け、その平均は x_t と x_0 の線形結合になります。さらに前述の再パラメータ化式 x_t = √(ᾱ_t)·x_0 + √(1-ᾱ_t)·ε を x_0 について解いて代入すると、平均は x_t と「乗っているノイズ ε」だけで表せます。
μ = (1/√α_t)·( x_t − (β_t/√(1-ᾱ_t))·ε )
x_t は手元にあるので、未知なのは ε だけ。だから平均そのものではなく、ノイズ ε を予測するネットワーク ε_θ(x_t, t) を学習すればよい、という発想に行き着きます。これが拡散モデルの「ノイズ予測(noise prediction)」の正体です。
直感的には「ノイズ画像から元画像 x_0 を復元させればいい」と思えます。実際それも可能ですが、加えたノイズ ε を当てる形に置き換えると、ターゲットが常に標準正規分布 N(0,I) でスケールが揃い、学習が安定し精度も上がることが経験的に分かっています。x_0 予測とノイズ予測は数式上は等価な情報量で、線形に変換し合えます。
学習目標:拍子抜けするほど単純な二乗誤差
ここまで来ると、損失関数は驚くほど素直になります。理論的には対数尤度の下界(変分下界, ELBO)を最大化する問題ですが、整理すると各ステップが「真のノイズと予測ノイズのずれ」に帰着し、係数を簡略化した実用版は次の一行です。
L = E[ ‖ ε − ε_θ( √(ᾱ_t)·x_0 + √(1-ᾱ_t)·ε , t ) ‖² ]
学習ループは下記のとおり、教師ラベルを人が用意する必要がありません。自分で足したノイズ ε がそのまま正解だからです(自己教師あり)。
# 1ステップぶんの学習
x0 = sample_batch() # 元データ
t = randint(1, T) # ステップをランダムに選ぶ
eps = randn_like(x0) # 正解ノイズ ε ~ N(0, I)
xt = sqrt(abar[t])*x0 + sqrt(1-abar[t])*eps # 1発で xt を作る
loss = mse(eps, model(xt, t)) # ノイズ予測の二乗誤差
loss.backward() # 勾配でパラメータ更新
最適化は通常の 勾配降下法 そのものです。ネットワーク本体は時刻 t を条件として受け取れる構造(多くは CNN ベースの U-Net)で、入出力が同じ画像サイズになっている点が画像生成向きの理由です。土台のニューラルネットの考え方は ニューラルネットワーク を参照してください。
- 前向き過程に学習可能なパラメータはない(β_t は事前に決める固定スケジュール)。
x_tはx_0から1ステップでサンプリングできる(√(ᾱ_t)·x_0 + √(1-ᾱ_t)·ε)。- ネットワークが予測するのは元画像でも次フレームでもなく、いま乗っているノイズ ε。
- 損失は本質的にノイズの二乗誤差(MSE)。複雑な尤度項は実装上ほぼこれに簡略化される。
サンプリング:ノイズから1枚を生む手続き
学習済みの ε_θ があれば、生成は次の反復で実現します。まず純粋なノイズ x_T ~ N(0, I) から始め、t = T から 1 まで順に巻き戻します。
x = randn(shape) # x_T: 純粋なノイズ
for t in range(T, 0, -1):
eps = model(x, t) # いま乗っているノイズを予測
mean = (x - beta[t]/sqrt(1-abar[t]) * eps) / sqrt(alpha[t])
z = randn_like(x) if t > 1 else 0 # 各ステップで“揺らぎ”を再注入
x = mean + sqrt(beta[t]) * z # 1ステップぶん戻す
return x # x_0: 生成画像
各ステップの中身は2段階です。(1) 予測ノイズ ε_θ を使って平均 mean(よりノイズの少ない推定)へ寄せ、(2) そこへ新たな小さなガウスノイズ z をあえて足し戻す。この (2) が無いと毎回ほぼ同じ出力に潰れてしまい、多様性が失われます。逆向き過程は決定的な復元ではなく、確率的なサンプリングである点が要です。
素朴な手続き(DDPM)は T=数百〜1000ステップを要し、1枚生成するのに同回数のネットワーク評価が走るため遅いのが弱点です。これを数十ステップに圧縮する決定的サンプラ(DDIM)や、常微分方程式・確率微分方程式として連続時間で解く高速ソルバなど、サンプリングを速くする工夫が研究の主戦場になっています。学習済みモデルはそのまま、サンプラだけ差し替えられるのが利点です。
まとめ:3つの式に集約される
拡散モデルの数理は、結局この対応関係に集約できます。
| 論点 | 中身 | 押さえどころ |
|---|---|---|
| 前向き拡散 | x_t = √(ᾱ_t)·x_0 + √(1-ᾱ_t)·ε | 固定の過程。任意 t を1発で生成でき学習効率の源 |
| 学習目標 | L = ‖ε − ε_θ(x_t, t)‖² | “ノイズ当て”の二乗誤差。ラベル不要の自己教師あり |
| サンプリング | 平均へ寄せ → ノイズ再注入を T 回反復 | 確率的に巻き戻す。再注入が多様性を生む |
「ノイズだけから画像が生まれる」という不思議は、壊し方を解析的に閉じたガウス過程で固定し、その逆を1ステップ=1回のノイズ予測に分解したことの帰結です。各ステップは易しい回帰問題に過ぎず、それを長い鎖でつなぐことで複雑な分布を表現します。難しさを「多数の簡単な問題」へ分割する——この設計思想こそ、拡散モデルが安定して高品質な生成を実現できる理由です。概念面の入口は 拡散モデル を合わせて読むと、数理と直感が一本につながります。
AI/機械学習 Article
拡散モデルの数理:前向き拡散と逆向き生成を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
拡散モデル
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
逆向き生成はその過程を1ステップずつ巻き戻す操作で、各ステップは「いま乗っているノイズの量」を当てるニューラルネットで近似する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「拡散モデル / 生成AI」に近いか確認する。
- 強みである「前向き拡散はデータに少しずつガウスノイズを足す固定の過程で、t ステップ後の状態は元データから1発で計算できる(再パラメータ化)。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。