Pixiv Fanbox
Anima用LoRA学習を大検証 キャラLoRAの層別学習から正則化まで
Published 07/12/2026, 10:42:07 PM · Edited 07/13/2026, 12:43:35 PM

<記事内容の要約>
・Anima向けキャラLoRAの層別学習率、Text Encoderキャッシュ、省VRAM設定を実例つきで理解できる
・「セルフアテンション」「クロスアテンション」「MLP」という3モジュールへの学習を個別に止めるとどうなるか実験し、最適設定を探究
・別キャラへの顔立ちのにじみ、正則化用画像の偏り、固有衣装タグの失敗例などを基に、実用的なデータセット作りと「焼き加減」の判断方法を紹介
こんばんは、スタジオ真榊です。今回はLoRA学習アプリ「Kohya LoRA Param GUI」を使ったAnima向けキャラLoRAの学習設定を深掘り検証した大型特集です。主にSDXLで学習経験のあるユーザー向けに、「どう学習したらどうなったか」を多角的に報告し、層別学習の概要を掘り下げる内容となっています。
AnimaとSDXLは構造から全く異なるモデルなので、SDXL時代の設定や常識をそのまま持ち込むと、思ったような結果にならないことがあります。この記事では、Animaの構造をかんたんに整理したうえで、LoRA学習を層別で止めた比較や、正則化用画像、固有衣装タグの検証を通じて、失敗例や成功のポイントを詳しく紹介していきます。【約2万4000字】
(※今回紹介するのは、数十~数百枚の画像とキャプションからなるデータセットを用意する従来型の追加学習法です。1枚絵から画風やコンセプトを抜き出す「コピー機学習法」はこちらの記事をご覧ください)
検証環境:学習は「Kohya LoRA Param GUI」26.6.6.1 Latest、検証画像はForgeNeoでAnima base v1.0を使用し、高速化LoRAを使い生成。グラフィックボードはRTX4080(VRAM16GB)を使用しています。
目次
はじめに:Animaはどんなモデル?
<SDXLとは構造から異なるモデル>
<DiTの内部構造>
TextEncoderの学習はどうすべき?
キャラLoRAの学習検証
<キャラLoRA学習設定の基本的考え方(仮説)>
<タグ付けについて>
<ステップ数の計算>
<データセット>
Kohya LoRA Param GUIを起動
<詳細設定タブ>
<パフォーマンスタブ>
<TextEncoderキャッシュとは?>
学習開始
<生成テスト>
各層の学習をしないとどうなるか
<3層学習版>
<セルフアテンションだけ切る>
<クロスアテンションだけ切る>
<MLPだけ切る>
<データセットにないプロンプトで実験>
<結果まとめ>
真のキャラLoRAを作るには
<正則化とは>
<学習やり直し>
<余計な学習内容はNegPiPで除去可>
<GUI内蔵の正則化機能を使ってもOK>
<鬼怒川さんの普段着を確実に覚えるには?>
固有衣装タグを作ってみよう
<再学習開始>
焼き加減は材料によって決まる
Anima向けキャラLoRA学習設定まとめ
・今後試したいこと:アルファマスク機能
終わりに
はじめに:Animaはどんなモデル?
Animaはご存知の通り、Danbooruタグと自然言語両方のプロンプト指示に対応できる次世代ローカル画像生成モデルです。NSFW生成や追加学習が可能で、高速化LoRAを使えば1枚10秒程度で整った画像が生成できるため、SDXLの後継モデルとして期待されています。Comfy UIかForge neo上で動作し、reForgeなどには対応していません。ForgeNeo上での基本的な使い方はこちらを参照のこと。
<SDXLとは構造から異なるモデル>
Animaは大きく分けて、以下の四つの部品でできています。
・「DiT(Diffusion Transformer)」…画像生成を行う本体
・「Qwen3-0.6B」…人間のプロンプトを読み取るテキストエンコーダ
・「LLM Adapter」…Qwen3の出力をDiTに橋渡しする翻訳役
・「Qwen-Image VAE」…潜在空間でできたものを目に見えるピクセルに変換
SDXLの本体は「U-Net」という構造でしたので、画像生成の仕組みからして全く異なるモデルであることを最初に理解する必要があります。
ざっくりイメージで伝えますと、まず人間がプロンプトをLLM(大規模言語モデル)であるQwen3-0.6Bに入力しますね。するとQwen3-0.6Bがそれを適切な形に変換・出力し、さらにLLM AdapterがDiT本体の読める形式に翻訳し、DiTがノイズから絵を組み立てて、VAEが人間の見える画像に変換する──というのがAnimaにおける画像生成の流れです。
<DiTの内部構造>
このときDiTの内部では、画像を小さなパッチ(タイル)に切り分けてトークンの列にし、まったく同じ構造の「Transformerブロック」というものを何十段も積み重ねて処理するということが行われているそうです。SDXLのU-Netはその名の通り「U字」の構造をしていましたが、DiTはこのブロックの層が重なったミルフィーユのような構造をしています。
このミルフィーユの層(各Transformerブロック)は、以下の3点セットのモジュールによって構成されています。
・「セルフアテンション」: 画像パッチ同士がお互いをチェックするモジュール
・「クロスアテンション」: 画像パッチがテキスト(プロンプト)をチェックするモジュール
・「MLP」:各パッチの情報を変換するモジュール
既にややこしいですね…。しかし、Anima向けLoRAの設定を理解するうえで一番大事なのがここなので、ふんわり理解でいいので詳しく見ていきましょう。
「セルフアテンション」では、「お隣のパッチは髪を描いているから、自分はその続きの毛先を描こう」というように、お互いがお見合いをしながら絵全体の文脈や整合性を保ちます。ユーザーがいちいち指示しなくても、自動的に自分たちでマスゲームをして、「まともに見える絵」にしてくれるイメージです。
「クロスアテンション」では、お隣のパッチではなくテキスト、つまりユーザーの指示を参照します。「blue eyesっていうタグがあるから、僕が担当する目のパッチは青くしよう」という感じで、テキスト条件を画像に反映させる経路なので、新しい言葉(キャラLoRAのトリガータグ)を学習させる場合は重要になります。
「MLP」は二つのアテンションの後で各パッチの情報を仕上げる層です。「アニメ塗りの肌はこういう色の乗り方」とか「線はこういうタッチ」といった見た目の変化を強めるため、画風LoRAでは特に重要な学習先です。
SDXLのLoRA学習にも層別学習はありましたが、基本的には「U-Netの学習率(LR=Learning Rate)」一つだけで学習をどう行うか決めていましたよね。それがAnimaでは「SelfAttnLR / CrossAttnLR / MlpLR / LLMAdapterLR」といったように、それぞれの層が司る内容ごとに学習率をかんたん設定することができるようになっています。では、まずキャラLoRAではどの層をどのように設定すると良い結果になるのだろうか?ということを、今回の記事で検証していくわけです。
TextEncoderの学習はどうすべき?
先ほどAnimaは四つの部品で構成されると説明しましたが、このうちテキストエンコーダであるQwen3の学習はどうすべきか?ということについて触れておきます。
▲どれにすべき?
これまでSDXL向けのLoRA記事でも触れてきましたが、SDXL時代は本体である「U-Netのみ」よりも「Text Encoder(TE)込み」で学習することで、キャラなどの再現度が上がるノウハウがありました。一方で、ヘタに学習させるとせっかく整っていた「言葉の地図」が崩れて副作用が出てしまうこともありました。では、AnimaでもTextEncoderであるQwen3-0.6Bの学習を行うべきなのでしょうか?
本記事では、いったん「学習しない」で統一して検証することにします。Anima向けLoRAの学習はSDXLより重いのですが、Text Encoderを学習しない場合、プロンプト処理結果を事前計算する「TextEncoderキャッシュ機能」(後述)によって学習負荷を大きく下げられるというのがまず第一。あれこれ試したところ、数十〜数百枚規模の一般的なキャラ・画風LoRAなら、DiT側だけでも十分な効果が得られることも分かってきたので、まずはDiTのみの学習方法で検証します。
同じように、「四つの部品」のうちQwen3とDiTの間にいる翻訳者である「LLM Adapter」についても、この記事では学習率0とします。こちらも学習自体は可能ですが、プロンプト全体に予想しない悪影響を及ぼすリスクがとても大きく、Anima公式も学習は非推奨としています。
(https://civitai.com/models/2458426/anima よりスクリーンショット引用)
というわけで、あれこれ難しい話から入ってしまいましたが、まずは「Qwen3とLLM Adapterは学習率0にし、DiTだけを学習するのが基本」「DiT内部のブロックに3つずつある層に、どれくらいの学習率で覚えさせるかで効果を調整する」と理解しておけばよいかと思います。
キャラLoRAの学習検証
基礎理論は十分なので、ここからは実践編。まずはAnima向けキャラLoRAをどう学習すべきか考えてみましょう。毎度おなじみ鬼怒川さんのデータセットでキャラLoRAを試作します。
データセットの作り方やタグ付けの方法はSDXLと変わりません。タグの区切りに「black_hair」のようにアンダーバーを使わず、「black hair」などと半角スペースを使うことにだけ注意すればOKです。
1枚絵しかない状況なら、ChatGPTなどに「このキャラクターを8方向から描いた画像を生成してください。白背景。3:4。n=8」「このキャラクターの日常を描いたバリエーションを10枚生成してください。シチュエーションに応じたポーズや表情にすること。3:4。n=10」「このキャラの表情バリエーションを10枚生成してください。白背景。3:4。n=10」などと指示してバリエーションを作るとよいでしょう。
(※Kohya LoRA Param GUIを使ったローカルLoRA学習が初めてで、導入方法やデータセットの作り方から覚えたい方はこちらの記事を先にお読みください)
<キャラLoRA学習設定の基本的考え方(仮説)>
キャラLoRAの本質は「トリガータグを入れたらそのキャラが正確に出る」ことですから、例えば「anna kinugawa」という言葉と「目つきの悪い黒髪ロングヘア白ロンT人妻」という容姿の対応付けがうまくでき、データセットにない行動(例:両手にバナナを持って初音ミクとダンスする)を指示してもきれいに再現できれば学習成功ということになります。
そして、Animaにおいてその対応付けを担うのはクロスアテンションでしたよね。ですから、キャラLoRAではクロスアテンションを0にせず、控えめな学習率で生かすとよい効果が出そう…というのが最初の仮説です。
これを踏まえて、今回の実験で最初に試すキャラLoRA向け学習設定はこちら。
ベースモデル:anima_baseV10.safetensors
いろいろやりましたが、Animaで一番素直な結果になるのはAnima-Base v1.0をベースに学習させ、できたLoRAもそのままAnima-Base v1.0に適用するやり方。Copitaで学習した画風LoRAをWAI ANIMAなど別のマージモデルに適用しても、モデルのマスピ画風と混じってきれいに出てこないことが多かったです。(もちろん、お気に入りのマージモデルをほどよく調整して新しい画風を作りたいならそれでOKですが)
network_dim / alpha:16 / 8
小さいほど過学習しにくく、大きいほど多くの要素を覚えられる。複雑な衣装などを細部まで正確に再現したい場合は32/16。
learning_rate:6e-5 (※つまり0.00006)
全体の基準値となる学習率。層別学習率に空欄がある場合はこれが採用されるが、今回の設定ではSelf-Attentionに4e-5、Cross-Attentionに2.5e-5、MLPに6e-5と直接指定しているため、ここの記述は実質飾り。Anima公式は「dim32の場合、LRは2e-5(0.00002)くらい弱めから調整して」としているので、これは3倍強気の設定。
self_attn_lr:4e-5 (※つまり0.00004)
セルフアテンションの学習率。0.00004。キャラの容姿に対して、構図への影響を控えめにしたい狙い。
cross_attn_lr:2.5e-5 (※つまり0.000025)
クロスアテンションの学習率。0.000025。今回の重要ポイント。キャラクターのタグと容姿の紐付けをここで覚えてほしい。
mlp_lr:6e-5 (※つまり0.00006)
つまり0.00006。髪の質感や顔立ち、服のディテールはここが覚える重要な層なので、全体LRと同じ強さ。(というより、今回3層とも指定しているので全体LRの指定は飾り)
llm_adapter_lr:0
鬼怒川さんをAnimaの辞典に加えるだけで、辞典全体はそのままにしたい。
batch:2
同時に2枚学習する設定。ここはSDXLと同じで、各々のVRAM容量に応じて増減しよう。
scheduler:cosine_with_restarts (4サイクル) + warmup
LoRAの「焼き加減」を時間とともに変化させるスケジューラ。過学習を避けながら効率的に学習が進められる。何を選ぶかは流派や「オプティマイザ」との相性があり、決まった答えはない。
解像度 1024 (bucket 512–2048)
ここはSDXLと同じでOK。Animaも基本は1024px前後で学習します。
<タグ付けについて>
SDXLでは、目の色や髪型のようにキャラの不変の特徴をタグ付けから外すと、トリガーワードに集約する動きをしました。ただ、あの挙動はTextEncoder込み学習に大きく助けられていたもの。TEの学習なしでも、同じ「タグ集約」現象が起きるのかどうか、実験で見ていきます。
なお、Animaはタグ中のアンダーバーの使用が基本的に御法度です。LoRAのキャプション(タグ付け)も生成時も、半角スペースを使うことを忘れないようにしましょう。特にトリガーワードは重要なので、「anna_kinugawa」ではなく「anna kinugawa」となっているか確認しておきます。
<ステップ数の計算>
データセットによりますが、総ステップ数はbatch1換算で1,500〜2,000程度が目安のようです。1エポックごとにLoRAを保存して、生成実験で出来具合を比較するのが確実です。ポーズや構図まで教師画像そっくりになったり、細部が溶けたり、プロンプト指示を聞いてくれなくなったら過学習のサイン。dimを下げるか、学習率を下げるか、エポックを減らすか、データセットのバリエーションを増やす必要があります。
<データセット>
キャラLoRAの場合、20~50枚くらいが目安かと思いますが、枚数・バリエーションが豊富なほど余計な学習を抑制できます。今回はこちらの画像57枚のデータセットで学習してみます。
オリジナルキャラ鬼怒川さんの1枚の立ち絵を基に、主にChatGPTでバリエーション生成したものです。ほとんど白背景で、全身、太ももから上、上半身、後ろ姿がバランスよく混じっており、このほかにNSFW画像やイベントCG風の背景ありショットも少量混ぜています。
タガーは好みですが、今回は「WD EVA02 Large Tagger v3」を使用しました。例えばこちらの画像なら、トリガーワード「anna kinugawa」を頭にしてこのようにタグ付けしています。
black hairやpurple eyes、large breastsといった固有の要素は削除しましたので、「anna kinugawa」に集約される(常に黒髪ロング紫目で描かれる)ことを期待したいところですが、今回はTextEncoderの学習をしないので、どうなるかがポイントです。
Kohya LoRA Param GUIを起動
このデータセットを使って、Kohya LoRA Param GUIで学習していきます。設定を手入力すると大変なので、公式リポジトリの一番下にある「サンプルプリセット」をリンク先からダウンロードして使うのが手っ取り早いです。
解凍すると出てくる中の「Anima」フォルダ内にAnima用のプリセットが保存されています。READMEを読みつつ、今回はキャラクターを学習させたいので「人物」を選びましょう。(そのまま使ってもきちんとしたLoRAができます)
次に、「詳細設定▶パス」で、普段Animaで生成するときに使っているqwen image vaeとqwen 3 06bのパスを指定する必要があります。Models/TextEncodersとModels/VAEにあるはずです。
今回はDiTの三つの層の働きを理解するのが目的なので、サンプルプリセットをそのまま使うのではなく、書き換えて学習します。設定はこちらのzipを解凍すると出てくるxmloraをGUIで読みこむと私と全く同じものがコピペできますので、ご確認ください。(ただし、完成版ではなく最初の実験に使った暫定版です)
学習率は6e-5(つまり0.00006)。学習の全体サンプル数は57枚×repeat8×5epoch=2280サンプルです。バッチ2(2枚同時学習)にしたので、実際には半分の1140ステップで終了します。オプティマイザは今回最も基本的なAdamWを選択しましたが、ここは流派がいろいろあろうかと思います。(Kohya LoRA Param GUIの既定プリセットだとCAMEをチョイスしていますね)
詳しくは後述しますが、このセットでは「TextEncoderのキャッシュ」機能をオンにして高速化・省メモリ化を図っています。その代わり、プロンプトの処理結果を事前に計算して固定してしまうため、SDXLで定番だった「キャプションのシャッフル」が使えません。チェックしていると学習開始時にこのような告知が出るので、外しておきます。(シャッフルは「前のほうのタグばかり重視される」のを防ぐための機能ですが、トリガーワードを先頭に置く運用なら実害は小さいので、キャッシュによる高速・省メモリ化を優先します)
<詳細設定タブ>
左下のボタンから「詳細設定」を開くと、このように拡散モデルのみ(AnimaではDiTのみ)の学習設定になっていることが確認できます。
「詳細設定▶Anima」から、このようにさきほどの層別LR(学習率)が設定できます。4e-05などの表記は分かりづらいですが、4e-5は「4×10のマイナス5乗」、つまり0.00004のこと。一番下の数字とゼロの数を書いていると覚えておけば問題ありません(4e-05と4e-5は同じ意味です)。今回はこのように、クロスアテンションを低めの0.000025で学習する設定になっています。空欄だと全体の学習率がそのまま適用され、0と書くと一切学習されませんので、LLM AdapterのLRは0にしてあります。
すごくざっくりした理屈では、MLPを0にすると画風が、セルフアテンションを0にすると構図が、クロスアテンションを0にするとプロンプト応答性が、それぞれ変化しにくくなるはずです。(実際はそう簡単ではなかったのですが…)
<パフォーマンスタブ>
「詳細設定▶パフォーマンス」タブで主にグラフィックボード環境に合った学習設定を行います。Animaはかなり学習負担が重めなので、先ほど触れたテキストエンコーダのキャッシュ機能などを活用して学習時間を短縮する必要があります。今回はこちらの設定で学習を進めていきます(RTX4080-VRAM16GB環境)。
Anima向け学習はVRAM8GB以上のグラフィックボードで対応していますが、低VRAM環境の場合相当な学習時間が掛かりますし、適切に設定しないとOut of memoryエラーが出ます。10GB未満のVRAMの場合、「スワップするブロック数」を8以上、8GBなら13にしてCPUを活用するのが推奨されています。
速度を犠牲にVRAM消費を抑える「モデルをfp8で読み込む」はanima非対応。「GradientCheckpointing」を外すと大幅に高速化しますが、VRAM負担が爆増します。学習中の計算精度やVRAM負担などに関わる「混合精度」は、animaではbf16推奨。
<TextEncoderキャッシュとは?>
これをオンにすると、最初に一度だけQwen3でデータセット内の全キャプションを読み込み、画像ごとに「~_anima_te.npz」というキャッシュファイルを作ります。よって、初回だけ「キャッシュ作成時間」が掛かりますが、これを先にやっておくとその後の学習ループ中にいちいちQwen3を動かさずに済むので、学習が速く・軽くなるという便利機能です。("latentのキャッシュ"では同じように学習中のVAEによる処理を省くことができ、省VRAM&学習時間短縮につながります)
2回目以降は、すでに「~_anima_te.npz」が画像ごとにあるので、Qwen3での下準備(キャッシュ作成時間)すらスキップされ、さらにスムーズになります。枚数が大量にあるほど速度アップにつながります。
ただし、一点だけ注意!タグをあとから書き直して再学習する場合、データセット内に古いanima_te.npzが残っていると、そちらが優先されて書き換え前のタグ設定で学習されてしまいます。タグを書き直したら、必ず古いanima_te.npzを削除する癖をつけておきましょう。フォルダ内で「te.npz」で検索して削除すればOKです。(画像の枚数と同じ数だけ検索ヒットしたかちゃんと確かめましょう)
▲「te.npz」で検索したところ。画像57枚のデータセットなら57個あるはずなので、ちゃんとファイル数が一致しているか確認した上で、Ctrl+Aで全選択して削除しよう
学習開始
以上の設定で学習開始すると、RTX4080環境では5エポックが約1時間で終了しました。あれこれキャッシュして高速化を図っていますが、2枚同時学習で実質1140ステップなのに1時間というのはSDXLに比べてかなり重めに感じますね。
<生成テスト>
できたLoRAでXYZ plot比較してみましょう。適用するモデルはAnimaのベースモデルそのまま。プロンプトは以下のようにしました。前半が高速化LoRAとクォリティタグ、NegPiPで、トリガーワードの「anna kinugawa」以降で容姿を指示しています。基本的にはデータセットで使用したタグをそのまま使いました。
PP:<lora:anima-turbo-lora-v0.2:0.8>masterpiece, best quality, score 7, (speech bubble, text, signature, artist name, water drop, fewer digits, bad hands, cropped, ^^^, :-1), anna kinugawa, 1girl, pants, solo, long hair, black hair, breasts, black pants, hand on own hip, shirt, open mouth, white shirt, collarbone, very long hair, looking at viewer, long sleeves, cowboy shot, cleavage, simple background, denim, medium breasts, asymmetrical bangs, jeans, standing, white background, large breasts, <lora:kinugawa_anima_test:0>
こちらが結果。一番上がLoRA未適用の状態で、下に行くほど効果が強まります。
おおむねデータセットそのままのキャラクター容姿が覚えられましたね。せっかくですので、Anima系の別のモデルでも使ってみましょう。
このように、だいたいのキャラデザは共通しつつ、それぞれのモデルの画風がにじむ結果となりました。鬼怒川さんは記号(ミナちゃんの赤眼鏡のようなトレードマーク)が少ないので、目つきまで似ないと本人には見えないのですが、どれも「だいたい同一人物」と言ってよい結果になったのではないでしょうか。
いつもの自然言語指示も問題なく効きます。
このLoRAはやや多めに2280step(batch1当たり)回した5エポック目のものなので、1~5エポックごとにどのように学習が進んでいったかもチェックしましょう。一番上が1エポック目で、一番下が完成品の5エポック目です。(適用モデルはAnima-Base v1.0、強度はいずれも1)
1epoch目からかなり特徴は捉えられていますが、まだちょっとニセモノ感がありますね。個人的には4epoch目から「本物の鬼怒川さんだ」という感じ。収束の速さはキャラデザの特徴がどれくらい詳細か、dim/alphaはどう設定したか、オプティマイザは何を選んだかでも変化しますが、この設定なら4epochでも十分だったように見えます。
<キャラの"色抜け"現象>
ただし、このLoRAで生成する際に指示から「black hair」や「white shirt」を抜くと、このように色が抜けてしまう現象が確認できました。このLoRAは「anna kinugawaはこういう見た目のキャラ」と顔立ちや服のデザインまでは先行して覚えているのですが、色の学習は後回しになっており、プロンプト指示せずに強制的に再現するには学習が足りなかったようです。
こうした「色抜け」は他のキャラ学習でもよく見られました。髪などの色をプロンプト指示すれば普通に使えるので別に構わないのですが、どうしてもキャラ名のタグだけですべてのカラーリングまで学習させたい場合は、学習率をより上げ、過学習を起こさないように慎重に学習を進めるか、TextEncoder込みの学習を試すかということになると思います。
各層の学習をしないとどうなるか
とりあえず期待通りの結果にはなりましたが、気になるのは、クロスアテンションやMLPの学習をしない(学習率を0にして凍結する)とどうなるのか?ということです。この効果が分かれば、構図や画風を侵食しない高品質なキャラLoRAや、画風LoRAを作りたいときの最適設定が推定できます。
そこで、全体の学習率を同じ0.00006に統一しつつ、「3層とも学習」「セルフアテンションだけ学習しない」「クロスアテンションだけ学習しない」「MLPだけ学習しない」の4パターンで学習する実験を行いました。他はほぼさっきと同じ設定にしますが、時短のためエポック数は4に減らします。
1エポック減らしたことと、TextEncoderキャッシュのおかげで、今度は1つあたり約45分でできました。さきほどと全く同じ設定でXYZ plotします。
PP:masterpiece, best quality, score 7, anna kinugawa, 1girl, pants, solo, long hair, black hair, breasts, black pants, hand on own hip, shirt, open mouth, white shirt, collarbone, very long hair, looking at viewer, long sleeves, cowboy shot, cleavage, simple background, denim, medium breasts, asymmetrical bangs, jeans, standing, white background, large breasts
<3層学習版>
まずは、3つとも6e-5で学習した「3層学習版」です。
きちんと学習されている感じですね。これを基本に、3つの層への学習をそれぞれ切るとどうなるか調べましょう。理屈通りなら、セルフアテンションを0にすると構図が、クロスアテンションを0にするとプロンプト応答性が、MLPを0にすると画風が、それぞれ変化しなくなるはずです。
<セルフアテンションだけ切る>
まず構図を覚えやすいとされるセルフアテンションへの学習を0にしたもの。構図が変わりにくくなるでしょうか。
3層学習版と見比べると、強度1の鬼怒川さんのポーズが変化しています。特に、腰に当てた手がデータセットにあった手の形の再現ではなく、自然な感じになっているように見えます。鬼怒川さんの衣装や顔立ち、画風は変わらず、ポーズはベースモデルの素の感じが残っている感じがしますね。
<クロスアテンションだけ切る>
次は、プロンプト応答性を変化させるとされるクロスアテンションへの学習を0にしたもの。
特に3層学習版と違いが見えませんでした。データセット画像とほぼ同じ、ごく単純な立ち絵指示だったせいかもしれません。データセットにない、難しいプロンプト指示をしてみたときにどうなるか確かめてみたほうがよさそうです。
<MLPだけ切る>
最後に画風を司るはずのMLPへの学習を切ります。
うーんこれも、ほとんど完璧に学習できてしまっていました。最も重要な層なので、鬼怒川さんに全く似なくなるかと思いましたが、そんなことはないようです。
この比較実験から分かることは、「学習データセットにある画像を再現する程度なら、一つの層を凍結しても残った二つの層で十分再現できてしまう」ということでした。学習結果の違いをはっきりさせるには、データセットに存在しない背景・アイテム・衣装・シチュエーションの画像を指示してみる必要がありそうです。
<データセットにないプロンプトで実験>
そこで、プロンプトを大きく変更し、「ホウキを持ったメイド服姿で恥ずかしそうに屋外に立つ鬼怒川さん」を注文しました。今作った4つのLoRAをヨコ列に並べ、タテ列に強度を並べたものです。左から、全学習版、セルフアテンションカット版、クロスアテンションカット版、MLPカット版です。
先に白状しますと、この例はメイド服に変更したのに「pants」タグを抜き忘れて生成してしまったのですが、矛盾したプロンプトのおかげでわかりやすい成果が得られました。
PP:<lora:anima-turbo-lora-v0.2:0.8>masterpiece, best quality, score 7, (speech bubble, text, signature, artist name, water drop, fewer digits, bad hands, cropped, ^^^, :-1), anna kinugawa, 1girl, pants, solo, maid, embarrassed, holding broom, standing, outdoors, city, tokyo, sky, solo focus, crowd, simple background
まず一番左の「3層学習版」は一番プロンプト通りに描けており、見た目の再現度は一番上です。が、セルフアテンション層が学習した傾向に引っ張られて、太ももから上のcowboy shot構図に変更する副作用が出ています。これはデータセットに上半身アップの画像が多かったため、「鬼怒川さんと言えば上半身アップで描かなきゃ」と言うバイアスが生じていることが分かります。
よって、セルフアテンションへの学習を0にした左から2列目だけは、構図がほぼLoRA未適用時のままになっています。ただし、セルフアテンションは構図だけでなく鬼怒川さんの顔立ちや胸の大きさや髪の形状なども覚えるようで、なんとなく4つのうちでは一番鬼怒川さんに似ていない(幼い)結果に見えます。
さらに隣(左から三番目)はクロスアテンションを切っているので、鬼怒川さんの衣装とタグの結びつきをきちんと覚えられていません。anna kinugawaと言えば胸がえっちでデニムを履いているということは覚えているので、無理やり整合性を取ろうとして崩壊しています。しかし、一つ前と比べると大人びた顔立ちは覚えられていますね。
最後の右端は、MLPに学習しなかった層。前向きと後ろ向きが分裂して派手に崩壊しています。他のアテンション層で学習できているので、画風が全く再現できないということではないようですが、服・身体・ポーズをひとまとまりの概念として維持できなくなっているようです。
・別パターンでも同様の傾向
今度は「pants」タグを抜き、Seed値を変えて何度か試しましたが、どれもいろいろなことが推察できました。例えばこちらの例では、MLPよりやはりアテンション層で鬼怒川さんの髪色や容姿、顔立ちが先行して学習されることが分かります。
クロスアテンションやセルフアテンションへの学習をしないと、0.5強度では黒髪や巨乳を再現できておらず、1強度にしても顔立ちがやや幼いままです。その代わりさきほどと同様、セルフアテンションを抜いたものは構図(カメラの遠さ)の変化が最も抑制できています。
一つ興味深いのは、MLPへの学習をしなかった場合「LoRA未適用状態と同じ年齢感(おっぱいのでかさやセクシーさ、服装)を維持している」ように見えることです。二つのアテンションを学習しなかった二つはLoRA学習によって服装を上書きしているように見えますから、MLPが服装の傾向を、アテンションが年齢感をデータセットから覚えていることが推測できます。なので、全部そろった3層学習版はそれを混合したような結果になっているわけです。
・ローアングル
こちらの例は、素の状態でローアングルになる構図に各層がどう影響するかを示しています。(振り向きやローアングルをプロンプト指示しているわけではなく、偶然チョイスされたもの)
さきほどカメラ位置を維持できたので、セルフアテンションへの学習を0にしたら構図を維持できるのかと思いましたが、今回はいずれも正面画像になっています。mlp0はやはり再びおっぱいや年齢感(mature female感)が強調されることが見て取れます。アテンション層を片方しか学習しなかった中央二つに比べて、左右二つの顔立ちがよく似ているのは、アテンション層をダブルで学習できている効果なのかもしれません。
<全身>
これも重要な結果。クロスアテンションを抜いたときだけ衣装が大きく違う結果になりました。
これは、クロスアテンション抜きで学習したことで、LoRAによる衣装変換があまり起こらず、ベースモデル側の衣装をそのまま残したように見えます。困ったことに、さっきはMLPを抜いたときに衣装をそのまま残したので、逆の現象が起きています。
今回の画像では、クロスアテンション層は「鬼怒川さんはあまり生足を見せない」というバイアスをデータセットから学習しており、クロスアテンションありで学習した3枚はどれもロングスカートに変更する働きをした可能性があります。
セルフアテンション抜きでは、なぜか謎のアホ毛が出ていますね。キャラの構成要素はMLPよりアテンション側に強く入ることを示しているように見えます。
他にもいろいろなプロンプト条件で実験しましたが、冗長になるので画像だけ掲載しておきます。
全く違う容姿指示(1girl, anna kinugawa, short red bob cut, green eyes, flat chest, oversized yellow hoodie, denim shorts, sneakers, full body, standing, simple white background)
2キャラ比較(2girls, anna kinugawa, full body, black-haired woman in a red business suit standing on the left, blonde woman in a blue hoodie standing on the right, different faces, different hairstyles, talking to each other, city street)
別キャラとの共演(1girl, anna kinugawa, white background, simple background, 2girls, anna kinugawa and hatsune miku)
<結果まとめ>
ここまでで検証画像から読み取れた内容は以下の通り。
・3つある層のうち1つの学習率を0にしても、残りの層が補って学習するもよう。「MLPへの学習を0にしたら画風への影響を切れる」「Self-Attentionへの学習を0にしたら構図への影響を切れる」といった便利な使い方はできない。
・二つあるアテンションの片方を学習しないと、顔立ち・年齢感が似なくなる傾向があったが、MLPを学習しなくても顔立ちにはほぼ影響しなかった。(MLP=画風ではない)
・セルフアテンションを学習しないと、LoRA未適用時の構図から変更されにくくなる現象が起きた。ただし、構図への影響だけを抑制はできず、顔立ちや体つきが再現しにくくなる。(さまざまなモデルで使いたいキャラLoRAでは有用かも)
・クロスアテンションを学習しないと、LoRA未適用時の衣装から変更されにくくなる現象が起きた(データセットにない着替えがしやすくなった)が、難しいプロンプトをまとめる力は弱体化したように見えた。
・MLPを凍結しても顔立ちは強く再現される代わりに、矛盾するプロンプトを上手に解決する力が弱まり、スカート+ズボンのように一見矛盾する難しい指示ではまとめる力がなくなり、画面崩壊することがあった。
少なくとも言えそうなのは、Animaの層別学習で思い通りにLoRAの効果を操るのは簡単ではないということです。キャラLoRAにおいて最も安定してキャラを再現するには、3層とも学習するのが無難そう。構図に影響が少なくなりそうだからセルフアテンションをいじる、というのはアリですが、完全に切ってしまうとせっかく覚えられる要素も切り捨ててしまうので、学習率を他の層の半分か、4分の3くらいにとどめるのが無難かもしれません。
そして、どの層を切っても、基本的には「画面全体に鬼怒川さん感を付与するLoRAになる」ということは避けられないようです。こちらは「The woman on the left has long black hair and is wearing a white long-sleeved shirt and black pants.The Hatsune Miku on the right is wearing a gray top and skirt.」と自然言語で指示したものですが、どの列でもミクさんが鋭い目つきの鬼怒川さん顔になってしまっています。「キャラLoRA」というより「画面全体を鬼怒川さん化する画風LoRA」という感じになっているのですね。
3層のうちどれかを抜いたらミクさんの顔や画風への侵食が防げるかと思ったのですが、そう甘くはありませんでした。残念。
ただ、単体キャラとして生成できれば十分なのであれば、この時点のLoRAでも実用上ほぼ困りません。1人で使う分には正しく鬼怒川さんが出ますし、作り方もSDXL時代と大きく変わりません。ミクさんの顔が気になるなら、あとでインペイントすれば簡単に直せますしね。
真のキャラLoRAを作るには
ただ、どうしても1回の生成で別キャラと共演させたいときはどうしたらいいでしょうか。今回は学習負荷を抑えるためQwen3を学習せず、Text Encoder出力キャッシュを使用することにしていますので、別キャラに特徴がにじまない「真のキャラLoRA」を作るためには「正則化」が有効そうです。
<正則化とは>
正則化というのは、1girl,anna kinugawaを学習するときに、「anna kinugawaではない1girlはどんな概念か」などを同時に学習させることで、1girlを始めとしたタグ概念が全体的に変容してしまうのを防ぐ方法。SDXLでは必要ないとされることが多かったのですが、Animaでは有効に使えるかどうか試してみたいところです。
そこで次は、Anima-Base v1.0で生成した「ハズレ1girl」を数百枚用意して、「これはanna kinugawaではない」「黒髪ロングの1girlだからといってanna kinugawaになるわけではない」ということを鬼怒川さんの容姿と同時に学習させてみます。Anima baseはさまざまな画風を包含した未ファインチューンのベースモデルなので、ランダムな容姿タグで生成すれば、このように画風のばらけた画像が得られます。
プロンプト例はこちら。例によって前半は高速化とNegPiPとクォリティタグで、後半がさまざまな容姿を呼び出すdynamic prompts/wildcard構成になっています。__lora_pose__や__expression_all__は、さまざまなポーズや表情のタグをランダムに一つ呼び出すwildcardです(個人的に制作したもの)。
<lora:anima-turbo-lora-v0.2:0.8>masterpiece, best quality, score 7, (speech bubble, text, signature, artist name, water drop, fewer digits, bad hands, cropped, ^^^, :-1), 1girl, solo, {tareme,white pupils|tsurime,dot pupils}, {|||thick eyebrows}, {casual wear|school uniform|suit,pants,shirt|medium_dress|bikini| __cosplay__}, {||(mature female:1.2),30 years old,wife}, __hairstyle__, __haircolor__, __eyes-color__, {indoors,__background_indoors__|outdoors,__background_outdoors__| (white background, simple background:1.3)| (white background, simple background:1.3)}, {upper body|from side|face,close-up|cowboy shot|full body}, {looking at viewer|looking ahead|looking away||},__lora_pose__,__expression_all__,
これでしばらく放っておくと、このような大量のハズレ1girlがたまるので、これをデータセットに混ぜます。髪色・髪型・年齢・服装・構図をできるだけ散らし、「黒髪ロングだけど鬼怒川さんではない」画像も混ぜるのがポイント。特定の服や髪型に偏ると、今度はその偏り自体を「ベースモデルの常識」として誤学習してしまいます。
フォルダ構成は以下のようになります。
「anna kinugawa」フォルダ
├── 4_anna_kinugawa/ ← 鬼怒川さん画像57枚 × repeat 4 = 228
│ キャプション: anna kinugawa, 1girl, <服装・ポーズ・背景タグ>
└── 1_various/ ← 正則化用ハズレ1girl画像 200枚 × repeat 1
キャプション: 1girl, <通常のタグ> ※トリガーなし
こうしておくと、データセットの半分強(57x4=228枚)は「anna kinugawa」で、残り200枚は「anna kinugawaではないランダム画風の1girl」になります。加減が分からないので、まずは本人側と負例側の出現回数をおおむね半々(1:1)になるようにして比較してみることにしました。
<学習やり直し>
さきほどは「57枚×repeat8×5epoch=2280サンプル」でしたが、今回は正則化画像とバランスを取るために鬼怒川さんフォルダのrepeat数を4に半減させました。1epochあたり57枚×4repeat+はずれ1girl200枚=428サンプル分のデータセットです。10epoch、batch2としたので、実際の更新回数は428枚の10倍の半分で2140step。比較のため、他の設定は最初のキャラLoRAと同じにしました。
ステップ数がさきほどの倍なので、学習開始すると、やはり学習終了まで2時間コースに。VRAMに余裕があるのでbatch4も試しましたが、この環境では処理時間が単純に半分になるわけではありませんでした。batchを上げられるかどうかはVRAM容量だけでなく、環境全体の処理速度にも左右されるようです。(あくまでRTX4080での実測値なので、より高性能なグラボをお使いの方はbatch4で倍速学習できるかもしれません)
というわけで2時間後、完成したLoRAでテストしてみます。まずこちらが通常の1girl,soloでの生成テスト。
ここまでは前回と同じですね。少なくとも容姿については普通に学習できているように見えます。
今度はミクさんとのツーショット版。
おお、ちゃんとミクちゃん部分はたれ目のまま維持されつつ、ツリ目の鬼怒川さんを再現できました!しかし、なぜか黒い革ジャケットを羽織るLoRAになってしまっていますね。プロンプトにjacketやsuitは入れていないのですが…。
PP:<lora:kinugawa_anima_shin:1>,<lora:anima-turbo-lora-v0.2:0.8>masterpiece, best quality, score 7, (speech bubble, text, signature, artist name, water drop, fewer digits, bad hands, cropped, ^^^, :-1), 2girls, yuri, anna kinugawa and hatsune miku, green hair, black hair, open mouth, looking at viewer, cowboy shot, simple background, standing, white background, white shirt, long sleeves, denim pants, grey shirt, sleeveless shirt, detached sleeves
何度か生成してみましたが、鬼怒川さんに白シャツと黒パンツを着せようとすると高確率で指示していない革ジャケットがついてくることが分かりました。
過学習は主にLRが高すぎたりエポック数が多すぎたりして「焼き過ぎ」になったときに起こるのですが、今回黒ジャケットばかりになった主要因は、正則化のための1girl画像セットに占める黒ジャケット率が高かったことです。服装をランダムにするタグを {casual wear|school uniform|suit,pants,shirt|medium_dress|bikini| __cosplay__}としたために、生成画像に6分の1の確率で黒スーツの画像が入ってしまい、「1girlにはよくblack jacketが付いてくるものだ」と繰り返し教えてしまったのですね(あとでチェックしたら、確率が上振れしていてデータセットの4分の1が黒スーツでした)。
プロンプトで「denim pants」と指示しているので、スーツジャケットではなくロック風の黒ジャケットを自然とコーディネートしてしまったというわけです。
<余計な学習内容はNegPiPで除去可>
NegPiPを使って(jacket,suit:-1)とするか、さきほどのように自然言語で細かく服装を指示すればジャケットは除去できます。こちらは、「The woman on the left has long black hair and is wearing a white long-sleeved shirt and black pants.The Hatsune Miku on the right is wearing a gray top and skirt.」(左の女性はロングヘアで白シャツ黒ズボン、右の初音ミクはグレーのトップスとスカート)と指示したもの。
こうすれば混線も起こりにくくなるので、このLoRAが使えないわけではありません。が、正則化用1girl群に偏りがあるとこのような現象が起こってしまうので、少数の選択肢から選ばれるdynamic promptではなく、100種類以上の衣装プロンプトが書かれた衣装wildcardで作ったほうがよいことが学べました。
<GUI内蔵の正則化機能を使ってもOK>
Kohya LoRA Param GUIには「正則化画像フォルダ」という欄があり、これを使うことでも1girlの正則化ができます。基本的には用意した正則化画像群と教師画像フォルダの枚数と1:1になるように調整され、最後に追加の引数タブから「prior_loss_weight」という倍率を掛ける仕組みのようです。(詳しくはsd-scriptsのドキュメント参照)
<鬼怒川さんの普段着を確実に覚えるには?>
今回使った鬼怒川さんのデータセットのキャプションでは、anna kinugawaが着ている服のタグを削除せず、毎回「white shirt,black denim...」などとタグ付けしていました。よって、ロンT&デニム衣装がanna kinugawa概念に集約されず、「鬼怒川さんの固有衣装」としては強く学習されなかったわけです。何をコスプレさせようとしても白い長袖+デニムっぽくなると困りますから、これはむしろ、着替え可能なキャラLoRAとしては望ましい挙動ですね。
よって、鬼怒川さんの服装を一発呼び出ししたいなら、white shirtやdenimなどのタグを削除して、「kinugawa outfit」などの衣装トリガータグで管理すべきということになります。
固有衣装タグを作ってみよう
というわけで、今度は鬼怒川さんの白ロンT衣装を「kinugawa outfit」タグで呼び出せるようタグ付けを変更してみました。タグ編集には、ForgeNeoに対応したフォーク版の「Dataset Tag Editor」を使うと便利です。(通常版はForgeNeoにインストールしても表示されません)
初めて使う方は、こちらの記事の「9.Dataset tag Editorの使い方」をご参照ください。
このように、タグ付け済みデータセットのあるフォルダのパスを「データセットディレクトリ」に打ち込んで「読み込み」すると、データセットの画像一覧とタグ付けが読み込まれます。
いまからやるのは、データセットのうち白ロンTを着ている画像だけを抽出してから、「shirt」や「denim」といったタグを除去した上、すべてに「kinugawa outfit」というタグを代わりにつける作業です。よって、まず「shirt」タグを「正のフィルター」に打ち込んで、鬼怒川さんの普段着画像29枚を抽出します。
あとは、「キャプションの一括編集▶検索と置換」で、shirtを全てkinugawa outfitに変換してしまいます。下図のように打ち込んで、「フィルタリングされた画像に変更を適用する」でOK。
shirtタグは全てkinugawa outfitに変わりましたが、まだdenimやwhite shirtなどの衣装タグが残っているので、「キャプションの一括編集▶削除」で全部消してしまいます。
この時点では、まだタグ内容の変更はデータセットフォルダに反映されていません。左上の「すべての変更を保存」で反映するのを絶対に忘れないように!Dataset Tag Editorはこれをやらないと、一切フォルダ内に変更内容が適用されません。これで、普段着を着ている鬼怒川さんの画像にすべて「kinugawa outfit」がタグ付けされました。
ついでに、さきほどの正則化1girl群はジャケット多すぎ問題が発覚したので、簡単にsuit画像だけ削除してしまいます。「suit」で抽出してみると、なんと200枚中46枚もあったので、とりあえず「ファイルの移動または削除」で削除。「画像ファイル・キャプションテキストファイル・キャプションバックアップファイル」にチェックし、「ファイルを削除」し、「すべての変更を保存」すればOKです。これで、1girl群は154枚に減りました。
<再学習開始>
あとは、anima_te.npzファイルが全て削除済みであることを再確認し、先ほどと同じ2時間コースで学習します。正則化用1girl群の枚数が200枚から154枚に減ったので、鬼怒川さんフォルダの繰り返し数は4から3に減らしてバランスを取り、総ステップが減った分エポック数を10から12に増やしました。さらに、二つのオリジナルタグを覚えてほしいので、dim16/alpha8だったのをdim32/alpha16に倍増させ、変化を確認します。
さらに、セルフアテンション3e-5、クロスアテンション8e-5、MLP 2e-5と、クロスアテンションを突出して高い学習率にすると何が変わるかも確かめました。
できたLoRAで生成したのがこちら。プロンプトは「anna kinugawa, kinugawa outfit, 1girl, solo, cowboy shot, standing, white background, simple background, collarbone 」です。一番上が1エポック目で、下に行くにつれて学習が重なっていきます。(※shin2はタグ付けをミスしたのでshin3になっています)
10エポック目以降はほぼ同じで、指示していない革ジャンやベルトが現れてしまいました。非常に明確で分かりやすい実験結果ですね。
1-7エポックではまだ衣装を再現できず、9エポック目前後でちょうどkinugawa outfitの学習がうまくいくのですが、さらに学習を重ねると過学習が起きてしまいます。また、衣装以外でも注意したいのが、9エポック目では確かに鬼怒川さん衣装が再現されているものの、顔立ちがあまり似せられていないこと。これは、クロスアテンションの学習率を高めにしすぎ、MLPの学習率が低すぎた影響と想像できます。
二つのアテンション層で顔立ちは学べるというのが今回得られた知見でしたが、クロスアテンションだけ突出させると学習順のバランスが崩れ、顔立ちを覚える前に服装を覚えて、そのまま過学習で崩壊してしまった感じです。しかし、スーツ画像を1girl群から除去したのですが、引き続き黒ジャケットが出たのは不思議です。1girl群と1:1になるように調整したのは少しやりすぎで、もっと鬼怒川さん画像を多く学習できるよう2:1か3:1くらいに調整したほうがよかったかもしれません。
(※Fable5の解析では"クロスアテンション突出(8e-5)と焼きすぎによって、anna kinugawaが背負い込んだ「白い胴体+黒い布(黒パンツ、メイド衣装の黒袖・黒グローブ)」の混合特徴を、ベースモデルが「白シャツの上に黒ジャケット」という最寄りの整合的な服として解決した合成幻覚に見える"とのこと。真偽は分かりませんが、参考まで)
以上を踏まえると、やや面白味のない結論ですが、少なくともキャラLoRAにおいては層別に強い傾斜を付けるとメリットよりデメリットが勝ることが分かりました。次は、以下のような傾斜の少ない学習率でやり直してみます。
セルフアテンション3e-5 ▶4e-5
クロスアテンション 8e-5 ▶5e-5
MLP 2e-5 ▶5e-5
さきほど10エポック以降で過学習が起きていたのを参考に、今回はエポック10までとしました。
ついでに、さきほどのデータセットでは「kinugawa outfit」の位置がばらばらになっていたので、Dataset Tag Editorで先頭にある「anna kinugawa」を「anna kinugawa, kinugawa outfit」に置換した上で、「重複タグを削除」し、常に2番目に来るようにデータセットを作り直しました。(タグを書き換えたので、忘れずにanima_te.npzを全削除)
長らく掛かりましたが、こちらが最終版。1エポック目からの学習の進み具合です。基本的に「anna kinugawa」と「kinugawa outfit」だけで生成しており、white shirtやblack denim、long hair、black hairなどの指定はしていません。
white shirtやblack hairがなくても、「anna kinugawa」と「kinugawa outfit」だけで鬼怒川さんの髪色、衣装まで再現することができました。焼き具合もぴったりですね。これ以降も学習を続けると、ジャケットが出るなど過学習による悪影響が生じ始めると思います。
焼き加減は材料によって決まる
ただ、今回たどりついた「セルフアテンション4e-5」「クロスアテンション5e-5」「MLP5e-5」でどんなキャラでも髪色まで学習できるかというとそうでもありませんでした。こちらの例では、トリガーワード「zaraki mina」にミナちゃんを構成する黒髪ポニテ赤眼鏡など全ての概念を焼きこもうとしたのですが、「black hair」などと指示しないと、このように黒髪部分の色合いが抜けてしまうLoRAになっています。
そもそも細部が溶けているので学習失敗ですね。データセット(材料)に対して火力(学習率)が足りず、zaraki minaの正しいカラーリングを覚える前に過学習に至ってしまったケースに見えます。
5e-5では足りないと判断し、3層とも8e-5の強さで学習させると、このように1girl, zaraki minaだけで正しいカラー・衣装・頭身を再現できるLoRAになりました。
よって、5e-5を基本としていたさきほどの学習設定は、もう少し強める余地がありそう。
材料であるデータセットを偏りなく作りつつ、焼き加減である学習率、加熱時間であるステップ数を正しく設定しないとおいしくできあがらないのは、LoRAの難しいところですね。学習率を上げるのには限界があるので、「zaraki mina」というタグ一つに多くの概念をしっかり焼き込みたい場合は、学習速度と引き換えにTextEncoder込みの学習も検討すべきだと思います。
こちらは「the pose」タグで出せる寝そべりポーズを題材にしたエポック比較です。1エポック目から下に向かって学習が進んでいくと、データセットが白背景の中央にミナちゃんが立っている画像に偏っていたため、立ったミナちゃんがいないことを「許せなくなり」、立っている分身を作って空白を埋めてしまいます。
しばらくは分身や異様に長い髪で埋めて安心していましたが、5~6エポックでようやく整合性が取れ(アテンション層の働きでしょう)、白い部分を埋めていた分身が1体のミナちゃんとして融合。9エポック目で指示していないsmileが勝手に出たのを予兆に、10エポック目で再び過学習による崩壊を起こしたように見えます。このケースだと、8エポック目あたりを0.8強度くらいで使うのが良さそうですね。
Anima向けキャラLoRA学習設定まとめ
というわけで、今回のまとめ。検証から分かったのは、「DiTの3つの層はそれぞれ欲しいものと副作用を同時に運んでくる役目を持っており、0にしても残りの層が代わりを果たすため、比率で副作用だけ選り分けるのは難しい」ということでした。
3層はそれぞれ、
・セルフアテンション:画像内の要素同士の関係や全体構成
・クロスアテンション:プロンプトと画像特徴の対応付け
・MLP:形、質感、色、陰影などの特徴変換
…を司ってはいますが、学習率を0にしてもその部分への影響がきれいに消え去るわけではないようです。これを踏まえると、現時点でキャラLoRAを作る際の基本的な学習設定は以下のようなものが良さそうです。
network_dim / alpha:16 / 8
(複数トリガーや複雑な衣装を覚える場合:32 / 16も)
全体学習率:6e-5(※3層を直接指定するなら実質未使用)
セルフアテンション学習率:5e-5か4e-5(構図への影響を抑制したい)
クロスアテンション学習率:5e-5(プロンプト応答性への悪影響を少し抑制)
MLP学習率:6e-5(削る理由があまりない)
llm_adapter_lr:0
Text Encoder:学習しない
総ステップ:batch1換算で1,000~2,000程度に調整。正則化用1girl群も一緒に学習する場合は、メインの学習対象がそれくらいになるように調整(メイン:1girl群の比率は3:2~2:1程度が目安)
つまり、顔立ちや画風も覚えさせたいキャラLoRAの場合は、3層とも学習するのを基本としつつ、構図やプロンプト応答性への悪影響を抑制したいなら、二つのアテンションへの学習を少し弱めるということですね。0にすると顔立ちや体格の再現まで弱まりますし、そこまでしても構図やプロンプト応答性への悪影響が0になるわけではないので、できるだけ残すことを推奨します。したがって、まず3系統を近い学習率で学習し、必要に応じて小さな差を付ける方法が無難です。
逆に、顔立ちまでは覚えてほしくない場合(キャラクターの服装などの学習に留め、ベースモデルの画風を前に出したい場合)は、セルフアテンションを0にしてもよいかもしれません。
なお、今回全体に採用していた学習率6e-5は「公式推奨の3倍」のかなり強気設定ですから、本来は2e-5前後に調整してepochを伸ばした方が安全運転ではあります。(今回のような革ジャケット現象のようなことは起こりにくくなりますが、その分きちんと学習内容が定着するまでステップ数が掛かります)
ただし、シンプルデザインの鬼怒川さんならこれで覚えられますが、ミナちゃんのような大量の構成要素(赤眼鏡、グレーカーディガン、緑グラデポニテ…)を「zaraki mina」一つに集約したいなら、もっと学習率を上げてクロスアテンションもMLPと同率にする必要があります。その分、データセットもきちんとバリエーション豊かに用意しないと過学習を起こしやすくなるわけですね。今回はキャラLoRAでしか検証できていないので、次回以降これをベースに画風LoRA、コンセプトLoRAを作って、さらに検証してみます。
・今後試したいこと:アルファマスク機能
最後におまけ。「詳細設定▶損失とノイズ」欄にある「アルファマスク」にチェックを入れると、透過画像を学習できるようになります。今回のデータセットはH画像以外ほとんど白背景だったので、どうしても「鬼怒川さんといえばいつも画面中央にいる白背景の人」という印象が混入してしまうのですが、白背景画像を透過した上でこの機能をオンにして学習すれば、そうした悪影響を防げるはずです。
髪型、顔、衣装などへ学習を集中しやすくなるはずですし、街や室内など別背景にキャラを置きやすくなると思います。ただ、透過が甘いと余計品質が悪化するので、手間のわりにメリットは小さいかもしれません。Animaではまだ試していないので、効果が確認できればここに追記します。
終わりに
以上、大変なボリュームになってしまいましたが、Anima用LoRA学習検証でした。Text Encoderへの学習や画風LoRAの最適設定など、やるべきことはまだまだあるので、今回はまだ第1回という位置付けになろうかと思います。
SDXLとは勝手が違うのであれこれ分からないこともあったのですが、基本的にはSDXLより素直な学習をしてくれますし、余計な概念が混じってもNegPiPや自然言語指示でカバーが効くので、Animaの印象がより良くなった気がします。これまでは「SDXLより高品質だが扱いにくいモデル」という感じがしていましたが、Copitaを使ったコピー機法と今回の従来学習法の両方が揃ったので、SDXLでやれていたことの大半が「お引越し可能」になってきたように思います。
最近はFable5とChatGPT 5.6 Solを両方使えるようになったので、検証もかなり捗るようになりました。今回はキャラLoRAについて掘り下げましたが、画風LoRAについても別の機会にあれこれ検証してみたいと思っています。今のところ、このような配分がよいのではないかと考えています(未検証)。
それでは今回はこのへんで。スタジオ真榊でした。
Attachments (82)

vOlg4PqY0ZHeQpGGL84fqwzH.jpeg

cjCYvDKZPe9pJbwLhaf7gH4a.jpeg

6vfIVt0orpv2W9NERDDzNxCF.jpeg

aV9NjGsYsKmPVJWkY3xEKajN.png

Ewi41UsLqpuxDPWi3qbsamjx.png

rmla2G2mzCc4413RxC2jGKwy.jpeg

UJ1IFl36BzspfpRI7pURsc70.png

YPks818iLikWGCRq3WZw5wFz.png

5el0odYroCcbJ0l8feXPw5z8.jpeg

44yPQC0OsZIwcfFyY4y124K8.png

SI7ioJu8LQqqqT73HF0WmfrA.png

mWub3YKRRCTpIWqOQgPgeglr.png

jNxKFFYHneGQT8GcSf419On0.png

iLobIFyaySqj7hcOc29xqH0W.png

oJ33O7n5KkCQk3dI2eYrIVnk.png

7Gp32vTbYwy20Pv1JS1iCZEc.jpeg

NE7W3hjyzwOs8fo9xO9vsRas.png
Anima用キャラLoRA学習セット.zip

ysrZ08uvOMYrEmvDeAkLt8gO.png

bQRX8QQlPTyrkxgPcr7YqkPe.png

mQwoYNqcXQxMyu3xraK4y3cI.png

bACA7sVygC3CwKN9IxICuBWP.png

ohtElTYnQTUr6PPOx6sbjOE2.png

eEmE3t3RIECYu8hVJr8W547i.png

xBnXJJNzCr4JtYc8kG0QMEoV.png

GbSDzQ7qqrlLsUT0AvXnqBh3.png

zgKvtgJsFRZ7ffwtrhWDrEBo.png

UjwbFX2cFZ8naJTBEcd3Nm3P.png

Ou59Qch6KmKpDDMRihUHMK8U.png

VitKHdnbURFfxWyN6SndxlQB.png

IO5YO6uKiBLBs68Eribg46Ia.png

fMDLIJQqCAs80r9mYUdhTAEW.png

NnAfJYdiILsjYQRXmVbCBsE2.jpeg

vLcHjXHOyP3SbvdiSIblKsmu.png

RqNud1oepnalxiXZGXGRRRZ8.jpeg

i4cuc9cj3ynIR2YwZH0qo25b.png

y6scEUshTEsO5KiU4nfDJ7QA.jpeg

vvR0jJmGtW9Ws9rs0Pd7thRA.png

Q0pSrdRjCgZAaljtYM93WEiZ.jpeg

p8z6m73fZ7zIEuH6aspIlE23.png

WDq9f7fbQchkCHP6aan8qIvT.png

tkNNA02l1SiVIa0nuI5IPlm1.png

W7UNIN4MspYVPWexu9oY9IyN.png

Q8kTiqWFWTja7997Rh2cYUUa.png

2mUNHvKPcFdbTZb5pmPLcw8A.png

FOKRyvMR1VwsCKyZHxzGryTJ.png

j4ZGid1h84lLd6Ctzm7QMbaI.jpeg

L9eXB9iTF5fQEUnIQ7BFcJiA.jpeg

NO373nlpppy58rHa1ahjKERs.png

PpFXe4dZQtGmO9ObgHDBk3yO.png

2rxD7CDtvpXcVfeXBicJ8RBH.jpeg

w29ydxd6mDKoLgr59zjHA30V.png

xvKLbFKymj6ssVsifYAAa1Yr.png

XnP3efXA2sosRujXcRrxTVQ0.png

kWFrmP0jn8SnMxu9uILjagSN.png

0qzg2mSNJfhnql6IUz4OAhv4.png

5ArMqwJgTC291aG1P8fBhFa0.jpeg

2mJ8TkoI1RAWWS2TmIAZIhlo.png

w6qsnxGdejGDk3szKKeEAJQG.png

y42PZbr2D7DCPMMT9zTC2JE9.jpeg

o9bJ05nN9h08UTc9DI58eGxZ.png

xyF18H7p4t6UbeWDv5zk4fly.jpeg

cUO5tb9ZwXgueVTITsJygzU8.png

vNPQY6gaiFBrGvXK7PzXnWjf.png

q6HyjYdInGM5npD9nsftFTDi.png

8MEiirq0zaAltpLJLBAcK0mi.png

hhLz6otrQblhuy7itbcqJnCp.png

aHHnxUyEFF2ea1HAbE3UpnBX.png

VBpKn9s6RPBsRZhhCLE4B4mi.png

MqdanVA4VkRWvm05ju0qS18s.png

lTlFlugbSCsZSSYRH8goYKjZ.jpeg

ZGAsmc4gz10b9SyhZvY4sgRv.png

8IcGaEnhJT5Bd7VMya5o6dFP.png

JkmNZb1gkUyu9JaEEs3p1V78.jpeg

AATHGpCnvocaatSvoptGwsCj.jpeg

rd9NKNofnTPkE8Ihqdnz6eGg.png

rz7PBYRqACQBU26ErXI5yF9L.png

R4n1Tjw3aRN32tu4Z9jXRqgt.jpeg

InGR1MP5lwcmX4X04sjF7Gf5.png

CZZ7CNK4VNTBKKZtYI38fdy5.png

J2nGXSI4IP3nGcgl08JQ77y0.jpeg

msNF8p6XHqE1zXp8X0uzVjzV.png
