LoRAにはいくつかのモジュールとアルゴリズムが存在する。
どれを使うかによって、パラメータの行列での扱い方が変わり、
学習結果に大きく影響する。
LoRAの種類
メジャー系LoRAの早見表
編集が難しく手を焼いており、旧情報があります。後述のリンク先も参照して下さい。
| 概要 | 設定パラメータ | ||||
|---|---|---|---|---|---|
| 実装モジュール --network_module=XXX | アルゴリズム名 | 旧式 | 語源大まかな特徴 | --network_args “XXX” “XXX” 指定必須な変数は★ | その他の設定 (公式推奨値) |
| networks.lora | LoRA-LierLa 改名前:LoRA | LoRA for Linier Layers, Linear 層およびカーネルサイズ 1x1 の Conv2d 層に適用されるLoRA | - | ||
| LoRA-C3Lier | LoConと基本機能は同じ。 LyCORIS版LoConと混合を避けるため改名 | conv_dim=XXX ★ conv_alpha=XXX ★ loraplus_lr_ratio=8 | |||
| LoRA+ | LoConの一種。v0.9.0より使用可能。 学習効率が高く扱いやすい。 | conv_dim=XXX ★ conv_alpha=XXX ★ | loraplus_lr_ratio=XX | ||
| locon.locon_kohya | LoCon | 旧 | LoRA for C olutional layers with 3 x3 Kernel and Linear layers | conv_dim=XXX conv_alpha=XXX | |
| networks.dylora | DyLoRA-LierLa | LoRA-LierLaのDyLoRA版 | algo=dylora ★ unit ★ down_lr_weight mid_lr_weight up_lr_weight dropout | ||
| DyLoRA-C3Lier | LoRA-C3LierのDyLoRA版 | algo=dylora ★ conv_dim ★ conv_alpha ★ unit ★ down_lr_weight mid_lr_weight up_lr_weight dropout | |||
| DyLoRA-LoRA+ | LoRA+のDyLoRA版 | unit lora_dim alpha apply_to_conv modules_dim modules_alpha | loraplus_lr_ratio=XX | ||
| lycoris.kohya | LoCon | algo=loconまたはlora ★ conv_dim=XXX conv_alpha=XXX | |||
| LoHa | アダマール積のLoRA | algo=loha ★ conv_dim=XXX conv_alpha=XXX dropout=XXX | dim <= 32, 上限64 alpha <= 1 | ||
| LoKr | クロネッカー積のLoRA | algo=lokr ★ conv_dim=XXX conv_alpha=XXX dropout=XXX | |||
| (IA)^3 | algo=ia3 ★ conv_dim=XXX conv_alpha=XXX | ||||
| DyLoRA | ※不明 | ||||
| Native Fine-Tuning | algo=full ★ conv_dim=XXX conv_alpha=XXX | ||||
実装モジュール:これをインストールすれば対応するアルゴリズムを使用できるようになります。
アルゴリズム名:一般的な呼称です。
旧式:完全上位互換の元が登場し、使う必要のなくなった方式
各LoRAの概要
※まともに紹介すると長文になるので、sd-scriptsのURLを優先的に掲載。
sd-scriptsに実装済みでメジャーのもの
LoRA-LierLa
LoRA-C3Lier(LoCon)
- LoRA: Low-Rank Adaptation of Large Language Models(arxiv)、LoRA(github)をStable Diffusionに適用したもの。
LoRA+
- LoRAプラスと読む。
- 一見すると新種のLoRAだが、基本構造や使い方、マージ方法はLoCon/DyLoRAそのもの。
- LoRAのA✕B行列のうちA側(上流側)のLearning rate比重を大きく設定できることで、驚異的な学習能力をもたらす。
- Lrを複数指定する方式であるため、一つしかLrを指定できない自動型オプティマイザーは使用不可*1。
2025/06時点でProdigy+ / RAdamScheduleFree で動作するのを確認、さらにLoRAだけでなくDoRAでも併用可能
- 検証結果
リンク掲載は控えるが、RedRayz氏がnoteで検証結果を報告しているのでそちらを参照のこと。 - シンプルな設計の割に高い忠実性を持つが、自動型オプティマイザーを使いたいかどうかで評価は大きく変わるだろう。
DyLoRA系
- sd-scripts内の解説:https://github.com/kohya-ss/sd-scripts/blob/main/docs/train_network_README-ja.md#dylora
- 技術論文:https://arxiv.org/abs/2210.07558
LyCORIS
誘導→ LyCORIS
その他マイナーなもの
OFT
Orthogonal Fine-Tuningの略。直行ファインチューニング。
- sd-scriptsに実装済み機能。SDXLに対応、SD1には非対応。
- 公式解説
- 特徴
- LoConのように「小さな行列」を追加するのではなく、「ニューラルネットワーク状の層」を追加して学習する。
その結果、複雑なタスクに対処できる。イメージ図
+------------------+ | 元のモデル | | (例えばU-Net) | | | | +-------------+ | | | Conv Layer | | ← 畳み込み層 | +-------------+ | | | Conv Layer | | | +-------------+ | | | Residual | | | | Block | | | +-------------+ | | | Attention | | | | Layer | | ← アテンション層 | +-------------+ | | | ... | | | +-------------+ | +------------------+ | | (追加のOFTレイヤー) v +------------------+ | OFT Layer | ← 追加されたOFTレイヤー | | | +-------------+ | | | OFT Block | | ← OFTブロック(通常は直交行列を使用) | +-------------+ | | | OFT Block | | | +-------------+ | | | ... | | | +-------------+ | +------------------+ | v +------------------+ | 元のモデル | | (例えばU-Net) | | | | +-------------+ | | | Conv Layer | | | +-------------+ | | | Conv Layer | | | +-------------+ | | | Residual | | | | Block | | | +-------------+ | | | Attention | | | | Layer | | | +-------------+ | | | ... | | | +-------------+ | +------------------+- LoConとfine tuningの中間的なVRAM消費と性能を持つ。
- LoConのように「小さな行列」を追加するのではなく、「ニューラルネットワーク状の層」を追加して学習する。
- 計算効率が高い。
直交性を保つ計算を行う。
行列内に存在する互いのウェイトの独立性が保たれ、あるウェイト更新が他のウェイトに影響を与えにくいため、従来のようにステップ進行に伴い画風(ウェイト)が往復するような無駄な計算を減らせる。- たとえば、互いのタグ要素が混ざりにくいといった効果を比較的得やすい。
あるキャラを学ばせたいのに、1girl等のウェイトが変動するせいで、キャラ学習が進まないという現象を回避しやすい。 - 収束期において、適当に設定したfine tuningよりも教師画像との一致度を高くしやすい。
- たとえば、互いのタグ要素が混ざりにくいといった効果を比較的得やすい。
- 元のモデルのウェイトは更新しないので、fine tuningよりも軽量
- 学習結果は元モデルへマージ可能。
sdxl_merge_lora.pyを使用する。- マージ方法:ベースモデルへのマージ(LoRA)
- 技術詳細:PR#1580
- 設定例
--network_module=networks.oft --network_dim=40 --network_alpha=1e-3 --network_args "enable_conv=true"- dim(=num_blocks)の値について、
dim=1でfine tuningと同等。dim=8,16,32,…のように大きくするとOut of Memoryしにくくなる*2 - alpha(∝constraint)
- dim(=num_blocks)の値について、
- 学習時の留意点
- 学習する規模が大きいので、精度を求めるならば
細かなタスクに対応できる設定を行うと良いかもしれない。- 例えば、prodigyを使うなど。
- 限界性能こそ他の方式よりも高いが、
低品質なデータセットに対する結果について未検証。
- 学習する規模が大きいので、精度を求めるならば
LoRA-FA
sd-scriptsに実装済み。軽量なのが特徴
LoRA-FA is added experimentally. Specify --network_module networks.lora_fa option. The trained model can be used as a normal LoRA model.*4
NestedUNet
としあき製のLoRA-C3Lier亜種。
詳細はNestedUNetページを参照