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

今回の記事はSDXLの1つPony Diffusion V6 XL(PDXL)を使ってキャラクターLoRAを学習します。PDXLは、Stable Diffusion XL(SDXL)をベースにした高品質なT2Iの一種で、とくにアニマルや人間、などのキャラクターを得意としたモデルになります。Pony派生モデルも多く公開されているので、Ponyベースで学習したLoRAをさまざまなスタイルで生成する事ができます。Kohya ss GUIのインストールや、データセットの作り方が分からない方は、まずは下記の記事を読んでみましょう。
また、LoRA学習がはじめての方は学習が早く終わるSD1.5モデルから為すことをおススメします。
Kohya ss GUIのデフォルト値を使った学習
まずは、キャラクター学習編でいつも最初に紹介しているKohya ss GUIのデフォルト値を使った学習をしてみましょう。ベースモデルは下記のモデルを使います。
データセット
データセットは「オリジナルキャラクターLoRAの作り方【データセット編】学習画像の制作とキャプション」で作成したデータを元に学習します。同じデータセットで学習させたい場合は、Patreonで公開していますが、有料サポーター様のみダウンロードが可能となっています。

デフォルトパラメーター
データセットの準備ができたら、下記のパラメーターを使って学習します。Ponyモデルの学習用に、少しだけ値を変更しています。入力または変更が必要な部分は赤文字で記載しています。
- Pretrained model name or path:ponyDiffusionV6XL_v6StartWithThisOne.safetensors
- Trained Model output name:DCAI_Girl_Pony_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
- Max resolution:1024, 1024 [デフォルト:512, 512] ※SDXLの解像度
- Network Rank (Dimension):8
- Network Alpha:1
- clip_skip:0 [デフォルト:1] ※SDXLではClip skipが無効化される為
学習したLoRAを使ったテスト生成
学習されたLoRAを、A1111 WebUIを使って生成した結果、下図の様になりました。生成には学習のベースモデルと同じ「ponyDiffusionV6XL_v6StartWithThisOne.safetensors」を使用しています。下はLoRA適用前の画像になります。


一見習熟度が高く見えますが、紹介した画像はseedが当たりだったのでよく見えてます。実際は衣装が不安定な生成をしていました。
Ponyモデル特有のスコアタグについて
Ponyモデルの特徴としてスコアタグがあります。下記に一覧をまとめたので見ていきましょう。
- score_9:極めて高品質(最高ランク)
- score_8_up:高品質(上位20%程度)
- score_7_up:良好(中〜上クラス)
- score_6_up:普通(中品質)
- score_5_up:やや低め(やや荒い、構図が甘いなど)
- score_4_up:低品質(破綻やぼやけあり)
たとえばscore_8_up
を指定すれば「スコア8以上」を言う意味ですが、score_9, score_8_up
と同時指定して使われることが多いです。
この品質タグを画像のキャプションに含めることによって学習品質をある程度調節する事ができます。
注意点としては、学習画像が明らかに低い場合にscore_9
を使うとLoRAモデルが不安定になる場合があります。また、学習画像に品質のバラつきがある場合はスコアタグを低めscore_6_up
にしたり、使わないようにしましょう。
比較モデルは下記の設定で学習して、それぞれにスコアタグを適用しています。
学習画像数:100
Repeats:5
Train batch size:1
Epoch:4
Max train steps:0
Seed:123
LR Scheduler:cosine_with_restarts
Optimizer:AdamW
Optimizer extra arguments:betas=0.9,0.99 weight_decay=0.05
Learning rate:0.0004 (4e-4)
Unet learning rate:0.0004 (4e-4)
Text Encoder learning rate:0.00005 (5e-5)
LR warmup (% of total steps):10
LR # cycles:2
Max resolution: 1024, 1024
Network Rank (Dimension):32
Network Alpha:16
clip_skip:0 ※SDXLではClip skipが無効化される為
各モデルをA1111 WebUIで生成しています。プロンプトはスコア無し、score_9や、すべてのスコア入りまで色々なスコア設定で生成しています。
生成設定は以下の様になっています。
基本ポジティブ-プロンプトdcai-girl, 1girl, solo, looking at viewer, solo, short hair, orange hair, brown eyes, animal ears, dress, meadow, sky, day, masterpiece, best quality
worst quality, low quality, bad anatomy, realistic, lips, inaccurate limb, extra digit, fewer digits, six fingers, monochrome, nsfw
checkpoint: ponyDiffusionV6XL_v6StartWithThisOne.safetensors
Steps: 20
Sampler: DPM++ SDE
Schedule type: Karras
CFG scale: 6
Seed: 3740385248
Size: 1024x1024
VAE: sdxl.vae.safetensors







今回のデータセットではスコア無しかscore_8_up辺りで学習して、score_8_upの生成もしくはscore全部入り+ネガティブプロンプトの生成が最適ではないでしょうか?score_4_upも品質が良いのは意外でした。
データセットのキャプション編集はA1111 WebUIの拡張機能「WebUI Dataset Tag Editor」の「Batch Edit Captions」にある「Search and Replace」を使います。

「Search Text」に1girl,
と入力して「Replace Text」に1girl, score_8_up,
と入力すれば書き足す事ができます。書き換える前に、Search and Replace inをEntire Caption
に選択して全体を書き換えしましょう。詳しい方法を知りたい方は下記の記事を参照してください。
Prodigyオプティマイザーを使った学習
今回はProdigyオプティマイザーを使って学習してみようと思います。
Prodigyオプティマイザーとは、基本的にはAdamWなのですが、最近のLoRAやDreamBoothの学習で注目されている適応学習率(Adaptive Learning Rate)最適化アルゴリズムを使ったオプティマイザーです。とくに低い学習率でも高速収束しやすいことから、LoRAの微調整や高品質学習に向いているオプティマイザーです。
Prodigyオプティマイザーの使い方
使い方としては基本的にはKohya_ss GUIのParametersの中のBasicにあるOptimizerからProdigy
を選択するだけです。なお、LarningRateはUnet/TextEncoder共に1.0
で学習します。学習率を下げたい場合はLRを下げるのではなくOptimizer extra argumentsにd_coef=0.5
(デフォルト:1.0)の様に記入することである程度調整できます。
公式ドキュメントではスケジューラーのcosine annealing
を推奨していますが、cosine_with_restarts
やpolynomial
でも高品質なLoRAを学習させることができます。
Prodigyオプティマイザーを使ったKohyaSS_GUIの設定
それではProdigyオプティマイザーの使ってKohya_ss GUIを設定していきましょう。使用するデータセットは先ほどのデフォルトパラメーターの学習で使用したのと同じデータセットをつかいます。今回のデータセットでは、Ponyのスコアタグを使うと、学習元画像のイメージスタイルが強く出てしまうので使いませんでした。
Optimizer extra argumentsについて
前回のSDXLの設定でも説明しましたが、Optimizer extra argumentsを使ってGUIで設定できないパラメーターを触っていきます。
まずは、リポジトリを参考に引数を見ていきましょう。
リポジトリより一部抜粋- params: 最適化するパラメーターのイテラブル、またはパラメータグループを定義する辞書のリスト。
- lr: 学習率調整パラメーター。Prodigyの学習率を増減させます。(デフォルト: 1.0)
- betas: 勾配およびその二乗の移動平均を計算するための係数。(デフォルト: (0.9, 0.999))
- beta3: 移動平均を用いてProdigyのステップサイズを計算するための係数。
None
に設定された場合、beta2
の平方根の値が使用されます。(デフォルト: None) - eps: 数値的安定性を向上させるために平方根演算の外側の分母に加えられる項。(デフォルト: 1e-8)
- weight_decay: L2正則化としての重み減衰。(デフォルト: 0)
- decouple: AdamWスタイルのデカップルされた重み減衰を使用するかどうか。(デフォルト: True)
- use_bias_correction: Adamのバイアス補正を有効にするかどうか。(デフォルト: False)
- safeguard_warmup: ウォームアップ段階での問題を回避するために、D推定値の分母から学習率(lr)を除外します。(デフォルト: False)
- d0: D適応のための初期D推定値。変更の必要はほとんどありません。(デフォルト: 1e-6)
- d_coef: Dの推定値を求める式中の係数。
0.5
や2.0
なども一般的に効果があります。このパラメーターを変更することで最適化手法を調整するのが推奨されます。(デフォルト: 1.0) - growth_rate: Dの推定値がこの乗数レート以上に急激に増加しないように制限します。
1.02
などの値を使うと、ある種の学習率ウォームアップ効果が得られます。(デフォルト: float(‘inf’)(無制限)) - fsdp_in_use: シャード化されたパラメーターを使用している場合は
True
に設定する必要があります。オプティマイザーはこれを自動検出しようとしますが、PyTorchの組み込み以外の実装を使っている場合は自動検出が機能しません。(デフォルト: False) - slice_p: 各テンソルの
p
番目の要素のみを用いて学習率適応の統計を計算することでメモリ使用量を削減します。1
より大きい値は通常のProdigyに対する近似となります。11
付近の値が妥当です。(デフォルト: 1)
この中でも今回は下記の引数を変更します。コピーしてOptimizer extra argumentsに貼り付けましょう。記入方法(= の前後にスペース禁止、カンマ区切りではなく、スペース区切り等)にご注意ください。
weight_decay=0.05 d_coef=1.3 betas=0.9,0.99 safeguard_warmup=True use_bias_correction=True
スケジューラーについて
今回はpolynomial
を使っていきます。polynomialはは、学習率(learning rate)を多項式曲線にしたがって減衰させるスケジューリング手法です。最初は速く学び、後半に学習率を抑える目的で使われます。
GUIのLR powerで学習率の減衰カーブを制御できます。下記のTensorBordのグラフを見てみましょう。

LR powerを変えることにより色々な学習率の減衰カーブを作ることができます。また、デフォルトの1
はカーブが掛からないので、スケジューラーの「linear」と同じになります。
今回はLR powerを2
にして学習するのでシアンのカーブになります。
学習パラメーター
先ほどの2つの設定に加えて、以前の記事でも紹介したShuffle captionなどを設定します。下記の一覧で入力または変更が必要な部分は赤文字で記載しています。
- Pretrained model name or path:ponyDiffusionV6XL_v6StartWithThisOne.safetensors
- Trained Model output name:DCAI_Girl_Pony
- Instance prompt:dcai-girl※今回使うキャプション方式では値は無視されますが、入力しないとエラーになるため。
- Class prompt:1girl※上記と同じ理由で入力。
- Repeats:5 [デフォルト:40]
- Presets:none
- LoRA type:Standard
- Train batch size:1
- Epoch:6 [デフォルト:1] ※総ステップをEpochで調節する為
- Max train epoch:0
- Max train steps:0 [デフォルト:1600] ※総ステップをEpochで調節する為
- Save every N epochs:0 [デフォルト:1] ※途中経過を見る必要が無かった為
- Seed:123 [デフォルト:0 = ランダム]
- LR Scheduler:polynomial [デフォルト:cosine]
- Optimizer:Prodigy [デフォルト:AdamW8bit]
- Optimizer extra arguments:weight_decay=0.05 d_coef=1.3 betas=0.9,0.99 safeguard_warmup=True use_bias_correction=True
- Learning rate:1.0 [デフォルト:0.0001 (1e-4)] ※Prodigy推奨値
- Text Encoder learning rate:1.0 [デフォルト:0.0001 (1e-4)] ※Prodigy推奨値
- Unet learning rate:1.0 [デフォルト:0.0001 (1e-4)] ※Prodigy推奨値
- LR warmup (% of total steps):0 [デフォルト:10] ※Prodigy側で制御する為
- LR power:2 [デフォルト:1]
- Max resolution:1024, 1024 [デフォルト:512, 512] ※SDXLの解像度
- Network Rank (Dimension):32 [デフォルト:8]
- Network Alpha:16 [デフォルト:1]
- Keep n tokens:8 [デフォルト:0] ※インスタンスとクラスのトークン数
- clip_skip:0 [デフォルト:1] ※SDXLではClip skipが無効化される為
- Shuffle caption:true [デフォルト:false]
- CrossAttention:sdpa [デフォルト:xformers]
以上のパラメーターで学習したTensorBordグラフが以下の様になりました。step:1900辺りが過学習の兆候に見えますが、最終的にlossが下がっているのでOKとしました。


学習結果
学習結果としては、それなりに高品質なLoRAができたと思います。顔面の品質は寄りの画角は問題ないのですが、引きの場合はADetailerの使用をおススメします。また、スカートの前部に布が生成される場合があったのでネガティブプロンプトにapron
を追加しています。全体の生成設定は以下の様になっています。
dcai-girl, 1girl, solo, looking at viewer, solo, short hair, orange hair, brown eyes, animal ears, dress, blue dress, black skirt, upper body, white thighhighs, thigh strap, meadow, sky, day, masterpiece, best quality, score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up <lora:DCAI_Girl_Pony:1>
score_6, score_5, score_4, apron, worst quality, low quality, bad anatomy, realistic, lips, inaccurate limb, extra digit, fewer digits, six fingers, monochrome, nsfw
checkpoint: ponyDiffusionV6XL_v6StartWithThisOne.safetensors
Steps: 20
Sampler: DPM++ SDE
Schedule type: Karras
CFG scale: 6
Seed: 3740385248
Size: 1344x768
VAE: sdxl.vae.safetensors
ADetailer: on
Hires upscaler: 4x-UltraSharp
以上のパラメーターで生成したのがコチラです。

同系統のチェックポイントモデルに適用する
Pony系統のチェックポイントであれば今回学習したLoRAを適用する事ができます。以下にLoRAを適用したサンプルを載せておきます。生成パラメーターは先ほどと同じパラメーターで生成しています。





最終結果のLoRAはCivitaiにて公開していますので興味のある方はダウンロードしてみましょう。
まとめ
今回はPony Diffusion V6 XL(PDXL)を使ってキャラクターLoRAを学習してみました。Ponyと言えばNSFWコンテンツが多く見られますが、SFWコンテンツとしても非常に優秀なモデルでした。執筆時はIllustrious-XL等の影響で前ほどの活気は無くなってきましたが、かなりの種類の派生モデルもあるのでLoRAモデルを作れば多くの事ができるでしょう。
さて、これまでSD1.5・SDXL・Ponyと学習方法を解説してきました。この流れで次回はIllustrious-XLでLoRAを学習させようを思っています。