最も基本的なLoRAマージ手法。各LoRAの重み行列を指定比率で線形結合する。
LoRAは内部的に A行列(down projection) と B行列(up projection) の積として表現される。
Linear Mergeはこの差分行列を比率加算する。計算が最速で実験初期に最適だが、重みの符号衝突(両LoRAで逆方向の更新が存在する場合)により品質が劣化することがある。
2モデル専用。重みベクトルを球面上のジオデシック(最短経路)で補間するため、重みの大きさ(ノルム)を保存しつつ方向をブレンドできる。色味・塗りの崩壊を抑制する効果がある。
3個以上のLoRAには対応しない。2キャラの等価合成(0.5:0.5)や微妙な調整(0.4:0.6)に最適。
複数LoRAのパラメータ干渉を段階的に解消する高精度手法。
| ステップ | 処理内容 | 目的 | パラメータ |
|---|---|---|---|
| ①Trim | 最大変化量パラメータのみ保持(上位k%) | ノイズ的な微小変化を除去 | trim_ratio(推奨0.2-0.4) |
| ②Elect Sign | 各パラメータの符号を多数決で決定 | 逆方向更新による相殺を防止 | 自動(重みの絶対値合計大側) |
| ③Merge | 符号一致パラメータのみ加重平均 | クリーンな特徴合成 | ratios配列 |
3個以上のLoRAマージで最も効果を発揮する。特にスタイル汚染・色味干渉の激しいケースに推奨。
研究論文で提案された手法で、90-99%の差分重みをランダムにゼロ化してからリスケールする。過剰な特化を削ぎ落とし、複数LoRAの干渉を最小化する。
異なるrankのLoRA(例:dim8 + dim16)を直接合算すると形状エラーが発生する。SVD版マージは以下のステップで対応する:
| ツール | 対応アルゴリズム | SDXL対応 | ランク不一致 | GUI | 速度目安 | waiIllustrous v160推奨ケース |
|---|---|---|---|---|---|---|
| sd-scripts/merge_lora.py Kohya公式 |
Linear / SLERP | ◎ | △(形状一致必須) | ×(CLI) | 高速(30秒〜) | 同一dim同士の通常マージ。量産環境推奨。 |
| sd-scripts/svd_merge_lora.py Kohya SVD版 |
SVD分解 | ◎ | ◎ | ×(CLI) | 中(2-5分) | dim8+dim16など異ランクLoRAのマージ必須。 |
| sd-webui-supermerger A1111拡張 |
全種+ブロック重み | ◎ | ○ | ◎(WebUI) | 中(1-3分) | ブロック重みでレイヤー選択マージしたい場合。 |
| LoRA-Merger-ComfyUI Mergekit統合 |
TIES / DARE / SLERP / Linear 他8種 | ◎ | ◎ | ◎(ComfyUI) | 低〜中(3-10分) | DARE-TIES実行・ComfyUIパイプライン統合。最推奨。 |
| mergekit(HuggingFace PEFT) Arcee AI製 |
TIES / DARE / SLERP / 線形他 | ○(LLM主体) | ◎ | ×(CLI/Python) | 高速 | 実験・大規模研究向け。Diffusion用はLoRA-Merger-ComfyUI経由推奨。 |
# 同一dimのキャラLoRA A(0.65) + キャラLoRA B(0.35) のマージ
python networks/merge_lora.py \
--sd_model "D:/models/waiIllustrousSDXL_v160.safetensors" \
--save_to "D:/loras/merged_charAB_v1.safetensors" \
--models "D:/loras/char_miyabi.safetensors" \
"D:/loras/char_yuki.safetensors" \
--ratios 0.65 0.35 \
--device cuda \
--dtype float16 \
--save_precision fp16 \
--clamp_quantile 0.99
# dim8キャラ + dim16スタイルのSVDマージ
python networks/svd_merge_lora.py \
--sd_model "D:/models/waiIllustrousSDXL_v160.safetensors" \
--save_to "D:/loras/svd_char_style_merged.safetensors" \
--models "D:/loras/char_miyabi_dim8.safetensors" \
"D:/loras/style_anime_dim16.safetensors" \
--ratios 0.65 0.35 \
--svd_rank 64 \
--device cuda --dtype float16
| # | エラー内容 | 原因 | 対処法 |
|---|---|---|---|
| 1 | shape mismatch | 異なるdimのLoRA同士 | svd_merge_lora.py に切替・--svd_rank 64を指定 |
| 2 | CUDA OOM | VRAM不足 | --device cpu + --dtype float32(時間は増加) |
| 3 | 出力ファイル破損 | 量子化異常 | --clamp_quantile 0.95-0.99 追加・--save_precision fp16固定 |
[Load LoRA File A] ──┐
├─→ [DARE Merge LoRA Stack] ──→ [Apply LoRA Merged] ──→ [KSampler] ──→ [VAE Decode]
[Load LoRA File B] ──┘ ↑ ↑
density=0.80 [Load Checkpoint]
ratios=[0.65,0.35] waiIllustrousSDXL_v160
method=DARE-TIES
DARE Merge LoRA Stackノード推奨設定(v160向け):merge_method=DARE・density=0.75-0.85・ratios合計1.0・3LoRA同時マージまで・seed固定推奨(再現性確保)。
| 比率 (A:B) | 期待結果 | 崩壊リスク | 推奨用途 | 備考 |
|---|---|---|---|---|
| 0.8:0.2 | キャラAの特徴が強く残る。Bはサブ要素として色味・雰囲気に混在。 | 低(15%) | ベースキャラ強化・バリエーション追加 | Aのトリガーワードのみ有効な場合が多い |
| 0.7:0.3 | A主体でBの特徴(髪色・目色・体型要素)がほのかに出る。自然なブレンド。 | 低〜中(25%) | 新キャラ創出の最推奨比率 | 最も安定した結果が出やすい黄金比 |
| 0.6:0.4 | 両キャラの特徴が混合。顔の造形に両者の影響が出る。 | 中(40%) | ハーフ・ミックスキャラ生成 | 複数回テストで安定確認要 |
| 0.5:0.5 | 均等融合。特徴が均一に混合されるが崩壊率が最も高い。 | 高(60%) | 実験用・品質確認後のみ量産可 | 符号衝突が最大化するため品質劣化しやすい。TIES適用推奨。 |
| 0.3:0.7 | キャラBが主体。Aはサブ要素として混入。 | 低(20%) | B中心・A要素追加 | 0.8:0.2の逆パターン |
# マージ後の呼び出しパターン(比率0.7:0.3の場合)
A主体で生成:
"miyabi_char, 1girl, ..."
B要素を強調したい場合:
"miyabi_char, yuki_char, 1girl, ..." ← 両トリガー並列
LoRAスタック(Runtime運用)との比較:
# Runtime版(推奨)
LoRA: miyabi_char.safetensors, model_str=0.75
LoRA: yuki_char.safetensors, model_str=0.25
ZipLoRA(論文: "Any Subject in Any Style by Effectively Merging LoRAs", 2023)はスタイルLoRAとキャラLoRAを自動最適化でマージする手法。本質的にハイパーパラメータフリーで最適比率を自動計算するが、Illustrious向け実装には追加設定が必要。手動マージでは以下の比率が実用上の最適解となる。
| 用途 | キャラLoRA強度 | スタイルLoRA強度 | 期待品質 | 推奨手法 | 備考 |
|---|---|---|---|---|---|
| エロ漫画R18用 | 0.85 | 0.55 | キャラ一貫性高・スタイル自然融合 | DARE-TIES | block weightでOUT0-5=0.3に設定。キャラ崩れを抑制。 |
| ソフトアニメ塗り追加 | 0.75 | 0.65 | 柔らかい塗りとキャラ特徴の両立 | Linear | 塗りスタイルはキャラと干渉しにくい。Linear で十分。 |
| 線画強調(主線太め) | 0.80 | 0.40 | 手描き感のある線画維持 | TIES | ミッドブロック(mid0-5)のみにスタイル適用。顔崩れ抑制。 |
| 背景スタイル追加 | 0.90 | 0.35 | キャラをほぼ完全保持・背景のみ変化 | Linear | 背景専用スタイルLoRAは干渉度が低い。キャラ優先。 |
| 厚塗り風(油絵調) | 0.70 | 0.70 | 厚塗りスタイルとキャラの融合 | DARE-TIES | 両方強度が高いため干渉リスクあり。density=0.80 で DARE を通す。 |
| デフォルメ・SD風 | 0.65 | 0.75 | SD体型・キャラ識別可能程度の特徴保持 | TIES | スタイルが主体。キャラはトリガーワードとアイコン的特徴に頼る。 |
sd-webui-supermerger のブロック重み機能を使用することで、UNetの特定レイヤーにのみスタイルLoRAを適用することができる。キャラLoRAと干渉しやすいレイヤー(入力・中間ブロック)を避け、スタイルが作用しやすい出力ブロックに集中させる戦略が有効。
# ブロック重み設定例(キャラ保護・スタイル後段適用)
# IN_BLOCKS(0-11) / MID_BLOCK(0) / OUT_BLOCKS(0-11)
キャラLoRA: IN=1.0, MID=1.0, OUT=1.0 ← 全ブロック適用
スタイルLoRA: IN=0.0, MID=0.3, OUT=0.7 ← 後半ブロックのみ
崩壊したLoRAをゼロから再学習するのではなく、崩壊部分のみを差分として上書きするアプローチ。崩壊LoRAとターゲット理想出力の差分を低ランクで学習することで、工数を1/3-1/5に削減できる。
| 崩壊タイプ | 主な原因 | 修復手法 | 成功率目安 | 工数目安 | 推奨ツール |
|---|---|---|---|---|---|
| 顔崩れ(埴輪化) | 学習枚数不足・過学習 | 差分LoRA(dim4)で顔特徴のみ再学習。または健全LoRAと0.6:0.4でTIESマージ。 | 65% | 2-4時間 | kohya_ss + TIES |
| 髪色化け | NEGタグ不足・学習データの髪色揺れ | Linear再マージ(正常版を0.4の強度でブレンド)。PromptにNEG色補完。 | 75% | 1-2時間 | merge_lora.py |
| 体型崩壊 | dim不足・体型多様データ不足 | SVDマージで体型特化LoRA(dim16)を0.3の比率でブレンド。 | 50% | 3-6時間 | svd_merge_lora.py |
| スタイル汚染 | 学習データに異スタイルが混入 | DARE(density=0.85)でスタイル関連重みをドロップ後、ベースLoRAとLinearマージ。 | 55% | 2-4時間 | DARE-ComfyUI |
| 解像度・ディテール不安定 | rank不足(dim8の限界) | rank upしたLoRA(dim16)に再学習。マージ修復は困難。 | 30% | 6-12時間(再学習) | 再学習推奨 |
2024年論文で提案された「精度劣化モデルからの軽量LoRA復元」手法。崩壊LoRAのA行列・B行列を固定し、残差をdim4の小ランクアダプタで学習することで最小工数で精度を回復する。Kohya環境では以下の設定で近似実装が可能:
# 差分LoRA学習の近似設定(kohya_ss train_network.py)
network_dim = 4 # 最小ランク(修復パッチ用)
network_alpha = 1
learning_rate = 5e-5 # 通常より低め(過修正防止)
max_train_steps = 500 # 短期修復
# 崩壊LoRAをnetwork_weightsに指定して差分学習
network_weights = "path/to/broken_lora.safetensors"
waiIllustrious v160で学習したLoRAを他のSDXLモデルで使用すると、同じ差分重みが異なるベース重みに加算されるため、結果が変わる。ベースモデル差分(delta)を計算して補正することで転移精度を向上させる手法がある。
| 転移元 | 転移先 | 互換性 | 品質劣化度 | 対応手法 | 実用度 |
|---|---|---|---|---|---|
| waiIllustrous v160 | waiIllustrous v161〜 | 高 | 5-10% | そのまま使用可 | A(即戦力) |
| waiIllustrous v160 | waiANIPONY v140 | 中 | 20-35% | delta補正 or block weight調整 | B(追加調整要) |
| waiIllustrous v160 | NoobAI SDXL | 中 | 15-30% | model_str 0.6以下で使用 | B |
| waiIllustrous v160 | Pony v6 | 低 | 40-60% | delta補正必須・部分的のみ | C(実験用のみ) |
| waiIllustrous v160 | SDXL 1.0ベース | 中 | 25-40% | delta補正推奨 | B |
# ベースモデル差分を計算(スクリプト例)
python calc_model_delta.py \
--base_src "waiIllustrousSDXL_v160.safetensors" \
--base_tgt "waiANIPONY_v140.safetensors" \
--output "delta_v160_to_pony.safetensors" \
--scale 0.3 # 補正強度(0.1-0.5)
# LoRAに差分補正を適用
python apply_delta_to_lora.py \
--lora_in "char_miyabi_v160.safetensors" \
--delta "delta_v160_to_pony.safetensors" \
--lora_out "char_miyabi_pony.safetensors"
| テスト軸 | プロンプト例 | 確認項目 |
|---|---|---|
| 正面アングル | 1girl, [trigger], looking at viewer, portrait, white background | 顔・髪色・目色の一致 |
| 横顔 | 1girl, [trigger], profile view, side shot | 輪郭・横顔造形の一貫性 |
| 後ろ姿 | 1girl, [trigger], from behind, full body | 髪型・体型・服の一貫性 |
| アップ(表情) | 1girl, [trigger], happy expression, close-up face | 笑顔・表情表現の質 |
| 全身立ち絵 | 1girl, [trigger], standing, full body, white background | 体型・プロポーション安定性 |
| 衣装1(デフォルト) | 1girl, [trigger], default outfit | 衣装再現精度 |
| 衣装2(ヌード/R18) | 1girl, [trigger], nude, r18 | 肌色・体型のキャラ一貫性 |
| # | チェック項目 | 合格基準 | 配点 |
|---|---|---|---|
| 1 | 髪色一貫性 | 7枚中6枚以上で正しい髪色 | 15点 |
| 2 | 目色一貫性 | 7枚中6枚以上で正しい目色 | 10点 |
| 3 | 顔造形安定性 | 埴輪化・別人化なし(7/7枚) | 20点 |
| 4 | 体型一貫性 | 全身5枚中4枚以上で体型安定 | 15点 |
| 5 | スタイル崩れなし | 異スタイル混入・色汚染なし | 10点 |
| 6 | トリガーワード反応 | trigger使用時とnon-trigger時で明確差 | 10点 |
| 7 | アヘガオなし(R18) | 表情崩れなし(品質ゲートルール準拠) | 5点 |
| 8 | CLIP Score | ≥ 0.82(CLIP ViT-L/14で測定) | 5点 |
| 9 | Grok採点 | キャラ一貫性軸 70点以上 | 5点 |
| 10 | NG品質ゲート通過 | r18_quality_gate.htmlで加重3.8以上 | 5点 |
合格基準:合計 80点以上(量産可)。70-79点は追加調整推奨。69点以下は再マージまたは廃棄。
| 比較軸 | Runtime strength | Merge weight(baked) | 推奨場面 |
|---|---|---|---|
| 1. 変更の容易さ | 高:ノード値変更で即反映 | 低:再マージが必要(2-10分) | テスト・実験 → Runtime |
| 2. VRAM使用量 | 複数LoRA分加算(3LoRA例:+3.7GB) | 単一LoRA分のみ(+1.2GB) | VRAM制約あり → baked |
| 3. 推論速度 | 基準比 -12〜18%(3LoRA同時) | 基準比 -3〜5% | 量産高速化 → baked |
| 4. 一貫性・再現性 | 中(seed+strength組み合わせ依存) | 高(ファイル固定のため完全再現) | 品質管理 → baked |
| 5. ファイル管理 | 複数LoRAファイル必要 | 単一.safetensors | 配布・共有 → baked |
| 6. 複数LoRA同時使用 | 最大8個程度(VRAM依存) | 推奨3個まで(品質保証観点) | 多種類組み合わせ → Runtime |
| 7. 量産時の推奨度 | 低〜中(LoRAが少なければ可) | 高(v160実績:53体中41体合格) | 量産 → baked推奨 |
| 8. 実験・テスト時 | 最適(比率即調整) | 非推奨(都度再マージ) | テスト → Runtime |
| 9. 配布・共有時 | 非推奨(複数ファイルセット必要) | 最適(1ファイル配布) | 配布 → baked |
| 10. v160 実績 | 12/53体合格(実験用) | 41/53体合格(量産用) | 量産 → baked圧勝 |
# ComfyUI Load LoRA ノード設定(waiIllustrous v160向け)
## 通常キャラLoRA(単体使用)
model_strength_model: 0.78 # UNet適用強度
model_strength_clip: 0.82 # テキストエンコーダ適用強度
## キャラ+スタイル 2本同時(Runtime)
LoRA1 (キャラ): model=0.75, clip=0.80
LoRA2 (スタイル): model=0.40, clip=0.30
## NG体の強度下げ運用(修復の前に試す)
model_strength_model: 0.55 # 0.75→0.55 に下げる
model_strength_clip: 0.60
# clip_str が高すぎる(0.9+)と prompt の効きが弱くなる
# → テキスト指示の自由度が落ちるため0.85以下推奨
| No. | 失敗内容 | 主な原因 | 対処法 | 予防策 |
|---|---|---|---|---|
| 1 | 合成後に両キャラの特徴が消滅(のっぺらぼう) | 0.5:0.5 Linear で符号衝突が全パラメータで発生 | TIESマージに切り替え | 最初の実験は0.7:0.3から始める |
| 2 | 髪色が毎回ランダム変化 | 両LoRAの髪色差異が大きい(黒髪 vs 金髪) | DARE(density=0.8)でノイズ除去後マージ | 同系統の髪色キャラ同士のみ合成 |
| 3 | スタイルLoRAが強すぎてキャラ消滅 | スタイル強度0.7超 | スタイルを0.3-0.4に下げる | スタイルLoRA上限は0.55を原則 |
| 4 | マージ後にLoRAが機能しなくなる | 異なるベースモデルのLoRAを合成 | 使用不可(廃棄) | 同一ベース確認を必須チェックに追加 |
| 5 | dim8 + dim16 のmerge_lora.pyでshapeエラー | rank不一致 | svd_merge_lora.py使用 | マージ前にLoRAのdimを確認 |
| 6 | CUDA OOMでマージ失敗 | VRAM不足(12GB以下) | --device cpu で実行 | CPU実行オプションを常備 |
| 7 | maerge後の.safetensorsが破損 | clamp_quantileなし・precision不一致 | --clamp_quantile 0.99 + --save_precision fp16追加 | マージスクリプトのテンプレを統一 |
| 8 | 3LoRA合成で画質が著しく劣化 | 干渉が多重化 | 2LoRA合成→再合成の段階的マージ | 一度に3本以上はDAREのみ許可 |
| 9 | SLERP適用でNaNエラー | θ=0(完全一致)のベクトル | SLERPをLinearに切り替え | マージ前に重みの類似度を確認 |
| 10 | 比率1.0:0.0でも元LoRAと結果が異なる | clamp_quantileや精度丸め誤差 | 元LoRAを直接使用 | マージは必ず新規ファイルとして保存 |
「みやびキャラLoRA(dim8, waiIllustrous v160)+ アニメスタイルLoRA(dim16)」のSVDマージ比率調整プロセス:
| 試行 | 比率(キャラ:スタイル) | 結果 | 問題点 | 次のアクション |
|---|---|---|---|---|
| 試行1 | 0.5:0.5 | 失敗 | みやびの顔造形が消滅。スタイルに引きずられる。Grok採点38点 | キャラ比率を上げる |
| 試行2 | 0.7:0.3 | 部分成功 | 顔は改善(55点)。髪色が若干スタイルLoRA色に引っ張られる。 | キャラをさらに上げるか、DARE適用 |
| 試行3 | 0.65:0.35(DARE density=0.80適用) | 改善 | 髪色安定(68点)。スタイルが薄い印象。 | スタイルを少し強めにする |
| 試行4 | 0.65:0.40(DARE density=0.80) | 成功 | 品質スコア79点。キャラ一貫性・スタイル両立。 | 黄金比率として採用 |
一般法則:キャラLoRA の最適比率 ≈ 0.65〜0.80、スタイルLoRA ≈ 0.35〜0.55(Illustrious向け実績値)
| 手法 | 工数/1体 | GPU時間 | 成功率 | 適用条件 | 優先度 |
|---|---|---|---|---|---|
| model_str調整のみ | 10分 | 0(推論のみ) | 70%(スコア55-70対象) | スコア55-70の軽度崩壊 | 最優先 |
| Linear/TIESマージ修復 | 1-2時間 | 0.1-0.5時間 | 55-65%(スコア40-55対象) | スコア40-55・崩壊タイプ特定済み | 高 |
| 差分LoRA学習(dim4) | 3-6時間 | 1-2時間 | 60%(顔崩れ・色化け) | スコア30-50・修復箇所特定済み | 中 |
| 再学習(dim8フル) | 8-16時間 | 3-6時間 | 85%+ | スコア30未満・マージ修復失敗 | 低(最終手段) |
| 廃棄 | 5分(判断のみ) | 0 | — | スコア30未満・データセット再構築不可 | スコア30未満・廃棄推奨 |
| カテゴリ | 症状 | 想定体数 | マージ修復可否 | 推奨アクション | 期待改善スコア |
|---|---|---|---|---|---|
| A(軽度) | スコア55-70。model_str下げで改善可能な軽度崩れ。 | 約18体 | 不要(調整のみ) | model_str 0.75→0.55に下げてテスト | +10〜15点 |
| B(中度) | スコア40-55。顔崩れ・髪色化けなど特定症状。 | 約22体 | 可(TIES/差分LoRA) | 崩壊タイプ特定→TIES or 差分LoRA | +15〜25点 |
| C(重度) | スコア30-40。複合崩壊。マージ修復は部分的。 | 約8体 | 部分的(dim4再学習補助) | 差分LoRA + DARE試行。失敗なら再学習 | +10〜20点(不確実) |
| D(崩壊) | スコア30未満。根本的データ不足・学習失敗。 | 約5体 | 不可 | 廃棄→データセット再構築→再学習 | 再学習で+40〜60点 |
| 軸 | 配点 | 基準 |
|---|---|---|
| 修復コスト(低い方が高点) | 25点 | 10分以内=25点、30分=15点、6時間超=5点 |
| 修復成功率(高い方が高点) | 25点 | 70%+=25点、50-70%=15点、50%未満=5点 |
| 量産投入後の期待収益 | 20点 | 高評価キャラLoRA=20点、汎用=10点、ニッチ=5点 |
| キャラLoRAとしての完成度ポテンシャル | 20点 | 学習データ質(良=20点、中=10点、不良=0点) |
| 既存Volとの連携可能性 | 10点 | Vol連携あり=10点、単発=5点 |