呪文は短いほうが良い。
とよく言われます。最近は BREAK 構文を用いるためトークン数を気にしない人も増えているような気もしますが、それでも少ないに越したことはありません。
Stable Diffusion の場合、75トークンで1セット。75なんてあっという間ですから節約できるならしたほうが良い。トークン数に余裕があれば後々のプロンプト調整も楽ですし。
1.トークン節約法
というわけでトークン数を節約する簡単な方法。
カンマ(,)を記入しない。
これだけです。
例えば以下のプロンプト
woman, red ribbon, white shirt, library, books, table
これで 13 tokens です。
このプロンプトからカンマを抜くと、
woman red ribbon white shirt library books table
8 tokens になります。カンマの数分トークン数が減りましたね。
カンマは1トークンとして計算されるので当たり前の話なのですが、プロンプトが長くなればなるほどカンマの数も増えていくため、トークン数の肥大化にかなり影響しているのです。
では違いを確かめてみましょう。上記2つのプロンプト例で画像出力したものが下です。ポジティブプロンプト以外はすべて同じ設定にしています。
当然トークン総数が違うので同じ画像にはなりませんが目指すべき方向は一致しています。
ちなみにカンマを最後尾に複数配置してトークン数を13にしたプロンプト
woman red ribbon white shirt library books table, , , , ,
で生成するとこうなります。
先頭に近いプロンプトが強い影響を与える証左でしょう。
一つ注意点ですが、カンマの有無で生成結果が変わったのと同様に、単語同士の間のスペースの有無によっても結果が変わります。
womanredribbonwhiteshirtlibrarybookstable
このようにすべてのスペースを削除してみると、トークン数が9になりました。出力結果は以下です。
2.視認性問題の解決
さて、トークンを節約できることは分かりましたが、カンマはプロンプトの視認性という点では優れています。カンマが無いとどこで区切っているかよく分かりませんからね。
解決策としては2つ挙げられます。
1つ目、先頭の文字を大文字にする。
Girl Red ribbon White shirt Library Books Table
Stable Diffusion は一部単語(BREAK等)を除いて大文字と小文字の区別をしませんので、1フレーズの先頭を大文字にします。"Red ribbon" のように次の大文字までが一つの区切りという形にすれば見やすさは若干向上します。
2つ目、括弧で囲う。
(Girl:1.0) (Red ribbon:1.0) (White shirt:1.0) (Library:1.0) (Books:1.0) (Table:1.0)
括弧のみでは強調文になってしまうため ":1.0" を追記しています。これで元のプロンプトと全く同じプロンプトとしてみなされます。こうすることにより重みの調整がしやすくなるという利点も新たに生じますが、入力は少々面倒ですね。
ちなみに括弧を使うプロンプト、複数のフレーズを一気に囲っても同じ結果が得られます。具体例をお見せします。
以下のプロンプトはすべて 4 tokens です。
boy shirt hat smile
(boy shirt hat smile:1)
(boy:1) (shirt:1) (hat:1) (smile:1)
出力した結果は下の画像です。
括弧を個別につけようが範囲につけようが変わらないということが分かります。
3.余談:スペースにまつわる話
更に余談ですが、例えば "photo realistic" というフレーズは "photorealistic" という風に単語同士を繋げても同じ意味で通用します。Stable Diffusion のプロンプト上ではどのような挙動になるでしょうか。
以下のプロンプトはどちらも 4 tokens です。
super girl photo realistic
super girl photorealistic
photo realistic は単語同士を繋げて一つの単語にしても、トークン数は2つのままということが分かります。結果は以下です。
最初のほうに書いた
womanredribbonwhiteshirtlibrarybookstable
というスペース全消去の文で何故かトークン数が増えた理由も似たようなものです。
"red ribbon" という2トークンの単語同士をつなげた際に、Stable Diffusion は "re/dribb/on" という3パターンの文字列をそれぞれ1トークンと計算したため、トークン数の増加現象が生じたのです。
赤いリボンを表す単語が認識されなくなったため、出力画像からも赤いリボンが消えました。ただし Stable Diffusion は自然言語処理を行うらしいので、完全にリボンという言葉が消えてしまうわけではないと思われます。
トークンがどこで区切られているかを調べるには、
Prompt Counter · Streamlit (https://kawaiiprompter-streamlit-clip-counter-app-kb643n.streamlit.app/)
ここにプロンプトをコピペするだけで完了します。
以上、余談が多くなってしまいましたがプロンプトのトークン数を節約する方法の説明でした。
「AIが使えるスペックのPCなんてないよ!」という方は、クラウドでGPUを借りられるサービス Paperspace をおススメします。使い方は以下で解説しています。
0 件のコメント:
コメントを投稿