潜在拡散モデル

潜在的拡散モデル
原作者コンプビズ
初回リリース2021年12月20日
リポジトリgithub .com /CompVis /潜在拡散
書かれたパイソン
タイプ
ライセンスマサチューセッツ工科大学

潜在的拡散モデルLDM[ 1 ]は、 LMUミュンヘンのCompVis(コンピュータビジョン&学習)[ 2 ]グループによって開発された拡散モデルアーキテクチャです。[ 3 ]

2015年に導入された拡散モデル(DM)は、訓練画像にノイズ(通常はガウス分布)を連続的に適用して除去することを目的として学習されます。LDMは、潜在空間で拡散モデリングを行い、自己注意と交差注意の条件付けを可能にすることで、標準的なDMを改良したものです。

LDMは実用的な拡散モデルで広く利用されている。例えば、Stable Diffusionバージョン1.1から2.1はLDMアーキテクチャに基づいている。[ 4 ]

バージョン履歴

拡散モデルは、非常に複雑な確率分布からサンプリングできるモデルを学習する手法として2015年に導入されました。このモデルでは、非平衡熱力学、特に拡散の手法が用いられました。[ 5 ] Theanoによるソフトウェア実装も行われました。[ 6 ]

2019年の論文では、ノイズ条件付きスコアネットワーク(NCSN)またはランジュバンダイナミクスを用いたスコアマッチング(SMLD)が提案されました。[ 7 ]この論文には、 PyTorchで書かれたソフトウェアパッケージがGitHubでリリースされました。[ 8 ]

2020年の論文[ 9 ]では、変分推論によって従来の手法を改良したノイズ除去拡散確率モデル(DDPM)が提案されました。この論文には、 TensorFlowで書かれたソフトウェアパッケージがGitHubで公開されました。[ 10 ]これはlucidrainsによってPyTorchで再実装されました。[ 11 ] [ 12 ]

2021年12月20日、LDMの論文がarXiv [ 13 ]に掲載され、 Stable Diffusion [ 14 ]とLDM [ 15 ]の両方のリポジトリがGitHubで公開されました。しかし、それらはほぼ同じままでした。Stable Diffusion v1に関する実質的な情報は、2022年8月10日にGitHubに追加されました。[ 16 ]

Stable Diffusion (SD) バージョン 1.1 から XL まではすべて、LDM アーキテクチャの特定のインスタンス化でした。

SD 1.1から1.4は、2022年8月にCompVisによってリリースされました。「バージョン1.0」はありません。SD 1.1は、laion2B-enデータセットで学習されたLDMでした。SD 1.1は、より美しい画像で1.2に微調整されました。SD 1.2は、分類器フリーガイダンスを改善するために、テキスト条件付けを10%削減し、1.3、1.4、1.5に微調整されました。[ 17 ] [ 18 ] SD 1.5は、2022年10月にRunwayMLによってリリースされました。 [ 18 ]

建築

LDM は任意のデータに基づいて任意のデータを生成するために機能しますが、具体的には、条件付きのテキストから画像への生成におけるその動作について説明します。

LDM は、変分オートエンコーダ(VAE)、修正されたU-Net、およびテキストエンコーダで構成されています。

VAEエンコーダは、画像をピクセル空間からより低次元の潜在空間へと圧縮し、画像のより根本的な意味を捉えます。ガウスノイズは、順方向拡散中に圧縮された潜在表現に反復的に適用されます。ResNetバックボーンで構成されるU-Netブロックは、順方向拡散からの出力を逆方向にノイズ除去し、潜在表現を取得します。最後に、VAEデコーダはこの表現をピクセル空間に再変換することで最終画像を生成します。[ 4 ]

ノイズ除去ステップは、テキスト文字列、画像、またはその他のモダリティを条件付けることができます。エンコードされた条件付けデータは、クロスアテンションメカニズムを介してノイズ除去U-Netに提示されます。[ 4 ]テキストの条件付けには、事前学習済みのCLIP ViT-L/14テキストエンコーダーを用いて、テキストプロンプトを埋め込み空間に変換します。[ 3 ]

変分オートエンコーダ

画像データを圧縮するために、まず変分オートエンコーダ(VAE)を画像データセットで学習させます。VAEのエンコーダ部分は画像を入力として受け取り、画像の低次元潜在表現を出力します。この潜在表現はU-Netへの入力として使用されます。モデルの学習が完了すると、エンコーダは画像を潜在表現にエンコードし、デコーダは潜在表現を画像にデコードします。

VAEのエンコーダとデコーダを とします。 ED{\displaystyle E,D}

RGB画像をエンコードするには、3つのチャネルを最大値で割り算し、すべての要素が範囲 内にある形状 のテンソルを 生成します。エンコードされたベクトルはで、形状 です。ここで0.18215はハイパーパラメータであり、これはエンコードされたベクトルをほぼ単位分散に白色化するために元の著者によって選択されました。逆に、潜在テンソル が与えられた場合、デコードされた画像は となり、範囲 にクリップされます[ 19 ] [ 20 ]×{\displaystyle x}3512512{\displaystyle (3,512,512)}[01]{\displaystyle [0,1]}0.18215×E2×1{\displaystyle 0.18215\times E(2x-1)}46464{\displaystyle (4,64,64)}y{\displaystyle y}Dy/0.18125+1/2{\displaystyle (D(y/0.18125)+1)/2}[01]{\displaystyle [0,1]}

実装版[ 3 ] : ldm/models/autoencoder.py では、エンコーダは畳み込みニューラルネットワーク(CNN)であり、終端近くに単一の自己注意機構を備えています。形状 のテンソルを受け取り、形状 のテンソルを出力します。これは、形状 の潜在ベクトルの予測平均と分散(それぞれ形状 )の連結です。分散は学習時に使用されますが、学習後には通常、平均のみが使用され、分散は破棄されます。 3HW{\displaystyle (3,H,W)}8H/8W/8{\displaystyle (8,H/8,W/8)}4H/8W/8{\displaystyle (4,H/8,W/8)}

デコーダーもCNNであり、末端近くに単一の自己注意機構を備えています。形状 のテンソルを受け取り、形状 のテンソルを出力します。 4H/8W/8{\displaystyle (4,H/8,W/8)}3HW{\displaystyle (3,H,W)}

Uネット

U-Net バックボーンは次の種類の入力を受け取ります。

  • VAEエンコーダによって生成される潜在画像配列。次元は。典型的には。チャネル身長{\displaystyle ({\text{チャンネル}},{\text{幅}},{\text{高さ}})}チャネル身長46464{\displaystyle ({\text{チャンネル}},{\text{幅}},{\text{高さ}})=(4,64,64)}
  • タイムステップ埋め込みベクトルは、バックボーンに画像にどの程度のノイズが含まれているかを伝えます。例えば、タイムステップの埋め込みは入力画像が既にノイズレスであることを示し、一方、 はノイズが多いことを示します。t0{\displaystyle t=0}t100{\displaystyle t=100}
  • モダリティ埋め込みベクトルシーケンス。これは、ノイズ除去のための追加条件をバックボーンに指示します。例えば、テキストから画像への生成では、テキストはトークンのシーケンスに分割され、CLIPエンコーダなどのテキストエンコーダによってエンコードされてからバックボーンに送られます。別の例として、入力画像はVision Transformerによってベクトルシーケンスに変換され、これを用いてバックボーンを条件付けることができます。例えば、同じスタイルの画像を生成するといったタスクです。

U-Netバックボーンを通過するたびに、予測ノイズベクトルが生成されます。このノイズベクトルはスケールダウンされ、潜在画像配列から差し引かれることで、ノイズがわずかに低減された潜在画像が生成されます。ノイズ除去はノイズ除去スケジュール(「ノイズスケジュール」)に従って繰り返され、最終ステップの出力はVAEデコーダーによって処理され、最終画像が生成されます。

標準的なTransformer言語モデルに現れる単一のクロスアテンションメカニズム
Transformerアーキテクチャ全体のブロック図。右側のスタックは、LN以前の標準的なTransformerデコーダーで、基本的には と同じですSpatialTransformer

標準的なU-Netと同様に、SD 1.5で使用されるU-Netバックボーンは、基本的にダウンスケーリング層とそれに続くアップスケーリング層で構成されています。ただし、U-Netバックボーンには、埋め込み処理を可能にする追加モジュールがあります。例として、バックボーン内の単一のダウンスケーリング層について説明します。

  • 潜在配列と時間埋め込みは次のように処理されますResBlock
    • 潜在配列は畳み込み層によって処理されます。
    • 時間埋め込みベクトルは、1 層のフィードフォワード ネットワークによって処理され、前の配列に追加されます (すべてのピクセルにブロードキャストされます)。
    • これは別の畳み込み層によって処理され、その後別の時間埋め込みによって処理されます。
  • 潜在配列と埋め込みベクトルシーケンスは、SpatialTransformer本質的には因果マスキングのない標準的な pre-LN Transformer デコーダーである によって処理されます。
    • クロスアテンションブロックでは、潜在配列自体がクエリシーケンスとして機能し、ピクセルごとに1つのクエリベクトルが存在します。例えば、U-Netのこの層で潜在配列が次元 を持つ場合、クエリシーケンスはベクトル 個を持ち、各ベクトルも次元を持ちます。埋め込みベクトルシーケンスは、キーシーケンスと値シーケンスの両方として機能します。1283232{\displaystyle (128,32,32)}1024{\displaystyle 1024}128{\displaystyle 128}
    • 埋め込みベクトルシーケンスが入力されない場合、クロスアテンションブロックはデフォルトで自己アテンションに設定され、潜在配列がクエリ、キー、値として機能します。[ 21 ]:行251

擬似コードでは、

def ResBlock ( x , time , residual_channels ): x_in = x time_embedding = feedforward_network ( time ) x = concatenate ( x , residual_channels ) x = conv_layer_1 ( activate ( normalize_1 ( x ))) + time_embedding x = conv_layer_2 ( dropout ( activate ( normalize_2 ( x )))) return x_in + xdef SpatialTransformer ( x , cond ): x_in = x x = normalize ( x ) x = proj_in ( x ) x = cross_attention ( x , cond ) x = proj_out ( x )戻り値x_in + xdef unet ( x , time , cond ): residual_channels = [] for resblock , spatialtransformer in downscaling_layers : x = resblock ( x , time ) residual_channels . append ( x ) x = spatialtransformer ( x , cond )x = middle_layer.resblock_1 ( x ,時間) x = middle_layer.spatialtransformer ( x ,時間) x = middle_layer.resblock_2 ( x ,時間)upscaling_layersresblock spatialtransformerの場合: residual = residual_channels . pop () x = resblock ( concatenate ( x residual )、time ) x = spatialtransformer ( x cond )xを返す

詳細なアーキテクチャについては[ 22 ] [ 23 ]をご覧ください。

トレーニングと推論

LDMは、マルコフ連鎖を用いて学習画像に徐々にノイズを加えることで学習されます。その後、モデルはこの逆のプロセスを学習します。つまり、ノイズの多い画像から始めて、徐々にノイズを除去し、最終的に元の画像に戻るまで学習します。より具体的には、学習プロセスは以下のように記述できます。

  • 順方向拡散プロセス: 実際の画像が与えられると、事前に決定された「ノイズ スケジュール」に従って、画像にガウス ノイズを徐々に追加することによって、潜在変数のシーケンスが生成されます。×0{\displaystyle x_{0}}×1:T{\displaystyle x_{1:T}}
  • 逆拡散プロセス: ガウスノイズサンプルから開始して、モデルは各ステップで追加されるノイズを予測することを学習し、拡散プロセスを逆にして元の画像の再構築を取得します。×T{\displaystyle x_{T}}×0{\displaystyle x_{0}}

モデルは、各ステップで予測されたノイズと実際に追加されるノイズの差を最小化するように学習されます。これは通常、平均二乗誤差(MSE)損失関数を用いて行われます。

モデルを学習させると、ランダムなノイズサンプルから逆拡散処理を実行するだけで、新しい画像を生成できます。モデルは学習したノイズ分布に従ってサンプルからノイズを徐々に除去し、最終的な画像を生成します。

詳細については、 拡散モデルのページを参照してください。

参照

参考文献

  1. ^ Rombach, Robin; Blattmann, Andreas; Lorenz, Dominik; Esser, Patrick; Ommer, Björn (2022).潜在拡散モデルを用いた高解像度画像合成. IEEE/CVF コンピュータビジョンおよびパターン認識会議 (CVPR) 2022. pp.  10684– 10695.
  2. ^ "ホーム" .コンピュータビジョン&ラーニンググループ. 2024年9月5日閲覧。
  3. ^ a b c「GitHub上の安定した拡散リポジトリ」。CompVis - マシンビジョンと学習研究グループ、LMUミュンヘン。2022年9月17日。2023年1月18日時点のオリジナルよりアーカイブ。 2022年9月17日閲覧
  4. ^ a b c Alammar, Jay. 「The Illustrated Stable Diffusion」 . jalammar.github.io . 2022年11月1日時点のオリジナルよりアーカイブ。 2022年10月31日閲覧
  5. ^ Sohl-Dickstein, Jascha; Weiss, Eric; Maheswaranathan, Niru; Ganguli, Surya (2015-06-01). 「非平衡熱力学を用いた教師なし深層学習」(PDF) .第32回国際機械学習会議論文集. 37. PMLR: 2256– 2265. arXiv : 1503.03585 .
  6. ^ Sohl-Dickstein、Jascha (2024-09-01)。「Sohl-Dickstein/拡散確率モデル」GitHub2024-09-07に取得
  7. ^ "ermongroup/ncsn" . ermongroup. 2019. 2024年9月7日閲覧
  8. ^ Song, Yang; Ermon, Stefano (2019). 「データ分布の勾配推定による生成モデリング」 .ニューラル情報処理システムの進歩. 32. Curran Associates, Inc. arXiv : 1907.05600 .
  9. ^ Ho, Jonathan; Jain, Ajay; Abbeel, Pieter (2020). 「拡散確率モデルのノイズ除去」 .ニューラル情報処理システムの進歩. 33. Curran Associates, Inc.: 6840– 6851.
  10. ^ホー、ジョナサン (2020 年 6 月 20 日)。「ホジョナタンホ/拡散」GitHub2024-09-07に取得
  11. ^ Wang, Phil (2024-09-07). 「lucidrains/denoising-diffusion-pytorch」 . GitHub . 2024年9月7日閲覧。
  12. ^ 「注釈付き拡散モデル」huggingface.co . 2024年9月7日閲覧
  13. ^ロンバック、ロビン;ブラットマン、アンドレアス。ローレンツ、ドミニク。エッサー、パトリック。オマー、ビョルン(2021-12-20)。 「潜在拡散モデルによる高解像度画像合成」。arXiv : 2112.10752 [ cs.CV ]。
  14. ^ "Update README.md · CompVis/stable-diffusion@17e64e3" . GitHub . 2024年9月7日閲覧
  15. ^ "Update README.md · CompVis/latent-diffusion@17e64e3" . GitHub . 2024年9月7日閲覧
  16. ^ "安定拡散 · CompVis/stable-diffusion@2ff270f" . GitHub . 2024年9月7日閲覧。
  17. ^ "CompVis (CompVis)" . huggingface.co . 2023年8月23日. 2024年3月6日閲覧
  18. ^ a b “runwayml/stable-diffusion-v1-5 · Hugging Face” . huggingface.co . 2023年9月21日時点のオリジナルよりアーカイブ。 2023年8月17日閲覧
  19. ^ 「textual_inversionの係数0.18215の説明? · Issue #437 · huggingface/diffusers」 . GitHub . 2024年9月19日閲覧
  20. ^ "diffusion-nbs/Stable Diffusion Deep Dive.ipynb at master · fastai/diffusion-nbs" . GitHub . 2024年9月19日閲覧
  21. ^ "latent-diffusion/ldm/modules/attention.py at main · CompVis/latent-diffusion" . GitHub . 2024年9月9日閲覧
  22. ^ 「安定拡散のためのU-Net」 .安定拡散のためのU-Net . 2024年8月31日閲覧
  23. ^ 「安定拡散U-Net用トランスフォーマー」 .安定拡散U-Net用トランスフォーマー. 2024年9月7日閲覧。

さらに読む