Stable Diffusionの基本:Latent Diffusionとは?

VAE潜在空間でtext条件付きdenoisingを行うStable Diffusionの全体像

VAE潜在空間でtext条件付きdenoisingを行うStable Diffusionの全体像

Stable Diffusion v1を例にすると、画像のpixelを直接少しずつ描くmodelではありません。VAE(Variational Autoencoder:画像を圧縮・復元するmodel)で画像をlatent(潜在表現)へ変換し、その小さなtensor上でnoiseを繰り返し除去するLatent Diffusion Modelです。

全体は三つの処理に分けられます。

  1. VAE Encoderが画像をlatentへ圧縮する
  2. U-Netがtext条件を参照しながらlatentのnoiseを予測する
  3. VAE Decoderがdenoise後のlatentをpixel画像へ戻す

High-Resolution Image Synthesis with Latent Diffusion Models(Robin Rombach、Andreas Blattmann、Dominik Lorenz、Patrick Esser、Björn Ommer、CVPR 2022)は、Diffusion Modelの反復計算をpixel空間からlatent空間へ移し、計算量とdetail保持の折り合いを付けました。さらにU-NetへCross-Attention(異なる入力系列を結び付けるAttention)を入れ、textやbounding boxなどの条件を画像生成へ反映できる形にしました。

この記事では、Stable Diffusion v1系を具体例にしながら、次の疑問へ順番に答えます。

  • Diffusion Modelは何を学習しているのか
  • なぜ高解像度pixelではなくlatentで計算するのか
  • PromptはCross-Attentionのどこへ入るのか
  • 学習時と画像生成時で処理はどう違うのか
  • StepsやGuidance Scaleを変えると何が変わるのか

Diffusion Modelは「加えたnoiseを当てる」学習から始まる

Diffusion Model(拡散モデル)は、dataを徐々にnoiseへ壊すforward processと、noiseからdataへ戻すreverse processを組み合わせた生成modelです。

ここでいう「拡散」は、画像生成時に画像をぼかしていく操作ではありません。学習用画像へ既知のGaussian noiseを加え、そのnoiseをnetworkが予測できるように訓練します。生成時は学習済みnetworkを使い、random noiseから少しずつ画像側へ戻します。

Diffusion Modelのforward processとreverse processにおけるnoiseの変化

Forward processは画像を既知の割合で壊す

Clean dataを\(x_0\)、timestep \(t\)のnoisy dataを\(x_t\)とします。各stepでは、小さなnoise schedule \(\beta_t\)に従ってGaussian noiseを加えます。

\[q(x_t\mid x_{t-1}) =\mathcal{N}\left( \sqrt{1-\beta_t}\,x_{t-1}, \beta_t I \right)\]

\(\beta_t\)が小さい初期stepでは元画像の構造が多く残り、stepが進むほどnoise成分が増えます。十分に大きな\(T\)では、\(x_T\)をほぼGaussian noiseとして扱えるようにscheduleを設計します。

学習では任意のtimestepを直接作れる

Forward processを理解すると「学習sampleごとに、\(x_0\)から\(x_1\)、\(x_2\)と順番にnoiseを加えるのか」と思うかもしれません。DDPM(Denoising Diffusion Probabilistic Model)では、累積係数を使って任意の\(t\)へ直接sampleできます。

\[\alpha_t=1-\beta_t, \qquad \bar{\alpha}_t=\prod_{s=1}^{t}\alpha_s\]
\[x_t =\sqrt{\bar{\alpha}_t}\,x_0 +\sqrt{1-\bar{\alpha}_t}\,\epsilon, \qquad \epsilon\sim\mathcal{N}(0,I)\]

学習時は次のように処理できます。

  1. 学習画像\(x_0\)を一つ選ぶ
  2. Timestep \(t\)をrandomに選ぶ
  3. Noise \(\epsilon\)をsampleする
  4. 上の式で\(x_t\)を直接作る
  5. Networkへ\(x_t\)と\(t\)を渡し、加えた\(\epsilon\)を予測させる

代表的な簡略lossは次の形です。

\[\mathcal{L}_{\mathrm{simple}} =\mathbb{E}_{x_0,t,\epsilon} \left[ \left\| \epsilon-\epsilon_\theta(x_t,t) \right\|_2^2 \right]\]

\(\epsilon_\theta\)はparameter \(\theta\)を持つnoise predictorです。Networkはclean画像を一度で出力するのではなく、「このtimestepの入力に、どのnoiseが含まれているか」を学びます。

この定式化は、Jonathan Ho、Ajay Jain、Pieter Abbeelが2020年に発表したDenoising Diffusion Probabilistic Modelsで広く知られるようになりました。厳密なtraining objectiveにはvariational boundとの関係がありますが、Stable Diffusionの入口では、noise level \(t\)付きのdenoising problemとして捉えると全体を追いやすくなります。

Reverse processは予測したnoiseを使って一段ずつ戻る

Generationではclean画像\(x_0\)がありません。Gaussian noiseからsampleした\(x_T\)を初期値にし、networkが予測したnoiseを使って\(x_{t-1}\)側へ更新します。

\[x_T\sim\mathcal{N}(0,I)\]
\[x_{t-1} =\operatorname{Step}\left( x_t,\epsilon_\theta(x_t,t),t \right)\]

ここでStepを決めるのがscheduler(各timestepでsampleをどう更新するか決める規則)です。DDPM、DDIM、Euler系などで更新式や必要step数が異なるため、U-Netが同じでも生成速度や結果は変わります。

学習と生成の違いを表にすると、次のようになります。

比較軸 学習 生成
Start clean data \(x_0\) random noise \(x_T\)
Timestep randomに一つ選ぶ schedulerに従って複数stepを進む
正解noise 自分で加えるため分かる 不明。modelが予測する
Network call sampleごとに通常1 timestep sampling stepごとに反復
目的 noise prediction errorを減らす 最終sampleをdata分布側へ移す

学習では任意の\(t\)を直接作れる一方、通常の生成では複数のdenoising stepが必要です。Diffusionの推論が遅くなりやすい理由は、画像を一度だけnetworkへ通すのではなく、同じdenoiserをtimestepを変えながら繰り返し呼ぶ点にあります。

学習時の任意timestep samplingと生成時の反復denoisingの違い

Pixel Diffusionは高解像度ほど反復計算が重くなる

DDPMの式はpixel画像にも適用できます。しかし、512×512や1024×1024の画像tensorをU-Netへ何十回も通すと、空間方向の計算とactivation memoryが大きくなります。

例えばRGBの512×512画像は、単純な入力要素数だけでも次の大きさです。

\[512\times512\times3=786{,}432\]

実際のU-Net内部では、このgridから多数のfeature mapを作り、downsampleとupsample、residual block、Attentionを繰り返します。入力scalar数だけでFLOPsは決まりませんが、空間sizeが大きいほど各layerの計算負荷が増えるという問題は残ります。

解像度を2倍の1024×1024へ上げると、縦横がそれぞれ2倍になり、pixel数は4倍です。さらにDiffusionはこの処理を複数step繰り返します。高解像度化とsampling step数が掛け合わさるため、pixel空間のままではtrainingもinferenceも高価になります。

Latent Diffusion Modelは、denoising能力を単純に弱くして速くするのではなく、denoiserが処理する表現の空間sizeを小さくする方向を選びました。

512×512 pixel gridと64×64 latent gridで反復denoising範囲を比較

Latent Diffusion Modelは圧縮・生成・復元を分業する

LDM(Latent Diffusion Model:潜在拡散モデル)は、pretrained autoencoderとDiffusion Modelを組み合わせます。

入力画像\(x\in\mathbb{R}^{H\times W\times3}\)をEncoder \(\mathcal{E}\)でlatent \(z\)へ変換し、Decoder \(\mathcal{D}\)で復元します。

\[z=\mathcal{E}(x), \qquad z\in\mathbb{R}^{h\times w\times c}\]
\[\tilde{x}=\mathcal{D}(z)\]

Downsampling factor \(f\)は次の関係です。

\[f=\frac{H}{h}=\frac{W}{w}\]

Diffusionのforward/reverse processは\(x\)ではなく\(z\)上で行います。Latentへnoiseを加えた\(z_t\)に対するobjectiveは、text条件\(y\)も含めると概念的に次の形です。

\[\mathcal{L}_{\mathrm{LDM}} =\mathbb{E}_{x,y,t,\epsilon} \left[ \left\| \epsilon-\epsilon_\theta \left(z_t,t,\tau_\theta(y)\right) \right\|_2^2 \right]\]

\(\tau_\theta\)はtextなどのconditioning inputをvector列へ変換するEncoderです。

VAE Encoder・U-Net・Cross-Attention・VAE DecoderからなるLatent Diffusion architecture

LDM論文は画像生成を二種類の圧縮として整理します。

  • Perceptual compression: Autoencoderが知覚上重要でない高周波detailや冗長性を減らす
  • Semantic compression: Diffusion Modelがdata分布の構造や、条件と画像の関係を学ぶ

役割を分けることで、Diffusion Modelはpixelを完全再現する作業ではなく、より小さい表現上で画像の構造を生成する処理へ計算を集中できます。

ただし、autoencoderはlossyです。Encoderで失われた細部をDiffusion Modelが完全に取り戻せるとは限りません。圧縮率を上げるほど高速化しやすい一方、細い線、小さな文字、微細なtextureなどのreconstructionが難しくなります。

LDM論文の分析では、downsampling factor \(f=4\)と\(f=8\)が生成品質と計算効率の良好な領域にあると報告されました。これは同論文のmodelとdatasetでの結果であり、すべての画像domainで8倍圧縮が最適という意味ではありません。

Stable Diffusion v1では512×512画像が4×64×64になる

Stable Diffusion v1はLDMの一つの具体的なconfigurationです。CompVisの公式repositoryでは、downsampling factor 8のautoencoder、860M parameterのU-Net、frozen CLIP ViT-L/14 text encoderを使うmodelとして説明されています。

512×512のRGB画像を例にすると、VAE Encoderの前後は次のshapeになります。

\[x\in\mathbb{R}^{3\times512\times512}\]
\[z\in\mathbb{R}^{4\times64\times64}\]

各軸で8分の1なので、空間位置は64分の1です。Scalar数を比べると次の通りです。

Representation Shape Scalar数
Pixel \(3\times512\times512\) 786,432
Latent \(4\times64\times64\) 16,384
Ratio Pixel側が48倍
\[\frac{3\times512\times512}{4\times64\times64}=48\]

Stable Diffusion v1で512×512×3画像を4×64×64 latentへ圧縮する計算

ここで「Stable Diffusionは計算量が必ず48分の1」と読むのは誤りです。U-Net内部のchannel数、Attention、VAE encode/decode、sampling algorithmがあるため、実際のFLOPs、VRAM、latencyは単純な入力scalar比と一致しません。

重要なのは、denoisingを反復する主経路が512×512 pixel gridではなく64×64 latent gridになることです。VAEのencode/decodeは必要ですが、反復回数の多いU-Net処理を小さい空間へ移せます。

また、4 channels、downsampling factor 8、latent scaling factor 0.18215はStable Diffusion v1のcheckpoint/configに結び付く値です。LDM一般の定数ではありません。別versionのVAEやU-Netを混ぜると、shapeが合ってもlatent分布のscaleがずれる可能性があります。

PromptはCross-AttentionでU-Netへ入る

Text-to-image生成では、promptをどこで画像へ反映するかが必要です。Stable Diffusion v1では、frozen CLIP text encoderがpromptをtext embedding列へ変換し、U-Net内部のCross-Attentionへ渡します。

Promptを\(y\)、text encoderを\(\tau_\theta\)とすると、conditioningは次の形です。

\[c=\tau_\theta(y)\]

U-Netのあるlayerにおける画像側featureを\(\varphi_i(z_t)\)とすると、LDM論文のCross-Attentionは次の関係で表されます。

\[Q=W_Q\varphi_i(z_t), \qquad K=W_Kc, \qquad V=W_Vc\]
\[\operatorname{Attention}(Q,K,V) =\operatorname{softmax} \left( \frac{QK^\top}{\sqrt{d}} \right)V\]

役割を言葉にすると、次の対応です。

Element 入力元 問い
Query \(Q\) U-Netのnoisy latent feature この画像位置・featureは何を参照すべきか
Key \(K\) Promptのtext embeddings 各text tokenは何を表すか
Value \(V\) Promptのtext embeddings 参照したtokenから何の情報を受け取るか

U-Net画像featureをQuery、prompt embeddingをKeyとValueにするCross-Attention

つまり、prompt全文を一つのvectorとして画像へ足しているわけではありません。U-Net内部の画像featureが、text token列のどこを参照するかをAttention weightで選びます。

例えば「赤い傘を持つ人物」というpromptでは、人物に対応する画像featureが「人物」tokenを、持ち物の領域が「赤い」「傘」に関係するtokenを参照できるよう学習します。ただしAttention mapは人間が指定したsegmentation maskではありません。Textと画像の対応をtraining dataから学んだ結果であり、物体数、左右関係、否定などを常に正確に表現できる保証はありません。

CLIPが画像とtextを同じ空間へ学習する仕組みは、CLIPとは?画像とテキストを同じ空間で扱う技術で説明しています。Stable Diffusion v1ではCLIPのtext encoderをconditioningに使いますが、LDM全般が必ずCLIP ViT-L/14を使うわけではありません。

学習時と画像生成時のpipelineを分けて読む

LDMのtrainingとgenerationは、同じU-Netを使っていてもdata flowが異なります。

学習時

  1. 学習画像\(x\)をVAE Encoderでlatent \(z\)へ変換する
  2. Randomなtimestep \(t\)とnoise \(\epsilon\)を選ぶ
  3. \(z\)からnoisy latent \(z_t\)を直接作る
  4. Promptをtext encoderでconditioning \(c\)へ変換する
  5. U-Netへ\(z_t\)、\(t\)、\(c\)を渡してnoiseを予測する
  6. 予測noiseと実際の\(\epsilon\)の差からlossを計算する

生成時

  1. Promptをtext encoderでconditioning \(c\)へ変換する
  2. Random seedから初期latent noise \(z_T\)を作る
  3. U-Netがconditional noiseを予測する
  4. Schedulerが\(z_t\)から\(z_{t-1}\)へ更新する
  5. 指定step数だけ3と4を繰り返す
  6. 最終latent \(z_0\)をVAE Decoderでpixel画像へ戻す

Trainingではclean画像をEncoderへ入れますが、text-to-image generationでは初期画像を必要としません。Generation開始時のlatentは、promptをVAE Encoderへ通して作るのではなく、seedからsampleしたnoiseです。

Img2imgでは入力画像をVAE Encoderへ通し、得られたlatentへ指定強度のnoiseを加えてからreverse processを始めます。Text-to-imageとimg2imgは同じcomponentを使えても、初期latentの作り方が異なります。

Seed・Steps・Guidance Scaleは別の場所へ作用する

Stable DiffusionのUIでは多くの設定が並びますが、原理を理解するには少なくとも三つを分けます。

Parameter 主に決めるもの 増やしたときの典型的なtrade-off
Seed 初期latent noise 同じ設定なら再現性を持たせやすいが、環境・実装差で完全一致しない場合がある
Sampling steps U-Netとschedulerの反復回数 時間は増える。品質改善は一定点で飽和し、sampler依存
Guidance scale Prompt条件へ寄せる強さ Prompt追従が強くなる一方、diversity低下や過飽和・artifactが起こり得る

Seed・Sampling Steps・Guidance Scaleが画像生成pipelineへ作用する位置

Classifier-Free Guidanceは二つの予測を混ぜる

CFG(Classifier-Free Guidance:外部分類器を使わず条件を強める手法)では、条件なしpredictionとprompt付きpredictionを組み合わせます。

\[\hat{\epsilon} =\epsilon_{\mathrm{uncond}} +w\left( \epsilon_{\mathrm{cond}}- \epsilon_{\mathrm{uncond}} \right)\]

\(w\)を大きくするとconditional方向を強く反映します。Jonathan HoとTim Salimansが2022年に発表したClassifier-Free Diffusion Guidanceが示す中心的な性質は、sample fidelityとdiversityのtrade-offです。「Guidance Scaleを上げれば画質が単調に良くなる」という関係ではありません。

また、UIやlibraryによってscaleの定義、negative promptの扱い、rescale処理が違います。異なるmodelやsamplerで数値だけを横並びにしない方が安全です。

Stepsはtraining timestepsと同じ意味ではない

Stable Diffusion v1のconfigにはtraining diffusion processのtimesteps: 1000があります。一方、生成UIで指定する20 stepsや50 stepsは、schedulerがそのtraining timestep範囲から選ぶ推論時の更新回数です。

「1000 timestepで学習したmodelだから、生成も1000 steps必要」という意味ではありません。DDIMや各種solverは少ないnetwork evaluationでtrajectoryを近似します。必要step数はsamplerとmodelの組み合わせで評価します。

Pixel DiffusionとLatent Diffusionの違い

どちらが常に優れているかではなく、何を反復計算の空間に置くかが違います。

比較軸 Pixel Diffusion Latent Diffusion
Denoising対象 RGBなどのpixel tensor Autoencoderが作るlatent tensor
高解像度の反復cost 空間sizeが直接効く 小さいlatent gridへ移せる
追加component Denoiser中心 EncoderとDecoderが必要
Detail保持 Autoencoder bottleneckがない 圧縮で微細detailを失う可能性がある
Model互換性 Pixel rangeとchannelが中心 VAE、latent channels、scaleも合わせる必要がある
向く条件 Pixel-level accuracyを重視し、計算資源を許容できる場合 高解像度生成を現実的な計算量で反復したい場合

LDMの価値は「latentは意味だけを持つ魔法の空間だから速い」ことではありません。知覚上重要な情報をある程度残した低解像度表現をautoencoderで用意し、計算の重い反復denoisingをそこへ移す設計にあります。

逆に、医用画像や文字、細線などpixel-level fidelityが重要なdomainでは、VAE reconstruction errorを独立に測る必要があります。生成modelの改善だけを追っても、first-stage autoencoderが落とした情報は戻りません。

Stable DiffusionとLDMを導入するときの確認項目

Checkpointを読み込めたことと、正しいpipelineで動いていることは同じではありません。少なくとも次を一組として確認します。

  1. VAE: downsampling factor、latent channels、scaling factor
  2. U-Net: input/output channels、Cross-Attention dimension、prediction type
  3. Text encoder: tokenizer、maximum length、embedding dimension
  4. Scheduler: training schedule、prediction parameterization、timestep spacing
  5. Preprocessing: image range、resize、normalization
  6. Precision: VAEとU-Netのdtype、overflowやunderflow
  7. Safety: 想定外prompt、個人情報、bias、公開範囲
  8. Rights: code、weights、training data、入力画像、outputの条件

VAE・U-Net・Text Encoder・Scheduler・前処理・権利条件の互換性checklist

Stable Diffusion v1のinference configでは、latent channelsは4、text context dimensionは768、scale factorは0.18215です。これらはcheckpointの学習条件と対応します。別VAEへ差し替える場合、output shapeだけでなくlatent distributionのscaleとdecoder reconstructionを確認します。

CompVisのlatent-diffusion repositoryはMIT Licenseですが、Stable Diffusion v1のweightsはCreativeML OpenRAIL-Mで、use-based restrictionsを含みます。さらにmodel licenseはtraining data自体をlicenseするものではありません。Repository code、model weights、training data、入力素材、生成物を一つの「open source」という言葉でまとめないでください。

Latent Diffusionの限界

Stable Diffusion v1-4 model cardは、技術的な限界とbiasを明記しています。

  • Autoencoder is lossy: VAE圧縮で微細detailが失われる
  • Text rendering: 文字列を正確に描くことが苦手
  • Composition: 複数物体の個数、属性、空間関係を誤ることがある
  • Faces and people: 顔や人物の表現が不安定になる場合がある
  • Language coverage: v1は英語caption中心で、他言語promptの対応が限定される
  • Dataset bias: 学習dataの文化的・社会的biasを出力へ引き継ぐ
  • Misuse risk: もっともらしい偽画像、権利侵害、個人への被害につながり得る

これらをすべてDiffusionのnoise objectiveだけで説明することはできません。VAE、text encoder、U-Net、training data、guidance、post-processingの各層に原因が分かれます。

問題を切り分けるときは、同じ画像をVAE encode/decodeだけしたreconstruction、promptなし・ありのnoise prediction、複数seed、複数guidance scaleを分けて比較します。VAE reconstructionの時点で文字が崩れていれば、sampling stepsを増やしても根本解決になりません。

まとめ

Stable Diffusionの基本は、Diffusion、latent compression、text conditioningの三つです。

  • DDPMは既知のnoiseを加え、U-Netにそのnoiseを予測させる
  • 学習時は任意のtimestepを直接作れるが、生成時はdenoisingを複数step反復する
  • LDMはVAEで画像を圧縮し、計算の重い反復をpixel空間からlatent空間へ移す
  • Stable Diffusion v1では512×512×3画像を4×64×64 latentとして扱う
  • Cross-AttentionではU-Net画像featureがQuery、text embeddingsがKeyとValueになる
  • Seed、Steps、Guidance Scaleは初期noise、反復回数、条件の強さという別の役割を持つ
  • Latent compressionには計算量削減とdetail lossのtrade-offがある

Latent Diffusionは、画像を小さくして終わる圧縮技術ではありません。Autoencoderが知覚表現を作り、Diffusion Modelがその空間で画像構造を生成し、Cross-Attentionがtext条件を注入する分業設計です。この三者を分けて追うと、Stable Diffusionの速度、prompt追従、画質劣化がどのcomponentから生じるかを判断しやすくなります。

発展的なsamplingで画像領域ごとに計算を配分する方法は、Patch Forcingとは?画像生成AIの推論を難しい領域へ集中させる仕組みで解説しています。

参考文献

コメント

タイトルとURLをコピーしました