Otama's Playground

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

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

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

Stable Diffusionは拡散モデルの一種であるLatent Diffusion Model(LDM)をベースとして拡張したモデルです。そのためStable Diffusionモデルの仕組みを知るためにはまず拡散モデルとLDMについて知っておく必要があります。この記事では、拡散モデルと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)

学習方法

  • 前向き拡散過程で生成されたノイズデータを使ってモデルを学習します。
  • 逆拡散過程の確率分布を正確に近似することを目標として、そのための損失関数が使用されます。

Latent Diffusion Modelとは何か

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

arxiv.org

Latent Diffusion Modelは、低次元の潜在空間(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)

学習方法

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

Stable Diffusionについて

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

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

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

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

モデルのアーキテクチャ

モデルのアーキテクチャ

最後に

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

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

otama-playground.com

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

otama-playground.com