SD1.5系のときはすごい過学習すると言われて持て余されてたProdigyオプティマイザー
SDXLになってとても早くLoRAが出来上がるということで脚光を浴びた
そこで推奨してるスケジューラーがスケジューラーを使わないconstantかCosineAnnealing
constantはいいとしてCosineAnnealingLRはsd-scriptsのデフォルトで入ってないからじぶんで対応する必要があるし挙動を理解するのが手間だった
使い方
bmaltais/kohya_ssを使ってるのでAdditional parametersのところに下記を入力
--lr_scheduler_type "CosineAnnealingLR" --lr_scheduler_args "T_max=500" "eta_min=0e-0"
挙動

テキストエンコーダーの学習率の例
設定したlrを頂上として開始してT_maxのSTEP数で谷底に到着する
T_maxは半サイクルの値
基本1サイクルで考えてたから若干混乱したポイント
eta_minは谷底の値でデフォルト値は0だから使用例の設定は別に要らなかった
lr2-5eから始まってT_max900で谷底、1800でまた頂点
推奨設定
素材やタグ、他の設定も含め正しかろうパラメーターなら頂上へ向かうにつれてLoss率が増加傾向で谷底に向かうにつれて低下傾向を示すようになる
ということは学習完了時谷底であることが望ましい
総ステップ数/T_max=奇数
多分これでいい
他の設定のいじり方は知らない
lrは頂点の上限を決めるものなので高めに設定すればいい
Prodigyの設定
基本的に周期変動は使うなと言うのがリポジトリでも書いてある
T_max = 総ステップ数
これが普通のcosineを使うのと何が違うのかは知らない
調べてもない
何サイクルも変動させたい場合やウォームアップ使いたいときははoptimizer_args
"safeguard_warmup=False"
こうするとlrを正しく計算できる
LoRA+の設定
特に縛りはないはず
何せ新しい技術なもんでsd-scriptsのdev Branchで動かす必要がある

te_lr 2e-5
unet_lr 1e-4
loraplus_lr 16
枚数 90
epoch 100
総ステップ 9000
T_max 900*1
ロスアベレージの下がり方がキレイだといやらしい画像を生成したときより興奮を覚える
*1:学習中に完了時は底で終了するようにしたほうがいいと気づいた