NegPiPの仕組みとFLUX対応
FLUXは表現力が高いのですが、ネガティブプロンプトが使えないのはとっても困ります。ネガティブプロンプトを導入するためにはCFGを有効にする必要があるわけですが、生成時間が2倍になってしまいます。ただでさえ長い生成時間が2倍になるのは厳しいですね。そこでNegPiPの仕組みが使えないかと考えるわけです。
NegPiP(Negative Prompt in Prompt)はStable Diffusion 1.X, 2.X向けに私が考案した手法です。原理上、ネガティブプロンプトはプロンプトよりも弱めに効くようになっているわけですが、プロンプトと同じ強度でネガティブプロンプト使えるようにする仕組みです。これにより従来のネガティブプロンプトでは対応できなかった物まで消せるようになったわけですね。
https://github.com/hako-mikan/sd-webui-negpip
ここで少し仕組みを解説しておきます。いじっているのは生成AIの肝と呼ばれるAttention機構です。Attention機構の解説は別に譲るとして、重要なのはQuery, Key, Valueという値です。

Attention機構ではAttention(注意)の名の通り、注目する部分というのを計算します。そこで使うのがQueryとKeyであり、計算結果として注目するべき部分というのがわかります。その部分の重みを強くする事を続けることで絵が出てくるわけです。ここで言う重みの部分がValueですね。例えば"anime"というプロンプトが入力されたとき、QueryとKeyを計算することで画像の中の"anime"っぽい部分を探します。通常はそこを増強するようにValueが働くわけですが、NegPiPではValueの値を反転させることで消すように働かせるのです。単純ですね。この程度の機能はデフォルトで実装しておいてもらいたいです。
NegPiPと名付けましたが今思えばNegative Attentionとかの方がしっくりくるような気もしますが、一般的すぎる名前なので検索にひっからなくなりそうでもありますね。
では実際にFLUXに適用したものの効果を見てみましょう。FLUXではアニメっぽい言葉を入れると強制的にアニメ調になってしまう問題がありました。Japaneseだけでは大丈夫ですが、"sailor uniform"とか入れちゃうと途端にアニメ調になってしまいます。そこで"anime"をマイナスにしてみます。

ちゃんと実写になりましたね。効果が確認できました。レポジトリの例も試してみます。

ちゃんと効果が現れていますね。-1.5の所は効果にばらつきがあるのですが、なぜなのかはよく分かってないです。また、FLUXは自然言語の方が強いはずなのですが、まだ自然言語を入れるとどうなるかなどの検証かしていないので実験的に使ってもらえるとありがたいです。
