Stable Diffusionのしくみとは?ノイズから画像が生まれる仕組みを初心者向けに解説
本記事では、Stable Diffusionの仕組みを基礎から丁寧に解説します。デノイジング(ノイズ除去)の基本概念から、潜在拡散モデル・U-Net・テキストエンコーダ・VAEといった内部のニューラルネットワークの動作原理まで、ステップバイステップでわかりやすく紹介します。
AI により中国語から翻訳されています。問題があればフィードバックボタンからお知らせください。
原文地址:https://mccormickml.com/2022/12/21/how-stable-diffusion-works/
作者:Chris McCormick(スタンフォード大学卒業後、コンピュータビジョン、機械学習、NLPの分野で活躍)
投稿日:2022年12月21日
翻訳:WaytoAGI(通往AGI之路)
『A16ZがまとめたAIコレクション』入門シリーズ第5弾
コンピュータがたった数行のテキスト説明だけで芸術作品を生み出せるなんて、信じられないほど素晴らしいことです!私自身、「ボンネットの内部」では実際に何が起こっているのだろうと非常に興味があり、その可能性を可能にしている仕組みを理解したいと思いました。そこでここでは、AIに詳しくない人でも、できる限り深く理解できるよう解説を試みます。
概要
最初のセクションでは、高レベルな説明をします(すでにご存知かもしれませんが)。これは良い出発点ですが、これだけでは好奇心を満たすには不十分だと分かっています。😉「すごい、でも実際にはどう動いているの?」と思うはずです。
その疑問に答えるため、Stable Diffusionの内部動作について見ていきます。内部の複雑さは想像以上かもしれませんが、少なくとも具体的な動作プロセスをお見せすることで、完全な謎ではなくなります。
具体的には:
-
Stable Diffusionは巨大なニューラルネットワークです。
-
ニューラルネットワークは純粋な数学でできています。
-
実際には、それが何をしているかを完全には理解していないのです!
-
最終的に、Stable Diffusionが機能するのは、私たちがそれを訓練したからです。
まずは全体像から始めましょう!
Stable Diffusionは画像からノイズを除去する
暗すぎる場所で写真を撮ろうとして、ザラザラした颗粒状の写真になってしまった経験はありませんか?この颗粒こそが、画像の「ノイズ」の一例です。
私たちはアートを生成するためにStable Diffusionを使っていますが、その裏側で行われているのは、実は画像の「クリーンアップ」なのです!
ただし、それは携帯電話の画像編集アプリにあるノイズ除去スライダーよりはるかに複雑です。Stable Diffusionは世界の姿を、書面言語を理解し、それらを利用して(ノイズ除去)プロセスを導くのです。
例えば、下の左側の画像を一流のグラフィックアーティストに渡して、「これはH.R. Giger(スイスの画家、彫刻家、セットデザイナー。『エイリアン』の異星生物デザインで知られる)のスタイルで描かれた、ギターを弾くエイリアンの絵だ」と伝えたとしましょう。きっと彼らは丁寧にクリーンアップして、右の画像のような作品を作り上げてくれるでしょう。
[図]
(これらはStable Diffusionが実際に生成した画像です!)
アーティストは、Gigerの作品に関する知識と、世界に関する知識(ギターがどうあるべきか、どう演奏されるかなど)を活用してこれを実現します。Stable Diffusionは本質的に同じことを行っているのです!
「推論ステップ」
多くの画像生成ツールにある「推論ステップ」スライダーをご存知ですか?Stable Diffusionは段階的にノイズを除去していきます。
これは25ステップ実行した例です:
[図]
エイリアンのギタリストの例は、最終的に何になるべきかがはっきり見えるため、より分かりやすいでしょう……しかし、上の図の初期画像は完全に判別不能に見えます!
実は、このノイズだらけのエイリアンの例は、プロセスのほぼ中盤から取ったものです——(最も初期の画像は)実際には完全なノイズから始まります!
[図]
どのように始まるのか?
アートを生成するために、Stable Diffusionには初期画像として単なる純粋なノイズを与えます。しかし、かなり残酷なことに😏、私たちはこう嘘をつきます:「これはH.R. Giger風のエイリアンがギターを弾く、ノイズだらけの絵です——クリーンアップしてもらえますか?」
このタスクをグラフィックアーティストに渡したら、彼らは困ってしまうでしょう——「手助けできませんよ、この画像はまったく判別不能です!」
では、Stable Diffusionはどうやってこれを成し遂げるのでしょうか?
最もシンプルなレベルでの答えは、それがコンピュータプログラムであり、与えられたタスクを実行して私たちに何かを生み出すしかない、ということです。
より深い答えは、Stable DiffusionのようなAIモデル(技術的に言えば「機械学習」モデル)が、很大程度上統計に基づいているという事実に関係しています。これらのモデルはすべての選択肢の確率を推定し、すべての選択肢の正しい確率が極めて低い場合でも、最も高い確率の経路を選びます。
例えば、モデルにはギターが画像のどこに位置すべきかについてある程度の理解があり、(実際には「正しい」選択がなくても)どのノイズ部分がギターの輪郭に最も近いかを推測し、物体の描画を開始できます。
正しい答えがないため、毎回異なる純粋なノイズ画像を与えることで、Stable Diffusionは異なるアート作品を創作するのです!
安定拡散プログラムをどのように書くのか?
機械学習に詳しくなく、実際にどう実装するのかを推測しようとするなら、まずはプログラムの書き方を考え始めるかもしれません。つまり、どのような手順を踏むのか、ということです。
おそらく、説明文からキーワードをマッチングし、その説明に合う画像データベースを検索し、ノイズと比較するのでしょうか?そして、あの人の説明を聞くと、まず画像の中で最も顕著なエッジを計算しているようにも聞こえますが?🤷
実際はそうではありません——参照する画像データベースも、画像処理アルゴリズムも使いません... 純粋な数学です。
「まあ、もちろん、コンピュータは結局大きな計算機で、やっていることはすべて数学に帰着する」と言っているのではありません。「黒板に目がくらむような方程式」といった数学の話です。以下のようなものです:
[図]
(これは私が安定拡散について書いた多くの構成要素の1つである「アテンション」に関する技術チュートリアルです。)
それぞれの異なる構成要素を定義する方程式をすべて書き出すと、少なくとも数ページは埋まるでしょう。
画像とテキストを数値として表す
これらの方程式を適用するには、初期ノイズ画像とテキスト記述を、大量の数値の表として表現する必要があります。
画像の表現方法はすでにご存知かもしれませんが、例を見てみましょう。これは満潮時に撮影した私の長時間露光写真です:
[図]
数学的にはこのように表現されます。512 x 512 ピクセルなので、512行512列の表として表します。しかし、実際には画像1枚につき3つの表が必要です。なぜなら、各ピクセルは赤、緑、青(RGB)の混合で構成されているからです。以下は上記の画像の実際の値です。
[図]
安定拡散では、テキストも扱います。これは私が画像に書いたかもしれない説明文です:
A long exposure color photograph of decaying concrete steps leading down into the ocean, with concrete railings, head on view, symmetry, dream like, atmospheric.
朽ち果てたコンクリートの階段が海へと続く、コンクリートの手すりを伴った、正面からの対称的な、夢のように幻想的な雰囲気の長時間露光カラー写真。
これは数値の表として次のように表現されます。各単語が1行で、各単語は768個の数値で表されます。これらは安定拡散 v1.5 でこれらの単語を表すために使用される実際の数値です:
[図]
単語を表す数値をどのように選ぶかは魅力的なトピックですが、かなり技術的でもあります。これらの数値は、それぞれが単語の意味の異なる側面を表していると大まかに考えることができます。
機械学習では、これらを実際には「表」とは呼ばず、「行列」や「ベクトル」という用語を使います。これらは線形代数の分野から来ています。
しかし、これらすべての中で最も重要で最も混乱する部分は、パラメータの概念です。
10億のパラメータ
初期ノイズとテキスト記述は、安定拡散への入力と呼ばれるもので、異なる入力はこれらの表で異なる値を持ちます。
また、これらの方程式にはさらに大きな数値のセットを挿入しますが、毎回同じものです——これらは安定拡散のパラメータと呼ばれます。
高校で方程式 y = 3x + 2 を使って線を描いたことを覚えていますか?
[図]
これが安定拡散だとすると、「x」が入力、「y」が最終画像、数字の3と2がパラメータです。(もちろん、方程式はもっと複雑ですが😝)
入力画像は約79万個の値で表され、プロンプト内の33個の「トークン」は約2万5千個の値で表されます。
しかし、Stable Diffusion には約10億のパラメータがあります。🤯
(これらすべての数字を手計算できると思いますか?!)
この10億の数字は、約1100個の異なるサイズの行列に分散されています。各行列は、数学演算の異なる段階で使用されます。
興味があれば、ここにこれらの行列の完全なリストを印刷しました!
繰り返しますが、これらのパラメータは変わりません——画像を生成するたびに同じ数字です。
安定拡散が機能するのは、10億の数字すべての正しい値を見つけたからです。これは非常に馬鹿げていると思いませんか?
10億のパラメータを選ぶ
明らかに、作者が「さあ、どの数字にしようか」と座って決めるわけではありません。特に、それらが1、2、3のような「整数」ではなく、私たちコンピュータマニアが「浮動小数点」値と呼ぶもの(表にある小さくて非常に正確な分数)であることを考えるとなおさらです。
私たちはこれらの数字を選んだわけではありません。それどころか、そのうちの一つすら説明できません!これが、Stable Diffusionの仕組みを完全に説明できない理由です。これらの方程式が何をするのかについては直感的な理解がありますが、多くのことはそれらの数字の値の中に隠れており、完全には理解できません。
すごくクレイジーですよね?
では、どうやってこれらの数字を見つけたのでしょうか?
まず最初に、10億のランダムな数字を選びました。この初期のランダムなパラメータ値では、モデルはまったく役に立ちません。より良いパラメータ値を見つけるまでは、価値のあることは何もできません。
そこで、トレーニングと呼ばれる数学的なプロセスを適用し、徐々に値を有効なものに調整していきます。
トレーニングの仕組みは私たちが完全に理解しているものです。基本的な微積分(非常に大きな方程式に適用されますが)であり、基本的に機能することが保証されており、なぜ機能するのかについても明確な理解があります。
トレーニングには膨大なトレーニングサンプルセットが必要です。個々のトレーニングサンプルは、入力と期待される出力で構成されます(Stable Diffusionにとってトレーニングサンプルがどのようなものかは、別の記事で説明します)。
最初のトレーニング入力を実行すると(パラメータ値は完全にランダム)、モデルが出力するものは期待される出力とはまったく異なります。
しかし、実際の出力と期待される出力の差を利用して、これらの方程式に非常に基本的な微積分を適用すると、10億の数字のそれぞれについて、特定の量を加算または減算すべきかがわかります(各パラメータごとに異なる微調整が行われます!)。
その調整を行った後、モデルは数学的に、より期待される出力画像を生成することが保証されます。
そこで、さまざまなトレーニングサンプルを使って何度も(数億回)実行し、モデルはどんどん良くなっていきます。ただし、トレーニングが進むにつれて効果は徐々に減少し、最終的にはモデルがそれ以上のトレーニングから利益を得られないポイントに達します。
作者がモデルのトレーニングを完了すると、パラメータ値を誰でも無料で使えるように公開しました!
Stable Diffusionのトレーニング
Stable Diffusionのトレーニングプロセスについては、理解しやすく学ぶのも楽しい内容がたくさんありますが、それは別のブログ記事に譲ることにしました!
結論
ここでの説明に少しがっかりして、「これでは簡単に理解できない」と感じたとしても、気を悪くしません。しかし、少なくともベールが剥がされ、その先にあるものが信じられないほど刺激的で感動的だと感じていただければ幸いです!