Otama's Playground

AIで遊んだ結果などをつらつら載せていきます。

【Stable Diffusion】画像生成モデルの仕組みを理解する

これまでいろいろ遊んできながらもStable Diffusionモデル本体について学んだことがなかったので、ほかに色々遊ぶ前に理解するフェーズを挟もうと思います。以下から早速説明に入ります。

Stable Diffusionの概要

Stable Diffusionモデルは、Latent Diffusion Models(LDMs)と呼ばれる高解像度画像生成技術をベースとした拡散モデルの一種であり、特に画像生成において高解像度かつ高品質な画像を効率的に生成するための手法です。拡散モデルとLDMについて知っておかないと始まらないと思うので、まずそれらについて簡単に解説した後に、Stable Diffusionそのものの説明に入ろうと思います。

拡散モデルとは何か

まずStable Diffusionにおいて重要な考え方である拡散モデルについて理解します。

arxiv.org

拡散モデルは、データ(例えば画像)に段階的にノイズを加え、その後逆プロセスでノイズを取り除くことで元のデータを再構成する生成モデルの一種です。これにより、新たなデータを生成することが可能になります。

拡散モデルの基本概念

  1. 拡散プロセス(Diffusion Process)
    • データポイントが徐々にランダムなノイズに変換されるプロセスです。
    • マルコフ連鎖を使用して段階的に進行します。
  2. 逆拡散プロセス(Reverse Diffusion Process):
    • ノイズから元のデータを徐々に再構築します。
    • 生成モデルはこの逆プロセスを学習し、新しいデータを生成します。

下の画像は拡散モデルの論文から引っ張ってきたものです。この画像が逆拡散プロセスの過程を示しており、これと同じ処理がStable Diffusionでも行われています。

Jonathan Ho, Ajay Jain, Pieter Abbeel, 2020, Denoising Diffusion Probabilistic Models, https://arxiv.org/abs/2006.11239?ref=ja.stateofaiguides.com

仕組み

  1. 前向き拡散過程 (Forward Diffusion Process)
    • 元のデータ(例: 画像)に徐々にガウスノイズを加えていき、最終的には純粋なノイズにします。
    • 元のデータ  x_0 から始まり、各ステップ  t でノイズを追加し、  x_t を生成します。
      •  x_t = \sqrt{1 - \beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon_t
      • ここで、  \beta_t はノイズスケジュール、  \epsilon_t はガウスノイズです。
  2. 逆拡散過程 (Reverse Diffusion Process):
    • 前向き拡散過程で生成されたノイズデータから、元のデータを再構築します。
    • モデルは、ステップ  t からステップ  t-1 に逆行する条件付き確率分布を学習します
      •  p_\theta(x_{t-1}\mid x_t)
  3. トレーニング
    • 前向き拡散過程で生成されたノイズデータを使ってモデルをトレーニングします。
    • トレーニング目標は、逆拡散過程の確率分布を正確に近似することです。通常、変分推論(Variational Inference)を使用して達成されます。

Latent Diffusion Modelsモデルとは何か

次にStable DiffusionモデルのベースとなったLatent Diffusion Models(LDM)について説明します。

arxiv.org

Latent Diffusion Modelsは、低次元の潜在空間(Latent Space)で拡散プロセスを行うことで、高解像度かつ高品質な画像生成を効率的に実現する拡散モデルの一種です。この手法は、高次元のピクセル空間で操作する従来の方法に比べて、計算コストとメモリ使用量を大幅に削減し、効率的なトレーニングと画像の生成を可能にします

LDMの基本概念

  • 潜在空間(Latent Space):
    • データの複雑な構造を低次元の潜在空間にマッピングします。通常の拡散モデルと異なり、潜在空間での操作を行います。
    • 潜在空間における拡散プロセスは、計算効率を向上させ、高次元データの処理を容易にします。

仕組み

  1. エンコーダ(Encoder)

    • 高次元データ(例えば、画像)を低次元の潜在表現に変換します。
    • エンコーダ ( E ) を使って、入力データ ( x ) を潜在変数 ( z ) にマッピングします
      •  z = E(x)
  2. 潜在拡散プロセス(Latent Diffusion Process)

    • 潜在変数  z に対して、通常の拡散プロセスと同様にノイズを加えていきます。
    • 前向き拡散過程(拡散モデルと同様)
      •  z_t = \sqrt{1 - \beta_t} \cdot z_{t-1} + \sqrt{\beta_t} \cdot \epsilon_t
      • ここで、  \beta_t はノイズスケジュール、  \epsilon_t はガウスノイズです。
  3. 逆拡散プロセス(Reverse Diffusion Process)

    • 潜在空間でのノイズデータから元の潜在変数を再構築します(拡散モデルと同様)。
    • モデルは、ステップ   t からステップ  t-1 に逆行する条件付き確率分布を学習します
      •  p_\theta(z_{t-1} | z_t) -ここで、   \theta はモデルのパラメータです。
  4. デコーダ(Decoder)

    • 再構築された潜在変数  z から元の高次元データを生成します。
    • デコーダ  D を使って、潜在変数  z から再構築されたデータ  \hat{x} を得ます
      •  \hat{x} = D(z)

学習方法

  • 前向き拡散過程と逆プロセスのトレーニング
    • 前向き拡散過程で生成されたノイズデータを使って、逆拡散過程の確率分布を学習します(拡散モデルと同様)。
    • トレーニング目標は、逆拡散過程の確率分布を正確に近似することです。これは通常、変分推論(Variational Inference)を使用して達成されます。

Stable Diffusionについて

Stable DiffusionはLDMをベースとした画像生成モデルの実装であり、LDMに学習を効率化、画像生成を高精度化させるためのテクニックを付加したものがStable Diffusionになります。

使用されているテクニックとか

例えば以下のようなテクニックが使われています。

  • 変分オートエンコーダ(VAE)との組み合わせ
    • Stable Diffusionは、変分オートエンコーダ(VAE)を使用して、潜在空間の表現を学習します。VAEはデータの潜在表現を正規分布に近づけるため、安定した潜在空間を提供します。
    • VAEにより、潜在変数の分布が正規化され、拡散プロセスが安定化されます。
  • クロスアテンション機構:
    • クロスアテンション機構を導入することで、潜在空間の情報と元の高次元データの情報を効果的に統合します。
    • これにより、生成プロセス中に重要な特徴が保持され、安定したデータ生成が可能となります。
  • アダプターの使用
    • アダプターと呼ばれる小さな学習可能なモジュールをモデルに挿入して微調整を行う方法があり、これはメモリと時間の効率が良く、大規模な計算リソースを必要とせずに効果的なカスタマイズを可能にしています
    • LoRAとかがこれです。(言いようによってはAnimateDiffとかも)
  • 効率的なサンプリング
    • Latent Consistency Models(LCM)などの技術を取り入れることで、Stable Diffusionは最小限の推論ステップで高品質の画像生成を実現し、効率と速度を向上させています
  • 拡張機能
    • 例えばinpaint, outpaint機能などオープンソースが故か拡張機能が大量にあり、簡単に使用できる状態になっていることも特徴です

モデルのアーキテクチャ

モデルのアーキテクチャ

最後に

触り程度に理解できた気になったのでこれくらいにしておきます。説明がふわっとし過ぎててあまりわからなかった、って方は記事の中に論文へのリンクも貼ってあるので、そこから読んでみてください。

実際に生成を試したい場合はComfyUIをインストールすれば簡単に試せます。以下の記事でインストール手順を紹介しているので読んでみてください。

otama-playground.com

その他、Stable Diffusion周りで読んだ論文は以下の記事でまとめているので、興味ある方はぜひご活用ください。

otama-playground.com