エクスレラ8

機械学習の拡散モデルの概要

この記事は、最初に公開された アセンブリAI 著者の許可を得てTOPBOTSに再発行しました.

拡散モデルは、ここ数年でかなりの人気を得ている生成モデルであり、それには正当な理由があります。 2020年代に発表されたいくつかの重要な論文 一人で GANを打ち負かすなど、拡散モデルが可能であることを世界に示しました[6] 画像合成について。 最近では、実践者は拡散モデルが使用されているのを見てきました。 DALL-E2、先月リリースされたOpenAIの画像生成モデル。

DALL-E 2 によって生成されたさまざまな画像 (source).

拡散モデルによる最近の成功の波を考えると、多くの機械学習の実践者は、内部の仕組みに確実に関心を持っています。 この記事では、 拡散モデルの理論的基礎を使用して画像を生成する方法を示します。 PyTorch の拡散モデル。 飛び込みましょう!

この詳細な教育コンテンツがあなたに役立つ場合は、 AIメーリングリストに登録する 新しい素材がリリースされたときに警告が表示されます。 

拡散モデル – はじめに

拡散モデルは 生々しい つまり、トレーニング対象のデータと同様のデータを生成するために使用されます。 基本的に、拡散モデルは トレーニング データの破棄 ガウス ノイズを連続的に追加し、 回復することを学ぶ によるデータ 逆転 このノイズプロセス。 トレーニング後、拡散モデルを使用してデータを生成できます。 ランダムにサンプリングされたノイズを、学習したノイズ除去プロセスに渡します。

拡散モデルを使用して、ノイズから画像を生成できます ( source)

より具体的には、拡散モデルは、固定マルコフ連鎖を使用して潜在空間にマッピングされる潜在変数モデルです。 このチェーンは、おおよその事後 q(x1:T|x0)、ここで x1、…、バツT x と同じ次元の潜在変数0. 下の図では、このようなマルコフ連鎖が画像データに現れています。

最終的に、イメージは純粋なガウス ノイズに漸近的に変換されます。 の 目標 拡散モデルをトレーニングすることは、  プロセス – つまりトレーニング pθ(xt−1|xt)。 このチェーンに沿って逆方向にトラバースすることで、新しいデータを生成できます。

拡散モデルの利点

前述のように、拡散モデルの研究は近年爆発的に増加しています。 非平衡熱力学に着想を得た[1]、拡散モデルは現在生産しています 最先端の画質、その例を以下に示します。

最先端の画質を超えて、拡散モデルには他にも多くの利点があります。 敵対的訓練を必要としない. 敵対的訓練の難しさは十分に文書化されています。 そして、同等のパフォーマンスとトレーニング効率を備えた非敵対的な代替手段が存在する場合は、通常、それらを利用するのが最善です。 トレーニング効率のトピックでは、拡散モデルには次の追加の利点もあります。 スケーラビリティと並列化。

拡散モデルはほとんど何もないところから結果を生み出しているように見えますが、これらの結果の基礎を提供する慎重で興味深い数学的選択と詳細が数多くあり、ベスト プラクティスは文献でまだ進化しています。 ここで、拡散モデルを支える数学的理論をより詳細に見てみましょう。

拡散モデル – ディープダイブ

前述のように、拡散モデルは 転送プロセス (または 拡散プロセス)、データム (通常は画像) が徐々にノイズ化され、 リバースプロセス (または 逆拡散プロセス)、ここでノイズはターゲット分布からサンプルに変換されます。

ノイズ レベルが十分に低い場合、フォワード プロセスのサンプリング チェーン遷移を条件付きガウスに設定できます。 この事実をマルコフの仮定と組み合わせると、フォワード プロセスの単純なパラメーター化が導かれます。

数学ノート

データを破損することについて話してきました 追加 ガウス ノイズですが、最初はこの加算をどこで実行しているのかが不明な場合があります。 上記の式によると、チェーンの各ステップで、チェーンの前の値 (つまり画像) を平均とするガウス分布から単純にサンプリングしています。

これら XNUMX つのステートメントは同等です。 あれは

理由を理解するために、次のように断言することで表記を少し乱用します。

最終的な含意は、確率変数の合計とそれらの分布の畳み込みとの間の数学的な同等性から生じます – を参照してください このウィキペディアのページ 。

言い換えれば、ガウス分布の平均を介して前のタイムステップに条件付けられたタイムステップの分布を主張することは、与えられたタイムステップの分布がガウスノイズを加えた前のタイムステップの分布であると主張することと同等であることを示しました。 分散スケジュールによって導入されたスカラーを省略し、簡単にするためにこれを XNUMX つの次元について示しましたが、多変量ガウス分布についても同様の証明が成り立ちます。

ここで β1、…、βT バリアンス スケジュール (学習または固定のいずれか) であり、適切に行えば、 保証する xT T が十分に大きい場合、ほぼ等方性ガウス分布です。

マルコフ仮定が与えられると、潜在変数の結合分布は、ガウスの条件付き連鎖遷移 (から変更された) の積です。 source).

前述のように、拡散モデルの「魔法」は、 リバースプロセス. トレーニング中、モデルは新しいデータを生成するために、この拡散プロセスを逆にすることを学習します。 純粋なガウス ノイズ p(xT):=N(xT,0,I) モデルは結合分布 p を学習しますθ(x0:T) なので

ここで、ガウス遷移の時間依存パラメーターが学習されます。 特に、マルコフ定式化は、特定の逆拡散遷移分布が前の時間ステップ (または、見方によっては次の時間ステップ) のみに依存することを主張していることに注意してください。

トレーニング

拡散モデルは、 トレーニングデータの可能性を最大化する逆マルコフ遷移を見つけます。 実際には、トレーニングは同等に、負の対数尤度の変分上限を最小化することで構成されます。

表記詳細

Lに注意してくださいVLB 技術的には アッパー 最小化しようとしているバウンド (ELBO のマイナス) ですが、これを L と呼びます。VLB 文献との一貫性のため。

L を書き換えようとするVLB の面では カルバック・ライブラー (KL) ダイバージェンス。 KL Divergence は、XNUMX つの確率分布がどれだけ異なるかを示す非対称の統計的距離の尺度です。 P 参照分布とは異なります Q. Lの定式化に興味がありますVLB マルコフ連鎖の遷移分布はガウス分布であるため、KL ダイバージェンスに関して、および ガウス間の KL ダイバージェンスは閉じた形をしています。

KLダイバージェンスとは?

連続分布の KL ダイバージェンスの数学的形式は次のとおりです。

二重棒は、関数がその引数に関して対称でないことを示します。

以下に、さまざまな分布の KL ダイバージェンスを示します。 P (青) 参照分布から Q (赤)。 緑色の曲線は、上記の KL 発散の定義における積分内の関数を示し、曲線の下の合計面積は、次の KL 発散の値を表します。 P から Q 任意の時点で、数値でも表示される値。

鋳造 レベルポンド KLダイバージェンスに関して

前述のように、[1] で L を書き換えるVLB KL発散に関してほぼ完全に:

コラボレー

派生の詳細

変分限界はに等しい

マルコフの仮定を前提として、分布をその定義に置き換えると、次のようになります。

対数規則を使用して式を対数の合計に変換し、最初の項を取り出します。

ベイズの定理とマルコフの仮定を使用すると、この式は次のようになります。

次に、対数ルールを使用して中間項を分割します

第 XNUMX 項を分離すると、

これを L の式に当てはめますVLB、 我々は持っています

ログルールを使用して、並べ替えます

d8

次に、任意の XNUMX つの分布の KL ダイバージェンスの次の等価性に注意してください。

最後に、この等価性を前の式に適用すると、

x でのフォワード プロセス ポステリアの条件付け0 Lでt−1 につながる扱いやすい形式になります。 すべての KL ダイバージェンスはガウス間の比較です。 これは、モンテカルロ推定ではなく、閉形式式を使用して発散を正確に計算できることを意味します。[3].

モデルの選択

目的関数の数学的基礎が確立されたので、拡散モデルの実装方法に関していくつかの選択を行う必要があります。 フォワード プロセスの場合、必要な唯一の選択肢は差異スケジュールを定義することです。その値は通常、フォワード プロセス中に増加します。

逆のプロセスでは、ガウス分布のパラメーター化/モデル アーキテクチャを選択します。 注意してください 高度な柔軟性 拡散モデルが提供するもの –  私たちのアーキテクチャの要件は、その入力と出力が同じ次元を持つことです。

これらの選択肢の詳細については、以下で詳しく説明します。

Forward ProcessとLT

上記のように、転送プロセスに関しては、差異スケジュールを定義する必要があります。 特に、私たちはそれらを 時間依存定数、それらが学習できるという事実を無視します。 例えば[3]、β からの線形スケジュール1= 10-4 βへT=0.2 が使用されるか、幾何級数が使用される可能性があります。

選択した特定の値に関係なく、差異スケジュールが固定されているという事実により、LT 学習可能なパラメーターのセットに関して定数になり、トレーニングに関する限り無視することができます。

逆工程とL1:T-1

次に、リバース プロセスを定義する際に必要な選択について説明します。 上で逆マルコフ遷移をガウスとして定義したことを思い出してください。

ここで、μ の関数形式を定義する必要があります。θ またはΣθ. Σ をパラメータ化するより複雑な方法がありますが、θ[5]、単に設定します

つまり、多変量ガウスは、時間とともに変化する分散値である同一の分散を持つ独立したガウス分布の積であると仮定します。 私達 これらの差異を、フォワード プロセスの差異スケジュールと同等になるように設定します。

Σ のこの新しい定式化を考えると、θ、 我々は持っています

それは私たちが変革することを可能にします

〜へ

ここで、差の最初の項は x の線形結合ですt と×0 分散スケジュールβに依存するt. この関数の正確な形式は、この目的には関係ありませんが、[3].

上記の割合の意味は、 μ の最も簡単なパラメータ化θ 単純に拡散事後平均を予測します。 重要なことに、[の著者3] 実際にトレーニング μθ を予測する ノイズ コンポーネントは、任意の時間ステップでより良い結果をもたらします。 特に、

コラボレー

これは、次の代替損失関数につながります、[の著者3] より安定したトレーニングとより良い結果につながることがわかりました:

[の著者3] また、この拡散モデルの定式化と、ランジュバン ダイナミクスに基づくスコア マッチング生成モデルとの関係にも注意してください。 実際、拡散モデルとスコアベースのモデルは、同じ現象の XNUMX つの同等の定式化を明らかにする波動ベースの量子力学と行列ベースの量子力学の独立した同時開発に似た、同じコインの表裏である可能性があるようです。[2].

ネットワークアーキテクチャ

私たちの単純化された損失関数はモデルをトレーニングしようとしています ϵθ、まだこのモデルのアーキテクチャを定義していません。 注意してください  モデルの要件は、その入力と出力の次元が同一であることです。

この制限を考えると、画像拡散モデルが一般的に U-Net のようなアーキテクチャで実装されていることは驚くべきことではありません。

リバース プロセス デコーダーと L0

逆のプロセスに沿ったパスは、連続条件付きガウス分布の下での多くの変換で構成されます。 逆のプロセスの最後に、 画像、整数のピクセル値で構成されます。 そのため、入手方法を工夫する必要があります。 離散 (対数) 尤度 すべてのピクセルの可能なピクセル値ごとに。

これを行う方法は、逆拡散チェーンの最後の遷移を 独立ディスクリートデコーダー. 与えられた画像 x の尤度を決定するには0 与えられた x1、まずデータ次元間に独立性を課します。

ここで、D はデータの次元数と上付き文字です。 i XNUMX つの座標の抽出を示します。 ここでの目標は、各整数値が特定のピクセルにどの程度当てはまるかを判断することです 与えられた 時間 t=1 でのわずかにノイズの入った画像の対応するピクセルの可能な値の分布:

ここで、t=1 のピクセル分布は、以下の多変量ガウス分布から導出されます。この多変量ガウス分布の対角共分散行列により、分布をデータの各次元に XNUMX つずつ、一変量ガウス分布の積に分割できます。

画像は [−0,1] に線形にスケーリングされた (標準の RGB 画像と同様に) 255,…,1,1 の整数で構成されていると仮定します。 次に、実際の線を小さな「バケット」に分割します。ここで、特定のスケーリングされたピクセル値について x、その範囲のバケットは [x−1/255, x+1/255] です。 ピクセル値の確率 x, x の対応するピクセルの一変量ガウス分布が与えられた場合1、 それは を中心とするバケット内の一変量ガウス分布の下の領域 x.

以下に、これらの各バケットの領域と平均 0 ガウスの確率を示します。このコンテキストでは、平均ピクセル値が 255/2 (半分の明るさ) の分布に対応します。 赤い曲線は、特定のピクセルの分布を表します。 t = 1 画像、および領域は、対応するピクセル値の確率を与えます t = 0 画像。

テクニカルノート

最初と最後のバケットは、合計確率を保持するために -inf と +inf まで拡張されます。

与えられた t = 0 各ピクセルのピクセル値、p の値θ(x0|x1)は単に彼らの製品です。 このプロセスは、次の式によって簡潔に要約されます。

コラボレー

&

p に次の式が与えられると、θ(x0|x1)、L の最終項を計算できます。VLB これは KL 発散として定式化されていません。

最終目標

前のセクションで述べたように、[3] は、特定のタイムステップで画像のノイズ成分を予測すると最良の結果が得られることを発見しました。 最終的に、彼らは次の目標を使用します。

したがって、拡散モデルのトレーニングとサンプリングのアルゴリズムは、以下の図に簡潔にまとめられています。

拡散モデル理論のまとめ

このセクションでは、拡散モデルの理論について詳しく説明しました。 数学的な詳細にとらわれるのは簡単なので、俯瞰的な視点からの方向性を維持するために、以下のこのセクション内の最も重要なポイントに注意してください。

  1. 私たちの拡散モデルは、 マルコフ連鎖、つまり潜在変数 x1、…、バツT 前の (または次の) タイムステップのみに依存します。
  2.   遷移分布 マルコフ連鎖には ガウシアン、順方向プロセスには分散スケジュールが必要であり、逆方向プロセスのパラメーターは学習されます。
  3. 拡散プロセスにより、xT is 等方性ガウスとして漸近的に分布 T が十分に大きい場合。
  4. 私たちの場合、 分散スケジュールが修正されました、しかしそれも学ぶことができます。 スケジュールが固定されている場合は、幾何学的な進行に従う方が線形の進行よりも良い結果が得られる場合があります。 いずれの場合も、分散は通常、系列の時間とともに増加します (つまり、βij 私のために
  5. 拡散モデルは 非常に柔軟 そして許可する どれか 入力と出力の次元が同じアーキテクチャを使用します。 多くの実装で使用 U-Netライク アーキテクチャ。
  6.   トレーニングの目的 トレーニングデータの可能性を最大化することです。 これは、モデル パラメータを次のように調整することで明らかになります。 データの負の対数尤度の変分上限を最小化する.
  7. 目的関数のほとんどすべての項は、次のようにキャストできます。 KL ダイバージェンス マルコフの仮定の結果として。 これらの値 計算できるようになる ガウス分布を使用しているため、モンテカルロ近似を実行する必要がありません。
  8. 最終的には、 簡素化されたトレーニング目標 特定の潜在変数のノイズ成分を予測する関数をトレーニングすると、最良かつ最も安定した結果が得られます。
  9. ディスクリートデコーダー 逆拡散プロセスの最後のステップとして、ピクセル値全体の対数尤度を取得するために使用されます。

この拡散モデルの高レベルの概要を念頭に置いて、PyTorch で拡散モデルを使用する方法を見ていきましょう。

PyTorch の拡散モデル

拡散モデルは、機械学習における他の古いアーキテクチャ/アプローチと同じ程度にはまだ民主化されていませんが、使用可能な実装はまだあります。 PyTorch で拡散モデルを使用する最も簡単な方法は、 denoising-diffusion-pytorch この記事で説明したような画像拡散モデルを実装するパッケージです。 パッケージをインストールするには、ターミナルで次のコマンドを入力するだけです。

pip install denoising_diffusion_pytorch

最小限の例

モデルをトレーニングして画像を生成するには、まず必要なパッケージをインポートします。

import torch
from denoising_diffusion_pytorch import Unet, GaussianDiffusion

次に、ネットワーク アーキテクチャ (この場合は U-Net) を定義します。 の dim パラメータは、最初のダウンサンプリング前の特徴マップの数を指定し、 dim_mults パラメータは、この値と連続するダウンサンプリングの被乗数を提供します。

model = Unet(
 dim = 64,
 dim_mults = (1, 2, 4, 8)
)

ネットワーク アーキテクチャが定義されたので、拡散モデル自体を定義する必要があります。 定義したばかりの U-Net モデルを、生成する画像のサイズ、拡散プロセスのタイムステップ数、L1 ノルムと L2 ノルムの選択など、いくつかのパラメーターと共に渡します。

diffusion = GaussianDiffusion(
 model,
 image_size = 128,
 timesteps = 1000, # number of steps
 loss_type = 'l1' # L1 or L2
)

拡散モデルが定義されたので、次はトレーニングを行います。 トレーニング用のランダム データを生成し、通常の方法で拡散モデルをトレーニングします。

training_images = torch.randn(8, 3, 128, 128)
loss = diffusion(training_images)
loss.backward()

モデルがトレーニングされると、最終的に次を使用して画像を生成できます。 sample() の方法 diffusion 物体。 ここでは、4 つの画像を生成します。これは、トレーニング データがランダムであることを考えると、単なるノイズです。

sampled_images = diffusion.sample(batch_size = 4)

カスタム データのトレーニング

  denoising-diffusion-pytorch パッケージを使用すると、特定のデータセットで拡散モデルをトレーニングすることもできます。 単純に交換する 'path/to/your/images' のデータセット ディレクトリ パスを含む文字列 Trainer() 下のオブジェクト、および変更 image_size 適切な値に。 その後、コードを実行してモデルをトレーニングし、前と同じようにサンプリングします。 を使用するには、PyTorch を CUDA を有効にしてコンパイルする必要があることに注意してください。 Trainer クラス:

from denoising_diffusion_pytorch import Unet, GaussianDiffusion, Trainer
model = Unet(
 dim = 64,
 dim_mults = (1, 2, 4, 8)
).cuda()
diffusion = GaussianDiffusion(
 model,
 image_size = 128,
 timesteps = 1000, # number of steps
 loss_type = 'l1' # L1 or L2
).cuda()
trainer = Trainer(
 diffusion,
 'path/to/your/images',
 train_batch_size = 32,
 train_lr = 2e-5,
 train_num_steps = 700000, # total training steps
 gradient_accumulate_every = 2, # gradient accumulation steps
 ema_decay = 0.995, # exponential moving average decay
 amp = True # turn on mixed precision
)
trainer.train()

以下では、逆拡散に似た、多変量ガウス ノイズから MNIST 桁への漸進的ノイズ除去を確認できます。

最後の言葉

拡散モデルは、データ生成の問題に対する概念的に単純で洗練されたアプローチです。 非敵対的トレーニングと組み合わせた彼らの最先端の結果は、彼らを大きな高みへと駆り立てました。彼らの初期の地位を考えると、今後数年間でさらなる改善が期待できます. 特に、拡散モデルは、次のような最先端モデルのパフォーマンスに不可欠であることがわかっています。 DALL-E2.

参考文献

【1] 非平衡熱力学を使用した深層教師なし学習

【2] データ分布の勾配推定による生成モデリング

【3] 拡散確率モデルのノイズ除去

【4] スコアベースの生成モデルをトレーニングするための改善された手法

【5] 改善されたノイズ除去拡散確率モデル

【6] 拡散モデルが画像合成で GAN を凌駕

【7] GLIDE: テキストガイドによる拡散モデルを使用したフォトリアリスティックな画像の生成と編集に向けて

【8] CLIP Latents を使用した階層的テキスト条件付き画像生成

この記事をお楽しみください? AIリサーチの最新情報にサインアップしてください。

このような要約記事がさらにリリースされたらお知らせします。

私たちとチャット

やあ! どんな御用でしょうか?