Scaleと強調表現をうまく使えば、色汚染などを極力制御できないか??
みなさんはよくAIイラストを作成していて「Scale」という言葉を耳にしませんか?
私はよくします。
しかし、このScaleの正体を知っている方って意外といないと思います。
(私は感覚でAIイラストをやっているのでね!!!)
実は、このScaleの仕組みを理解すると
色汚染などを効果的に制御できる可能性があります!!
私、気になります!!(大パクリ)
早速、解説していきたいのですが、
今回の内容はかなり専門的な知識がベースとなっています。
(もちろん、この記事では踏み入った話はしないのでご安心を)
なので、今回は専門家兼アドバイザーとして
「でべろぱ(@ai_prompt_dev)」さんに知識をお借りします!
大変感謝しております。
本記事の目的
本記事では、
■実際に色汚染を防げるか挑戦
まずは必要な知識から
今後話を進めるにあたって便宜上決めておきたいことがあります。
(Apple:1.2)
上のような表現を見たことがあると思います。
この書き方をした時の「1.2」という数値を、記事内では増幅係数と呼ぶことにします。
画像生成のシステムについて
Scaleや増幅係数がどのような働きを持っているか知るために、
まずAIイラストの生成手順をざっくりと説明しますね。
一体、1Stepの間にどのような処理が行われているのでしょう?
①プロンプト同士が絡み合う
プロンプト同士が絡み合う…
別にいかがわしい話ではないです。
想像力が豊かですねみなさま、オホホホ
冗談はさておき、この「絡み合う」とは簡潔に言うと、
「プロンプトに記入した単語が他の単語に影響を及ぼして、新たな単語群を生成する」
といったようなイメージです。
例えば、
apple red apple blue apple
というpromptがあるとすると、
“apple” “apple red apple” “apple red apple blue apple“
という単語群を生成するイメージです。
2つ目のappleは”apple red”に絡みつかれ、
3つ目のappleは”apple red apple blue”に絡みつかれる感じです。
②生成された単語を増幅係数によって強調する
ここでみなさんが普段使っている()や{}に出番が来ます!
①で単語群を生成した後に、()や{}によって強調処理が行われます。
例えば、
apple red (apple:1.5) blue apple
というPromptがあるとすると、
先述した通り、”apple“と”apple red apple“と”apple red apple blue apple“が生成されますが、
増幅係数をつけた”(apple:1.5)”が”apple red”に絡まれた結果として生成された
“apple red apple”が1.5倍強調されます!
ただし、注意が必要なのは単純に影響度合いが1.5倍されるわけではないということです。
この増幅係数を考慮してできた単語群は、更にある処理を行って現在のイラストへの影響値へと変換されます。
この処理を行うときに1.5倍された単語は
そのままの係数で影響値へと変換される訳ではない、というわけですね。(難し~~w)
ちなみにここで増幅係数の役目は終わりです。はやっ
③ネガティブプロンプトとの影響度合いを考える
さあ、ついに登場です。ネガティブプロンプト。
ネガティブプロンプトの説明はもはや不要ですね。割愛します。
実は、ネガティブプロンプトが1Stepの処理の中で初登場するのはここではないです。
①と②の処理はポジティブプロンプトとネガティブプロンプトどちらにも同時に行われます。
そして、
ポジティブプロンプトとネガティブプロンプトそれぞれで計算された影響値(②)を
ここで混ぜることで最終的な影響値を決定します。
では、一体ポジティブとネガティブの影響値(②)をどういう風に混ぜているのでしょう?
実はそこにScaleが関係しています。
影響値を混ぜるときの数式は以下のようになります。
(Scale)×(ポジティブの影響値) + (Scale-1)×(ネガティブの影響値)
つまり、
Scaleは、ポジティブ影響値とネガティブ影響値の比率に関係しているということです。
もし、Scaleの数値によってネガティブの増幅係数にあたりをつけようとしているならば、
Scaleをむやみやたらに変えられないということになります。
Scaleが変化すると影響値の比率も変わってしまうため、
増幅係数を一から考え直さないといけなくなってしまうということです。
Step内処理のまとめ
いままでの①~③をイメージとしてまとめてみたいと思います。
なお記事内で出てくる”pp_tangled”などの名称は、便宜上つけているだけです。
ただ、この章の内容は読むとかえって分かりにくく感じる方もいらっしゃると思うので、
飛ばして頂いても一向にかまいません。
まず、ポジティブプロンプト(“pp”とします。)とネガティブプロンプト(“np”とします。)は、
前の単語に絡まれて以下のように変化します。
①の内容ですね。
pp -> pp_tangled
np -> np_tangled
そして、前の単語の影響を受けた単語群は、増幅係数によって影響度合いが増幅されます。
その後、イラスト(の種となる変数群)への影響値へと変換される流れです。
②の内容になります。
pp -> pp_tangled -> pp_tangled_enhanced -> pp_influenced
np -> np_tangled -> np_tangled_enhanced -> np_influenced
最後に②で計算したppとnpのそれぞれの影響値をScaleの数値に応じて混ぜます。
mixed_influences = np_influenced + SCALE*(pp_influenced – np_influenced)
next_roots = roots + mixed_influences
このようにして次のイラストの元となる変数群が生成されています。
UI上での活用方法
以上の仕組みを理解したうえで言えることは次の通りです。
2.増幅係数はそのまま影響値に倍率がかかるわけではない
3.Scaleはポジティブとネガティブを混ぜる比率を決定している
1.単語は後ろの単語にのみ絡む(前の単語には絡まない)
たとえば、以下のようなプロンプトを考えてみます。
1girl, white hair, green jacket

実はこの絡みが色汚染の原因となっています。
残念ながら起こり得ます。
ただ、確率で言うと体感かなり少ないと思います。
2.増幅係数はそのまま影響値に倍率がかかるわけではない
難しい内容なのでサクッと行きます。
最後に言いたい結論に大きく関わる話でもないためです。
増幅係数は、絡み終わった後の単語(特徴量)に倍率を掛けます。
倍率をかけられた単語はそこから影響値に変換されるため、
単純な倍率がそのまま影響度合いとイコールにはならないということですね。
3.Scaleはポジティブとネガティブを混ぜる比率を決定している
これは前述した適用式の内容ですね。
重要なのは、
ネガティブの方がポジティブより影響度合いが小さくなるということです。
倍率で言うと、ネガティブはポジティブに対して
“(Scale – 1) / Scale 倍”されます。
つまり、
Scaleが小さくなるほど、ネガティブは相対的に効きにくくなる筈です。
ちなみに、ポジティブとネガティブを強引に打ち消そうとすれば、
token位置を互いに合わせてから、ネガティブだけ上記の倍率をかければ理論上は可能です。
しかし、ポジティブとネガティブがどうしても互いに共通する要素を持つせいで、
生成画像が歪まされてしまう印象が個人的にはあります。
結論
色々難しい話をしたけれど、定量的な制御は不可能!!
理由は簡単です。
特徴量や影響値の計算を我々一個人が知りえることは現状難しいからです。
そこが分からないと増幅係数をどの程度にすればいいかという定量的判断はできません。
(でべろぱさん曰く、一応tokenからの距離に対して反比例のような減衰をするらしいです)
しかし、意識することでクオリティを上げるテクニックはあります!!
■増幅係数は感覚で調整するしかないため、最終調整として使うべし
■Scaleに応じて増幅係数は調整しなおすべし
どちらかというと今まで感覚的にやってきたことに対する意味付けのような内容になりました。
(一方で多様性は失われてきている気もしますが…)
かわいい。
コメント
こういった小さな考察の積み重ねが大切なんですよね。わかりやすい解説ありがとうございました。