見出し画像

Stable Diffusionって何? #2

Stable Diffusionの仕組みに迫るシリーズ第2段です!
今回は、潜在拡散モデル(: latent diffusion model)をメインに解説します。

読者の想定と作成方針
AIイラスト作成に触れたことがある人を読者として、簡単な理解から積み上げるように説明していくことで誰でも理解できることを目指します。
※数式は使わず模式図でふわっと説明するので詳しい方は読むときに注意してください。

前回のおさらい

前回の記事では、拡散モデル(Diffusion model)はノイズからデータを復元する過程を学習しているもので、処理したいタスクに応じて適切にノイズを計算することによってStable Diffusionは多様なタスクを実行できると解説しました。
https://note.com/lively_viola452/n/nb8d60a828e83

赤い着物の絵をimage2imageで青い着物に変化させるときは下のような処理フローになります。

image2imageのときの処理フロー

今回は、Stable Diffusionの原理となる潜在拡散モデル(: latent diffusion model)について取り上げます。

潜在拡散モデルとは?

潜在拡散モデルは、大量の計算量を削減するために画像ではなく潜在変数に対して拡散過程と復元過程を行う新しい種類の拡散モデルです。

その背後にある理由と概念を理解するために、まずはなぜ計算量を削減する必要があるのか、そして潜在変数について詳しく見ていきましょう。

なぜ拡散モデルは計算量が多いのか?

拡散モデルとは、ノイズから画像を復元する過程(復元過程)を学習しているモデルで、画像をノイズにする過程(拡散過程)はプログラムで計算できます。
実はこの過程の計算量が膨大なのです。

要因は2つあります。

  1. 画像は要素数が膨大なデータであり、これを処理するには多くの計算が必要です。例えば、512×512のカラー画像では、1ピクセルごとにRGBの3つの要素を持っているため、全要素数は512x512×3=786,432になります。このような大量の要素に対する処理は、AIの学習に大きな計算量を必要とします。

  2. 一つの画像についての拡散過程と復元過程で同じ処理を何回も繰り返しているため。こちらについては次の段落で詳しく説明します。

拡散モデルにおける拡散過程と復元過程はどちらも1ステップの処理ではなく同じ処理を何ステップも繰り返す処理になっています。標準的には一つの画像について拡散過程と復元過程はそれぞれ1000回繰り返す必要があります。
拡散過程では、今のステップの画像に対してノイズを加えることでより純粋なノイズに近づける処理を繰り返し、復元過程では、逆に今のステップの画像に対してノイズを除去する信号を加えることで画像に復元する処理をしています。

拡散過程と復元過程の模式図

これら2つの要因が、拡散モデルの計算量を膨大にする主な原因です。この計算量を削減するために、潜在変数という概念が重要な役割を果たします。

次に、この潜在変数とは何か、そしてそれがどのように拡散モデルの計算量を削減するのかについて詳しく見ていきましょう。

VAE(変分オートエンコーダ)と潜在変数

VAEとは画像と潜在変数(英: latent variable)を相互に変換するモデルです。
画像から潜在変数へ変換するのがエンコーダで、潜在変数から画像に変換するのがデコーダです。

VAEの模式図

潜在変数についてChatGPTを参考に博士と小学生のやり取り風で説明してみます。

博士:こんにちは、君。君のお気に入りのアニメキャラクターは誰か知ってる?それはピカチュウだろうか、それともドラえもん?

小学生:はい、それはドラえもんです!

博士:なるほど、ドラえもんが好きなんだね。さて、君がドラえもんの絵を描くとき、どうやって描くの?

小学生:ええと、まず、大きな丸い頭を描いて、そして四角い体を描き、その後に目、鼻、口、耳を描きます。

博士:すごいね、その順番で描くことでドラえもんの絵が出来上がるんだね。これが、ひとつの「ルール」や「指示」みたいなものだよね。

小学生:うん、そうだね!

博士:それでね、VAEというのは、それと同じようなことをコンピュータがやる方法を学ぶんだ。でも、その代わりに「どうやって絵を描くか」を学ぶのではなく、コンピュータが「どうやって画像を理解するか」を学ぶんだ。

小学生:え、でも、コンピュータは絵を理解できるの?

博士:うん、それが「潜在変数」の役割だよ。潜在変数は、ドラえもんの絵をどうやって描くかの「指示」を、コンピュータが理解するための言葉みたいなものなんだ。

小学生:それって、どういうこと?

博士:たとえば、君がドラえもんの絵を描くときに、大きな丸い頭、四角い体、目、鼻、口、耳と描くように、コンピュータも同じような「指示」をもとにドラえもんの絵を理解するんだ。でも、コンピュータが使う「指示」は、「色の明るさはどれくらいか?」「形は丸い?四角い?」など、もっと詳しく、そして大量の情報が必要なんだ。

小学生:それが「潜在変数」なの?

博士:そのとおり!潜在変数は、画像を理解するための「指示」や「ルール」のようなものなんだ。それらはドラえもんの絵がどのように描かれているかを表す情報を持っていて、その情報を使ってコンピュータは画像を理解することができるんだよ。

小学生:なるほど、なんとなく分かったような気がする。

博士:うん、それが大切なんだよ。コンピュータが画像を理解するためには、それぞれの部分がどのように描かれているかを理解することが必要なんだ。そして、それができるのが潜在変数なんだよ。

小学生:そういうことなら、分かるような気がする。ありがとう、博士!

博士:いつでも質問してくれていいんだよ。楽しみながら学べることが一番大切なんだからね!

Inspired by ChatGPT4

上のやりとりにあるように、潜在変数はVAEにとっての画像の理解を表す特別な数値列です。VAEは潜在変数を介して画像を理解しますが、人間が潜在変数を見ても解釈できません。例えば、512×512のカラー画像に対応する潜在変数は64×64×4の数値列となります。

重要な点は、潜在変数は画像に比べると要素数が非常に少ないことです。512x512のカラー画像の要素数は512x512×RGB=786,432ですが、潜在変数の要素数は64x64x4=16,384なので、これは元の画像に対して48倍に圧縮されています。

その結果、画像全体ではなく、圧縮された潜在変数に対して拡散過程と復元過程を行うことで、大幅に計算量が削減されます。

まとめ

潜在拡散モデルとは、要素数が少ない潜在変数上で拡散過程と復元過程の計算を行うことで、従来の拡散モデルに比べて劇的に計算量が軽減されるという特徴を持つ拡散モデルです

潜在拡散モデルの登場によって拡散モデルの研究がより早く進むようになり結果としてStable Diffusionも生まれました。

次の記事に向けて

今回は、潜在拡散モデルについて画像を生成する部分について解説しました。

しかし、テキストがどのような仕組みで生成される画像に反映されるかについてはまったく説明できていません。

次回はより一般的にtext to imageモデルにおいてテキストがどのような仕組みで生成される画像に反映されるかについて解説しようと思います。

次の記事は公開できても来週末になるので、是非コメントで感想・疑問点やもっと解説して欲しい内容についてフィードバックをもらえると嬉しいです!

この記事が気に入ったらサポートをしてみませんか?