LoRA オプティマイザ別の結果比較メモ



なにこれ

LoRAの学習をさせるにあたってオプティマイザ別での比較情報が欲しくなったが、高dimはあれど比較的低dimのケースでの情報は少なく感じた。
この類の情報は先行者との比較の上でも数があればあるほどよいだろうし、差があるならあるで興味深いと思い比較してみることにした。※あとNesterovの学習結果情報があんまりない
層別メモへのつながりが出てくることも期待している。
正則化画像検証も必要に応じて参照されたし。 

【注意】あくまでn=1の実例として捉えてほしい。
dimや学習データ等で当然自分自身の合否基準は変わってくるはずなのでそれぞれ参考にした上で最適な設定を選定しよう。

6/6 DAdaptLion検証結果を一部追加(Dim16のみ)

前提条件

  • 基本的な実行コマンド

accelerate launch --num_cpu_threads_per_process=4 "train_network.py" --enable_bucket --pretrained_model_name_or_path="【学習元モデル】" --train_data_dir="【学習データ】" --reg_data_dir="【正則化画像 元モデルでの生成100枚】" --resolution=1024,1024 --output_dir="【出力先】" --logging_dir="【ログ出力先】" --network_alpha="8" --training_comment="【学習時コメント】" --save_model_as=safetensors --network_module=networks.lora --network_args "conv_dim=8" "conv_alpha=1" --text_encoder_lr=5e-5 --unet_lr=0.0001 --network_dim=16 --output_name="【出力モデル名】" --lr_scheduler_num_cycles="20" --learning_rate="1e-4" --lr_scheduler="cosine_with_restarts" --lr_warmup_steps="1067" --train_batch_size="2" --max_train_steps="10670" --save_every_n_epochs="1" --mixed_precision="fp16" --save_precision="fp16" --seed="1234" --caption_extension=".txt" --cache_latents --optimizer_type="【指定オプティマイザ】" --clip_skip=2 --keep_tokens="2" --bucket_reso_steps=64 --xformers --persistent_data_loader_workers --bucket_no_upscale

  • 各オプティマイザごとの個別条件
    以下の通り上記のコマンドから一部条件を変更している。そのため完全同一条件とはならないことを留意されたし。
    • AdamW、Lion
      特になし
    • AdaFactor
      LRWarmup = 0 (設定できないため)
    • SGDNesterov
      momentum = 0.9 (設定が必要となる。無指定時に設定されるデフォルト値)
    • DAdaption
      learning rate, text encoder learning rate, unet learning rate = 1(DAdaptionではlr=1以上推奨のため)
      lrの操作は他とは影響が大きく異なると思われるためDAdaptionについては参考として見られたし。
    • DAdaptLion (6/6 New!)
      learning rate, text encoder learning rate, unet learning rate = 1(DAdaptionではlr=1以上推奨のため)
  • 学習データについて
    • 学習データ
      1キャラクターの全画像&衣装別画像でのタグ指定複合学習 繰り返し回数*画像数合計=1067 10epoch batchsize=2 計10670Step
    • 正則化画像
      学習元モデルで"girl"のキーワードのみで生成した画像100枚(512*512)
  • 比較にあたっての学習後生成条件
    • Seed
      112233,445566,778899,101011111212で固定
    • 画像サイズ
      512x768, 768x512の2パターン
    • CFG, Step, model, VAE
      CFG=12, Step=24, model=nullmix, VAE=kl-f8-anime2.ckpt

オプティマイザ別の出力結果

16/8/8/1での比較

学習速度比較

速い>>>遅い
Lion(1:58) > AdamW(2:03) >> SGDNesterov(2:28) >>DAdaption(3:04)> AdaFactor(3:10) >> DAdaptLion(5:19) (New!)

微差だが自環境(RTX4090を50%制限で使用)ではLionが一番10エポック完走までの所要時間は短かった。既知の通りAdaFactorは圧倒的に遅い。
上記スケールで注意すべきなのは、あくまで10エポック完走時の所要時間であること。
学習結果が例えば6エポック目で十分な内容になっているのであれば、実質所要時間の6割で問題ない、と見ることもできる。
6/6 DadaptLionでの検証結果を追加した。遅すぎて二度見した。結果から見ても、低Dimだと総ステップ数と時間がかさむ傾向があるかもしれない。高Dimでは使える傾向があることはみているので、別のもっと走行時間の短い学習セットで類似の比較をしたいところではある。

生成向けのプロンプトは以下。
(a)512x768
prompt:【LoRAトリガーワード】 is dancing in field full of flowers, wearing red dress white skirt, smile, sun blue sky cloud dramatic light river tree mountain <lora:【LoRA名】-1024-【オプティマイザ名】:1>
negative prompt:NSFW, (worst quality:1.4), (low quality:1.4), text, error, cropped, blurry, signature, watermark, username, monochrome, multiple view
コメント:デフォルト衣装(赤ドレス、白スカート)を衣装のキーワードなしで呼んでいる。合わせて背景を指定して学習状況と抵抗力を確認。
(b)768x512
prompt:【LoRAトリガーワード】wearing black bikini, smile, sun blue sky cloud dramatic light beach <lora:【LoRA名】-1024-【オプティマイザ名】:1>
negative prompt:NSFW, (worst quality:1.4), (low quality:1.4), text, error, cropped, blurry, signature, watermark, username, monochrome, multiple view
コメント:黒ビキニを指定して衣装変更・背景指定し、学習状況と変更に対する抵抗力を確認。

出てほしいイメージ傾向(通常衣装の場合)

電撃オンラインWikiの画像あたりを参照のこと。
電撃オンライン・SRX-X

AdamW

(a)512x768
AdamW(a)
寸評:
最初のエポックからそれなりの学習度を稼いでおり、最終エポックまで順当に学習している傾向が見える。
細部の形状(上衣のデザインやスカート部位?)は学習しきれていない。スカート色は赤が勝っている。
背景表現は最終エポック付近ではやや怪しいが概ねプロンプトに従っている。
髪の描写を誇張する傾向が見られる。エポック9のSeed445566など後半エポックでも出現している。
(b)768x512
AdamW(b)
寸評:
黒ビキニ率0。最初期のエポックでも学習素材の衣装に影響を受けて襟を生やしたりしているが、後半になるにつれて部分的な適用を増やす傾向があり、終盤はやや怪しい。
キャラ分裂傾向あり。NPで殺しきれていない。分裂していないケースでも謎背景(顔入りの太陽とか雲とかオブジェクト)を生成している。
後半エポックになるにつれて全体的な学習度合いは良化している傾向なのは(a)と同様ではある。

Lion

(a)512x768
Lion(a)
寸評:
白スカートがかなり早めのエポックで登場している。スカート部位などの部分学習精度が比較的高め、かつ早め。
背景表現はある程度通っているように見えるが最終エポックだと怪しい。
画風への影響度合いが他と比較して高めに見える。最終エポックではかなり影響を受けている。
(b)768x512
Lion(b)
寸評:
エポックによっては衣装指示の通りがかなり悪くなっている。特に後半は学習素材の鎧の情報が勝ってしまっている。
一方で最初期のエポックでは黒ビキニの通りが完璧、中盤でも黒ビキニ指示が通っているなど比較的柔軟。
特異な事象として6エポック目で「黒」の指示を肌に対して適用している様相が出ている。
画風絵の影響度合いは相当高い。

AdaFactor

(a)512x768
AdaFactor(a)
寸評:
最初のエポックからそれなりの学習度を稼いでおり、最終エポックまで順当に学習している傾向が見える。
細部の形状(上衣のデザインやスカート部位?)は学習しきれていない。スカート色は赤が勝っている。
背景表現は最終エポック付近ではやや怪しいが概ねプロンプトに従っている。
天使化(羽を生やす)傾向あり。全体としてはAdamWに似た出力傾向に見える。
(b)768x512
AdaFactor(b)
寸評:
キャラ分裂傾向あり。NPで殺しきれていない。ただし中盤のエポックのみ。
黒ビキニ率0。ビキニ指示に従って腹部を露出させようとしているが、学習データの衣装に引きずられている傾向がある。
序盤、終盤エポックで背景に謎のオブジェクトを生成しようとしている傾向がある。
全体的にはAdamWと似た出力傾向に見える。

SGDNesterov

(a)512x768
SGDNesterov(a)
寸評:
おそらく絶対的に学習不足
(b)768x512
SGDNesterov(b)
寸評:
おそらく絶対的に学習不足

DAdaption(参考)

(a)512x768
DAdaption(a)
寸評:
背景等も踏まえると3~4エポック目あたりが候補か。そう考えると精度はもう少し上がってほしいところ。
特に6エポック以降の背景影響が顕著。
(b)768x512
DAdaption(b)
寸評:
学習させた衣装情報影響が出ているのが見て取れる。3エポックでも既に肩部分の意匠が出ている。
後半はほぼ色指示は通らなかった。

DAdaptLion(参考 6/6 New!)

(a)512x768
DAdaptLion(a)
寸評:
通常のLionと比較するとゆっくり目の学習進行。最終エポックでもまだ学習不足の懸念がある。
スカート細部の形状などまだ学習できていない。
(b)768x512
DAdaptLion(b)
寸評:
中盤以降は素材側の衣装情報の影響を受けている傾向がある。肩の意匠や色彩など。

dim / nw変更時の比較

16/8/8/1での比較で一部のオプティマイザは低エポックのうちに学習が進行している可能性が見えたことから、今度はdim/nwを変更した時の変動を確認する。32/16、64/32、128/64学習時のそれぞれのオプティマイザ出力結果を比較する。
なお、モデルはBluePencilv4を今回使用している。

学習速度比較

基本的にはLion >AdamW >DAdaption >AdaFactorの位置付けは変わらず。

  • AdamW
    • dim32nw16 2134/2134 34:07 1.04it/s
    • dim64nw32 2134/2134 31:44 1.12it/s
    • dim128nw64 2134/2134 31:49 1.12it/s
  • Lion
    • dim32nw16 2134/2134 31:21 1.13it/s
    • dim64nw32 2134/2134 31:01 1.15it/s
    • dim128nw64 2134/2134 30:08 1.18it/s
  • AdaFactor
    • dim32nw16 2134/2134 41:08 1.16it/s
    • dim64nw32 2134/2134 38:43 1.09it/s
    • dim128nw64 2134/2134 40:17 1.13it/s
  • DAdaption
    • dim32nw16 2134/2134 39:18 1.11it/s
    • dim64nw32 2134/2134 37:30 1.05it/s
    • dim128nw64 2134/2134 38:09 1.07it/s
32/16/8/1 での比較

32/16/8/1(a)
寸評:
Lionのみドレスの描写がずば抜けてできている。
32/16/8/1(b)
寸評:
Lionのみ肩にドレスの残骸が出るなど学習素材衣装の影響が強い。一方で学習素材の顔はLionのみかなり表現できている。

64/32/8/1 での比較

64/32/8/1(a)
寸評:
Lionは2エポック目で既に学習過多の傾向が見えている。他は髪の色はともかく体型やドレス形状などはあまり学習できていない。
64/32/8/1(b)
寸評:
Lionは黒ビキニが出せなくなっている(学習元の衣装に引き摺られている)。

128/64/8/1 での比較

128/64/8/1(a)
寸評:
Lion、破綻。裏返すとコピー機化するまで速い、時短ができるということかもしれない。
他のオプティマイザは特徴をしっかり掴むまでもう少しエポック数かかりそう。
128/64/8/1(b)
寸評:
Lionは破綻。他のオプティマイザは学習不足。

(6/8New!) DAdaptLion追加

(a)
寸評:
素のLionほどの瞬間的な学習速度はなさそう。高Dimで長回しする分にはいいのかもしれないが……
(b)
寸評:
特筆すべき事項はなさそう。安定はしている。

ざっくり所感

上記の生成結果を見るに、Lionは「比較的低めのdimで使用した時に低エポックから学習されやすい」オプティマイザ(ただし学習に癖あり)、というふうに見える。うまく最適設定が詰められるようになれば、AdamWよりも高速でLoRAを量産できるようになる……かもしれない。

おまけ

Max Norm Regularization

6/3に追加された新機能。ノルムを制限することで過学習抑制、LoRA組合せ時の結果向上……があるかもしれないもの。
ひとまずscale_weight_norms=1を適用したものとそうでないもので比較している。
なお比較用の画像はすべて同一シードで衣装の指定ワードのみをXYZ Plot で変換している。

  • 基本的な学習情報

accelerate launch --num_cpu_threads_per_process=4 "train_network.py" --enable_bucket --pretrained_model_name_or_path="【学習元モデル】" --train_data_dir="【学習データ】" --reg_data_dir="" --resolution=512,512 --output_dir="【モデル出力先】" --logging_dir="【ログ出力先】" --network_alpha="32" --training_comment="【学習時コメント】" --save_model_as=safetensors --network_module=networks.lora --network_args "conv_dim=32" "conv_alpha=16" down_lr_weight="0,0,0,0,1,1,1,1,1,1,1,1" mid_lr_weight="0" up_lr_weight="1,1,1,1,1,1,1,1,1,1,1,1" --text_encoder_lr=【TE_LR】 --unet_lr=【Unet_LR】 --network_dim=128 --output_name="【出力モデル名】" --lr_scheduler_num_cycles="10" --learning_rate="0.0001" --lr_scheduler="cosine_with_restarts" --train_batch_size="6" --max_train_steps="1112" --save_every_n_epochs="1" --mixed_precision="fp16" --save_precision="fp16" --seed="1234" --caption_extension=".txt" --cache_latents --optimizer_type="【指定オプティマイザ】" --max_train_epochs=10 --clip_skip=2 --keep_tokens="3" --bucket_reso_steps=64 --xformers --persistent_data_loader_workers --bucket_no_upscale --multires_noise_iterations="8" --multires_noise_discount="0.3"

  • 各オプティマイザごとの個別条件
    • Lion
      text_encorder_LR=0.00005, unet_LR=0.0001
    • DAdaptLion
      text_encorder_LR=1.0, unet_LR=1.0
  • 出力パターン
    学習データあり衣装1、学習データあり衣装2、学習データなし衣装の3パターンで確認する
Lion(scale_weight_norms指定なし)

Lion-NoNorms
!寸評:
ドレス衣装はよい。ローブは終盤エポックは合わせが正しくなっている。
水着は中盤以降ドレス衣装の汚染が出ている(肩部分)。

Lion(scale_weight_norms=1)

Lion-norms
寸評:
ドレス衣装の色彩情報が落ちている。
ローブも一部怪しい。衣装学習力が落ちているということだろうか。
一方で中盤エポックでドレス衣装の汚染が出ておりそれはそれで微妙。

DAdaptLion(scale_weight_norms指定なし)

DAdaption-NoNorms
寸評:
ドレス衣装は最終エポックが一番近い内容になっている。
最終エポックのローブ表現が正しくないものが出ている。
水着の最終エポックはドレスの学習データに引っ張られている。

DAdaptLion(scale_weight_norms=1)

DAdaptLion-norms
寸評:
外見上の習得は最初期のエポックでも抑えている。最終エポックより中盤のほうが総合的には良さそう。
ローブのあわせは後半につれて正しくなっている。
水着の最終エポックは肩部分が学習衣装に汚染されている。

dropout

同じく6/3に追加された新機能、三種類のdropoutを適用して比較している。比較はすべてLionで実施した。

Lion(dropout指定なし)

Lion-NoNorms
寸評:
比較用のベース。先述のNoNormsと同じもの。

Lion(すべてdropout=0.1)

Lion-AllDropout
寸評:
水着の終盤エポックはドレス衣装の汚染が出ている。特に最終エポックは色指定を凌駕する汚染。
ドレス衣装の表現はほどほど。

Lion(Module dropout=0.1)

Lion-ModuleDropout
寸評:
ドレス衣装は学習度が中盤のほうがよい面白い結果に。
ローブはなぜか体型影響が出てふくよかそうな見た目になっている。
水着は中盤エポック以降ドレス衣装の影響が出ている。

Lion(Network dropout=0.1)

Lion-NetworkDropout
寸評:
ドレス衣装は順調によくなっているが、終盤エポックは別衣装の影響が出ている。
全体的に色に関する情報が落ちがちでローブも最終エポックは情報が落ちてしまっているほか、水着も黒指定が飛んでいる。
水着についてはドレス衣装の汚染が大きく出ている。

Lion(Rank dropout=0.1)

Lion-RankDropout
寸評:
ドレス衣装は順当に学習していく形。
ローブ衣装の学習度があまり上がっていない。
水着については終盤エポックに一部ドレス衣装の影響が出ており、最終エポックは色指定が飛んでいる。

Edit
Pub: 19 Apr 2023 03:01 UTC
Edit: 15 Jun 2023 13:44 UTC
Views: 7238