誰でもわかるStable Diffusion スケジューラー
Stable Diffusionで絵を生成するとき、まずノイズだらけの砂嵐のような画像が用意されます。ここから少しずつノイズを取り除いて希望の絵を浮かび上がらせていく、というのが画像生成の仕組みです。
さて、「少しずつノイズを取り除く」というとき、この「少しずつ」とはいったいどれくらいなのでしょう?それを決めるのが「サンプラー」といわれるものです。
今回はこの「サンプラー」について大まかに解説します。
なおこの記事は、各サンプラーの比較や、各サンプラーがどんな画像が生成するかといった実用的な話ではありません。あくまで「サンプラーが何か」を知るための解説です。
Diffusionモデルをおさらい
Stable Diffusionでは「Diffusionモデル」と呼ばれる手法が使われていますが、その仕組みを大まかに知っている必要があります。
※実際は「Latent Diffusion」という、画像を圧縮してから処理する手法ですが、この解説では簡単のため画像を圧縮せずに処理することにします。
まずは画像を学習
Diffusionモデルはまず「学習」によって大量の画像の特徴を記憶します。何十億枚という画像からたくさんの特徴を取り出し、それらをニューラルネットに取り込みます。
しかし、学習に使う画像をそのまま突っ込めばいいというわけではありません。
何をどう学習しているのでしょう?
- まず、学習用の画像「正解画像」を用意します。Diffusionモデルにはこの「正解画像」を描けるようになってもらいたいのです。
- 次にこの「正解画像」に少しだけノイズを乗せます。すると「正解画像」が少しザラザラした見た目になります。
- 2の「少しだけノイズを乗せる作業」をランダムな回数繰り返します(後述)。どんどんノイズが重なって、どんどん画像がザラザラになっていきます。ここで乗せたすべてのノイズを「追加ノイズ」、出来上がったザラザラの画像を「汚い画像」とします。
- この「汚い画像」をDiffusionモデルで使うニューラルネット(いわゆるAI)に入力します。するとニューラルネットはいろいろな処理をして最終的に「正解画像に乗っているであろう追加ノイズ」を予想して吐き出します。これを「予測ノイズ」とします。
- もしニューラルネットが完璧に賢いなら「予測ノイズ」は実際に追加されたノイズと完璧に一致するはずです。その場合、「汚い画像」から「予測ノイズ」を引くと「正解画像」に正しく近づきます。しかし、実際はそんなに簡単ではありません。そこで、乗っているノイズのうちの「ほんのちょっとだけのノイズ」を予測します。
- 「予測ノイズ」と実際に乗っている「追加ノイズ」がなるべく一致するようにニューラルネットを少し賢くします。
- 「正解画像」を変えたり「追加ノイズ」の量を変えたりして、1~6の作業を膨大な量繰り返します。
この「ノイズを乗せた画像を学習する」という学習はDiffusionモデルのユニークなところです。
さて、学習の時に大切になるのが「ランダムな回数ノイズを乗せる」という処理です。Stable Diffusionの場合、このランダムな回数は1~1000回です。
この記事では、ノイズが1回だけ乗った画像を「1ノイズ画像」と呼ぶことにします。50回乗れば「50ノイズ画像」、100回乗れば「100ノイズ画像」という感じです。最大にノイズが乗った画像は「1000ノイズ画像」ということになります。
学習では1回の処理につき1ノイズ分の「予測ノイズ」を出力できるようにします。
画像が「1ノイズ画像」の時は、ノイズの量がほんの少し(1ノイズ分)なので、見た目は元の「正解画像」とあまり変わりません。ニューラルネットもきっと簡単に学習して、ノイズを予測できるようになるでしょう。しかしノイズの量が100、200と増えていくにつれてどんどん元の「正解画像」が不明瞭になっていきます。
「1000ノイズ画像」ではもはや元々何が描いてあったのか全く分からなくなってしまいます。こんな画像からいきなり1000ノイズ分を予測するのは不可能ですが、1ノイズ分ならなんとか予測できそうなので、がんばって学習してもらいます。
このニューラルネットのすごいところは、ノイズの量が変化しても単体でそれに対応できることです。ノイズ量に応じて違うニューラルネットを用意する、という必要がなく、このニューラルネットだけですべてのノイズ量に対応します。
※「ノイズってなんだ?」と思われるかもしれませんが、Stable Diffusionでいうところの「ノイズ」とは「ガウス雑音」と呼ばれる、単純な数式として表せるノイズです。ガウス雑音が選ばれたのは、これが計算で一番扱いやすいからです。ガウス雑音には「平均」と「分散」という2つのパラメータがあって、「平均」が0、「分散」が1に近づいていくにつれてノイズがどんどん多くなります。「ノイズを乗せる」とは、最初の絵にガウス雑音を少しずつ浸食させていき、最終的にガウス雑音によって絵を乗っ取ってしまおう、という処理です。
画像生成は学習の逆
十分な学習の後、今度は学んだことを生かして画像を描いてもらいます。
画像生成は冒頭でも少し説明しましたが、以下のような処理です。
- 最初にノイズだらけの画像を用意する。これは実質「1000ノイズ画像」とみなされる
- 与えられたプロンプトから「正解画像」を何となく予想する。例えば「cat」というプロンプトならネコの写っている絵を「正解画像」と予想する。
- 学んだことを生かし、「こういうノイズを取ればネコの絵になりそう」と予想し、「予測ノイズ」を作って出力する。
- 「ノイズ画像」から「予測ノイズ」を引く。するとノイズ画像から少しノイズが取り除かれる。例えば1000ノイズ画像だったのが999ノイズ画像になる、という感じ。
- 上の2~5の処理を「1ステップ」として、最終的に「0ノイズ画像」になるまでステップを繰り返してノイズをどんどん減らしていく。
- もし予測された「正解画像」が正しければ、「0ノイズ画像」=「理想の絵」となっているはず。
1000ノイズ画像からいきなり0ノイズ画像(つまり正解画像)にすることは不可能なので、少しずつノイズを引いていきます。
では、完成画像にたどり着くまでに1000回もノイズを予測しなければいけないのでしょうか?1枚の画像を作るのにいちいちそんな膨大な作業を行っていたら、時間がかかりすぎてとても使い物になりません。
そこで、1回の処理で1ノイズだけ引くのではなく、10とか20とか、ノイズをある程度まとめて引くことを考えます。最近の研究で、ノイズをある程度まとめて引いても結構うまく画像を作れることが分かってきました。
ここで「ある程度まとまったノイズ」がどれくらいなのか、そのノイズをどう作るのかを決めるのが「サンプラー」です。
サンプラーによって各ステップのノイズ量が変わります。例えばあるサンプラーは毎ステップ50ノイズずつノイズ量を減らすとします。すると950、900、850…とノイズ量が減っていきます。別のサンプラーでは最初は多めに、終盤は少なめにノイズを減らすかもしれません。その場合、920、840、……50、20、10というようなノイズの減り方になると思います。
取り除くノイズ量が変わると、「予測ノイズ」も変わり、それを引いた後の画像も変わってきます。つまり、ステップごとのノイズ量を管理するサンプラーは「予測ノイズ」に影響を与え、その結果、完成画像にも影響を与えます。
※専門的に言うと、サンプラーとは「微分方程式を解くための手法」です。詳しくは解説しませんが、Diffusionモデルのプロセスを数学的に眺めると、画像生成とは「確率微分方程式(SDE)」または「常微分方程式(ODE)」を解くことと同義であることが分かりました。そのため、Stable Diffusionではいろいろな微分方程式の解法をサンプラーとして使用しているのです。
Stable Diffusion Web UIのサンプラー
現在、PC上でStable Diffusionを利用するときに最もよく使われるツールが「Stable Diffusion Web UI」です。このツールには「Sampling method」という設定があり、ここでサンプラーを決めることができます。
一般的に、以下のようなルールがあります。
- 「a」または「SDE」が付くものはランダム要素が入る
- 「2」と付くものはEulerサンプラーと比べて時間が2倍かかる(ただしDPM++ 2MはEulerと同じ時間)
- 「++」は「改良版」という意味
- 「Karras」が付くものは、付かないものよりも精度がいい
初期のサンプラー
Eulerは、数あるサンプラーの中でも一番シンプルなサンプラーです。毎回同じ量のノイズを取り除いて、最終ステップで0ノイズ画像になるようにします。
HeunはEulerサンプラーの改良版です。精度を上げるためにEulerの計算を2回(つまりノイズ予測を2回)行います。そのためEulerサンプラーに比べて2倍の処理時間がかかります。
LMS(Linear Multi-Step Method)はEulerサンプラーと同等のスピードでより精度を上げるように提案されたサンプラーです。過去数回分のノイズ除去の結果から次のノイズ除去量を決める、という処理を行っています。
DDIM(Denoising Diffusion Implicit Model)はDiffusionモデルを効率化するために提案されたサンプラーのうち、最も初期のものです。
PLMS(Pseudo Linear Multi-Step Method)はいわばDDIMの発展形で、ニューラルネット用に調整したものです。
DPMサンプラー
DPM(Diffusion Probablistic Model)サンプラーはStable Diffusionに搭載された新しいサンプラーです。画像生成の精度を上げると言われていますが、処理時間は一般的にEulerサンプラーよりも遅くなります。
DPMサンプラーには様々なバリエーションがあります。
DPM Fastは処理時間がEulerサンプラーと同程度の速さですが、精度は他のDPMサンプラーに比べて低くなります。
DPM++は、オリジナルの改良版です。
DPM2は、オリジナルよりも2倍時間がかかります。
「Karras」サンプラー
Karrasとは人の名前です。2022年、NVIDIAのKarrasさんのグループが発表した論文で「ノイズをいつどれくらい取り除くか」(ノイズスケジューラー)が新たに提案されました。ここで提案された手法はStable Diffusionの各スケジューラーにも取り入れられ、「Karrasサンプラー」と呼ばれることになりました。
Karrasサンプラーの特徴は画像完成に近づくにつれてノイズ除去がより繊細になることです。例えばLMSは普通のLMSサンプラーとKarras版LMSサンプラーがありますが、一般的にKarras版の方が結果が良いとされています。
「a」サンプラー、SDEサンプラー
いくつかのサンプラーには「a」という記号がついています。これは「ancestral」の略ですが、Diffusionモデルではこのネーミングは大した意味を持ちません。
aサンプラーの最大の特徴は生成画像が収束しないことです。一般的にDiffusionモデルでは「正解画像」に向かって真っすぐ近づいていくように画像を生成しますが、aサンプラーは「ノイズを少し余計に引いた後、余計に引いた分を埋め合わせるようにまたノイズを加える」という作業を行うので「正解画像」に近寄ったり離れたりします。このせいで画像が処理終盤になっても収束せず、いきなり画像の内容がガラッと変わったりすることがあります。
なお、「埋め合わせるために加えるノイズ」は毎回ランダムに決まるので、同じ条件で画像を再度生成しても、aサンプラーを使っている場合は毎回微妙に違う画像が生成されます。
SDEサンプラーも同様に生成画像が収束しません。これはこのサンプラーが確率微分方程式を解いているからです(詳細は省略)。
UniPCサンプラー
Stable Diffusion Web UIで最近導入されたサンプラーです。このサンプラーの特徴は収束が速いことで、10程度のステップ数でもある程度完成した画像を生成してくれます。ただしクオリティを上げるには他のサンプラーと同程度のステップ数が必要になるようです。
迷ったら「DPM++ 2M Karras」
結局どれがいいの?という話ですが、現在スピードと品質を両立するもっともよいサンプラーは「DPM++ 2M Karras」です。これはEulerサンプラー(もっとも単純で最速)と同等のスピードでありながら画像精度が高い、優れたサンプラーです。
「DPM++ SDE Karras」も評判の良いサンプラーです。このサンプラーは画像が収束せず、ステップごとの時間もDPM++ 2M Karrasの2倍かかりますが、ステップ数を少なめにしても精度の高い画像ができるようです。
逆に「a」が付いたサンプラーは生成画像にランダム要素が入るので避けた方が無難だと思います。
まとめ
今回はサンプラーについて大まかな解説をしました。
ノイズを取り除いて画像を作っていくStable Diffusionでは、どのようにノイズを取り除くかが最終的な画像のクオリティに大きな影響を与えます。この「ノイズを取り除くプロセス」を決めるのがサンプラーですが、それぞれのサンプラーにはスピードや質に関して一長一短あります。
もちろん生成画像のクオリティは主観も入るので「これが決定版サンプラーだ」というようなものはありませんが、サンプラーによっぽどこだわりたい人以外はKarras系サンプラーを使っておけば間違いないでしょう。