見出し画像

『AUTOMATIC1111版Stable Diffusion WEB UIでの75トークン内プロンプトの効力とBREAKの意味』

1.概要

今回はAUTOMATIC1111版Stable Diffusion WEB UIで、一般的に言われている75トークン内では最初が一番効果が強く、75トークン目に近づくほど効果が薄いという定説の検証と、『BREAK』の挙動について検証します。

実はこの説、AUTOMATIC1111の開発者も同様の発言をされている為、非常に説得力がある定説です。(※注釈1)
しかし今回、検証した結果、それは正しくもあり、間違ってもいるというのが結論に至りました。

正確に言うならば『75トークン内の位置・順序による重みの差はない、しかし確かに効果は変わる』のです。

はい、意味が分かりませんね。
では、実際に生成された画像とプロンプトを元に詳しく説明いたします。

2.プロンプトの順序と効果差

さて、今回検証用として下記のプロンプトを用意しました。
これは拡張機能『stable-diffusion-webui-tokenizer』でも、AUTOMATIC1111のプロンプト入力欄右上の数字でも、ギリギリ75トークン以内に収まるプロンプトです。このトークンカウント関係は今回割愛。
どっちだったとしても検証結果に響かないようにしたという点だけご理解いただければ問題ありません。

tokenizerカウント
プロンプト入力欄カウント

At a tropical island beach, a delicate beauty with a lovely smile and a refined face plays in a tight floral T-shirt, wearing low-rise short denim shorts, revealing her sexy abdomen, Her artistic face, figure, and beauty, as well as her captivating soft, full breasts enchant viewers.HDR,top light,(abs1:2),

NegativePrompt:
nsfw,topless,nipple,(nail polish:1.5),(worst quality:2),(low quality:2),(navel piercing),lowres,deformed,blurry,bad anatomy,disfigured,poorly drawn face,mutation,mutated,malformation,extra limb,ugly,poorly drawn hands,missing limb,floating limbs,disconnected limbs,missing fingers,malformed hands,bad hands,multiple legs,long neck,long body,blur,out of focus,extra digit,fewer digits,cropped,signature,(bad-hands-5:0.5),watermark,username,artist name,Undesired Content,bar censor,jagged edges,

Steps: 80, Sampler: DDIM, CFG scale: 7, Seed: 2620823678, Face restoration: GFPGAN, Size: 512x768, Model hash: 7e78128329, Model: chilled_re-generic_v2fix, Clip skip: 2

Seedは2620823678-2620823685のバッチサイズ:8の連続生成でHires.fixは行いません。そして今回は腹筋美女の腹筋レベルで効果を確認します。
(abs1:2)の位置を変更するということです。
そして上記を入力した結果がこちらの画像です。

末尾に(abs1:2),

ナイス腹筋、キレてるよ!
では、この(abs1:2),を最初に持ってきて、より腹筋が強化するのか確認してみましょう。
しかし最初に持ってくるだけで腹筋が鍛えられたら楽ですよね!
誰か私に(abs1:2)挿入してくれないでしょうか。あとhandsome faceも希b…おっと失敬。
そもそも(abs1:2)でもやや強めだから、どういう結果になるのか! 
いざ参らん。

(abs1:2),At a tropical island beach, a delicate beauty with a lovely smile and a refined face plays in a tight floral T-shirt, wearing low-rise short denim shorts, revealing her sexy abdomen, Her artistic face, figure, and beauty, as well as her captivating soft, full breasts enchant viewers.HDR,top light,

最初に(abs1:2),

わーぉ、ナイスバルク! いいね! ボディビル選手権狙えるよ!
筋肉が生き生きしてるね! 腕の筋繊維も輝いてるね! って……おや?
absって腹筋じゃなくて全体的にマッチョ化する用語だった!?

確かに腹筋も強化されているように見える。
ただ、それ以上に体格や全体的な筋肉化が顕著ですね。
これは、まさかプロテインでもやっているのでしょうか?(※注:プロテインはただのタンパク質である) 
一体全体どういうことだろうか?

・CLIPと自然言語処理

ここからちょっと専門的なお話です。

Stable Diffusionでテキストプロンプトでは、CLIPという文章と画像を学習したテキストエンコーダーから、U-NETというノイズから画像を生成する層に送られ、最終的にVAEで処理されて画像が出力されます。

このCLIPは入力されたプロンプトを自然言語処理で各単語や文章の関連性や意図を汲み取って、こういう画像希望ですという情報をU-NETに流しています。(※正確には色々違うのですが、難しいので大まかな説明です)

そして、このプロンプトは英語で入力されます。
英語圏は日本と比べても、結論を先に言う文化なので、自然言語処理的にも最初の単語や文章が『主』として取り扱われる確率が、より高いのです。
そうすると最初に(abs:1.2)と言われたCLIP

『腹筋強め希望→腹筋強めってことはマッチョ→要約するとマッチョ女子ご希望っと。オーダー入りまーす、マッチョな美女がビーチにて笑顔で、服装指定あり。腹筋マシマシ、いい感じでオネシャス』

U-NETに送るわけです。その結果が上記です。

これは英語に限定された話ではありません。
日本語でも近いことは起こります。
例えば天使の絵を見たとき、

『天使の絵だ。周囲には煌びやかな建造物が立ち並び、人々は幸せそうな顔で往来している。鳥や植物も生き生きとして正に天国を感じさせる』

『周囲には煌びやかな建造物が立ち並び、人々は幸せそうな顔で往来している。鳥や植物も生き生きとして正に天国を感じさせる、天使の絵だ』

どちらが天使を主な絵として感じられるでしょうか。
前者ではないでしょうか? 日本語はかなり結論を後に言う文化とされていますが、それでも後者より前者のほうが天使を主にした絵と感じられます。

要するにパラメーター的にプロンプトの重みが75トークン目に近くなるほど軽くなるというよりは、言語というものの特徴として、そうなってしまうというのが私の導き出した結論です。

この入力されたプロンプトそのものの重みに違いはないということは、GPT-4に質問した結果、得られた回答でもあります。

『CLIPモデルは、トランスフォーマー・アーキテクチャをベースにしているため、シーケンス内のすべてのトークンは同時に処理されます。トランスフォーマー・アーキテクチャは、位置情報も考慮して各トークンの関連性を学習しますが、特定の位置に重みを置くことはありません。
そのため、最初のトークンと75番目のトークンがU-NETに送られる際の影響力に大きな違いはないと考えられます。ただし、文脈や意味が連続したテキスト内での相対的な位置によって、モデルの解釈や重み付けが異なる場合があります。
具体的な違いの程度は、モデルの学習や評価を通じて得られる知識や、入力されるテキストの具体的な内容に依存します。ですが、基本的には、CLIPモデルはトークンの位置に関係なく、文脈や意味を適切に捉えるように設計されています。』

ChatGPT/GPT-4の回答より

え? GPT-4にCLIPの情報聞いても正確な情報じゃなくない? hallucination(幻覚)かも知れないのでは?と思うかも知れません。しかし、GPT-4とSD1.5に搭載されているCLIPは同じOpenAIが開発しており、

CLIPモデルはテキスト入力に関して一定の長さの制限があります。OpenAIがリリースしたCLIPモデルは、デフォルトで77トークンの制限が設定されています(最初と最後に特別なトークンが追加されるため、実際に入力できるテキストは75トークンまでです)。

ChatGPT/GPT-4の回答より

という仕様としては77トークン制限(※注釈2)であることまで知っている為、
一定レベルの信用に足る情報でしょう。

つまりただ単に最初へ持ってきた方が、その通りの結果が得られるというわけではなく、75トークン内であっても文脈的に、正しいポジションに配置しないと求める効果は得られないというのが正解だと思われます。
その為、アメリカ英語が得意な方以外はGPTを活用し、プロンプトの手直しを行ったほうが理想に近づきやすいでしょう。

特に単純な単語配置(いわゆるWD・Danbooru・NOVEL AI式)だと意図せず相反する用語を入れた結果、無効になる。あるいは破綻するなどの結果を引き起こしやすいのです。
だから75トークン目に近いプロンプトが無効化されるという噂も流れたのではないかと考えられます。

3.BREAKの特徴と効果

さて、75トークンの話をすると、BREAKに関することを言及しないとなりません。何せ、BREAKは挿入すると強制的にトークン数を75まで調整する役割を持つ、特殊なプロンプトだからです。

詳しい説明をここですると読者の脳がBREAKしそうなので、BREAKも兼ねて、ここでBREAKの効果を検証した画像を添付します。

最初に(abs1:2),BREAK

(abs1:2),BREAK
At a tropical island beach, a delicate beauty with a lovely smile and a refined face plays in a tight floral T-shirt, wearing low-rise short denim shorts, revealing her sexy abdomen, Her artistic face, figure, and beauty, as well as her captivating soft, full breasts enchant viewers.HDR,top light,

やはり見事なまでのマッチョ美女ですね。しっかし、『強めの腹筋で! 中断!』と命令されてCLIPも困惑でしょうね。
あとマッチョは服の上からでも乳首の形が浮き出ている率が高いとU-NETが学習している可能性がありますね!
今度は最後に、BREAKして、(abs1:2),を入れましょう。これならCLIPもご満悦。いい腹筋美女が出るに違いありません。

最後にBREAK(abs1:2),

At a tropical island beach, a delicate beauty with a lovely smile and a refined face plays in a tight floral T-shirt, wearing low-rise short denim shorts, revealing her sexy abdomen, Her artistic face, figure, and beauty, as well as her captivating soft, full breasts enchant viewers.HDR,top light,
BREAK(abs1:2),

おや? 見知ったマッチョ美女ですね。
プロンプトを間違えたのでしょうか?
いえ、確かめてみても確かに最後、BREAK(abs1:2),です。
これは非常に面白いですね。
実はプロンプトの入力画面でも少し面白い現象が起きています。
右上の数字を確認してください。

143/150
78/150

そう、トークン数が異なって表示されています。
何故でしょうか?

BREAKというのはCLIPの自然言語処理的に無意味とされる文字(padding characters)を75トークン目まで入力し、強制的に次のシーケンスに移行させる効果を持ちます。
その為、最初に(abs1:2),BREAKした時は、この段階で75トークンとなり、それ以降がカウントされているわけです。

そして75トークンを超えた場合は、一度CLIPに送って処理し、また次のシーケンスもCLIPに送って処理し、その後結合する処理をAUTOMATIC1111では行っているそうです。難しいですね!(※注釈2)

それが具体的にどう影響するのか、どう処理されるのかまでは私も分かっていません。しかしながら、最初にBREAKしても後にBREAKしても、結果は変わらないということは一つ認識として持っておいて良いでしょう。

そう、だから出社してすぐBreakTimeを取っても問題はな…。

BREAK

次はBREAKせず、75トークンを超えた場合です。

At a tropical island beach, a delicate beauty with a lovely smile and a refined face plays in a tight floral T-shirt, wearing low-rise short denim shorts, revealing her sexy abdomen, Her artistic face, figure, and beauty, as well as her captivating soft, full breasts enchant viewers.HDR,top light,,,,,,,,,,,,,,,(abs1:2),

,,,,,,,,,,,,,,,(abs1:2),

やっぱりマッチョな美女が出ました。では、ここから,を一つだけ除外し、(abs1:2),を75トークン内に収めてみます。

At a tropical island beach, a delicate beauty with a lovely smile and a refined face plays in a tight floral T-shirt, wearing low-rise short denim shorts, revealing her sexy abdomen, Her artistic face, figure, and beauty, as well as her captivating soft, full breasts enchant viewers.HDR,top light,,,,,,,,,,,,,,(abs1:2),

,,,,,,,,,,,,,,(abs1:2),

おお! ご無沙汰しております。
素晴らしい腹筋です、ありがとうございます!

というわけで最初の結論。
『75トークン内の位置・順序による重みの差はない、しかし確かに効果は変わる』ということが分かったわけです。
同時に、単純に位置を移動させるよりは文脈的に最適な位置が理想である。という難題も浮かび上がりました。

結局プロンプト影響研究に終わりはなさそうです。
ただ上記のように文章メインで構成されたプロンプトは、モデルが変わっても露骨な変化がなく、そのモデルが学習している一番いい感じの画像を出してくれます。それがアジア系なのか、白人系なのかはモデルに寄りますが、それでも腹筋美女という点では割と安定します。

一方、WD・Danbooru・NOVEL AI式はモデルを変える度に大幅な調整が必要です。ただ同じモデルで同じ顔系統を出す為に固定するには適しています。
一長一短。上手いバランスを見出したいものです。

本当はネガティブプロンプトに関しても考察を書きたかったのですが、少々難解な情報を詰め込んだので、今回はここでBREAK。

また次の機会にさせていただきます。

ここまでお付き合いいただき、ありがとうございました。

4.注釈

注釈1:
So after a bit of poking around in code, here is what it does (and i would have preferred if you described the mechanism in the PR message).
Rather than run CLIP once on a string on any length, this breaks the string into groups of 75 tokens, runs CLIP on each of those, and combines results. So 75th token has relation to all tokens before it, its weight is very low, and 76th knows nothing about what came before it, has extremely high weight (because it's first in its sequence), and is totally unrelated to 75 previous ones. It's very convenient for text mostly made out of meaningless commas, and it seems like it would be much less so for a proper prompt.
So the above could be a problem, and it could be okay, but there is another thing that is definitely a problem, and this is if a textual inversion embedding with multiple number of vectors per tokens is placed at the border between 75 characters. Then it would be split between two independent groups of tokens and probably would not produce very good results.

https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/2138#issuecomment-1272825515

注釈2:
Typing past standard 75 tokens that Stable Diffusion usually accepts increases prompt size limit from 75 to 150. Typing past that increases prompt size further. This is done by breaking the prompt into chunks of 75 tokens, processing each independently using CLIP's Transformers neural network, and then concatenating the result before feeding into the next component of stable diffusion, the Unet.
For example, a prompt with 120 tokens would be separated into two chunks: first with 75 tokens, second with 45. Both would be padded to 75 tokens and extended with start/end tokens to 77. After passing those two chunks though CLIP, we'll have two tensors with shape of (1, 77, 768). Concatenating those results in (1, 154, 768) tensor that is then passed to Unet without issue.

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#infinite-prompt-length

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