第4回 -Scaleと強調表現の仕組みを理解しよう-

AIイラスト

Scaleと強調表現をうまく使えば、色汚染などを極力制御できないか??

みなさんはよくAIイラストを作成していて「Scale」という言葉を耳にしませんか?

 

私はよくします。
しかし、このScaleの正体を知っている方って意外といないと思います。
(私は感覚でAIイラストをやっているのでね!!!)

 

実は、このScaleの仕組みを理解すると
色汚染などを効果的に制御できる可能性があります!!


私、気になります!!(大パクリ)

 

 

早速、解説していきたいのですが、
今回の内容はかなり専門的な知識がベースとなっています。
(もちろん、この記事では踏み入った話はしないのでご安心を)

なので、今回は専門家兼アドバイザーとして
「でべろぱ(@ai_prompt_dev)」さんに知識をお借りします!
大変感謝しております。

 

この記事ではAnything v3.0を使用します。
確認はしていませんが、NovelAI上でも類似の傾向があると思われます。

 

本記事の目的

本記事では、

■Scaleと係数がどのように画像生成に関わっているかをざっくり解説
■実際に色汚染を防げるか挑戦
以上を目的としたいと思います。

まずは必要な知識から

今後話を進めるにあたって便宜上決めておきたいことがあります。

(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”に絡みつかれる感じです。

 

厳密には、単語ではなくtokenと呼ばれるものに対して処理されます。
tokenは、AI君が「単語」として認識するユニットのようなものです。
また、生成されたtoken群はtoken番号列なるものへと変換され、768次元ベクトルへ割り振られるなどの処理が実際には行われています。へー

 

②生成された単語を増幅係数によって強調する

ここでみなさんが普段使っている()や{}に出番が来ます!

①で単語群を生成した後に、()や{}によって強調処理が行われます。

 

例えば、

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上での活用方法

以上の仕組みを理解したうえで言えることは次の通りです。

1.単語は後ろの単語にのみ絡む(前の単語には絡まない)
2.増幅係数はそのまま影響値に倍率がかかるわけではない
3.Scaleはポジティブとネガティブを混ぜる比率を決定している
順に説明していきます。まずは1.から。

1.単語は後ろの単語にのみ絡む(前の単語には絡まない)

プロンプト内の単語は、後ろの単語にしか影響を及ぼしません!(絡まない)
でも、AIイラストを描いている方たちにとって、これは感覚と異なる内容だと思います。
たとえば、以下のようなプロンプトを考えてみます。
1girl, white hair, green jacket
実際に生成されたイラストがこちら。
白いジャケットになっていますよね?
実はこの絡みが色汚染の原因となっています。
つまり、“white hair”の”white”が後ろの”jacket”に絡んでいるというわけです。
ちなみに、「じゃあ、髪が緑になることはないの?」という疑問に対してですが、
残念ながら起こり得ます。
なぜかというと、“hair” が後ろの”green”に絡んでしまうためですね。
ただ、確率で言うと体感かなり少ないと思います。

2.増幅係数はそのまま影響値に倍率がかかるわけではない

難しい内容なのでサクッと行きます。
最後に言いたい結論に大きく関わる話でもないためです。

増幅係数は、絡み終わった後の単語(特徴量)に倍率を掛けます

倍率をかけられた単語はそこから影響値に変換されるため、
単純な倍率がそのまま影響度合いとイコールにはならないということですね。

 

「絡み終わった単語」は厳密には単語としてではなく、768個の数値へ変換されます。
この数値群を「特徴量」と呼びます。

3.Scaleはポジティブとネガティブを混ぜる比率を決定している

これは前述した適用式の内容ですね。

(Scale)×(ポジティブの影響値)(Scale-1)×(ネガティブの影響値)

重要なのは、
ネガティブの方がポジティブより影響度合いが小さくなるということです。

倍率で言うと、ネガティブはポジティブに対して
“(Scale – 1) / Scale 倍”されます。

つまり、
Scaleが小さくなるほど、ネガティブは相対的に効きにくくなる筈です。

 

ちなみに、ポジティブとネガティブを強引に打ち消そうとすれば、
token位置を互いに合わせてから、ネガティブだけ上記の倍率をかければ理論上は可能です。
しかし、ポジティブとネガティブがどうしても互いに共通する要素を持つせいで、
生成画像が歪まされてしまう印象が個人的にはあります。

 

結論

色々難しい話をしたけれど、定量的な制御は不可能!!

理由は簡単です。
特徴量や影響値の計算を我々一個人が知りえることは現状難しいからです。
そこが分からないと増幅係数をどの程度にすればいいかという定量的判断はできません。
(でべろぱさん曰く、一応tokenからの距離に対して反比例のような減衰をするらしいです)

 

しかし、意識することでクオリティを上げるテクニックはあります!!

 

■増幅係数よりも単語の順番を意識すべし
■増幅係数は感覚で調整するしかないため、最終調整として使うべし
■Scaleに応じて増幅係数は調整しなおすべし
色々内部処理などを学んだ結果、割と当たり前とされるノウハウが重要だということが分かりました。
本当はブレイクスルー的発想が思いつくかなと期待していたのですが、
どちらかというと今まで感覚的にやってきたことに対する意味付けのような内容になりました。
最近のAIイラストを見ていると、以前より比較的全体のクオリティが上がってきているように思います!
(一方で多様性は失われてきている気もしますが…)
今回の内容のような些細なことに気を配るかどうかが、今後はより意味を持ってくるのではないかと思います。
今回はこのあたりで。ではまた。

 

かわいい。

コメント

  1. もんた より:

    こういった小さな考察の積み重ねが大切なんですよね。わかりやすい解説ありがとうございました。

タイトルとURLをコピーしました