| 原作者 | コンプビズ |
|---|---|
| 初回リリース | 2021年12月20日 |
| リポジトリ | https://github.com/CompVis/latent-diffusion |
| 書かれた | パイソン |
| タイプ | |
| ライセンス | マサチューセッツ工科大学 |
潜在的拡散モデル(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]この論文には、GitHubでPyTorchで書かれたソフトウェアパッケージがリリースされました。[8]
2020年の論文[9]では、変分推論によって従来の方法を改良したノイズ除去拡散確率モデル(DDPM)が提案されました。この論文には、GitHubでTensorFlowで書かれたソフトウェアパッケージが付属していました。[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 のエンコーダとデコーダを とします。
RGB 画像をエンコードするには、3 つのチャネルを最大値で割って、すべてのエントリが範囲内にある形状のテンソルを作成します。エンコードされたベクトルは で、形状は です。ここで、0.18215 はハイパーパラメータであり、元の著者はエンコードされたベクトルをほぼ単位分散に白色化するためにこれを選択しました。逆に、潜在テンソル が与えられた場合、デコードされた画像は となり、範囲 にクリップされます。[19] [20]
実装されたバージョン[3] :ldm/models/autoencoder.py では、エンコーダは畳み込みニューラルネットワーク(CNN)であり、最後に単一の自己注意メカニズムを備えています。形状のテンソルを受け取り、形状のテンソルを出力します。これは、潜在ベクトルの予測平均と分散の連結です。分散はトレーニングで使用されますが、トレーニング後には通常、平均のみが取得され、分散は破棄されます。
デコーダーは、最後に単一の自己注意メカニズムを備えた CNN です。形状 のテンソルを受け取り、形状 のテンソルを出力します。
Uネット
U-Net バックボーンは次の種類の入力を受け取ります。
- VAE エンコーダによって生成された潜在画像配列。次元は です。たとえば、 に等しい場合は、64 x 64 の RGB 画像として視覚化できます。ただし、潜在画像は直接視覚化されることを意図したものではありません。
- タイムステップ埋め込みベクトル。これは、画像にどの程度のノイズがあるかをバックボーンに示します。たとえば、タイムステップの埋め込みは、入力画像にすでにノイズがないことを示しますが、は大量のノイズがあることを示します。
- モダリティ埋め込みベクトルシーケンス。バックボーンに対して、ノイズ除去の追加条件を示します。たとえば、テキストから画像への生成では、テキストはトークンのシーケンスに分割され、CLIP エンコーダーなどのテキスト エンコーダーによってエンコードされてから、バックボーンに送られます。別の例として、入力画像はVision Transformerによってベクトルのシーケンスに処理され、これを使用して、同じスタイルの画像を生成するなどのタスク用にバックボーンを調整できます。
UNet バックボーンを経由する各実行では、予測されたノイズ ベクトルが生成されます。このノイズ ベクトルは縮小され、潜在画像配列から差し引かれ、わずかにノイズの少ない潜在画像が生成されます。ノイズ除去はノイズ除去スケジュール (「ノイズ スケジュール」) に従って繰り返され、最後のステップの出力は VAE デコーダーによって処理されて完成した画像になります。


SpatialTransformer。標準のU-Netと同様に、SD 1.5 で使用される U-Net バックボーンは、基本的にダウンスケーリング レイヤーとそれに続くアップスケーリング レイヤーで構成されています。ただし、UNet バックボーンには、埋め込みを処理できるようにするための追加モジュールがあります。例として、バックボーン内の単一のダウンスケーリング レイヤーについて説明します。
- 潜在配列と時間埋め込みは次のように処理されます
ResBlock。- 潜在配列は畳み込み層によって処理されます。
- 時間埋め込みベクトルは、1 層のフィードフォワード ネットワークによって処理され、前の配列に追加されます (すべてのピクセルにブロードキャストされます)。
- これは別の畳み込み層によって処理され、その後別の時間埋め込みが行われます。
- 潜在配列と埋め込みベクトルシーケンスは
SpatialTransformer、因果マスキングのない標準的なpre-LN Transformerデコーダーであるによって処理されます。- クロスアテンションブロックでは、潜在配列自体がクエリシーケンスとして機能し、ピクセルごとに 1 つのクエリベクトルがあります。たとえば、UNet のこのレイヤーで潜在配列に次元がある場合、クエリシーケンスにはベクトルがあり、それぞれに次元があります。埋め込みベクトルシーケンスは、キーシーケンスと値シーケンスの両方として機能します。
- 埋め込みベクトルシーケンスが入力されない場合、クロスアテンションブロックはデフォルトで自己アテンションになり、潜在配列がクエリ、キー、値として機能します。[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 ))))
戻り値 x_in + x
def SpatialTransformer ( x , cond ):
x_in = x
x = normalize ( x )
x = proj_in ( x )
x = cross_attention ( x , cond )
x = proj_out ( x )
戻り値 x_in + x
def 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_layersのresblock 、 spatialtransformer の場合: residual = residual_channels.pop () x = resblock ( concatenate ( x 、residual ) 、time ) x = spatialtransformer ( x 、cond )
xを返す
詳細なアーキテクチャについては[22] [23]をご覧ください。
トレーニングと推論
LDM は、マルコフ連鎖を使用してトレーニング画像に徐々にノイズを追加することでトレーニングされます。次に、モデルはこのプロセスを逆にするようにトレーニングされ、ノイズの多い画像から始めて、元の画像が復元されるまで徐々にノイズを除去します。より具体的には、トレーニング プロセスは次のように説明できます。
- 順方向拡散プロセス: 実際の画像が与えられると、事前に決められた「ノイズ スケジュール」に従って、画像にガウス ノイズを徐々に追加することで、潜在変数のシーケンスが生成されます。
- 逆拡散プロセス: ガウスノイズサンプルから始めて、モデルは各ステップで追加されるノイズを予測することを学習し、拡散プロセスを逆にして元の画像の再構築を取得します。
モデルは、予測されたノイズと各ステップで追加される実際のノイズの差を最小化するようにトレーニングされます。これは通常、平均二乗誤差(MSE) 損失関数を使用して行われます。
モデルのトレーニングが完了すると、ランダムなノイズ サンプルから逆拡散プロセスを実行するだけで、新しい画像を生成できるようになります。モデルは学習したノイズ分布に従ってサンプルからノイズを徐々に除去し、最終的な画像を生成します。
詳細については、拡散モデルのページを参照してください。
参照
参考文献
- ^ Rombach, Robin; Blattmann, Andreas; Lorenz, Dominik; Esser, Patrick; Ommer, Björn (2022). 潜在拡散モデルによる高解像度画像合成。IEEE/CVF コンピュータービジョンおよびパターン認識会議 (CVPR) 2022。pp. 10684–10695。
- ^ 「ホーム」。Computer Vision & Learning Group 。 2024年9月5日閲覧。
- ^ abc 「GitHub 上の安定した拡散リポジトリ」。CompVis - マシンビジョンおよび学習研究グループ、LMU ミュンヘン。2022 年 9 月 17 日。2023 年 1 月 18 日時点のオリジナルよりアーカイブ。2022 年9 月 17 日閲覧。
- ^ abc Alammar, Jay. 「The Illustrated Stable Diffusion」. jalammar.github.io . 2022年11月1日時点のオリジナルよりアーカイブ。 2022年10月31日閲覧。
- ^ Sohl-Dickstein, Jascha; Weiss, Eric; Maheswaranathan, Niru; Ganguli, Surya (2015-06-01). 「非平衡熱力学を用いた教師なし深層学習」(PDF)。第32回国際機械学習会議の議事録。37。PMLR : 2256–2265。arXiv : 1503.03585。
- ^ Sohl-Dickstein、Jascha (2024-09-01)。 「Sohl-Dickstein/拡散確率モデル」。GitHub。2024-09-07に取得。
- ^ "ermongroup/ncsn". ermongroup. 2019年. 2024年9月7日閲覧。
- ^ Song, Yang; Ermon, Stefano (2019). 「データ分布の勾配を推定することによる生成モデリング」。ニューラル情報処理システムの進歩。32。Curran Associates 、Inc。arXiv:1907.05600。
- ^ Ho, Jonathan; Jain, Ajay; Abbeel, Pieter (2020). 「拡散確率モデルのノイズ除去」。ニューラル情報処理システムの進歩。33。Curran Associates 、Inc.:6840–6851。
- ^ ホー、ジョナサン (2020 年 6 月 20 日)。 「ホジョナタンホ/拡散」。GitHub。2024-09-07に取得。
- ^ Wang, Phil (2024-09-07). 「lucidrains/denoising-diffusion-pytorch」. GitHub . 2024-09-07に取得。
- ^ 「注釈付き拡散モデル」huggingface.co . 2024年9月7日閲覧。
- ^ ロンバック、ロビン;ブラットマン、アンドレアス。ローレンツ、ドミニク。エッサー、パトリック。オマー、ビョルン(2021-12-20)。 「潜在拡散モデルによる高解像度画像合成」。arXiv : 2112.10752 [cs.CV]。
- ^ 「Update README.md · CompVis/stable-diffusion@17e64e3」。GitHub 。2024年9月7日閲覧。
- ^ 「Update README.md · CompVis/latent-diffusion@17e64e3」。GitHub 。2024年9月7日閲覧。
- ^ “stable diffusion · CompVis/stable-diffusion@2ff270f”. GitHub . 2024年9月7日閲覧。
- ^ “CompVis (CompVis)”. huggingface.co . 2023年8月23日. 2024年3月6日閲覧。
- ^ ab "runwayml/stable-diffusion-v1-5 · Hugging Face". huggingface.co . 2023年9月21日時点のオリジナルよりアーカイブ。 2023年8月17日閲覧。
- ^ 「textual_inversion の 0.18215 係数の説明? · Issue #437 · huggingface/diffusers」。GitHub。2024年9 月 19 日閲覧。
- ^ 「diffusion-nbs/Stable Diffusion Deep Dive.ipynb at master · fastai/diffusion-nbs」。GitHub 。 2024年9月19日閲覧。
- ^ 「latent-diffusion/ldm/modules/attention.py at main · CompVis/latent-diffusion」。GitHub 。2024年9月9日閲覧。
- ^ 「安定した拡散のためのU-Net」。安定した拡散のためのU-Net 。2024年8月31日閲覧。
- ^ 「安定した拡散U-Netのためのトランスフォーマー」。安定した拡散U-Netのためのトランスフォーマー。 2024年9月7日閲覧。
さらに読む
- Wang, Phil (2024-09-07). 「lucidrains/denoising-diffusion-pytorch」. GitHub . 2024-09-07に取得。
- 「注釈付き拡散モデル」。huggingface.co 。 2024年9月7日閲覧。
- 「安定拡散のためのU-Net」。安定拡散のためのU-Net 。 2024年8月31日閲覧。
- 「安定拡散 U-Net 用トランスフォーマー」。安定拡散 U-Net 用トランスフォーマー。2024 年 9 月 7 日閲覧。
