nijijourneyのプロンプトのトークン数に関する検証
結論
- nijiourneyのプロンプト制限は75トークン
- 重みづけを利用することで75トークンの制限を回避できます。ただし重みづけの影響で寄与度は薄くなるため注意が必要です。
本文
(私の知る限り)nijijourneyには明確なドキュメントが存在しておらず、プロンプトの制限に関して以下のことが言われています。
- プロンプトは75トークン制限
- midjourneyのドキュメントには60トークン制限と記載 [参考]
Q: What is the length limit for prompts?
A: Anything over around 60 words will not affect the output, so don't write a novel. (It must stay under 6000 characters.)
そこでプロンプトのトークン数に関して以下の検証を行いました。
- プロンプト最大数の検証
- 重みづけによるプロンプト数の拡張
また、nijijourneyでも(おそらく)利用されているCLIPのトークン数はNovelAIが提供するTokenizer(モードをCLIP Tokenizerに要変更)や私の作ったカウンターPrompt Counterでトークン数を測ることができます。
検証1:プロンプト最大数の検証
「;で埋めた75トークンのプロンプト」と「75トークン目にcatを入れたプロンプト」と「76トークン目にcatを入れたプロンプト」を比較しました。
1. 75トークン分を;で埋める(ベース)
girl ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; --seed 0
2. 75トークン目をcatに変える
girl ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; cat --seed 0
→猫の要素が入り効果あり
3. 76トークン目にcatを追加
girl ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; cat --seed 0
→1の結果と同様であり効果なし。76文字目以降は無視される
検証1の結論
- 認識する最大数は75トークン
- 76トークン以降は無視される
検証2:重みづけによるプロンプト数の拡張
nijijourneyとmidjourneyには重みづけの機能があります[公式]。NovelAIやAUTOMATIC1111ではCLIPのtext encoderを通した後のembedded vectorの成分を増やしていますが、negative promptを加えた際に正の値にならなければならないなどの仕様から、midjourney系ではembedded vectorの演算を行っていると予想し、重みづけでのプロンプト数の拡張ができないかを試行しました。
4. 重みづけを利用
「1のプロンプト」と「";"を前半に74個埋めてcat」を重みづけしたプロンプトをそれぞれ1,1の割合で重みづけしました。
girl ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;::1
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; cat::1
--seed 0
→猫の要素が入り効果あり。2とは結果が異なっています。
5. 3つの重みづけが可能かの検証
さらに「3のプロンプト」と「";"を前半に74個埋めてcat」と「";"を前半に74個埋めてgreen」の3つを1,1,1の割合で重みづけしました。
girl ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;::1
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; cat::1
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; green::1
--seed 0
→若干、右上の服が緑になった程度。
6. 5+greenのweightを変更
5+「";"を前半に74個埋めてgreen」のweightを2に変更
girl ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;::1
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; cat::1
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; green::2
--seed 0
→緑要素の追加。girl,cat要素も影響度は小さくなっているが残っています。
検証2の結論
- 重みづけを利用することでプロンプトの拡張は可能。
- ただし個々の要素は薄くなるため、weightのかけ方に注意が必要。
コメント
- AUTOMATIC1111ではembedded vectorを次元方向にconcatしたものをUnetに渡していますが、重みの割合を指定することからmidjourney系ではembedded vectorを重みづけ和で演算したのちUnetに渡していると予想しています。StableDiffusionと同様にCrossAttentionでテキスト情報と画像情報を混ぜているとすると、concatした場合と比較し重みづけ和の場合は情報量が減ってしまいます。そのため依然としてmidjourney系では長文は向いていない可能性があります。(技術的な詳細は開示されていないのであくまで推論ですが・・・)
- またPlatさんの下記ツイートによるとデフォルトのトークンが存在しており、75トークンを使うとそれが適応されないとのことなのでそれも注意が必要です。(そちらも検証したかったのですがseedを固定しても「girl ;x50」,「girl ;x60」,「girl ;x70」,「girl ;x75」で結果が変わってしまい「;」や「,」の影響を無視しきれず私の方では正確に把握できませんでした。参考までに結果を末尾に載せておきます)
間違いなどございましたら、コメントやDMなどで教えていただけますと大変助かります。
宣伝(?)
プロンプトカウントアプリ(Prompt Counter)をnijijourneyに対応しました。重みづけをした際に各プロンプトごとのトークン数をカウントしますので、75トークンオーバーを監視しやすくなるかと思います。不具合があればご連絡ください。
(おまけ);の数を変えた場合の出力
girl ;x50 (seed=0)
girl ;x60 (seed=0)
girl ;x70 (seed=0)
girl ;x75 (seed=0)
;で埋めると画像の傾向は変わるのですが、デフォルトプロンプトによるものなのか;の効果によるものかの判別は難しいです…。
Discussion