生成速度を2倍にするLoRA
cfg_scaleを1にしてもまともな画像が出てくるようにすることで、生成速度を2倍にするLoRAを作ったよ。
はじめに
Stable DiffusionではClassifier Free Guidanceというものが使われています。これは適当に言うとプロンプトなしの生成を基準にしてプロンプトの効果を増幅するようなものです。
$${\mathrm{cfg} = \phi + \mathrm{s}(c- \phi)}$$
$${c}$$は何らかのプロンプトによる生成、$${\phi}$$は空文による生成で、$${s}$$がCFG scaleとかGuidance scaleとか言われるものです。1に設定するとプロンプトによる生成だけの結果になります。
AUTOMATIC1111氏はCFG scaleを大きくすると$${\phi}$$から離れていくという点に着目して、空文ではなく望ましくないプロンプトを表すネガティブプロンプトによる生成を使うことを提案しました。
$${\mathrm{cfg} =n + \mathrm{s}(c- n)}$$
これが一般的に使われている式です。この方法は非常に強力ですが、一個だけ弱点があります。それは生成時間が二倍になることです。二つのプロンプトによる生成を使うので当然ですね。じゃあ初めから左辺のような結果が出てくるようにLoRAを学習すれば1回分の生成で済むやん、っていうのが今回の発想です。この発想自体はこの論文にあります。このLoRAを作るためにLECOを使います。
LECO
LECOで使われる式はCFGと似てますというかほぼおんなじです。例えば$${c}$$というプロンプトに$${c'}$$という意味を付け加えたいとき、LECOでは以下のような結果になるようなLoRAを作ります。
$${c = n + s(c'-n)}$$
逆に除去したいときは$${s}$$をマイナスにすればいいのですが、そういう話は置いておいて、先ほどの話はLECOで達成できることが分かると思います(本当か?)
学習設定
というわけで今回やってみたプロンプトの設定はこんな感じ。2000ステッポやってみました。
- target: "1girl"
positive: "1girl, masterpiece, best quality"
negative: "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name"
neutral: ""
guidance_scale: 12.0
結果
XL系のアニメモデルであるNekoRayXLで試していまあす。
まずLoRAなしでcfg scale=1と7だとこんな感じ
それに対して今回作ったLoRAを適用すると、
といった感じでまあcfg scale=1でもまともに生成できています。逆に普通の設定だと極端な画像ができあがりますね。
感想
実用性ありそうな感じもしますがいくつかの欠点があります。
ネガティブプロンプトが使えない
プロンプトの利きが悪い
そもそもcfg scale=1でも生成時間が変わらない実装がある
1.はネガティブプロンプト側の計算をしていないので理論上どうしようもないことです。使わなくていいのでメリットといえなくもないですが・・・。
2.はLECOによって増幅させたのが、1girlやネガティブプロンプトだけで、一般的なタグに対する増幅効果がないためにプロンプトが効きづらいような感じがします。先ほどの例は(blush:1.5)なのにそんな感じしないですよね。この対策として学習時にランダムなキャプションを追記するということが考えられますが、それでどれほどカバーできるやら・・・
3.は推論環境によっては、cfg scale=1なんていう変態設定を想定されておらず生成時間が変わらないことがあります。cfg scale=1のときだけアルゴリズムを変えなくてはいけないのでしょうがないですね。ComfyUIは対応していますが、AUTOMATIC1111氏のwebuiは今どうなっているか知りません。また拡張機能の方でこういった計算が想定されていない可能性もあって、私のIP-Adapter-ComfyUIもこの場合はエラーになります。
今回作ったLoRA