🦊CFG
🏠/🦊雑に学ぶComfyUI
前/🦊latent diffuison modelsとVAE
次/ComfyUI Manager
参考
https://arxiv.org/abs/2207.12598Classifier-Free Diffusion Guidance
CFG
CFGはモデルが画像を生成する際、どれだけ条件(conditioning)に縛られるかを決めるものです
条件の最たるものがテキストプロンプトです。CFGを高くするほど自由度を失う代わりにプロンプトに従った画像を生成するようになります
ただし、CFG 5で "13時を示す時計" が描けなかったからといって、CFGを12にしたところで描けるようになるとは限りません
CFGはconditioningで"縛る"ものであり、そのconditioningが"13時を示す時計 "をよく理解していなかったり、そもそも使っているモデルの性能が悪ければどれだけCFGを高くしても意味がありません
プロンプトに従わないからといってCFGの調整に必死になっても、時間の無駄になる可能性があります
一方で、モデル × サンプラー × step数 × CFG これらのパラメータには、アーティファクトの発生や"burning"といった過飽和・過露出異常な画像が生成されてしまう組み合わせがあります
その点には注意しましょう
🦊SamplerCustomノードと🦊SplitSigmasノードを活用して多重にSamplerを重ねればステップ単位でCFG(どころかSamplerそのものすら)変えることも可能…ですが少々ややこしいので説明は割愛。
うまく行かない組み合わせ
CFG#640be2dee2dacc000040916eにある表の黄色や赤になっている組み合わせは使わないほうが良いでしょう
DPM++ 2M Karrasでstep数20だとcfg25を超えてくると赤信号です
https://gyazo.com/2726d797e03185230ce53475d48d707b
$ DPM++ 2M Karras / Step数 20 / CFG 8
https://gyazo.com/262e228b7207b827b105bfad833d3ac5
$ DPM++ 2M Karras / Step数 20 / CFG 30
https://gyazo.com/375e367784f6446fcc1e4a0a93fbc0cb
CFG以外の原因でも、このように彩度が上がりすぎた画像が生成されることがありますが、このような画像をover-saturated colorsやburn outと表現することがあります
LCM
LCMは特殊でstep数3 ~ 8、CFGが1 ~ 1.5でうまく生成できます
CFGを1丁度にすると、ネガティブプロンプトが無視されるらしいので、注意
参考元→https://github.com/comfyanonymous/ComfyUI/discussions/2081
蒸留モデル
Flux.1-devやHiDream-I1-Devがそうですが(上のLCMもそう)、ベースモデルに蒸留ということをして高速・軽量に動作するようにしたモデルがあります
蒸留前のモデルは条件付き(positive)+非条件付き(negative)を別々に計算しますが、蒸留によって一回の計算で済むようになります
蒸留モデルではCFGを1にして生成するのですが、CFGを1にしたとき上手く生成できる、というよりは従来のCFGをオフ(つまりCFG=1)にして、代わりに蒸留時に組み込まれたDistilled CFG Scale(ComfyUIでは例えばFluxGuidanceノード)を使うという感じです
ComfyUIにおけるCFGの計算方法
CFGには二つの計算方法があり、ComfyUIでは後者が選ばれています
$ output = positive + guidance_scale * (positive - negative)
$ output = negative + guidance_scale * (positive - negative)
直感的にはguidance_scale(CFG)を0にすればnegativeが無効になりそうですが、ComfyUIでは output = negative + 0 * (positive - negative) = negative になりnegativeのみの生成になります
CFGを1にすると、output = negative + 1 * (positive - negative) = positiveとなりnegativeが無効になります
あまりこだわるパラメータではないので例外はありますが基本的に以下の値を使っていきます
Stable DIffusion 1.5 / SDXL
$ steps: 20 / cfg: 6 ~ 8 / sampler: euler / scheduler: normal
or
$ steps: 20 / cfg: 6 ~ 8 / sampler: dpmpp_2m / scheduler: karras
蒸留モデル
$ steps: 20 / cfg: 1 / sampler: euler / scheduler: normal
数ステップ蒸留モデル
$ steps: 4 ~ 6 / cfg: 1 / sampler: euler / scheduler: normal
(Archive)🦊CFG