拡散モデル — ノイズを加えて、戻す

絵にノイズを振りかけて壊すのは誰にでもできます。拡散モデルの発想は、その壊れていく過程を逆再生する方法だけを学習すること。Stable Diffusion や動画生成AIの心臓部であるこの仕組みを、点群と 16×16 の小さな画像を動かしながら理解します。

1. 発想の転換 — 壊すのは簡単、「直す」を学ぶ

VAE や GAN は「ノイズ z → データ」という一発の大ジャンプを1つのネットワークに学ばせました。拡散モデルはこの難problemを分割します。

POINT — 大ジャンプを小さな一歩に分解する 1回のデノイズは「ほんの少しきれいにする」だけの簡単な回帰問題で、ガウス分布でよく近似できる。難しい生成を、簡単な問題×1000回に分解したことが拡散モデルの安定した学習と高品質の源泉。GANのような不安定なゲームは登場しない。

2. 前方拡散 — データが雲になるまで

ステップ t でのノイズの混ざり具合は、係数 ᾱt(アルファバー)で決まります。便利なことに、途中を経由せずどの t へも一発でジャンプできる閉じた式があります。

xt = √ᾱt · x0 + √(1 − ᾱt) · ε  (ε 〜 N(0, I)) √ᾱ_t=残っている信号の割合、√(1−ᾱ_t)=混ざったノイズの割合。t が進むと信号→0、ノイズ→1 へ

下のデモは、渦巻き状に並んだ2次元の点群(=データセット)にノイズを加えていく様子です。スライダーで t を動かすと、渦巻きが徐々にほどけて、最後はただのガウス雲になります。紫の線は、いくつかの点がたどる軌跡です。

前方拡散 — 渦巻きがガウス雲に溶けていく
水色=現在の点群 xt、薄い灰色=元の渦巻き x0、紫の線=オレンジで強調した点の軌跡。右のバーは「信号の強さ √ᾱ」と「ノイズの強さ √(1−ᾱ)」。スライダーを動かすと一時停止して手動で観察できます。どんなデータも t=50 では同じガウス雲——だからこそ逆向きの出発点を N(0,I) にできるのです。

3. 逆拡散 — ノイズの中から形が浮かぶ

逆向きに戻るには、各地点で「どちらへ動けばよりデータらしくなるか」という矢印(ベクトル場)が分かれば十分です。この矢印の正体がスコア ∇x log p(x)(対数密度の勾配)で、実は「混ざっているノイズ ε を当てる」ことと等価です。ネットワーク εθ の学習目標は驚くほど単純な回帰です:

L = Et, x₀, ε [ ∥ ε − εθ(xt, t) ∥² ] 「x_t に混ざったノイズ ε を当てよ」。正解の ε は自分で混ぜたのだから必ず手元にある——教師データが無限に作れる
POINT — スコアとノイズ予測は同じもの ∇ log p(xt) = −ε / √(1−ᾱt) の関係があるため、「ノイズを当てる」=「データらしくなる方向を知る」。ノイズ予測の逆方向に少し動く、を繰り返すのが逆拡散。

下のデモでは、ガウス雲からスタートした点群が、スコアのベクトル場(この教材では渦巻きへ向かう場を解析的に計算)に従って段々と渦巻きに戻っていきます。最初は大まかな配置、後半で細部が決まる——粗→細の順に形が現れるのが拡散生成の特徴です。

逆拡散 — ガウス雲から渦巻きが生成される
水色の粒=生成中のサンプル、緑の薄い線=目標の分布(渦巻き)、紫の矢印=その場所での「データらしくなる方向」(=ノイズ予測の逆方向)。ノイズレベル σ が大きいうちは矢印がおおざっぱに中心を指し、σ が下がるにつれて渦巻きの細部を指すようになります。

4. 画像で見るデノイズ — 「1000回の小さな引き算」

今度は 16×16 ピクセルの「画像」で同じことを見ます。スライダーが右端なら純ノイズ、左へ動かすほどノイズが引き算されて絵が現れます。DDPM の逆ステップは1歩ぶんのノイズを取り除く式です:

xt−1 = (1/√αt) ( xt − (βt/√(1−ᾱt)) · εθ(xt, t) ) + σt z 予測したノイズを少し引いて、少し縮めて、少し揺らす。これを t=T→1 まで繰り返す
画像のデノイズ — ノイズ量とステップ数の関係
スライダーで t を手動スクラブできます。「純ノイズから生成」を押すと、下のタイムラインの●の位置だけを経由して t=50→0 へデノイズが進みます。ステップ数を 50 にすればきれいに、2〜5 に減らすと速い代わりに粗い仕上がりになる——ステップ数と品質のトレードオフを試してください。
注意 — 生成が遅い、が最大の弱点だった DDPM は生成に約1000回のネットワーク実行が必要で、GAN の1回と比べ圧倒的に遅い。そこで DDIM(確率的な揺らぎを消しステップを間引いても破綻しない決定的サンプラー、上のデモの「●を間引く」イメージ)や、大きなジャンプを別の小さなモデルに教え込む蒸留(1〜4ステップ生成)が開発され、実用速度に達した。

5. 条件付き生成 — プロンプトが「目的地」を変える

ここまでの逆拡散は「とにかくデータらしいもの」へ向かうだけでした。テキスト条件付き生成では、プロンプトの埋め込みを U-Net / Transformer にcross-attention で注入し、デノイズの方向を「その説明文らしい画像」の方へ曲げます。つまりプロンプトは逆拡散の目的地を切り替えるスイッチです。

テキスト条件付け — 同じノイズでも目的地が変わる
ボタンを押すたびに同じ初期ノイズから逆拡散をやり直しますが、条件が違うので違う絵にたどり着きます。実際のモデルでは、条件あり/なしのノイズ予測の差を強調する classifier-free guidance で「プロンプトへの忠実さ」を調整します。

6. まとめと現在地

一歩先へ — 潜在空間で拡散する(Stable Diffusion) 512×512 のピクセル空間で1000回もデノイズするのは高すぎる。そこで Stable Diffusion は、前章の VAE でまず画像を約 1/48 の潜在表現に圧縮し、その潜在空間の中で拡散・逆拡散を行い、最後に VAE デコーダで画像へ戻す。「圧縮の VAE + 生成の拡散」という分業——二大源流と新しい本流が1つのパイプラインに同居している。