チャプター 21 · 拡散 · 9 min

ノイズを消して画像を生成する

Stable Diffusion、DALL-E、Midjourney。逆方向のノイズ除去、CLIP の役割、そしてなぜ U-Net が Transformer に道を譲るのか。

異なるファミリー

ここまで見てきたものはすべて、次のトークンを予測する Transformer を記述している。それは言語、コード、そしてますますビデオやオーディオを支配するアーキテクチャだ。

しかし Midjourney、DALL-E、Stable Diffusion にプロンプトを入力するとき、起こっているのはそれではない。画像はピクセルごとに左から右に生成されるのではない。いたるところで同時に現れ、連続的なステップで洗練される。

これは非常に異なるモデルファミリーの仕事だ:拡散モデル

中心的なアイデア:ノイズ除去を学ぶ

拡散プロセスはほとんど単純すぎる直感に基づいている。鮮明な画像を取り、ガウスノイズを徐々に加えていけば、ある時点で純粋なノイズと区別がつかなくなる。そのプロセスを逆転させる——少しずつノイズを取り除く——ことを学べば、純粋なノイズから始めて鮮明な画像で終わることができる。

訓練中:

  1. データセットから画像を選ぶ
  2. 事前定義されたスケジュール(例えば T = 1000 ステップ)に従ってノイズを加える
  3. ノイズの加わった画像とステップ t を与えられて、加えたノイズを予測するようネットワークを訓練する

こうしてモデルは、どんなノイズレベルでも、何が「本物の画像」で何が「加えられたノイズ」かを認識することを学ぶ。

推論時には、逆転する:純粋なノイズから始め、各ステップでモデルがノイズを予測し、それを引いて、繰り返す。T ステップ後、もっともらしい画像が得られる——学習した分布に似たもの。

ノイズ除去を試してみよう

アニメーションは純粋なノイズの画像から始まり、段階的にデノイズされる。各ステップは学習時に学んだ勾配に従い、CLIP のテキスト embedding に導かれる。5 ステップでは結果はぼやけており、50 ステップでは鮮明になる。

ステップ数で遊んでみよう。5ステップでは、画像はざらついたままだ——モデルには洗練する時間がない。50ステップでは鮮明になるが、計算量が10倍だ。現代のサンプラーのほとんど(DDIM、DPM-Solver)は 20 から 30 ステップでほぼ最適な品質に達する。

特定の画像へ誘導する:guidance

純粋なノイズはどんなプロンプトでも同じだ。モデルはどうやって我々が夕日を欲していて犬ではないと知るのか?答え:モデルをテキストで条件付けする。

訓練中、ネットワークはノイズの加わった画像とステップに加えて、画像に関連付けられたテキストの埋め込み(しばしば CLIP 型のエンコーダ)を受け取る。こうしてネットワークは条件付きノイズ予測を学ぶ:「画像が夕日を描写していると分かっているので、ノイズはこのように見える」

推論時には、2つの予測を計算する:プロンプトありのものと、なし(または空のプロンプト)のもの。Classifier-Free Guidance (CFG) の手法は、プロンプトの方向に外挿することで構成される:

最終予測 = プロンプトなし予測 + guidance × (プロンプトあり予測 − プロンプトなし予測)

guidance 係数(CFG scale)は、自然から離れてプロンプトに合わせる程度を制御する。CFG=0 ではモデルはテキストを無視する;CFG=7 では画像はプロンプトに忠実に従いつつ人工的にはならない;12 を超えると過飽和になり、細かいディテールを失う。

latent diffusion:計算量を減らす

512×512 の画像は 786,432 ピクセル(3 チャネル × 512 × 512)を持つ。それだけのピクセルで 1,000 ステップのノイズ除去を行うのは非常にコストが高い。Stable Diffusion はある手法を普及させた:圧縮された潜在空間で作業する

拡散モデルを訓練する前に、画像を 64×64×4 の潜在空間——約 48 倍小さい——に圧縮するオートエンコーダ(VAE)を訓練する。拡散はピクセルではなくこの潜在表現にだけ適用される。ノイズ除去の最後に、潜在表現を最終画像にデコードする。

これが、Stable Diffusion をコンシューマー向け GPU で数秒で実行可能にしているもの——同等のピクセルベースのモデルならクラスターが必要だっただろう。

CLIP:テキストと画像の橋

テキストで条件付けするには、画像と空間を共有するテキスト表現が必要だ。それが CLIP(Contrastive Language-Image Pretraining)の役割で、OpenAI が 4 億の画像/キャプションペアで訓練した。

CLIP は2つのエンコーダ——画像用と、テキスト用——を学習し、共通の空間に埋め込みを生成する。キャプションとそのターゲット画像は近い埋め込みを持ち、無関係なキャプションは遠い。このアラインメントが、訓練中に正確に見たことのないテキストプロンプトを拡散モデルが理解できるようにする。

U-Net vs Transformer (DiT)

長い間、拡散の参照アーキテクチャは U-Net だった:細かいディテールを保つスキップ接続を持つ U 字型の畳み込みネットワーク。Stable Diffusion 1.4、1.5、2 はすべて U-Net を使う。

しかし 2022 年、Peebles と Xie は DiT(Diffusion Transformer)を提案した:U-Net を純粋な Transformer に置き換える。画像の各「パッチ」はトークンとして扱われ、他のすべてのパッチに対する完全なアテンションを持つ。畳み込みのピラミッドはなく、スキップ接続もない——積み重ねられた Transformer ブロックだけだ。

Stable Diffusion 3、FLUX、Sora(ビデオ)——最近のすべてのアーキテクチャは Transformer に移行した。なぜか?Transformerよりスケールするからだ:言語と同じスケーリング則が見られる。DiT で計算量を倍にすれば、画像は予測通りに改善される。

サンプラー:DDPM、DDIM、DPM-Solver

サンプラーは、各ステップで、ノイズの予測を現在の状態とどう組み合わせて次のステップを生成するかを決定するアルゴリズムだ。

サンプラー典型的なステップ特徴
DDPM1000確率的、訓練に忠実、遅い
DDIM20–50決定的、はるかに少ないステップで DDPM に匹敵する品質
DPM-Solver10–25ODE ソルバー、さらに速い
Euler / Heun20–30古典的な ODE 手法、シンプルで頑健
LCM4–8潜在的な蒸留、超高速

サンプラーの選択は、速度対品質を調整するための最もアクセスしやすいレバーの1つだ。

なぜこのファミリーが Transformer と並んで存在するのか

問うかもしれない:なぜテキストのように、トークンごとに画像を生成しないのか?答えは微妙だ。

テキストでは、順序は自然だ:左から右へ読み、各単語は前の単語に依存する。画像には、正典的な順序がない。ピクセルごとに生成すると、アーティファクトが入る(最初のピクセルは最後のピクセルの文脈を持たない)。拡散は、画像全体を並列に生成し、各ステップで全体的に洗練することで、この問題を解決する。

それが、ピクセル上の自己回帰的アプローチ(PixelRNN、または OpenAI の初期の ImageGPT)が拡散に取って代わられた理由だ。唯一可能な復活は、画像トークン上の自己回帰モデル(DALL-E 1、そして今や Meta の Chameleon)を通じてだろう——しかしフォトリアリスティックな品質ではまだ拡散に劣る。

拡散は Transformer ではない。それは複雑な分布を学ぶ別の、数学的に直交する方法だ——そして画像については、それが勝ったほうだ。

更新日

Diffusion:ノイズを取り除いて画像を生成 · Step by Token