技術約6分で読めます

4人LoRAで毎回同じキャラが出る崩れの大半は、プロンプトの書き忘れで直った

いけさん目次

4キャラ合体LoRAは、全指定プロンプト(トリガー+位置文+識別アンカー+服装文)で一発率6/6まで確認して採用した。ところが、日本語プロンプトをComfyUIへ橋渡しする自作の生成サーバーから4人を指定して生成すると、毎回同じキャラばかり出てくることがあった。人数が減ると起きにくく、4人だとかなりプロンプトを練らないと4人がそろわない。

学習時の検証と本番の生成で結果が違う原因が、LoRA側にあるのかプロンプトの書き方の側にあるのかを切り分けるため、プロンプトの情報量を段階的に削りながら、どこまで削ると誰が消えるかを人数の組み合わせごとに実測した。

検証環境

項目内容
ベースモデルAnima-Base v1.0
キャラLoRAanima-4char-v1_epoch100(rank256)
生成経路自作の生成サーバーのAPIを直接叩き、トリガー語とプロンプト本文をジョブごとに指定
生成設定Turbo 8step / cfg1.0 / er_sde / simple / LoRA strength1.0
対象キャラkurara・keichan・kanachan・koharu(4人合体LoRAの全員)
seed42 / 1234 / 9999 の固定3seed

プロンプトを4段階に分けた

キャラの人数と、プロンプトの情報量を両方振って、どの段階で誰が消えるかを確かめる設計にした。

段階内容
Lv0トリガー語のみ
Lv1+識別アンカー(髪色・アクセサリ等の短い一文)
Lv2+位置文(誰が左・右・中央か)
Lv3+服装文(全員共通の服)

対象は2〜4人の全11通り(ペア6組・トリオ4組・4人1組)。まずLv0とLv3の両端を全組み合わせで実測し、崩れたところだけ追加で検証した。判定基準は、指定した全員が本人の見た目になっているか。身長差は参考扱いにしていた。

トリガー語だけでは大半のコンボが崩れる

Lv0(トリガー語のみ)を11コンボ×3seedの33件で実測した結果、3seedとも通った組み合わせは1つもなかった。

#組み合わせLv0通過数
1kurara+keichan1/3
2kurara+kanachan0/3
3kurara+koharu1/3
4kanachan+keichan0/3
5koharu+keichan0/3
6koharu+kanachan0/3
7kurara+keichan+kanachan1/3
8kurara+keichan+koharu0/3
9kurara+kanachan+koharu0/3
10kanachan+keichan+koharu0/3
114人0/3

33件中、指定した人数全員がそろったのは3件のみで、残り30件は崩れた。2人ペアの時点でほとんど崩れており、崩れは人数によらず起きていた。崩れ方には偏りがあり、30件の失敗の多くはkuraraに関係するものだった。指定していないkuraraが割り込む、他キャラの髪型や身長がkurara寄りになる、といった形で繰り返し出てきていた。

Lv0(トリガー語のみ)でkurara+kanachanを指定した生成例。左のキャラの髪の長さと身長がkanachanでなくkurara寄りになっている

kuraraは4人合体LoRAの学習データ全体でトリガー語の出現数が312件あり、keichan・koharuの282件、kanachanの250件より多い。単純に学習時の露出量が一番多いキャラが、トリガーだけの曖昧なプロンプトでのデフォルトになっていると考えられる。

識別アンカー+位置文+服装文まで重ねるとほぼ直る

Lv3(識別アンカー+位置文+服装文まで重ねたプロンプト)を同じ33件で実測すると、11コンボ中8コンボが3/3で通った。残り3コンボは、全員本人の見た目にはなっていたものの身長差が崩れていた。参考扱いにしていた身長差も判定に入れると、koharu+keichanとkoharu+kanachanは3seedとも身長差が一度もつかず0/3、kurara+koharuは2/3で身長差が小さくなる回が1つ混じった。

全指定(Lv3)での4人生成例。4人ともそれぞれの見た目の特徴を保ったまま分離している

学習キャプションを確認すると、koharukeichanのペア画像キャプション20枚のうち19枚に「koharuの方がshorter」という言及が入っており、koharukanachanのペア画像20枚のうち14枚に同種の言及があった(うち12枚は「about half a head shorter」で表現が揃っていた)。どちらのペアも、最初に組んだプロンプトではこの一文を書き忘れていた。

学習キャプションにある言い回しをそのまま足すと、3seedとも身長差を含めて正しく分離した。

# 修正前(身長差の一文を書き忘れていた)
koharu, with short dark hair and red eyes, is on the left.
keichan, a blonde girl with a blue ribbon, is on the right.

# 修正後(学習キャプションにある言い回しを追加)
koharu, a shorter girl with short dark hair and red eyes, is on the left.
keichan, a blonde girl with a blue ribbon, is on the right.

koharu+keichanの生成比較。身長差の一文を書き忘れたプロンプト(左)と、学習キャプションにある一文を足したプロンプト(右)。同じ2人でも身長差の有無で印象が変わる

身長差は逆転せずになくなっていく

残るkurara+koharuの2/3は、koharu+keichanやkoharu+kanachanと同じ方法では直らなかった。このペアの学習キャプション(6枚)を確認すると、身長差の言及が1枚もなかった。プロンプトに入れていた「koharuが頭一つ分shorter」という一文は学習データに存在しない、自分の作文だった。

koharu+keichan・koharu+kanachanの修正前の生成を見返すと、身長の崩れ方は毎回同じで、片方がもう片方より高くなる逆転ではなく、両者の身長が近づいて差がなくなっていた。この環境・設定で見る限り、複数人の身長を同程度にそろえる既定の傾向があり、身長差の指示がそれをどれだけ上書きできるかで結果が決まっていると考えられる。今回確認した範囲では、学習キャプションに7〜9割台の高い頻度で現れる言い回しを足した場合は3seedとも身長差が出た一方、学習データに存在しない指示ではブレが残った。

生成サーバー側の直し所

11コンボ×Lv0/Lv3×3seedの66件で観測した崩れの多くは、プロンプト側を学習キャプション相当まで書き足すだけで直った。rankを変えた比較はしていないので、LoRAの容量やrankの影響自体はこの検証では判定していない。生成サーバーがキャラ選択時に自動で追加する識別アンカーは、髪色やアクセサリ程度の短い一文だけで、位置文・服装文・ペアごとの身長差のような固有の識別句は入っていない。本番で特定のキャラばかり出ると感じていたのは、この自動挿入テキストの薄さが影響していた可能性が高い。

そもそも学習キャプションはClaudeとCodexを使ってダブルチェックもかけ、全てが同じような出現頻度になるように、学習画像に合うように調整をかけていたはずだった。今回の内容ではそもそもの前提が崩れているのもあるので、3人LoRAまでのできに辿り着いてない気がしている。しかし一応プロンプトで調整は効くので、例えばプロンプトを大きめのエンコーダーに差し替えることが可能なら、表現範囲が広がるのかどうか、というのを今後の調査課題にしようと思う。