こんばんは、スタジオ真榊です。今回は、supermergerやregional-prompterで知られるhakomikanさんが開発した追加学習法「ADDifT」についての特集記事です。
CoppyLoRAで使われているコピー機法と同様に、2枚の画像ペアから違いを抽出し、LoRAとして出力することができる技術で、最短1分でLoRAを作れる快速性が最大の特徴です。
おなじみのCoppyLoRAは2枚の画像を過学習した「コピー機LoRA」を順番に作って差分を取るのですが、今回検証するADDifTはコピー機LoRAを作らず、2枚の画像をもとにいきなり差分LoRAを一発学習できるのが最大の違い。RTX4080環境ですと、CoppyLoRA一つ学習するのに40分かかりますが、ADDifTは1~5分程度で学習ができてしまいます。
ADDifTはhakomikanさんの提供されているLoRA学習用の拡張機能「traintrain」に実装されているのですが、以前reForgeに導入してみたところ環境ごと壊れてしまったので、A1111版かForgeで導入するか、拡張ではなく単独で動作する「traintrain-standalone」を使うのが安心かもしれません(現在はreForgeにも対応しているとの告知あり。試していませんので各自自己責任で)
この記事では、インストール方法を簡単に触れた後で、実際に各種LoRAを作って検証し、従来のCoppyLoRAとの使い分けを考えてみたいと思います。
1.インストール
(1)拡張機能としてインストールする方法
(2)スタンドアロン版をインストールする方法
2.traintrainを使ってみよう
3.ポーズ差分学習
・画像ペアを簡単に作るには?
・使用モデル
・traintrainの設定
4.ポーズLoRA生成実験
・学習し直し①:学習回数とdim/alphaを増やす
・学習し直し②:dim32/alpha16
・学習し直し③:学習回数を200に/BASEにも学習
・瞳LoRAでは別の設定がベター
5.「ADDifT Style」で画風差分学習
6.ADDifTの現状 - メリットとデメリット
7.Multi ADDifTで複数同時ペア学習
・設定入力方法
・リネーム方法
8.まとめ -coppyloraとの比較-
まずはインストール方法から見ていきましょう。traintrainを拡張機能としてインストールする方法と、coppywebUIのようにスタンドアロン(単体)で動作するアプリをインストールする方法の二つを順番に解説していきます。スタンドアロン版の方はやや導入が複雑です。
(1)拡張機能としてインストールする方法
公式サイトの説明によると、拡張機能が動作するのは、A1111版WebUI v1.10か、Forge/reForge の最新バージョン。やり方は「URLからインストール」に「https://github.com/hako-mikan/sd-webui-traintrain」と入力して「インストール」するだけでOKです。
インストールがうまくいっていれば、このようにtraintrainのタブができているはずです。こちらが起動画面。スタンドアロン版を使わない方は「2.traintrainを使ってみよう」まで飛んでOKです。
(2)スタンドアロン版をインストールする方法
SDwebUIの拡張機能ではなく、CoppyLoRAwebUIのように単体で動作させたい場合はこちら。インストールしたい場所でこちらのリポジトリをgit cloneします。
よく分からない方(かつ、Win11を使用している方)は、インストールしたい場所で右クリックして「ターミナルを開く」をクリック。「git clone https://github.com/hako-mikan/traintrain-standalone」と入力してENTERすると、その場所にフォルダができるはずです。よくわからなかったらChatGPTやGrok3に「このリポジトリを好きな場所にgit cloneしたいんだけどどうしたらいいの?」と聞いてみましょう。
スタンドアロン版の場合、インストールが終わった後に、普段使っているmodelフォルダのパスを指定する必要があります。これを指定しないと、ベースモデルやVAEを選ぶことができませんし、出力先のLoRAフォルダが見つかりません。
webui-user.batをメモ帳で開いたら、「set COMMANDLINE_ARGS=」となっている行を下記のように書き換えます。
set COMMANDLINE_ARGS=--models-dir (modelsフォルダのフルパス)
例えば私の環境だとこのようになります。余計な半角スペースなどがないかよくチェックしましょう。できたらファイルを上書きして保存。
書き換えが済んだら、今上書き保存したwebui-user.batをダブルクリックします。初回は各種インストールが進むので多少待つことになります(次回からはサクサク)。このような画面になりますので、「Running on local URL:」以降のURL部分をCtrlキーを押しながらクリックすると、ブラウザでスタンドアローン版のtraintrainが起動します。
traintrainはADDifT専用のアプリというわけではなく、汎用的なLoRA学習ツールです。LoRA学習自体はほかのツールでも可能ですが、hakomikanさんの開発したADDifTでの学習は現時点ではこのツールでしか行うことができません。
◇公式解説
こちらの「Mode」から「ADDifT」にチェックを入れるところから始めましょう。
その右上にあるのは、学習目的別の設定プリセットのプルダウンメニューです。「ADDifT Action」は二枚の画像の動きや位置の違いを抽出するのに向いた設定で、「ADDifT Style」は画風の違いを抽出するのに向いた設定です。SDXLモデル用LoRAを作る場合は「XL」がついているものを選び、横の「↙」ボタンを押すと、公式おすすめの設定が全ての入力欄に上書きされます。
では、さっそくこちらのペアで「口元で逆ピースをして舌を出すポーズLoRA」を作ってみましょう。
・画像ペアを簡単に作るには?
その前に、こうした差分LoRA学習用の画像ペアの作り方から触れておきます。
このような差分用画像はNovelAIのv4インペイントを使うと簡単に作ることができます。まず学習ターゲットとしたいポーズの画像を用意し、このように手と口の部分をインペイントして普通のポーズにするだけ(arms at sideタグを使うと自然に手を下におろせます)。二つの画像の間で異なっているのはポーズだけ、というペアにできればOKです。
NAIをサブスクしていない方は、Controlnetインペイントなどを使ってもよいでしょう。最近では、ChatGPT4oに頼むなどしてペアを作ることもできるようになってきています(画角を変えるLoRAなどを作るときはとても役に立ちます)
・使用モデル
今回のテストに使用したベースモデルはWAI-NSFW-illustrious-SDXLのv12です(記事執筆時点の最新バージョンはv13)。ターゲット画像も、ベースモデルのマスピ画風で生成した方がLoRAの精度がよくなると思われます。
・traintrainの設定
さっそく学習していきましょう。LoRA学習が初めてで「dim」や「alpha」、「オプティマイザ」といった言葉について知らない方はこちらの記事をご参照ください。

【注】この記事は過去記事のアーカイブです。特に理由がなければ、現在の環境に合わせたアップデート版の特集をお読みください。 こんばんは、スタジオ真榊です。今日はAnimagineXLベースのLoRAを自分で作れるようになる方法についての大型検証記事をお届けします。1枚の画像から簡易的な画風LoRAやキャラLoRAを作る「Co...
traintrainの設定はこのような感じです。(拡大して御覧ください)
・「停止」のすぐ下のウィンドウでアクション(ポーズを動かす)LoRA学習用のプリセット「ADDifT Action XL」を選び、↙ボタンを押すとプリセット(ひな形)が入力されます。
・「モデル」からベースモデルにするcheckpointを選択(今回はWAI-NSFW-illustrious-SDXLのv12)
・「VAE」はNoneか、普段使用しているものを選びます。
・「train iterations」は学習回数。ADDifTでは30~100程度が限界で、それ以上にすると過学習を起こします。ここは公式プリセットのまま「30(回)」にします。train batch sizeは公式推奨の「1」とします。
・「train learning rate」は学習率(lr)。プリセットの「0.0002」のままでいきます。
・「train optimizer(オプティマイザ)」はプリセットのCAMEを使います。これは、低ステップから学習結果が出てくることで知られている比較的新しいオプティマイザです。
・プリセットを使う場合、network rank(いわゆるdimのこと)は4、alphaは1が推奨値。これを引き上げると学習に時間が掛かり、LoRA自体が重くなる代わりに細部をよく学習することができます。とりあえずそのままでやってみます。
・「train lr scheduler」は、学習率スケジューラ。デフォルトはコサインですが、プリセットだと「cosine annealing」を採用しているようです。このままやります。
・「use gradient checkpointing」は、学習時のVRAM使用量を抑制できる重要オプション。学習開始したらVRAMがいっぱいになってしまって異常に学習に時間が掛かってしまう場合、ここにチェックを入れましょう。(私のRTX4080環境ではチェック必須です)
・「save lora name」に、これから作るLoRA名を記入します。「lora trigger word」はいわゆるトリガーワードのこと。通常のLoRA学習では「vpero」などと独自の文字列を入れておくと、そのワードを入れたときに覚えさせた要素が現出するようにできるのですが、ADDifTではあまり安定した効果が見られないようです。普段は空欄にしています。
・「network blocks(BASE = TextEncoder)」はモデルのどの層に学習を影響させるかです。プリセットは「BASE」だけ外しており、つまりTextEncoderに学習させない設定になっています。
一つ下の画面はほぼいじりません。アクションLoRAの場合はtrain min timestepsを500、train max timestepsを1000とするのが公式の推奨で、プリセットでもそのようになっています。「save as json」という入力欄にチェックを入れておいて学習すると、学習した設定がさきほどのプリセット欄に記録されるので、いつでも呼び出せるようになります。
あとは画面最下部の二つある画像入力欄から、用意したペアを入力します。左がベース、右がターゲット。LoRAを適用すると、左の画像が右の画像に変化するのを想定します。画像ペアのサイズは必ず一致するようにしましょう。
あとは「Start Training」ボタンを押せば学習開始です。私の環境では1分20秒ほどで、ADDifT製LoRA「test01.safetensors」が保存されました。
ほぼプリセットの設定でできたLoRAで、さっそく画像生成してみます。
学習に使ったモデルを使用し、PP:1girl, upper body + クォリティタグで普通に生成したのがこちら。 上から「強度1」「強度0.5」「LoRA適用なし」です。
うーん、全然ダメでした。なんとなく舌を出して手を口元に沿える程度しか学習できていない感じがします。学習回数が30回では足りなかったのでしょうか。
しかし、プロンプトに「v,tongue out」を足してみると、このように学習した内容がちゃんと出てきました。ただ、それではあまりLoRAを作る意味がないので、より良い学習設定を検討してみます。
・学習し直し①:学習回数とdim/alphaを増やす
さきほど30回だった学習回数を100回に増やし、次元数なども「dim16/alpha8」に変更してみます。公式の説明では「学習回数は30~100程度でよく、それ以上だと過学習になる」とのことでしたので、その限界にトライしてみます。
学習時間は学習回数の分増え1分20秒から3分30秒程度に増加しましたが、このような感じになりました。(vやtongueタグはなし)
強度1は過学習により崩壊。さきほどよりは指の形を覚えましたが、まだ学習が足りず、奇形化してしまっています。指をどうするか学習しているのではなく、「肌色のふたまたのものをこの位置に置く」くらいの理解しかできていないようです。
・学習し直し②:dim32/alpha16
そこで、細部を詳しく覚えてもらうため、network rank(dim)を「32」、network alphaを「16」に変更し、学習率を0.0002から「0.0001」に下げてみました。一気にではなくじっくり学習することで、崩壊を防ぐのが狙いです。
このように、指の精度が多少上がり、強度を強めたときの崩壊が多少防げたことが分かります。
・学習し直し③:学習回数を200に/BASEにも学習
改善が見られたことを受けて、学習回数をさらに2倍の「200」にし、チェックを外していた「BASE(つまりTextEncorder)」にも学習させてみます。
こちらが生成結果。
やはり強度1だと崩壊しますが、0.5前後の適用度ならかなり改善したように見えますね。
ランダムシードで4枚生成生成するとこのような感じ。
これで、なかなかうまくいったのではないでしょうか。
いまのところ、この「CAMEで学習回数200回、dim32Alpha16、バッチサイズ1、train timesteps500~1000」の設定が一番よい結果が出ています。もちろん覚えさせたい差分の内容によっても最適な設定は変化すると思いますが、影響があまり出ない(学習が足りない)ならステップを増やし、細部がおかしいならdim/alphaを引き上げるのは通常のLoRA学習と同じ考え方ですね。
ちなみに、上の画像では薬指と小指がやや不安なかたちになっており、人差し指と中指もちょっと長すぎるように感じるのですが、これは学習させたターゲット画像がそのようになっているためです。ADDifTでは2枚の画像の差だけが抽出され、文脈はあまり理解されにくいので、学習設定だけでなく、学習させる画像そのものを厳選することも重要なのが分かります。
さきほどのLoRAを普段使いのモデル(同じillustrious系)で生成するとこうなりました。多少細部は怪しいですが、5分でこれができるのはすごい。
・瞳LoRAでは別の設定がベター
ここまでは良いのですが、その後の実験で、違う種類のLoRAを作る場合は全く違う設定がベターであることがわかってきました。こちらは左の画像を1girl,faceで生成し、手作業でハイライトを塗りつぶして「虚ろ目」にしたペアです。
さきほどうまくいった「CAMEで学習回数200回、dim32Alpha16、バッチサイズ1、train timesteps500~1000」で学習させると、0.5強度の適用でこのような感じになりました。あまりちゃんと消せていないですね。
ところが、逆に学習回数を50に下げ、dim8/alpha1にしてみると、今度は綺麗にハイライトを消せるLoRAができてしまいます。
じゃあこれが最適設定なのか!?と思いきや、この設定でさきほどの舌出しVサインLoRAができるかというと…
全くできませんでした。
これはいろいろ考え方がありそうですが、ペア間の「侵襲度」というか、このLoRAが画像をどれだけ遠く書き換えるかによって、適切な設定が大きく変わるということなのだと思います。瞳のハイライトを消す程度なら侵襲度が低いので、低ステップの学習でも十分書き換えられる(むしろ細部を覚えすぎるとよくない)のに対して、ポーズを大きく変更する場合は、より多数回の学習をじっくりしないといけない、ということなのでしょう。
こちらができたハイライト消しLoRAでランダム生成したもの。1分ちょいで作ったものですが、ちゃんと意図通りになっていますね。学習が短時間でできる分、失敗も結構起こるので、ADDifTを使いこなすのはかなり「慣れ」が必要なのかなと思います。
さて、アクションLoRAはうまくできたので、今度は「ADDifT Style XL」のプリセットで、普段CoppyLoRAで作っていた賢木画風LoRAを作ってみましょう。

こんにちは、スタジオ真榊です。今回は、NoobAIなど生成するたびに顔立ちや画風が変わりやすいIllustrious系モデルに、CoppyLoRAv2を使って「マスピ顔」を作る実験を行いました。うまくいくまでに起きた各種失敗と、そこから分かってきた知見をまとめてレポートしたいと思います。 Illustrious系モデルはNovelAIのように...
今回はこちらのペアから画風を抽出してもらいます。右はAI絵の顔部分を私が手で描き直した「賢木画風の顔立ち」。左はそれを実写系モデルで雑にimage2imageして、「ターゲットと同じものを描いているが、画風がかけ離れている絵」です。
追加学習の仕組みからして、基本的には1024x1024サイズの正方形を選ぶことにしていますが、1024x1536pxくらいまでなら横長や縦長のイラストでもおそらく大丈夫だと思います。実際、さきほどのVサインLoRAの画像ペアは二つとも1024x1536pxでした。
「ADDifT_Style_XL」のプリセットを適用し、あとはモデル・VAE・LoRA名を指定して、そのまま学習してみましょう。さきほどの感想からすると学習回数などが足りないことが予想されますが、まずは出来上がりを見て判断します。
できたのがこちら。こ、これはひどい…
では、学習回数200回でdim32/alpha16、学習率は0.0001、BASEにも学習するなど、基本的にはさきほどのアクションLoRAと同じ設定にしてみます。一つ違うのは、さきほどtrain min timestepsを500、train max timestepsを1000としていたところを、min200、max400に変更するところです。こちらも公式の推奨値をそのまま採用しています。
しかしこちらも大崩壊。
どうもADDifTでは違いがはっきり収束しないような差分をうまく学習できないのかもしれません。左側の突き放した画風との相性が悪いのかと考え、今度はこのような、白紙との差分を取ってみました。
するとこのように、中段の1枚がややいい感じに。しかし、強く適用すると白紙になってしまう効果も出てしまい、安定は全くしませんでした。
0.4くらいの強度でランダム4枚生成すると、このようにややそれらしい画風で描かれることもあるのですが、けっこうな確率で上の例のように崩壊(何も描かれない)してしまいますし、画風が似ないので使いようがありませんでした。画風LoRAを作るなら、ADDifTより素直にCoppyLoRAを使ったほうがコントロールしやすいように思います。
ちなみにhakomikanさんのnoteの解説では、「ペアの左右を逆転させるとうまくいく」という記述もありましたが、私の環境ではそうした現象は見られませんでした。(普通に突き放したほうの画風LoRAの出来損ないになる)
どうもADDifT Style XLの使いどころは、このような描き手ごとにある「画風」ではなく、いわゆる「スライダー系」のスタイルコントロールの方が向いているようです。例えば、線を太く/細く調整したり、書き込みの量を増減させたり、色を濃く/薄く調整したりといった感じでしょうか。
例えばこのようなペアで、春らしいカラーリングを学習させてみます。設定はdim16alpha8、min200max400、CAMEで50回です。(所要時間約1分)
するとこのようになります。強度1では崩壊しますが、0.5では影響がカラーに絞った影響が見られます。
学習回数を200に上げて、dim64/alpha32まで上げるとこれくらい(所要時間5分)。強度を上げると崩壊度が強まりますが、0.5ではこちらの方がよく特徴が出ている気がします。
一方、CoppyLoRAで同じミナちゃんの画像ペアから学習するとこうなります(所要時間40分強)。こちらは強度を強めても崩壊しないことが分かります。
これまでにない速度で一発学習ができるADDifTですが、ここまでで分かったのは、やはり「設定がピーキー」「速度と品質はやはりトレードオフ」だということです。1分で作ると学習不足が起こりやすいですし、ほぼ設定の余地がなく期待した結果が出やすいCoppyLoRAに比べて、設定の余地がたくさんある代わりに差分抽出の結果が予測不能なところがADDifTの特徴かなと思います。今後さらにブラッシュアップされていくのでしょうし、より汎用性の高い設定などが見えてくれば、より使い勝手も上がっていくでしょう。
ADDifTでのアクションLoRAには弱点もあります。これは、さきほどのプロンプトに「from side,looking ahead」を加えたもの。覚えた画像ペアは正面・カメラ目線でしたから、それと違う条件を指示したとたん、うまく効かないLoRAになってしまいました。
多様な生成指示にフィットする差分LoRAを作るには、正面しかないペアでやるより、コピー機学習法でじっくり正確に差分を取りだすか、通常通り数十枚のデータセットから共通部分を抽出したほうがよいのかもしれません。
ただ、ADDifTでは、CoppyLoRAにはない「複数ペアから同時に抽出する」Multi ADDifT機能が実装されています。これはADDifTの快速性があるからこそできる学習法で、例えばさきほどの「舌出しVサイン」も、さまざまなキャラや角度のペアで学習させることができる可能性があります。
Multi ADDifTは、ADDifTで従来のコピー機学習法よりも圧倒的に早く追加学習できることを利用して、2枚セットの画像ペアを複数同時に学習してしまおうという野心的な学習法です。さきほどは正面のみの画像ペアで学習したため、他の画角の指示に応えきれませんでしたが、このように3つのペアで学習すれば改善するかもしれません。
さっそく実際に検証してみましょう…と言いたいところですが、この記事を書いている4/5現在、最新版のtraintrainではMulti ADDifTの動作がおかしいようですので、今回はやり方だけ記述しておきます。
・設定入力方法
traintrain画面上で「Multi ADDifT」にチェックを入れると、通常の「ADDifT」とは少し設定画面の欄が変化します。
画面最下部の2枚の画像ペアを入れる欄がなくなり、「lora data directory」や「diff target name」といった項目が増えています。ここに、さきほどの3組の画像ペア(画像サイズの同じ計6枚のpng)を格納したフォルダのフルパスと、「ターゲットネーム」という文字列を入れる必要があります。
・リネーム方法
デスクトップなど適当な場所にフォルダを作り、traintrainから見てどれがターゲットでどれとペアか分かるようにリネームします。ここが難しい!
ルールは「ペア同士は同じファイル名にし、ターゲットとなる方には"ターゲットワード"を入れる」というもの。ターゲットワードはなんでもよいのですが、ここでは「vpero」としました。こちらの画像で見た方が理解が早いと思います。
このようにリネームできたら、「アドレスをテキストとしてコピー」します。
今回は「C:\Users\owner\Desktop\vperodata」というパスですので、このように入力欄にコピペします。そのすぐ下の「diff target name」に、先ほど半角アンダーバーをはさんで入力したワード(今回は_vpero)を入れれば完成です。ここで注意したいのは、「vpero」ではなく「_vpero」としないと、「nodata(画像ペアが見つかりません)」エラーが起こるということ。ペア同士の差分になっている文字列をそのまま打ち込みましょう。
あとはさきほどアクションLoRAを作ったときと同じ設定でやってみましょう。3ペア同時に学習するので、右下の「use gradient checkpointing」にチェックしておくことをおすすめします。
リネームやフォルダのパス指定がうまくいっていれば、このように学習が進みます。今回は3つのペアですが、単純に3倍の時間が掛かるわけではないようで、通常のADDifTで学習回数100回の設定をしたときとほぼ同じ時間で学習できます。(2~3分)
ただ、現在の最新版ではこのように、適応しても全く変化のないLoRAが出力されるようです。私だけの環境かなと思いいろいろ試しましたが、他の方からも同様の報告があるようですので、後日改善されましたら、実験結果やパラメータ設定などを検証していきたいと思います。
というわけで、快速差分学習法ADDifTの検証でした。個人的な感想としては、差分LoRAを数分程度で学習できるのはやはり強力! CoppyLoRAとの違いとしてはやはりその快速性が最大のメリットですが、デメリットはある程度研究しないと安定した結果が得られないことと、LoRAの内容によっては1分学習(学習回数30回程度)ではやはり効果が薄く、5分程度は掛けないとまともに使えないところが気になるかなと思います。
また、違いが明確なポーズLoRA(アクションLoRA)と違い、言語化が難しいような画風LoRAの学習は不得意なようです。ここはCoppyLoRAに明らかに軍配が上がるポイント。アクションLoRAの実験でも実感できましたが、目の種類LoRAや眉の角度LoRAなど、2枚の画像の違いがとても明確で、侵襲度が低くさほど複雑でない変化をする場合は、従来のLoRAに比べて圧倒的に速い時間で作れるのがADDifTの強み。いろいろな目の種類のLoRAを量産する場合など、とても捗ると思います。
また、今回は検証できませんでしたが、Multi-ADDifTを使うことで、より汎用性のある差分LoRAを作ることも期待できます。あるポーズを覚えさせたいとき、全身図だけで学習させても細部は覚えられないわけですが、「全身図」「バストアップ」「手のアップ」「横から」「背後から」など複数のペアを用意して学習させると、いろいろな指示に反応できるLoRAになるのではないでしょうか。
まだできたての技術ですが、CoppyLoRAとどちらが優れているかというよりも、それぞれのメリット・デメリットを理解して、自分がいま作りたいLoRAに合っているのはどちらかを見定めるのが重要かなと思います。
それでは今回はこのへんで。スタジオ真榊でした。
おまけ:マジで知りませんでした。