プロンプトのトークン数を節約する方法 [Stable Diffusion]

27/05/2023

AI StableDiffusion

呪文は短いほうが良い。

とよく言われます。最近は 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つのままということが分かります。結果は以下です。


単語の並び順、トークン数が変わらなくても出力画像に変化が出ることが確認できました。

ここで「なんでスーパーガール?」と思った方もいるかと思います。
実は "super girl" というフレーズを "supergirl" と1単語で表すと、なんと2トークンだったものが1トークンになります。出力結果は以下。


なんというか、よりドラマに近づいたというか……。
認識する単語もトークン数も変わったため、絵の変化度合いは大きいですね。


最初のほうに書いた

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 をおススメします。使い方は以下で解説しています。

Paperspace で Stable Diffusion WebUI を起動するまで(終了方法と2回目以降の起動も説明)

Paperspace で Stable Diffusion WebUI を起動するまで(終了方法と2回目以降の起動も説明)

AIで画像を生成したいけど高スペックPCなんて無いよ!という人にオススメなのが Paperspace です。 Build & scale AI models | Paperspace Cloud Machine Learning, AI, and effortless GPU ...


Major Contents

Contact us

名前

メール *

メッセージ *

QooQ