AI · AIの基礎
拡散モデル(diffusion model)の仕組みとは?
結論
拡散モデルは、ノイズを取り除くことを学習したモデルです。学習では、本物の画像にランダムなノイズを少しずつ加え、そのノイズを予測するニューラルネットワークを鍛えます。生成するときは、純粋なノイズから出発し、テキストプロンプトに導かれながら、ステップごとに少しずつノイズを取り除き、きれいな画像に仕上げます。画像・動画生成AIの多くがこの方式で動いています。
ひとことで言うと:ノイズの掃除を学び、純粋なノイズを掃除する
写真に、ほんの少しランダムなザラザラ(ノイズ)を加えるところを想像してください。さらに少し足し、また足し、数百ステップ後には灰色の砂嵐しか残りません。この向きは簡単で、コンピューターなら数式1行でできます。
拡散モデルは、その逆向きを学習したニューラルネットワークです。ノイズだらけの画像を見て、加えられたノイズを推定し、引き算できるようにします。あらゆるノイズの強さでこれが上手にできるなら、純粋なランダムノイズから出発して、ステップごとに掃除できます。最後に残るのは、これまで存在しなかった、しかし学習データの仲間に見える新しい画像です。
この考え方は2015年に説明され、2020年のDenoising Diffusion Probabilistic Models(DDPM)の論文で、高品質な画像生成に使える形になりました。執筆時点では、Stable Diffusion、FLUX、Imagen、DALL·E系のモデルや、Veo、Kling、Runway、Seedanceなど多くの動画生成AIが、この方式か近い方式の上に作られています。
学習:順方向のプロセスとノイズ予測器
学習には、キャプション付きの数百万枚の画像を使います。学習例ごとに、システムは同じ小さな練習を行います。
- 本物の画像とそのキャプションを選びます。たとえば「a red bicycle leaning on a brick wall(レンガの壁に立てかけた赤い自転車)」というキャプションの写真です。
- ランダムなノイズの強さを選びます。ほぼきれいな状態から、ほぼ純粋なノイズまでの範囲です。
- その強さで画像にランダムなノイズを混ぜます。これが順方向のプロセスで、学習は必要ありません。
- ノイズ入りの画像、ノイズの強さ、キャプションをネットワークに渡し、加えられたノイズを予測させます。
- 予測を実際のノイズと比べ、誤差が小さくなるようネットワークの重みを調整します。
これを数十億回繰り返すと、ネットワークは、あらゆるぼやけ具合で画像一般がどう見えるかを学びます。エッジがどこに来やすいか、光が肌にどう当たるか、自転車やレンガの壁がどんな見た目か、といったことです。学習用の写真をファイルとして保存するわけではなく、その統計を学んでいます。見たことのない組み合わせの発想を混ぜられるのもそのためです。
ネットワーク自体は、以前は画像用ネットワークの一種であるU-Netが一般的でした。最近のモデルの多くは、代わりにトランスフォーマー(拡散トランスフォーマーとも呼ばれます)を使います。ノイズから画像への直線的な経路を学ぶフローマッチングという近い方式で学習する最近のモデルもあります。ユーザーから見た考え方は、以下で説明するものと同じです。
生成:逆方向のプロセスを1ステップずつ
「生成」を押すと、モデルは線を引いたり部品を貼り付けたりするわけではありません。次のようなループを回します。
x = random_noise(seed) # start: pure static
for t in noise_levels_high_to_low: # e.g. 30 steps
predicted_noise = model(x, t, prompt)
x = remove_some_noise(x, predicted_noise, t)
image = decode(x) # latent -> pixels最初のステップが大きな形を決めます。被写体の位置、水平線、主な色などです。中盤のステップで形状と照明が加わります。終盤のステップで、髪、布、肌の毛穴などの細かなテクスチャが加わります。これで、実用上のいくつかの現象が説明できます。ステップ数を減らしすぎると、画像はなめらかで未完成に見えます。シードを変えると最初のノイズが変わるので、構図全体が変わります。
ノイズの予測を、少しきれいな画像に変えるルールを、サンプラー(またはスケジューラー)と呼びます。DDPMでは多数の小さなステップを使いました。その後のDDIMなどの方式で、大きな決定論的なステップを踏んでも、はるかに少ないステップ数で同程度の品質が出せるとわかりました。最近のツールが、1,000ステップではなく数十ステップで済むのはそのためです。
テキストプロンプトが画像を導くしくみ
プロンプトはまず、テキストエンコーダー(キャプションの意味を表現するよう学習された言語モデル)によって数値に変換されます。デノイズを行うネットワークの内部では、クロスアテンションという仕組みによって、画像のあらゆる領域が、毎ステップでプロンプトの単語を参照できます。顔になりつつある領域は、「freckles(そばかす)」や「smiling(笑顔)」といった単語に注意を払います。
この誘導だけでは弱いので、クラシファイアフリーガイダンスで強めます。各ステップで、モデルはノイズを2回予測します。あなたのプロンプトを使うものと、空のプロンプトを使うものです。最終的な予測は、その差の方向へさらに進められます。どこまで進めるかを決めるのがガイダンススケール(CFGスケール)です。値が高いとプロンプトにより忠実になりますが、きつく、彩度が高すぎる見た目になることがあります。低いと自然に見えますが、プロンプトの一部を無視することがあります。
ネガティブプロンプトに対応するツールでは、通常、この2回目の予測の空のプロンプトの代わりにそれを使います。画像は、「blurry, watermark, extra fingers」のような単語から遠ざけられます。
多くのモデルが潜在空間で動く理由
フル解像度の画像を何百回もデノイズするのは遅すぎます。Stable Diffusionの基盤である潜在拡散(latent diffusion)では、まずオートエンコーダーを学習します。画像をずっと小さな数値の格子に圧縮し、元に戻せるものです。拡散モデルは、その小さな格子の上でだけ動きます。たとえば縦横それぞれ8分の1に圧縮すると、512×512の画像は64×64の格子になり、処理する位置は64分の1になります。
生成の最後は、デコーダーが、きれいになった潜在の格子をピクセルに戻す処理です。画像に変な色のムラがあったり、小さな顔がにじんだりするとき、デコーダーの圧縮が一因であることが多く、被写体がフレームの中で大きいほど顔や小さな文字がきれいになるのはこのためです。
動画の拡散モデルも同じ考え方に時間を加えたものです。潜在はフレームの積み重ねで、ネットワークがそれらをまとめてデノイズするので、フレーム間で動きの一貫性が保たれます。
よくある設定が実際に変えるもの
多くの生成ツールは、こうした設定のいくつかを公開しています。名前は違っても、仕組みは同じです。
| 設定 | 制御するもの | 実際の効果 |
|---|---|---|
| シード | 最初のノイズ | 同じシード、同じプロンプト、同じ設定なら同じ画像になります。変えると新しい構図が見られます。 |
| ステップ数 | デノイズの回数 | 少なすぎるとぼやけて未完成に見えます。ある程度を超えると、増やしても時間がかかるだけで品質はあまり上がりません。 |
| ガイダンス / CFGスケール | プロンプトをどれだけ強く反映するか | 高いとプロンプトに忠実ですが、きつくなることがあります。低いと自然ですが、ずれやすくなります。 |
| サンプラー / スケジューラー | 各ステップのルール | 速度と細かなテクスチャが変わります。ほかの設定を試すときは、サンプラーを固定します。 |
| ネガティブプロンプト | 遠ざけたいもの | 繰り返し出る欠点を消すのに便利です。長いリストはほとんど効きません。 |
| 強度(画像から画像) | 入力画像に加えるノイズの量 | 低いとレイアウトが保たれ、高いとおおまかなアイデアだけが残ります。 |
| 解像度 / アスペクト比 | 潜在の格子の大きさ | 学習時のサイズから大きく離れると、被写体が二重になったり、体が伸びたりすることがあります。 |
試すときは、シードを固定して、設定を1つずつ変えるのがよい方法です。そうしないと、画像が良くなったのが変更のおかげなのか、運なのかがわかりません。
拡散モデルとほかの画像生成方式
拡散は唯一の方式ではありません。自己回帰型のモデルは、言語モデルが文章を書くのと同じように、画像をトークンの列として1つずつ生成します。最近のマルチモーダルモデルの一部がこの方式です。たとえば、cv.cmのai-image-generatorは、自己回帰型のJanus-Pro-1Bを、ブラウザ上でWebGPUを使い、384pxでローカルに動かしています。設定の感覚は違い、拡散でいうステップ数を調整する場面はありません。
以前のGAN(敵対的生成ネットワーク)は1回の処理で画像を作るため高速でしたが、学習が難しく、多様性も劣りました。拡散が主流になったのは、学習が安定していて、幅広い画像をカバーできるからです。主なコストは速度で、1枚ごとにネットワークを何度も通す必要があります。蒸留したモデルはステップ数を数回まで減らせますが、多様性はある程度犠牲になります。
よくある弱点と回避のしかた
- 手と指:手はさまざまなポーズで現れ、学習写真では一部が隠れていることも多いので、モデルはぼんやりした平均を学びます。シンプルで見えやすい手のポーズを頼むか、後から手の部分をインペインティングで直します。
- 画像内の文字:モデルは文字を、綴りではなく形として学びます。新しいモデルはずっと上手ですが、文字は短くし、プロンプトでは引用符に入れ、1文字ずつ確認してください。重要な文字は、後からエディタで入れます。
- 数えること:「five apples」で4個や6個になることがよくあります。物の数が少ないほど確実です。
- プロンプトの漏れ:色や属性が被写体の間で混ざります。たとえば赤い帽子のせいでシャツまで赤くなる、といったことです。各被写体を1つの明確なフレーズで説明するか、別々に生成してください。
- コピー:有名な画像や、何度も繰り返し出てくる画像に近いコピーを出力してしまうことがあります。オリジナルの作品が必要なら、アーティスト名やブランドのキャラクターをプロンプトに入れるのは避けましょう。
よくある質問
Stable Diffusionと拡散モデルは同じものですか?
いいえ。拡散モデルは一般的な方式の名前です。Stable Diffusionは、潜在拡散を使う、オープンなモデルの特定の系統です。ほかにも多くの生成ツールが拡散を使っています。
同じプロンプトなのに、毎回違う画像になるのはなぜですか?
生成のたびに、シードで決まる別のランダムなノイズから始まるためです。シードを固定し、ほかの設定もすべて同じにすれば、同じソフトウェア上では同じ画像が再び得られます。
拡散モデルは学習した画像のコピーを保存していますか?
保存しているのは学習した重みで、画像ファイルではありません。ただし、有名な画像や繰り返し現れる画像など、一部の学習画像はほぼそのまま取り出せることが研究で示されており、まれに近いコピーが起きることはあります。
AI画像の生成に数秒かかるのはなぜですか?
拡散モデルは、大きなネットワークをステップごとに1回動かし、1枚で数十回になることもよくあります。ステップ数が少なくて済むよう訓練された高速なモデルもあり、圧縮された潜在空間で動かすことでも時間を節約しています。
CFGスケールはどのくらいが適切ですか?
モデルによります。古いモデルの多くは範囲の中間あたりで動き、蒸留したモデルの一部では、ガイダンスをとても低くする必要があります。ツールの初期値から始め、シードを固定して少しずつ動かしてください。