オリジナルキャラクターLoRAの作り方【SD1.5学習編】SD1.5のキャラクター学習

今回の記事は、Kohya ss GUIを使ったSD1.5の学習について詳しく解説します。この記事の執筆時ではSD1.5モデルは主要モデルではありませんが、SD1.5の学習は短時間で終わるので、学習パラメーターを色々試すことができます。現在イラストAIで主要なSDXL(Illustrious・Pony)とまったく同じ特性ではありませんが、入門としては最適ではないでしょうか。Kohya ss GUIのインストールや、データセットの作り方が分からない方は、先に下の記事を読むことをおススメします。


LoRAのプロセスについて
LoRAの学習を理解するにあたって、学習プロセスを理解するのは重要です。簡単にですがプロセスを説明すると、まずインプット画像とキャプションタグを用いて、ベースモデルにデータを入力します。モデルの出力と元の画像を比較し、誤差(Loss)を計算します。このLossをもとに勾配を求め、LoRAの学習対象となるパラメーターを更新します。このプロセスを1ステップとして、繰り返し学習されたパラメーターがLoRAモデルとなります。なお、LoRAはベースモデルのパラメーターを直接変更せず、アダプターを通じて学習を行うのが特徴です。

Kohya ss GUIデフォルト値を使った学習
データセット
まずは、パラメーターをデフォルトで学習してみましょう。データセットは前回の記事で作成したデータを元に学習します。同じデータセットで学習させたい場合は、Patreonで公開していますが、有料サポーター様のみダウンロードが可能となっています。

デフォルトパラメーター
データセットの準備ができたら、次の様なパラメーターで学習します。SD1.5モデルのイラスト学習用に、少しだけ値を変更しました。入力または変更が必要な部分は赤文字で記載しています。
- Pretrained model name or path:runwayml/stable-diffusion-v1-5
- Trained Model output name:DCAI_Girl_SD15_def ※モデルの出力名
- Instance prompt:dcai-girl ※今回使うキャプション方式では値は無視されますが、入力しないとエラーになるため。
- Class prompt:1girl ※上記と同じ理由で入力。
- Repeats:5 [デフォルト:40] ※学習元画像が100枚で、トータル画像を500にしたいため。
- Presets:none
- LoRA type:Standard
- Train batch size:1
- Epoch:1
- Max train epoch:0
- Max train steps:1600
- Save every N epochs:1
- Seed:123 [デフォルト:0 = ランダム] ※パラメーターをコントロールする為に適当な数字を入れます。
- LR Scheduler:cosine
- Optimizer:AdamW8bit
- Learning rate:0.0001 (1e-4)
- Text Encoder learning rate:0.00005 (5e-5) [デフォルト:0.0001 (1e-4)] ※公式ドキュメントの推奨デフォルト値に変更しています。
- Unet learning rate:0.0001 (1e-4)
- LR warmup (% of total steps):10
- Network Rank (Dimension):8
- Network Alpha:1
- clip_skip:2 [デフォルト:1] ※SD1.5イラストAIの場合の推奨値
デフォルトの学習元モデルについて
デフォルトのrunwayml/stable-diffusion-v1-5
は、SD1.5系の基本となっているモデルなので汎用性はありますが、イラスト系の学習にはあまり向いていません。LoRA学習がはじめての方は、基本を知るという意味でこのモデルを使って学習してみましょう。
学習元モデルをデフォルトのrunwayml/stable-diffusion-v1-5
に設定している場合、次のDiffusers pretrainedモデルが自動で読み込まれます。
- vae:diffusion_pytorch_model.safetensors/335Mb
- text_encoder:model.safetensors/492Mb
- unet:diffusion_pytorch_model.safetensors/3.44Gb
Runwayのモデルは現在削除されています。執筆時点のバージョンでは、benjamin-paine氏のリポジトリから自動的にダウンロードしています。
学習時のパフォーマンスについて
Kohya ss GUIの学習中は、Windowsの場合、タスクマネージャーにあるパフォーマンスを確認しましょう。SD1.5モデルの学習はSDXLと比べて軽量なので、あまり気にしなくでも問題ありませんが、専用GPUメモリ(VRAM)が足りなくなると、共有GPUメモリを使います。この状態は学習速度がかなり低下するので、負荷の軽い設定に変更することをおススメします。

学習LoRAを使ったテスト生成
学習されたLoRAを、A1111 WebUIを使って、生成した結果が下図の様になりました。生成には「AnyOrangeMix」を使用しています。

生成結果は忠実性はほとんどありませんが、下図のLoRA適用前の結果と比べると衣装には影響があるのが確認できます。また、顔についてはほとんど影響していませんでした。

テスト生成のパラメーター
cinematic lighting, upper body,
(dcai-girl, 1girl, :1.1),solo, short hair, orange hair, brown eyes, animal ears,
dress, blue dress, long sleeves, black bowtie,
(skirt, black skirt, belt, brown footwear, white thighhighs, thigh strap,:0.8)
masterpiece, meadow, sky
<lora:DCAI_Girl_SD15_def:1.0>
(easynegative:1.0),(worst quality,low quality:1.2),(bad anatomy:1.4),(realistic:1.1),nose,lips,adult,fat,sad, (inaccurate limb:1.2),extra digit,fewer digits,six fingers,(monochrome:0.95)
Checkpoint Model: anyorangemixAnything_mint
Sampler: DPM++ SDE Karras
Steps: 20
CFG scale: 6
Seed: 3547528961
With: 768
Height: 512
Clip skip: 2
Textual Inversion: easynegative
ADetailer: on
Hires upscaler: 4x-UltraSharp
学習したLoRAモデルのメタデータを確認する方法
学習したモデルをDCAIの「🔗LoRAインスペクター🧐」を使えば、LoRAのメタデータを見る事ができます。検証の為に大量のLoRAを学習した時、すべての学習パラメーターを覚えるのは大変なので、LoRAインスペクター🧐で学習パラメーターを確認しましょう。
デフォルト値とanimefullFinalPrunedモデルを使った学習
続いて、学習ベースモデルをアニメ系のベースモデル「Animefull-final-pruned」に変更して、学習してみましょう。
次のモデルを\kohya_ss\models
にダウンロードしてKohya ss GUIの「Pretrained model name or path」にある📄ボタンよりモデル選択します。
パラメーターは先ほどと同じ値で、学習モデルのみを変更して学習した結果が以下になりました。

1回目のテスト生成よりも忠実性が上がりました。さらに、衣装だけでなく顔にも影響がでているのが確認できます。それぞれの効果が分かりやすいようにウェイト比較をしてみました。

LoRAの学習ベースモデルの違いだけでもこれだけの品質違いが出てきます。
Checkpoint Model: anyorangemixAnything_mint
Sampler: DPM++ SDE Karras
Steps: 20
CFG scale: 6
Seed: 3547528961
With: 512
Height: 512
Clip skip: 2
Textual Inversion: easynegative
ADetailer: off
TenorBordの平均Loss値を比較してもわずかにLoss値が下がっています。

LoRAの品質をよくするための手法
高品質なLoRAと言っても何を基準に高品質というのが難しいですが、目的に忠実な画像を生成ができるLoRAは高品質と言えるのではないでしょうか。高品質なLoRAを目指すにはLoRAの目的を明確にすることが重要です。代表的なLoRAの目的を見てみましょう。
- キャラクター
- 衣装
- イメージスタイル(画風)
- コンセプト
- ポーズ
- 背景
- 乗り物
これらの目的によって学習画像・キャプション・学習パラメーターが変わっていきます。今回はキャラクターのLoRAを学習させたかったので人物の特徴・衣装に重点をおきます。この重点によってデータセットと学習パラメーター(学習画像数・総ステップ数・学習率・ネットワークランク)をバランスよく設定する必要があります。
先ほどのLoRAウェイト比較画像をもう一度見てみましょう。

上段の右にあるウェイト1.0の画像を見ると衣装の特徴が少しだけ反映されているのが解りますが、学習元画像とは大きくはなれています。下段では衣装の雰囲気が近づいてきましたが、まだ似ているだけになっています。しかし、上段と比べてLoRAが効いてきているのが確認できます。
学習不足と過学習
LoRAの品質の指標として学習不足と過学習があります。これらは簡単に言うとLoRAの効果が出にくいLoRAを学習不足といい、効果が強く出過ぎてしまうLoRAを過学習といいます。通常これらの症状はUnetの学習度に関係しています。次の比較画像を見てみましょう。

これらはepochを20にして学習させたときのエポックごとに保存したLoRAの比較になります。1エポック500枚の画像を学習しています。
学習不足
比較図一番左の<lora:DCAI_Girl_SD15_afFP-000002:1>
は学習1000ステップ目のLoRAになります。学習元画像の特徴は出ていますが、正確ではないので今回のLoRA学習目的では、学習不足となります。
過学習
反対に、10,000ステップ目の<lora:DCAI_Girl_SD15_afFP:1>
はキャラクター・衣装の再現は正確に生成されています。しかし、学習元画像のグレー背景の影響なのか、プロンプトのmeadow
が認識されなくなり、背景がシンプルな背景しか生成できなくなっています。この状態は今回のLoRA学習目的では、過学習となります。過学習の兆候として顔や手の造形が崩れだしたり、コントラストや、色のにじみが強くなっていたりします。

学習不足や過学習を見分ける手段の1つとしてLoRAのウェイトを調節してみる事です。

ウェイトをプラス・マイナス方向に振り生成結果を確認します。このモデルは1.0あたりが、適正になります。学習不足や過学習のLoRAでは、この適正値が大幅にズレてしまいます。(学習不足例:ウェイトが1.5等で適正|過学習例:ウェイトが0.5等で適正。)
Unet learning rateとText Encoder learning rateについて
学習率のUnet learning rateとText Encoder learning rateは、LoRAの学習パラメーターのなかで重要なパラメーターです。初心者の方は、デフォルト値を使いましょう。結果が悪かった場合はstep/epochで調整します。では、比較画像を見てみましょう。

A1111 WebUIでは、<lora:loraName:Unet:TE>
の様な形式でUnetとTextEncoderそれぞれにウェイトを適用する事ができます。左から、[すべて適応/Unetのみ/Unetと半分のTE/TEのみ/TEと半分のUnet]と並んでいます。この比較画像だけで色々判断するのは難しいですが、UnetとTEについて説明します。
Unet
Unetは、学習画像の要素の関係性や構造における位置づけを学習します。
Unet learning rateは学習不足・過学習に一番影響する値になります。低すぎると学習不足になり、LoRA使用時に学習要素の忠実性が下がります。高すぎると過学習になり、プロンプトと学習画像のイラストスタイルが強く出てしまったりします。
比較画像のUnetのみ/Unetと半分のTEを見てみましょう。Unetのみだと、衣装が学習画像の衣装では無くなっています。Unetと半分のTEだと、衣装の正確性が上がっているのが確認できます。
Text Encoder
Text Encoderは、生成時にAIがプロンプトをどの様に解釈するかを制御します。
Text Encoder learning rateが低すぎるとLoRA使用時にプロンプトが効きにくくなってしまいます。逆に高すぎるキャプションと強く結びつくので、プロンプトに記述していない学習画像の要素(例:背景など)が生成されやすくなります。
比較画像のTEのみ/TEと半分のUnetを見てみましょう。TEのみだと、衣装の要素は近いが、ディテールが忠実ではありません。Unetと半分のTEだと、衣装が学習画像に近くなっています。
このテストでLoRAのUnet learning rateとText Encoder learning rateの強度をある程度把握する事ができます。
Network Rank (Dimension)とNetwork Alphaについて
Network Rank (Dimension)
Network Rank (Dimension)はUnetとTEの情報量を指定します。一般的には大きければ良いとされていますが、大きすぎると余計な情報まで学習されてしまいます。AIイラスト場合は8/16/32/64辺りを使いましょう。
Network Alpha
学習不足にならないようにブレーキの様な役割をします。一般的にはNetwork Rank (Dimension)と同じか半分の値が使われます。この値が低いと学習不足になりやすくなりますが、高すぎるとAIイラスト生成時に学習したポーズや表情が固定されたりします。
以上のことを頭に入れながら比較画像を見てみましょう。

上段はランクを8/16/32/64で学習させ、アルファはすべて1にしています。ランクが高いほど、ディテールが出ています。しかし、アルファが効かないので、表現の自由度がある分、忠実性が無くなっています。
中段はアルファをランクの半分の値にして、適用させています。コチラもランクが高いほど、忠実性が上がっています。
下段はランクとアルファを同じ値にして、適用させています。見た目はほとんど中段と変わりませんが、わずかに忠実度が上がっています。
TensorbordとLoss値について
学習の目安としてTensorbordのLoss値を見ると、ある程度の学習度が確認できます。まずは、デフォルトと「Animefull-final-pruned」の学習のTensorbordを見てみましょう。

基本的にステップが左から右に向かって上がっていきます。通常のグラフは初期段階は高いLoss値から始まり中期に向かって収束していき、後期でまた、すこし上がります。グラフの形が分かりやすいloss/epochのグラフを見てみましょう。

epoch1から2まで急速にLoss値が下がっていきepoch3では落ち着いていきます。では、このグラフにAnimefull-final-prunedで10,000ステップまで学習させたグラフを追加して比較してみましょう。


Epoch/Loss値のグラフが一番分かりやすいので拡大しています。epoc5の時点でLoss値が急激に上がっているのが確認できますが、これは過学習の兆候の現われになります。その後のLoss値も大幅に上げ下げがあります。この様な形のグラフは過学習になっている可能性が高いです。
TensorbordのLoss値はあくまでも参考程度と思ってください。また、Loss値が低いほど優秀という訳でもありません。学習の経過を見て、異常な形になっていないかの確認程度にしましょう。
その他オススメのパラメーター
Scale weight norms
Scale weight normsは学習したLoRAを他のLoRAと併用時に影響が大きくなり過ぎないようにウェイトを平均化します。下の比較画像はデフォルト設定のAnimefull-final-prunedモデルで学習した画像とScale weight normsを1
に設定したモデルの比較になります。

比較画像では生成結果はあまり変わっていませんが、複数のLoRAを適用した時に若干忠実度が上がっています。次の比較図は「🔗flat2」を0.85
で適応しています。また、効果が分かりやすいようにDCAIのLoRAを1.2
で適応しています。

CrossAttention
クロスアテンションを指定します。お使いのGPUがNVIDIA 30X0/40X0系の場合はsdpaの方がパフォーマンスが高くなります。下の比較画像はxformersとsdpaの比較になります。

比較した結果は、学習時間が少しだけ早くなり、忠実度が上がりました。

Shuffle caption/Keep n tokens
キャプションを、Keep n tokensで指定した最初のnトークン分維持しながら、以降のタグをランダムに並び替えて学習します。
設定方法はA1111 WebUI等のプロンプトに、インスタンスタグとクラスタグを入力して、右上にあるカウンターでトークン数を確認します。
Kohya ss GUIのParameters > Advancedにある「Keep n tokens」に先ほど確認したトークン数を入力します。あとは、「Shuffle caption」のチェックボックスをオンにすれば設定完了です。

比較画像ではほとんど変わりませんでした、しかし、TenorBordの平均Loss値を比較するとLoss値が下がっているのが確認できます。

Min SNR gamma
平均Lossをスムーズにして学習を安定させます。論文では5
の値をおススメしています。比較画像はMin SNR gammaを5にて学習しています。

結果はほとんど同じですが、若干忠実性が上がっています。平均Loss値はほとんど同じですが微妙に上がっていました。

パラメーターを変更して高品質なLoRAを学習する
これまでに解説してきたテクニックを使って、LoRAの学習設定をしていきましょう。
今回の設定は、学習画像の忠実度に重点を置いた設定になっています。学習キャラクターのみの生成は良いのですが、複数キャラクターを生成すると、キャラクター要素が他のキャラクターに影響してしまいます(LoRA bleeding)。修正するには、適用LoRAのウェイトを下げるか、今回の記事では説明はしませんが正規化画像を導入したり、アテンションブロックの調整などが必要です。
学習パラメーター
それでは、パラメーターを見ていきましょう。入力また変更した箇所は、赤文字で記載しています。
- Pretrained model name or path:anyorangemixAnything_mint [デフォルト:runwayml/stable-diffusion-v1-5]
- Trained Model output name:DCAI_Girl_SD15_V1
- Instance prompt:dcai-girl
- Class prompt:1girl
- Repeats:5 [デフォルト:40]
- Presets:none
- LoRA type:Standard
- Train batch size:1
- Epoch:4 [デフォルト:1] ※総ステップをEpochで調節する為
- Max train epoch:0
- Max train steps:0 [デフォルト:1600] ※総ステップをEpochで調節する為
- Save every N epochs:1
- Seed:123 [デフォルト:0]
- LR Scheduler:cosine
- Optimizer:AdamW [デフォルト:AdamW8bit] ※VRAMが少ない方はAdamW8bitを使いましょう。
- Learning rate:0.0001 (1e-4)
- Text Encoder learning rate:0.00005 (5e-5) [デフォルト:0.0001 (1e-4)] ※公式ドキュメントの推奨デフォルト値に変更しています。
- Unet learning rate:0.0001 (1e-4)
- LR warmup (% of total steps):5 [デフォルト:10]
- Network Rank (Dimension):32 [デフォルト:8]
- Network Alpha:32 [デフォルト:1] ※忠実度を高めたい為
- Scale weight norms:1 [デフォルト:0]
- Keep n tokens:8 [デフォルト:0]
- clip_skip:2 [デフォルト:1]
- Shuffle caption:true [デフォルト:false]
- CrossAttention:sdpa [デフォルト:xformers]
- Min SNR gamma:5 [デフォルト:0]
以上の設定で学習をしてみましょう。
学習結果
学習したモデルを使って、生成された画像が次の様になりました。

SD1.5系モデルのLoRAは、SDXL系と比べると汎用性があるので「Animefull-final-pruned」で学習したLoRAを、他のモデルで使っても問題なく使用できます。下図の様にイラスト系や、dreamshaper8の様なリアル系でも特徴を捉えたキャラクターが生成できています。また、参考までにスタイル変換をしていないVRoid Studioのキャプチャー画像を使って、同じ学習設定(画像が半分なのでリピート数は10に設定しています。)で学習させて、同じ生成設定で生成した画像も一緒に乗せておきます。



2つの比較画像を見比べると、後半の方がVRoid Studioのイラストスタイルが強く残っています。イラストスタイルまで学習させたい場合は、スタイル変換はしない方が良いでしょう。
最後に最終結果のTenseBordグラフを載せておきます。

最終結果のLoRAはCivitaiにて公開していますので興味のある方はダウンロードしてみましょう。
まとめ
今回はSD1.5モデルの、オリジナルキャラクターLoRAの学習方法を解説しました。前回のデータセット制作とあわせて、CG感の高い学習元画像から、汎用性のあるキャラクターLoRAを学習することができました。この方法を使えば学習元画像のイラストスタイルを無くし、チェックポイントモデルが元々持っているイラストスタイルを活かしたオリジナルキャラクターLoRAを制作する事ができるでしょう。
次回は、SDXLのキャラクターLoRAの解説をします。SDXLはテキストエンコーダーが2つになり、SD1.5の様に汎用性のあるLoRAを作るのは難しいので、系統別で解説していこうと思っています。

