テキストエンコーダーとベクトル演算が引き起こすプロンプト混在の謎

スタジオ真榊のAIイラスト術解説になぜ、複数キャラクターのプロンプトが混じってしまうのかというのがあるので、私なりに解説を試みてみましょう。

まず、画像生成AIのプロセスについて考える必要があります。代表的な、画像生成AIであるStable DiffusionについてはDeep Learning 論文 Advent Calendar 2022に参加された、omiitaさんの表した、「世界に衝撃を与えた画像生成AI「Stable Diffusion」を徹底解説!」があるのでこれを下敷きにします。

Stable DiffusionはText Encoder、拡散モデル、VAEというパーツで成り立っています。基本的にはプロンプトを解析する、Text Encoder、画像生成に重要な役割を担う拡散モデル(U-Net)を考えます。VAEは拡散モデルのはらんでいる問題点の解決には重要ですが、あとで考えても構わないと思います。

まず、「複数キャラクターのプロンプトが混じってしまう」要因には、Text Encoderが大いに関わっています。Stable DiffusionではText EncoderにCLIPという手法を使っていますが、これの役目はテキストをベクトルに変換することです。まず、試みに、”(1 girl, blue hair color), (1 boy, red hair color)”というプロンプトを考えます。

“()”は通常、Stable Diffusionでは、重みづけ以上の意味を持ちえません。故に、見た目ではグループ化のように見えますが、Stable Diffusionでは重みづけ以上の意味はありません。さて、ベクトル表現とはなんでしょうか? これは分散表現と大いに関係があります。

例えば、Kingという言葉を分散表現でとらえるとき、このような考え方ができます。King→男性の統治者、そうすると男性という概念と統治者という概念で表現できます。簡単に表そうとすれば(1,1)というベクトルでしょうか。この場合、最初の次元が例えば男性という概念、統治者というのが2次元目とします。

さて、女王と言うものを考えるためにベクトルの次元を増やしましょう。2次元目として女性という概念を加えます。この場合、先ほどの例は(1,0,1)というベクトルで表現できるかもしれません。昔、Word2vecが大流行りしたときに、王-男性+女性=女王というサンプルが多く見られました。これは以下の計算で、この例に当てはめられます。

(1,0,1)-(1,0,0)+(0,1,0)=(0,1,1)

ここまで、考えると、なぜプロンプトが混じるのかに答えが見えてきます。理由はベクトルの計算において、混じってしまうからです。先ほど、述べたように、()はStable Diffusionにおいて、重み以上の意味はありません。従って、書いたつもりになっていても単にベクトル演算の押し合いへし合いでかき回されているだけになります。

では解決策はどうするのか、何とかして計算を分離すればいいとなります。例えば、Latent Coupleなどでは、領域を分割して、そこに独立してText EncodingやU-Netを構築します。この辺は「複数キャラクターを分けて生成するLatent coupleの改良版!(Attention Couple)」あたりの解説を読むのが適切です。

以上、なぜ、プロンプトが混じるのかを解説してきました。

なぜ、VAEは特に説明しなかったのか? それは、基本的には拡散モデルの計算量を削減するための仕組みであり、実際上、VAEは画像の仕上がり具合には大きな影響がありますが、特に、最近では、VAEはモデルに組み込まれているものをそのまま使うことが多く、SD 1.5時代のように色味とかを考えてVAEを案じることがほぼ見られなくなっているため説明を省略しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です