1.概要
今回はAUTOMATIC1111版Stable Diffusion WEB UIで、一般的に言われている75トークン内では最初が一番効果が強く、75トークン目に近づくほど効果が薄いという定説の検証と、『BREAK』の挙動について検証します。
実はこの説、AUTOMATIC1111の開発者も同様の発言をされている為、非常に説得力がある定説です。(※注釈1)
しかし今回、検証した結果、それは正しくもあり、間違ってもいるというのが結論に至りました。
正確に言うならば『75トークン内の位置・順序による重みの差はない、しかし確かに効果は変わる』のです。
はい、意味が分かりませんね。
では、実際に生成された画像とプロンプトを元に詳しく説明いたします。
2.プロンプトの順序と効果差
さて、今回検証用として下記のプロンプトを用意しました。
これは拡張機能『stable-diffusion-webui-tokenizer』でも、AUTOMATIC1111のプロンプト入力欄右上の数字でも、ギリギリ75トークン以内に収まるプロンプトです。このトークンカウント関係は今回割愛。
どっちだったとしても検証結果に響かないようにしたという点だけご理解いただければ問題ありません。
Seedは2620823678-2620823685のバッチサイズ:8の連続生成でHires.fixは行いません。そして今回は腹筋美女の腹筋レベルで効果を確認します。
(abs1:2)の位置を変更するということです。
そして上記を入力した結果がこちらの画像です。
ナイス腹筋、キレてるよ!
では、この(abs1:2),を最初に持ってきて、より腹筋が強化するのか確認してみましょう。
しかし最初に持ってくるだけで腹筋が鍛えられたら楽ですよね!
誰か私に(abs1:2)挿入してくれないでしょうか。あとhandsome faceも希b…おっと失敬。
そもそも(abs1:2)でもやや強めだから、どういう結果になるのか!
いざ参らん。
わーぉ、ナイスバルク! いいね! ボディビル選手権狙えるよ!
筋肉が生き生きしてるね! 腕の筋繊維も輝いてるね! って……おや?
absって腹筋じゃなくて全体的にマッチョ化する用語だった!?
確かに腹筋も強化されているように見える。
ただ、それ以上に体格や全体的な筋肉化が顕著ですね。
これは、まさかプロテインでもやっているのでしょうか?(※注:プロテインはただのタンパク質である)
一体全体どういうことだろうか?
・CLIPと自然言語処理
ここからちょっと専門的なお話です。
Stable Diffusionでテキストプロンプトでは、CLIPという文章と画像を学習したテキストエンコーダーから、U-NETというノイズから画像を生成する層に送られ、最終的にVAEで処理されて画像が出力されます。
このCLIPは入力されたプロンプトを自然言語処理で各単語や文章の関連性や意図を汲み取って、こういう画像希望ですという情報をU-NETに流しています。(※正確には色々違うのですが、難しいので大まかな説明です)
そして、このプロンプトは英語で入力されます。
英語圏は日本と比べても、結論を先に言う文化なので、自然言語処理的にも最初の単語や文章が『主』として取り扱われる確率が、より高いのです。
そうすると最初に(abs:1.2)と言われたCLIPは
『腹筋強め希望→腹筋強めってことはマッチョ→要約するとマッチョ女子ご希望っと。オーダー入りまーす、マッチョな美女がビーチにて笑顔で、服装指定あり。腹筋マシマシ、いい感じでオネシャス』
とU-NETに送るわけです。その結果が上記です。
これは英語に限定された話ではありません。
日本語でも近いことは起こります。
例えば天使の絵を見たとき、
『天使の絵だ。周囲には煌びやかな建造物が立ち並び、人々は幸せそうな顔で往来している。鳥や植物も生き生きとして正に天国を感じさせる』
『周囲には煌びやかな建造物が立ち並び、人々は幸せそうな顔で往来している。鳥や植物も生き生きとして正に天国を感じさせる、天使の絵だ』
どちらが天使を主な絵として感じられるでしょうか。
前者ではないでしょうか? 日本語はかなり結論を後に言う文化とされていますが、それでも後者より前者のほうが天使を主にした絵と感じられます。
要するにパラメーター的にプロンプトの重みが75トークン目に近くなるほど軽くなるというよりは、言語というものの特徴として、そうなってしまうというのが私の導き出した結論です。
この入力されたプロンプトそのものの重みに違いはないということは、GPT-4に質問した結果、得られた回答でもあります。
え? GPT-4にCLIPの情報聞いても正確な情報じゃなくない? hallucination(幻覚)かも知れないのでは?と思うかも知れません。しかし、GPT-4とSD1.5に搭載されているCLIPは同じOpenAIが開発しており、
という仕様としては77トークン制限(※注釈2)であることまで知っている為、
一定レベルの信用に足る情報でしょう。
つまりただ単に最初へ持ってきた方が、その通りの結果が得られるというわけではなく、75トークン内であっても文脈的に、正しいポジションに配置しないと求める効果は得られないというのが正解だと思われます。
その為、アメリカ英語が得意な方以外はGPTを活用し、プロンプトの手直しを行ったほうが理想に近づきやすいでしょう。
特に単純な単語配置(いわゆるWD・Danbooru・NOVEL AI式)だと意図せず相反する用語を入れた結果、無効になる。あるいは破綻するなどの結果を引き起こしやすいのです。
だから75トークン目に近いプロンプトが無効化されるという噂も流れたのではないかと考えられます。
3.BREAKの特徴と効果
さて、75トークンの話をすると、BREAKに関することを言及しないとなりません。何せ、BREAKは挿入すると強制的にトークン数を75まで調整する役割を持つ、特殊なプロンプトだからです。
詳しい説明をここですると読者の脳がBREAKしそうなので、BREAKも兼ねて、ここでBREAKの効果を検証した画像を添付します。
やはり見事なまでのマッチョ美女ですね。しっかし、『強めの腹筋で! 中断!』と命令されてCLIPも困惑でしょうね。
あとマッチョは服の上からでも乳首の形が浮き出ている率が高いとU-NETが学習している可能性がありますね!
今度は最後に、BREAKして、(abs1:2),を入れましょう。これならCLIPもご満悦。いい腹筋美女が出るに違いありません。
おや? 見知ったマッチョ美女ですね。
プロンプトを間違えたのでしょうか?
いえ、確かめてみても確かに最後、BREAK(abs1:2),です。
これは非常に面白いですね。
実はプロンプトの入力画面でも少し面白い現象が起きています。
右上の数字を確認してください。
そう、トークン数が異なって表示されています。
何故でしょうか?
BREAKというのはCLIPの自然言語処理的に無意味とされる文字(padding characters)を75トークン目まで入力し、強制的に次のシーケンスに移行させる効果を持ちます。
その為、最初に(abs1:2),BREAKした時は、この段階で75トークンとなり、それ以降がカウントされているわけです。
そして75トークンを超えた場合は、一度CLIPに送って処理し、また次のシーケンスもCLIPに送って処理し、その後結合する処理をAUTOMATIC1111では行っているそうです。難しいですね!(※注釈2)
それが具体的にどう影響するのか、どう処理されるのかまでは私も分かっていません。しかしながら、最初にBREAKしても後にBREAKしても、結果は変わらないということは一つ認識として持っておいて良いでしょう。
そう、だから出社してすぐBreakTimeを取っても問題はな…。
BREAK
次はBREAKせず、75トークンを超えた場合です。
やっぱりマッチョな美女が出ました。では、ここから,を一つだけ除外し、(abs1:2),を75トークン内に収めてみます。
おお! ご無沙汰しております。
素晴らしい腹筋です、ありがとうございます!
というわけで最初の結論。
『75トークン内の位置・順序による重みの差はない、しかし確かに効果は変わる』ということが分かったわけです。
同時に、単純に位置を移動させるよりは文脈的に最適な位置が理想である。という難題も浮かび上がりました。
結局プロンプト影響研究に終わりはなさそうです。
ただ上記のように文章メインで構成されたプロンプトは、モデルが変わっても露骨な変化がなく、そのモデルが学習している一番いい感じの画像を出してくれます。それがアジア系なのか、白人系なのかはモデルに寄りますが、それでも腹筋美女という点では割と安定します。
一方、WD・Danbooru・NOVEL AI式はモデルを変える度に大幅な調整が必要です。ただ同じモデルで同じ顔系統を出す為に固定するには適しています。
一長一短。上手いバランスを見出したいものです。
本当はネガティブプロンプトに関しても考察を書きたかったのですが、少々難解な情報を詰め込んだので、今回はここでBREAK。
また次の機会にさせていただきます。
ここまでお付き合いいただき、ありがとうございました。
4.注釈