潜在拡散モデル(Latent Diffusion)の設計
なぜStable Diffusionは家庭用GPUで高解像度画像を生めるのか。重い拡散をピクセルではなく圧縮した潜在空間で走らせる二段構造と、テキスト条件付けの仕組みまで一気につかめます。
- 1.潜在拡散はオートエンコーダ(VAE)で画像を小さな潜在表現へ圧縮し、その潜在空間で拡散・逆拡散を行う。ピクセル空間より次元が桁違いに小さく、計算とメモリを大幅に削減できる。
- 2.知覚的圧縮(VAEが担う見た目の細部)と生成的拡散(U-Netが担う意味的な構成)を役割分担する二段構造が核心。各段を別々に最適化できる。
- 3.テキスト等の条件は、U-Net中間層へクロスアテンションで注入する。条件を鍵・値、画像特徴を問い合わせとして対応づけ、任意モダリティの条件付けを共通の枠組みで扱える。
動機:ピクセル空間の拡散はなぜ重いのか
拡散モデルの数理 で見たとおり、拡散モデルは1枚生成するのに数十〜数百回のネットワーク評価を要します。問題はその1回の評価が走る空間の大きさです。512×512のRGB画像はおよそ 512×512×3 ≒ 786,432 次元。この高次元テンソルに対してU-Netを数百回適用するのが素朴な「ピクセル空間拡散(pixel-space diffusion)」で、学習にも生成にも莫大な計算とメモリを食います。
潜在拡散モデル(Latent Diffusion Model, LDM)の着眼点はシンプルです。画像の情報の大半は、知覚的にはほとんど効かない高周波な細部に費やされている。ならば拡散を生のピクセルで回すのではなく、意味のある成分だけを残した低次元の潜在表現で回せばよい——これがLDM、そして実装系であるStable Diffusionの設計思想です。
潜在空間の縦横を例えば各8分の1に圧縮すると、空間要素数は 8×8 = 64 分の1になります。U-Netの計算量は処理するトークン数(空間位置数)にほぼ比例し、自己アテンションを含む層ではその二乗に効くため、削減効果は単純な比例以上に大きくなります。LDMが家庭用GPUで動く最大の理由がこれです。
二段構造:知覚的圧縮と生成的拡散を分離する
LDMの本質は、生成を性質の異なる2つの段に分けることです。
| 段 | 担当モジュール | 学習対象 | 受け持つ情報 |
|---|---|---|---|
| 知覚的圧縮(perceptual compression) | オートエンコーダ(VAE) | 画像 ↔ 潜在 の符号化/復号 | 見た目の細部・テクスチャ・高周波成分 |
| 生成的拡散(generative diffusion) | U-Net(拡散モデル) | 潜在空間でのノイズ予測 | 意味的な構成・物体配置・大域構造 |
第一段のオートエンコーダは、エンコーダ E が画像 x を潜在 z = E(x) へ落とし、デコーダ D が x ≈ D(z) へ戻します。ここで重要なのは、この圧縮が知覚的に等価であればよく、ビット単位の完全復元は不要だという割り切りです。学習には単純な二乗誤差だけでなく、知覚損失(特徴空間での距離)と敵対的損失(GAN判別器)を併用し、見た目の自然さを直接最適化します。土台の理論は VAE の数理(ELBO) を参照してください。
第二段の拡散は、この潜在 z の上で完結します。前向き拡散も逆向き生成も、すべて低次元の潜在空間で行われます。
ダウンサンプリング係数 f(例 f=4, 8, 16)が圧縮の強さです。f が小さい(弱い圧縮)と潜在が大きく、拡散の計算が重いまま。f が大きい(強い圧縮)と計算は軽いが、デコーダが復元しきれず細部が潰れて品質が落ちます。Stable Diffusion が f=8 を採用するのは、計算コストと再構成品質の釣り合いが良い領域だからです。
なぜ二段に分けると有利なのか。知覚的な細部の再現は決定的・局所的なマッピングで十分こなせる仕事で、確率的な拡散過程をわざわざ割り当てる必要がありません。逆に物体の配置や構図といった大域構造の生成は、多様な可能性からサンプリングする確率的な過程が向きます。それぞれの仕事に向いた機構を割り当てることで、拡散モデルは本来得意な「意味の生成」に計算を集中できます。
潜在を暴れさせない:KL正則化という制約
ここで設計上の落とし穴があります。エンコーダを再構成品質だけで学習すると、潜在空間が任意のスケールや分散を持つ「でたらめな」分布になりがちです。拡散は標準正規分布を出発点に潜在を生成するので、潜在の分布が制御されていないと、拡散側が扱える前提が崩れます。
LDMはこれを2つの方式のいずれかで抑えます。
| 正則化 | 中身 | 性格 |
|---|---|---|
| KL正則化(KL-reg) | 潜在を標準正規分布 N(0,I) へ弱く引き寄せる(VAEと同じKL項) | 潜在の分散を穏やかに制御。Stable Diffusion 系が採用 |
| VQ正則化(VQ-reg) | 潜在をコードブックの離散ベクトルへ量子化する | VQGAN 流。離散表現で表現力を持たせる |
KL正則化版では、係数を非常に小さく設定するのがコツです。強くかけると VAE と同様に潜在が事前分布へ潰れて情報を失います。LDMが欲しいのは「ほどよくスケールが揃った、しかし情報を多く保った」潜在なので、KLは弱い軽い制約として効かせます。実装ではエンコーダ出力をある定数倍してから拡散に渡し、潜在の分散をおおむね1へ揃える調整も行います。
クロスアテンションによる条件付け
LDMがStable Diffusionとして爆発的に広まった決定打が、任意モダリティの条件付けをクロスアテンションで統一した点です。テキスト「a cat riding a bike」のようなプロンプトをどう拡散に効かせるか——その答えがこれです。
仕組みは アテンションの数理 の素直な応用です。まず条件(テキスト)を専用エンコーダ(CLIPテキストエンコーダなど)で系列の特徴 τ(c) に変換します。次にU-Netの中間特徴を問い合わせ Q、条件特徴を鍵 K・値 V として対応づけます。
Q = W_Q · φ(z_t) # 画像側(U-Net中間特徴)から作る問い合わせ
K = W_K · τ(c) # 条件(テキスト特徴)から作る鍵
V = W_V · τ(c) # 条件から作る値
Attention(Q,K,V) = softmax( Q·Kᵀ / √d ) · V
各画像位置(Q)が、プロンプトの各トークン(K)との関連度を softmax で重み付けし、対応する値 V を引き込みます。直感的には「画像のこの領域は、プロンプトのどの単語に注目して描くべきか」を層ごとに学習している、ということです。
# U-Net 内のクロスアテンション層(概念コード)
def cross_attention(z_feat, cond): # z_feat: 画像特徴, cond: τ(c)
q = z_feat @ Wq # 問い合わせは画像側
k = cond @ Wk # 鍵・値は条件側
v = cond @ Wv
attn = softmax(q @ k.T / sqrt(d)) # 画像位置 × 条件トークン の重み
return z_feat + attn @ v # 残差として中間特徴へ注入
この設計の強みは汎用性です。条件側を K・V として差し込む形なので、τ を差し替えるだけでテキスト・クラスラベル・レイアウト・別画像など、あらゆる条件を同一の枠組みで扱えます。自己アテンション(画像内の位置どうし)とクロスアテンション(画像と条件)をU-Netの各解像度ブロックに交互に挟むのが標準構成です。
クロスアテンションは条件を注入する経路ですが、プロンプト忠実度をつまみで調整するのは別機構の 分類器フリーガイダンス(CFG) です。学習時に条件をランダムに空にして条件付き/無条件の両方を1つのU-Netに同居させ、生成時に両者のスコアを外挿します。LDMの「効く」プロンプト追従は、クロスアテンション(注入)とCFG(増幅)の二段構えで成り立っています。
学習目標とサンプリング:拡散の式は潜在に置き換わるだけ
第二段の数理は、ピクセル空間の拡散をそのまま潜在 z に置き換えたものです。前向きで潜在にノイズを足し、U-Netがそのノイズを予測します。条件 c を受け取る点だけが追加です。
L_LDM = E[ ‖ ε − ε_θ( z_t , t , τ(c) ) ‖² ], z_t = √(ᾱ_t)·z_0 + √(1-ᾱ_t)·ε
z_0 = E(x) はエンコーダで一度計算して固定(学習中はエンコーダ・デコーダを凍結するのが基本)。あとは 拡散モデルの数理 と同じく、ノイズの二乗誤差を最小化するだけです。生成の全体手続きは次のとおりです。
# 潜在拡散の生成(概念フロー)
z = randn(latent_shape) # 純粋ノイズ(小さな潜在空間)
c_emb = text_encoder(prompt) # τ(c): 条件の特徴系列
for t in range(T, 0, -1):
eps = unet(z, t, c_emb) # クロスアテンションで条件を効かせつつノイズ予測
z = denoise_step(z, eps, t) # 1ステップ潜在を巻き戻す(CFGはここで適用)
image = decoder(z) # 最後に一度だけピクセルへ復号
注目すべきは反復ループが潜在空間で閉じていることです。重いデコーダ D を呼ぶのは最後の1回だけ。数十〜数百ステップの拡散はすべて小さな潜在テンソル上で走るため、ピクセル空間拡散に比べて桁違いに軽くなります。
まとめ:分割統治が生んだ実用性
| 論点 | LDMの設計 | もたらす効果 |
|---|---|---|
| どこで拡散するか | VAEで圧縮した低次元の潜在空間 | 計算・メモリを大幅削減し家庭用GPUで動く |
| 役割分担 | 知覚的圧縮(VAE)と生成的拡散(U-Net)の二段 | 細部と意味を別々に最適化できる |
| 条件付け | U-Net中間層へのクロスアテンション | テキスト等あらゆる条件を統一的に注入 |
| 潜在の制御 | 弱いKL(またはVQ)正則化 | 拡散が前提とするスケールへ整える |
潜在拡散の核心は、「見た目の再現」と「意味の生成」という性質の違う2つの問題を分離し、それぞれに向いた機構を割り当てたことに尽きます。重い拡散を圧縮空間へ押し込めて計算を現実的な水準まで下げ、空いた余力をクロスアテンションによる柔軟な条件付けへ回す。この分割統治の設計が、拡散モデルを研究室のデモから誰もが使える生成基盤へと押し上げました。前提となる拡散そのものの直感は 拡散モデル、スコアの視点は スコアベース生成モデル を合わせて読むと、潜在拡散の位置づけが一本につながります。
AI/機械学習 Article
潜在拡散モデル(Latent Diffusion)の設計を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
拡散モデル
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 6
導入後に効く点
知覚的圧縮(VAEが担う見た目の細部)と生成的拡散(U-Netが担う意味的な構成)を役割分担する二段構造が核心。各段を別々に最適化できる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 6
判断チェックリスト
- 自社の用途が「拡散モデル / 潜在拡散」に近いか確認する。
- 強みである「潜在拡散はオートエンコーダ(VAE)で画像を小さな潜在表現へ圧縮し、その潜在空間で拡散・逆拡散を行う。ピクセル空間より次元が桁違いに小さく、計算とメモリを大幅に削減できる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。