技術 約17分で読めます

WAI-Anima向けキャラLoRAを公式推奨の12,000ステップまで延ばしたら逆に方向制御が悪化、半分のep150で100%出るようになった

いけさん目次

前回のキャプション書き直し記事 で、サイドポニーの方向制御は LoRA や rank 32 の問題ではなく Anima アーキテクチャ全体の制約(CLIP-less 設計 + Qwen3 0.6B TE が LoRA 適応を圧倒する catastrophic forgetting)だと分かった。Anima 公式の Discussion では対処として 学習率 1e-5 〜 2e-5 に下げて、ステップ数を 12,000+ に伸ばす が推奨されている。今回はそこを実際に試す。

v4 の問い

v3 までで詰めたキャプション設計(bound hair 排除 / brown hair brown eyes 削除 / side ponytail の Danbooru 実在タグだけ使用 / 自然言語で方向描写)を一切いじらず、学習量だけ Anima 公式推奨水準まで持ち上げて、方向制御が安定するかを切り分ける。

仮説は2つで、どちらが当たっても結論として価値がある。

仮説結果イメージ
学習量を増やせば NL の方向シグナルが LoRA に焼き付く「Anima でキャラLoRA作るならコストかけろ」が結論
学習量を増やしても効かない「Anima アーキの根本制約。Differential Output Preservation 待ち」が結論

v3 と単純比較で済むよう、変えるのは learning_rate と epochs だけ。それ以外は同じ。

YAML 差分(v3 → v4)

- # Kanachan LoRA on WAI-Anima v1 - Caption rework v3 (bound -> side ponytail in NL)
+ # Kanachan LoRA on WAI-Anima v1 - Caption rework v4 (long training: 12k+ steps at 2e-5)
+ # v3 captions kept as-is. Only learning_rate and epochs changed.

- epochs: 12
+ epochs: 227

- learning_rate: 5.0e-5
+ learning_rate: 2.0e-5

- output_dir: "/workspace/output/rework-v3"
- output_name: "kanachan-waianima-rework-v3"
+ output_dir: "/workspace/output/rework-v4"
+ output_name: "kanachan-waianima-rework-v4"

save_every: 1 / sample_every: 1 は v3 から継承。長時間学習だからこそ各エポックで挙動を残しておきたい。flip_augment: false も v3 のまま(前回検証で意味なかったが、変数を増やしたくない)。

エポック数の計算ミスで一度作り直した

最初は epochs: 190 で起動した。runbook に「212 steps × 190 ≒ 12,000」とメモしてたから。だが起動直後の AnimaLoraToolkit のログでこう出て気付いた。

2026-04-26 14:01:50,085 - INFO - 数据集大小: 212, 每 epoch 步数: 53, 总步数: 10070

数据集大小: 212repeats: 4 × 53枚 = 212 の前処理サンプル数で、それを batch_size: 1 × grad_accum: 4 = effective batch 4 で割った 53 が 1 epoch あたりの effective step53 × 190 = 10,070 で公式推奨 12,000+ にギリ届かない。

epochs を 227 に修正(53 × 227 = 12,031 で12,000超え)。kill して再起動したのが3〜5分のロス、$1〜1.5 弱の追加コスト。気付いた時点で踏み直したほうが、記事化したときに「公式推奨ギリ達成」とクリーンな数字になる。

環境の作り直し

前回のRunPod記録 で使った Network Volume はそのまま残してあった。v3 学習の output、AnimaLoraToolkit、モデル群(waiANIMA_v10 / VAE / TE)、データセット、.npz latent キャッシュまで全部生きている。

ただし Pod のコンテナは新規 = Python 環境はゼロから。前回の踏み抜きどおり xformers が torch を cu130 で吹き飛ばすので、今回は xformers を入れずに必要な deps だけ手動でインストールする。

pip install einops safetensors transformers diffusers accelerate peft \
  lycoris-lora omegaconf tqdm Pillow numpy lpips pytorch-fid pytorch-msssim \
  scipy scikit-image matplotlib pandas pyyaml psutil rich tiktoken sentencepiece \
  protobuf

pillow-jxlpy は wheel がなかったのでスキップ(JPEG-XL 用、今回必要なし)。protobuf は最初に入れ忘れて T5Tokenizer の sentencepiece 変換でこけたので追加した。

torch の状態を確認する。

python -c 'import torch; print(torch.__version__, torch.cuda.is_available())'
# → 2.4.1+cu124 True

OK、Volume 内の cu124 環境はそのまま使える。

tmux で起動

11時間 × 1pane の SSH 接続を維持するのは非現実なので tmux で起動。RunPod のベースイメージに tmux 入ってなかったので apt install tmux から。

cd /workspace/AnimaLoraToolkit
tmux new-session -d -s train \
  "python anima_train.py --config ./config/train_kanachan_rework_v4.yaml \
   2>&1 | tee /workspace/output/rework-v4/train.log"

tmux lstrain: 1 windows (created ...) が出れば成功。tail で確認すると tqdm の進捗バーは \r を使うので tee の log には流れ込まないが、AnimaLoraToolkit が monitor_data/state.json にステップごとの loss / step / speed を書き出してくれるので、これを見るほうが正確。

python3 -c 'import json; d=json.load(open("/workspace/AnimaLoraToolkit/monitor_data/state.json")); \
  print("step:", d["step"], "/", d["total_steps"], "speed:", d["speed"])'
# → step: 5 / 12031 speed: 0.31331414944110736

学習速度は v1 と同じ 0.31 it/s(53 ステップ/エポックで約 170 秒)。GPU 100%、VRAM 10.8GB、温度 69℃ で安定。

コスト試算

項目単価想定時間小計
RTX 6000 Ada$0.77/h約12.5時間(学習 + sample 生成)$9.63
Network Volume 50GB$0.005/h約13時間$0.07
失敗 v1 起動分$0.77/h約4分$0.05
起動・prep$0.77/h約20分$0.26
合計目安約 $10

sample_every: 1 で 227 回のサンプル生成(30秒/回程度)が約 1.8 時間ぶん追加されるので、純粋な学習時間 10.8 時間と合わせて 12.5 時間が現実的な見積もり。

前回の v1〜v3 でかかった $1.22 + α と比べると一気にコスト膨張するが、これが Anima 公式推奨に従うときの最低ラインということになる。SDXL 系で 53枚 × 12 epoch = 636 ステップ $1 で済んでいたのと比較すると、Anima アーキへ最適化された LoRA を作るには 同じ素材で約 19 倍の学習量、約 8 倍のコスト が必要、という体感が掴めた。

結果

学習中サンプル(プロンプト固定: masterpiece, best quality, safe, 1girl, solo, kanachan, Her side ponytail with a blue scrunchie is visible on the right side of the image. side ponytail, ahoge, standing, looking at viewer, white background, simple background)。

両端と中間を抜粋(baseline = LoRA 注入前の WAI-Anima v1 単体、ep1 = 学習開始直後、ep227 = 最終エポック)。

baseline
v4 baseline (LoRAなし)
epoch 1
v4 epoch 1
epoch 227
v4 epoch 227

学習サンプルから方向ヒット率を粗カウント

トレーナー内蔵 sampler は固定 seed 42 + 固定プロンプトで毎エポック1枚出すので、エポック間の挙動比較に使える。学習が安定領域に入っていそうな ep177〜227 の 51枚を目視カウントしたところ、サイドポニーが学習素材通りの viewer 右側に出ていたのは 25枚 ≈ 49%

ほぼ 1/2 のガチャ。エポック間で方向が揺れるということは、LoRA が方向情報を「概念として」焼き付けていない証拠で、毎エポックの微小な重み更新で base bias と新シグナルの綱引きの結果がランダムに転がっている、という挙動になっている。

ちなみに同じ素材で IL(SDXL)で 12,000 ステップ回したら、1枚あたり 226 回見ている計算になり、過学習で素材をほぼ 1:1 で再現する状態(いわゆる「LoRA しか出ない」状態)になる。Anima ではそこまで踏み込んでも方向すら焼けないので、Qwen3 0.6B TE が LoRA 適応を圧倒する catastrophic forgetting 仮説の決定的な証拠になっている。

ただし学習サンプルには制約がある。

  • 単一プロンプト(簡易型 = NL 1文 + 構造タグ少なめ)
  • 単一 seed(seed: 42

なので、プロンプト形式や seed を変えれば改善する余地は理論上残る。これを潰すために本番プロンプトでバストアップマトリクステストをかけた。

ローカル ComfyUI でのバストアップ検証

ep227(最終)と ep150(中盤の hit 含む位置)の2本を選定。

選定理由は3点。

  • 学習が浅いと髪型構造タグが効かないのは v3 まで で実証済みなので、本命は深い領域から選ぶ
  • ある段階から顔がほぼ動かなくなる(過学習収束)ので、深い ep の中で選ぶのが安牌
  • ep227 は最終、ep150 は浅すぎず深すぎずの比較対照

設定: 832×1024、er_sde + simple、30 steps、CFG 4.0、LoRA strength model=1.0 / clip=0.8。

プロンプトは3形式で切り分ける。

形式T(タグのみ)

masterpiece, best quality, score_7, safe, 1girl, solo, kanachan,
side ponytail, ahoge, double parted bangs, medium hair, blue scrunchie,
white collared shirt, red necktie, upper body, looking at viewer, front view,
white background, simple background

形式N(自然言語のみ)

masterpiece, best quality, safe, 1girl, solo, kanachan,
A close-up portrait of a young girl looking at the viewer with a calm expression.
Her side ponytail with a blue scrunchie is visible on the right side of the image,
and a small antenna of hair rises from the top of her head.
She wears a white collared shirt with a red necktie.
white background, simple background

形式TN(両方併用 = 学習揃え)

masterpiece, best quality, score_7, safe, 1girl, solo, kanachan,
A close-up portrait of a young girl looking at the viewer with a calm expression.
Her side ponytail with a blue scrunchie is visible on the right side of the image,
and a small antenna of hair rises from the top of her head.
side ponytail, ahoge, double parted bangs, medium hair, blue scrunchie,
white collared shirt, red necktie, upper body, looking at viewer, front view,
white background, simple background

各形式 × seed 42 / 100 / 200 = 9枚、それを ep227 と ep150 の2本ぶん = 計18枚。LoRA が タグ経由で発火しているのか / NL 経由か / 両方揃って初めて発火するのか を切り分けるのが目的。

ep227(最終、12,031 step)

各列 = seed 42 / 100 / 200。緑枠 = 方向プロンプト通り(viewer 右側)に出ている、赤枠 = viewer 左側に出ている miss。

形式T(タグのみ)

seed 42
ep227 T s42
seed 100
ep227 T s100
seed 200
ep227 T s200

形式N(自然言語のみ)

seed 42
ep227 N s42
seed 100
ep227 N s100
seed 200
ep227 N s200

形式TN(両方併用)

seed 42
ep227 TN s42
seed 100
ep227 TN s100
seed 200
ep227 TN s200

ep150(中盤、7,950 step)

形式T(タグのみ)

seed 42
ep150 T s42
seed 100
ep150 T s100
seed 200
ep150 T s200

形式N(自然言語のみ)

seed 42
ep150 N s42
seed 100
ep150 N s100
seed 200
ep150 N s200

形式TN(両方併用)

seed 42
ep150 TN s42
seed 100
ep150 TN s100
seed 200
ep150 TN s200

方向ヒット率の集計

LoRAT(タグのみ)N(NLのみ)TN(両方)合計
ep150(7,950 step)2/3 (67%)3/3 (100%)3/3 (100%)8/9 (89%)
ep227(12,031 step)0/3 (0%)2/3 (67%)2/3 (67%)4/9 (44%)

観察

1. ep150 が ep227 より圧倒的に良い

学習量と方向制御の関係が 単調増加ではない。ep150(約 8,000 step)が sweet spot で、ep227(12,000 step)は明らかに過学習領域に入って方向ヒット率が大きく落ちる。Anima 公式推奨の「12,000+ ステップ」は本ケースでは過剰だった。

ep227 の T 形式 0/3 は特に象徴的で、タグだけで方向情報を与えなければ全部 base bias 通り viewer 左に倒れる。学習素材は全枚キャラ視点で左サイド(viewer 右)なのに、ep227 の LoRA は 学習素材と逆方向 を全力で返してくる。これは LoRA が方向情報を「焼き付けた」のではなく、catastrophic forgetting で base bias と逆方向の弱いシグナルだけを残し、それすらも seed 揺れで打ち消されている挙動。

2. NL 形式が決定的に効く

ep150 でも ep227 でも、N と TN(NL を含む形式)は T(タグのみ)より方向ヒット率が高い。これは LoRA 学習側で Her side ponytail with a blue scrunchie is visible on the right side of the image という自然言語が 方向シグナルとして焼き付いたことを意味する。タグの side ponytail は左右情報を持たないので(v3 で確認済み)、学習側のキャプションに NL を入れた効果がここに表れている。

3. キャラ造形は ep150 のほうがシャープ

ep227 の出力はやや顔立ちが甘く、kanachan 感が薄れている。ep150 のほうが ahoge の立ち方やシュシュの色乗り、目元のディテールが学習素材に近い。過学習領域に入ると、キャラ核心まで base 平均寄りに引き戻される現象が起きている可能性がある。

4. 形式 T 単独でも ep150 なら 67% 出る

side ponytail タグだけ(NL なし)でも ep150 では 2/3 通る。これは学習側のタグ列だけでも、ある程度の方向情報が LoRA に蓄積されたことを示す。ただし ep227 では 0/3 まで落ちるので、過学習でこの蓄積も壊れてしまう。

学習サンプル時点の 49% との整合

学習中サンプル(ep177〜227 で 49%)と本番テスト(ep227 で 44%)はほぼ一致している。学習サンプルは固定 prompt(簡易型 = N に近い)で seed 42 だけ振る形なので、本番テストの ep227 N 形式の集計と直接比較すべき。簡易 NL prompt で seed を揺らす条件では、ep227 は 50% 前後で安定して悪い

Sweet spot をエポックスキャンで特定

ep150 と ep227 の差が想定外だったので、間と外を埋めるためにスキャン検証した。N 形式(ヒット率の差が一番出る)で ep100 / ep120 / ep180 / ep200 を seed 42 / 100 / 200 で各3枚生成。

ep100(5,300 step) — まだ学習が浅い

seed 42
ep100 N s42
seed 100
ep100 N s100
seed 200
ep100 N s200

ep120(6,360 step) — 立ち上がり始める

seed 42
ep120 N s42
seed 100
ep120 N s100
seed 200
ep120 N s200

ep180(9,540 step) — ep150 と並ぶプラトー

seed 42
ep180 N s42
seed 100
ep180 N s100
seed 200
ep180 N s200

ep200(10,600 step) — 急落、しかもアーティファクト発生

seed 42
ep200 N s42
seed 100
ep200 N s100
seed 200
ep200 N s200

3 枚とも viewer 左側に1本だけサイドポニーを出そうとしているが、そのサイドポニー自体がゴースト化して半透明にしか描けていない。二重に出ているわけでも、両方向に揺れているわけでもない。LoRA はサイドポニーという「形」を作りきれず、コミットがぼやけたまま base bias の方向に向かって溶け始めている 状態。

N 形式ヒット率カーブ

epochtotal step1枚あたり露出hit/3ヒット率
1005,300400回0/30%
1206,360480回1/333%
1507,950600回3/3100%
1809,540720回3/3100%
20010,600800回0/30% ❌
22712,031908回2/367%

「1枚あたり露出」 = 学習素材1枚を LoRA が見た回数。素材53枚 × repeats 4 / 53 = repeats 4 × epoch 数で計算。

T 形式(タグのみ)でも同じ範囲を sweep

NL 経路を切ったとき LoRA がどれだけ方向情報を持っているかを切り分けるため、T 形式でも同じ ep を seed 42 / 100 / 200 で生成。ep215(ep200 と ep227 の中間、collapse 後の状態)も追加した。

ep100(T) — 浅い、全 miss

seed 42
ep100 T s42
seed 100
ep100 T s100
seed 200
ep100 T s200

ep120(T) — まだ全 miss

seed 42
ep120 T s42
seed 100
ep120 T s100
seed 200
ep120 T s200

ep180(T) — ep150 T と並ぶプラトー

seed 42
ep180 T s42
seed 100
ep180 T s100
seed 200
ep180 T s200

ep200(T) — N 形式と同じく崩落、ゴーストも N と同じ位置

seed 42
ep200 T s42
seed 100
ep200 T s100
seed 200
ep200 T s200

ep215(T) — ゴーストは消えて形は戻る、ただし方向は base bias 寄り

seed 42
ep215 T s42
seed 100
ep215 T s100
seed 200
ep215 T s200

完全マトリクス(全 ep × 全形式)

phase 4 で TN 形式の sweep も完了し、3 形式 × 7 ep の全 9 マスが揃った。

epochTNTN備考
1000/30/30/3全形式 dead(学習不足)
1200/31/31/3N と TN だけ立ち上がり
1502/3 (67%)3/3 (100%)3/3 (100%)sweet spot
1802/3 (67%)3/3 (100%)3/3 (100%)sweet spot
2000/30/30/3全形式 dead(ゴースト化)
2150/31/3 (33%)0/3TN < N の唯一例外
2270/32/3 (67%)2/3 (67%)N=TN 部分回復、T 死亡

T 形式でも ep150-180 が同じくプラトー。ヒット率は N 形式の 100% より低い(67%)が、それでも他の ep(全て 0%)より明確に高い。sweet spot 領域は形式横断で成立 している。

特徴的なのは ep227 の挙動差で、N 形式では 67% まで部分回復するが、T 形式では 0% のまま。ep227 の部分回復は NL 経路だけで起きる、つまり LoRA は最後まで NL 方向描写へのレスポンスを部分的に保つが、タグだけでは方向情報を呼び出せない、という非対称な挙動になっている。

ep215 T は ep200 のゴースト現象は消えて形は戻っているが、方向は base bias 寄り(viewer 左)に固定。collapse → 形態回復 → 方向喪失、という3段階の遷移として読める。

TN 形式(タグ + NL 併用)の sweep

最後に TN 形式で全 ep を埋める。ep150 / ep227 は既出(どちらも N と同じ)。新規スキャンは ep100 / ep120 / ep180 / ep200。

ep100(TN) — 全 miss

seed 42
ep100 TN s42
seed 100
ep100 TN s100
seed 200
ep100 TN s200

ep120(TN) — N と同じく 1/3 立ち上がり

seed 42
ep120 TN s42
seed 100
ep120 TN s100
seed 200
ep120 TN s200

ep180(TN) — ep150 と並ぶ完全制覇 3/3

seed 42
ep180 TN s42
seed 100
ep180 TN s100
seed 200
ep180 TN s200

ep200(TN) — 全形式 collapse、ゴースト残る

seed 42
ep200 TN s42
seed 100
ep200 TN s100
seed 200
ep200 TN s200

ep215 の N / TN 形式

過渡期の挙動を切り分けるため、ep215 を N / TN でも生成。

ep215(N) — 1/3 で部分回復の入口

seed 42
ep215 N s42
seed 100
ep215 N s100
seed 200
ep215 N s200

ep200(0%)→ ep215(33%)→ ep227(67%)と、N 形式のヒット率が線形気味に回復している。catastrophic forgetting の底(ep200)から、LoRA が NL シグナルを部分的に取り戻していく過程。

ep215(TN) — N より悪化、0/3

seed 42
ep215 TN s42
seed 100
ep215 TN s100
seed 200
ep215 TN s200

ep215 TN(0/3)が ep215 N(1/3)より悪い という非対称が出ている。sweet spot 領域では N と TN は同等(ep150 はどちらも 3/3、ep227 はどちらも 2/3)だったが、collapse 領域では T タグが N の方向シグナルを引き下げる干渉源 になっている。タグの side ponytail は方向情報を持たない上に、過学習で base bias 寄りに崩れた重みでは「タグ」と「viewer 左の側ポニ」の連合だけが残っているらしく、TN 形式で T タグを足すとそちらの連合が再活性化して NL シグナルを上書きする、という挙動として読める。

つまり3つの段階に整理できる。

  • sweet spot(ep150-180): NL とタグが協調、TN ≈ N(どちらも高ヒット)
  • 過学習境界(ep215): NL が辛うじて生きているが、タグは害になる、TN < N
  • 末期回復(ep227): NL のみ部分回復、T 経路は完全に死んだまま、TN ≈ N(同レベル)

ep215 だけが「TN < N」になる理由は、過学習でタグ→視覚マッピングが「side ponytail という言葉と viewer 左への結びつき」を強く焼き付けてしまっているせい。NL の方向シグナルが残っていても、タグ列にある side ponytail が「左へ倒す」既知パターンを再活性化して、NL の right side of the image を上書きする。ep200 は LoRA 自体が形を保てない壊れ状態なので何の信号も効かない、ep227 は学習が進んで NL が再び勝つようになる、と各段階で挙動が違う。

観察(スキャン結果から)

5. ヒット率カーブは単峰ではない

ep150-180 のプラトー → ep200 で底(0%、しかもゴースト化)→ ep227 で部分回復(67%)という非単調な動き。ep200 周辺は LoRA がサイドポニーという形そのものをコミットできなくなる過渡期で、base bias 方向に半透明で溶け始める。その先(ep227)では再びある程度形を保つようになるが、方向は base bias 寄り(viewer 左)に引き戻されてガチャが残る、と読める。

6. 同じ ep でも形式によって表情・全体印象がブレる

ep180 を 3 形式で並べて見ると、方向制御の話とは別に 表情の出方が形式依存で揺れる のが分かる。形式T(タグのみ、表情指定なし)は無表情〜やや真顔寄り、形式N(calm expression を含む NL)は柔らかい落ち着いた表情、TN は両者の中間。NL は方向情報以外にも「全体の印象」をクランプする働き を持っていて、これが抜けると base のデフォルト解釈で振れる。

実用上の含意は次のとおり。

  • 方向ヒット率だけで ep150 / ep180 を選んでも、形式T で運用すると表情ガチャが追加で乗る
  • N 形式は方向 100% × 表情も安定 = 二重に安定なので、運用レシピとしては「ep150 or ep180 + N 形式 + seed 揺らし最小化」が最適解
  • T 形式は方向 67% に加えて表情も振れるので、実用には不向き

7. T 形式も同じ範囲がプラトー、ただし ep227 の回復は起きない

タグのみのプロンプトで sweep し直すと、ep150 / ep180 は両方とも 2/3(67%)で N 形式に劣るが他の ep よりは明確に高い。sweet spot は形式に依存しない構造的な領域で、その範囲内では LoRA がタグ列だけからでも方向情報を部分的に取り出せる。範囲外では一切取り出せない(0%)。

ep227 の挙動は T 形式と N 形式で 完全に分かれる

  • N 形式: 67%(部分回復)
  • T 形式: 0%(回復しない)

これは ep227 の LoRA に残っている「方向への弱いシグナル」が NL 経由でしか発火できないことを意味する。タグの side ponytail は方向情報を持たないので、過学習で薄まった LoRA に対しては手がかりを与えられず、base bias に倒れる。つまり ep200 以降の collapse は タグ→視覚マッピング側から先に壊れる という非対称な過程になっている。

8. 1枚あたり露出 600〜720 回が安定領域

ep150(600回)と ep180(720回)でフラットに 100%。SDXL/IL の経験則「1枚 200〜400 回」より少し多い が、Anima base のバイアス強度を考えれば妥当な範囲。これより少ないとシグナル不足(ep100/120)、多いと過学習で壊れる(ep200)、というのが小規模キャラ LoRA の指針として使えそう。

9. 公式推奨「12,000+」は完全に over-shoot

Anima 公式が言う「12,000+ ステップ」は、おそらく大規模データセット(数百〜数千枚)での絶対step数を念頭にしている。53枚規模のキャラ LoRA に当てはめると ep227 で 1枚あたり 908回 になり、これは過学習領域。素材枚数で割って「1枚あたり露出回数」で運用基準を立てるべき

学習素材 / WAI-IL LoRA との比較

ep150(v4 sweet spot)が 学習素材WAI-IL でキャラ学習した LoRA と比べてキャラとしてどれだけ忠実か確認する。プロンプトは smile 表情に揃え、N 形式 + seed 42 で生成。

学習素材
training source smile
WAI-IL v16 LoRA
WAI-IL v16 LoRA smile
v4 ep150(Anima)
v4 ep150 smile

3枚並べて見ると、どちらも学習素材を強く反映していて差は微妙だが、いくつか目につく違いがある。

  • WAI-IL v16 は anime 寄りに寄せた絵作りで、目のキラキラ感が強い。コミック調の発色
  • v4 ep150 は学習素材の落ち着いた発色寄り。ahoge の立ち方、シュシュの存在感、目尻の優しさが学習素材に近い印象
  • 髪色は v4 のほうが学習素材の柔らかい茶に寄っている。WAI-IL は若干鮮やか寄り

学習素材忠実度という意味では v4 ep150 のほうが学習素材に近い という感想で、これは Anima base 自体の絵柄が WAI-IL より落ち着いていて学習素材と相性が良いことに起因する可能性が高い。WAI-IL ベース LoRA は IL 自体が持つ華やかさ・コミック寄りの発色が顔に乗ってしまう。

逆に「IL 派の絵柄に寄せたい」用途では WAI-IL ベースの LoRA のほうが正しい選択になるので、優劣ではなく「ベースモデルの絵柄が乗るので、どの絵柄に乗せたいかでベースを選ぶ」という運用指針として整理できる。本記事の動機(Anima 系へのキャラ持ち込み)に照らすと、Anima のキャラLoRA は IL 用とは別個に学習する価値がある、という結論を補強する材料になる。

結論

仮説 A(学習量で解決する)と仮説 B(効かない)の二択で組んだが、結果は第三の答えだった。

  • 仮説 A の半当たり: 学習量を v3 の 636 step → ep150〜180 の 8,000〜9,500 step まで増やすと、方向ヒット率が約 50% → 100%(N 形式)。明確に効いている
  • 仮説 B の半当たり: ただし学習量を進めすぎると(ep200 / 10,600 step)一気に 0% に崩落、ep227 / 12,031 step でも 67% までしか戻らない。Anima 公式推奨「12,000+ ステップ」は 53枚規模の素材には完全に過剰

実用上の結論は次のとおり。

  • ep150〜180 + NL 形式プロンプトで 100% 出るので、Anima のキャラ LoRA は実用化できる
  • 1枚あたり露出 600〜720 回 が安定領域(SDXL/IL の経験則 200〜400 回より多い、Anima の base bias 強度ぶん)
  • 1枚あたり 800 回を超えると catastrophic forgetting で崩壊(ep200 で実証)

運用ガイドラインは次のとおり。

  • 学習量は (epoch × repeats) ≈ 600〜720 を狙う。素材53枚なら ep150〜180、素材100枚なら ep80〜90、素材30枚なら ep270〜320 のように素材枚数で逆算
  • 推論時は NL で方向描写を含めるプロンプト が必須。タグ列だけだと方向制御が崩れる
  • 学習素材のキャプションも NL を必ず含める(v3 の方針が正しかった)

公式ドキュメントとの差分は次のとおり。

  • 「12,000+ ステップ」という公式推奨は 大規模データセット(数百〜数千枚)の絶対step数 が前提と思われ、小規模キャラ LoRA には適用できない。素材枚数で割った「1枚あたり露出回数」で考えるべき
  • learning_rate 1e-5〜2e-5 は 2e-5 の上限で問題なかった。下げる必要はなさそう(ただし 1e-5 は未検証)
  • Differential Output Preservation の話は依然として有効そうだが、本記事の範囲では待たなくても運用に乗せられる結果が出た

次に検証する余地

  1. strength 揺らし: ep150 / ep180 を strength 0.5 / 0.7 / 1.0 で振って、低 strength でも形が崩れないか
  2. 髪型独立性 retest: ep150 で hair down, semi-long hair を要求して、v3 で確認した「kanachan に髪型が焼き付かない」性質が ep150 でも維持されているか
  3. ep150 vs ep180 の決定戦: キャラ感の細かい比較(顔立ち、ahoge、シュシュ色乗り)で sweet spot 内のどちらが kanachan として正解か
  4. i2i パイプライン検証: ep150 を IL → Anima i2i のキャラ保持に使い、本記事の動機(Anima 系へのキャラ持ち込み)に一区切りつける

ただ、当面の運用には ep150 または ep180 + NL プロンプト で十分。


ここまでの全工程を時間とコストで概観する。

工程時間コスト
RunPod GPU で v4 学習(12,031 step)約 12 時間約 $10
ローカル ComfyUI で初回バストアップ(ep150 / ep227 全形式 18 枚)約 90 分電気代
Phase 1: N 形式 sweep(ep100/120/180/200 × 3 seed = 12 枚)約 60 分同上
Phase 2: T 形式 sweep + ep215 全形式(21 枚)約 105 分同上
Phase 3: ep150 smile 比較用(3 枚)約 15 分同上
Phase 4: TN 形式 sweep(ep100/120/180/200 × 3 seed = 12 枚)約 60 分同上
合計約 17.5 時間$10 強

検証画像の総数は 51 枚 + 学習中サンプル 229 枚 = 280 枚。記事に埋め込んでいるのはそのうち約 70 枚。同じ顔の同じ構図ばかりなので、書いている自分でもゲシュタルト崩壊しかけた。

なお検証側は M1 Max のローカル ComfyUI で回したから 1 枚 4〜5 分かかっている。RTX 6000 Ada なら 30〜60 秒なので、RunPod 側で全部回せば検証時間は 3 時間以上短縮できた。ただ ComfyUI 環境の構築 + LoRA の upload・結果の download + 課金タイマー意識のオーバーヘッドを考えると、慣れているローカル環境で粛々と回したほうが体感は楽だった、というトレードオフ。

普通の人間が「1キャラの LoRA 焼くだけ」でこれをやらないと思う。普段なら ep5 と ep10 出してみて「ええやん」で終わる作業を、Anima の方向制御が思い通りに行かなかった連鎖から v1〜v4 と4本記事を跨いで詰めた結果、ここまで来てしまった。

ただ詰める価値はあって、ここまで踏み込まないと「Anima のキャラ LoRA はそもそも実用域にあるのか」「公式推奨を機械的に踏むのが正解なのか」という根本の問いに答えが出ない状態だった。51 枚並べたから初めて「sweet spot は 1枚あたり露出 600〜720 回」「NL が決定的」「ep215 の TN < N 例外」など、運用知識として再利用できる結論が手に入った。

似た状況にハマる人は多分そんなにいないが、Anima 系で個別キャラ LoRA を焼こうとして「方向が動かない」「過学習で崩れた」「タグだけ効かない」のどれかに当たった人は、本記事の data point だけでもショートカットになるはず。あと 生成 AI とのお絵描きは何でこんな大変なんですか という普遍的な疑問への答えにもなっている、はず。

関連記事

Anima 系の検証を時系列で並べておく。本文中にリンクを散りばめてあるが、見落としやすいのでまとめて再掲する。