LoRAの学習設定 - maTORIx/matorix-sd-scripts GitHub Wiki

はじめに

sd-scriptsに感謝します。初心者が知りたいことのほとんどは、sd-scriptsのREADMEに書かれている。

また、学習するためのpythonコードに--helpオプションをつけることで、そのオプションの役割を知ることができる。たとえば、以下のようになる。

cd sd-scripts
./venv/Scripts/python.exe train_network.py --help

ハイパーパラメータ

ハイパーパラメータとは

ここでは学習の際に設定する、いろいろな値のことを指すこととする。

学習率 / Learning Rate

1回の学習ステップで、どれぐらいパラメータを調整するかについての数値。LoRAの学習では通常、1e-4から5e-7程度が用いられる傾向がある。学習率の設定に関して色々な意見が見受けられるが、最終的な結論は「設定しない」で一致しているように考えられる。

AdaFactorまたはDAdaptaionなどのOptimizerを用いることで、自動的にlr(Learning Rate)が修正されるような学習方法にするとよい。

(なお、DAdaptationのlr推奨値は1.0)

Network

sd-scriptsのNetworkに関しては、本家を見るとよい。 sd-scripts 学習できるLoRAの種類

簡単に解説すると、LoRA-LierLa(UI上ではLoRA), LoRA-C3Lier、DyLoRAの主に3種類がある。LoConやLoHAもあるが、現在は基本的にsd-scriptsで提供されるネットワークで十分精度が出るように見受けられる。左から右になるにつれて構造が複雑である。(あんまよくわかってないが、おそらくDyLoRAはネットワークのことというよりは、どちらかというとLoRA-LierLaとLoRA-C3Lierの両方で使用可能な学習手法。ただ、指定方法はほとんどネットワークの感じと同じ)

また、それとは別にパラメータ数(というか、次元数?)というものもある。これは、ネットワークの構造を指すのではなく、ネットワーク(ここで示すのはLoRA)の大きさのことを指している。

パラメータ数が大きい(UIの場合はLargeと表示される)ものを使用する場合、学習ステップが少なくても良い精度が出ることを期待できる傾向がある。しかし、極端に大きいからといってよいLoRAになるというわけではない。

DyLoRAを使用すれば、適切なdim(パラメータ数)を自動的に設定してくれる。ただし、使用可能なOptimizerに制限があるので注意(AdafactorとDAdaptationが使用できない)。また、指定したunitごとの学習になるため通常と比べて学習時間が長くなりやすい。また、これによって作成したモデルは抽出がいる。

Optimizer

おすすめはAdaFactor。ただし、VRAM(GPUメモリ)の消費が激しい。

DAdaptationも、AdaFactorと同様に学習率の調整を行ってくれる。こちらは、lr_schedulerを設定できる利点がある。なお、DyLoRAには対応していない。

AdamはAdafactorより下に見られがちであるが十分性能の高いOptimizerであり、メモリ消費が少ない・学習が速く進むなどの利点がある。また、性能的には必要十分である場合のほうが多いように見受けられる。収束が速いのでいちど小さなstepsとAdamで試した後に、Adafactorで高stepの学習を回して本格的にLoRAを作るという方針もアリ。

lr_scheduler

ステップ数を重ねていくごとにlrをどのように設定するかについての値。デフォルトはconstantで定数。ずっと同じである。おすすめはcosine_with_restarts。学習終盤につれてlrが下がるほうが、最終的な細かいディティールなども考慮してくれる分良い調整が行われているように見受けられる。

epoch数 steps数

概要

何回学習の処理を行うかについて。たとえば、BatchSizeが2の場合は、画像を2枚学習することで1stepとみなされる。

Epochで指定する場合は、データセットを何周するかでstep数が変わる。images_count / batch_size * epoch = stepsとなる。

ネットワークの種類や学習する画像の枚数によって推奨値は変わるが、通常12000stepもあればかなり高精度のものが作れる。少ない場合は数百で済むらしい。情報求ム。

num_repeatsとepoch数は密接に関係している。そもそも、num_repeatsは正則化画像と学習画像の枚数を均等もしくは学習画像側に傾けるために存在している。詳細はsd-scriptsのREADMEに記載されている。下記を参照してほしい。

https://github.com/kohya-ss/sd-scripts/blob/cf8021020f82398b3338019b72e15fe293863be6/docs/train_README-ja.md#%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E5%9B%9E%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

繰り返し回数は、正則化画像の枚数と学習用画像の枚数を調整するために用いられます。正則化画像の枚数は学習用画像よりも多いため、学習用画像を繰り返して枚数を合わせ、1対1の比率で学習できるようにします。

基本的にepoch数はデータセットを何周するかについての数値である。

そのため、学習用の画像のnum_repeatsを10にした場合、実質的には1epochで(1 * 10 num repeats)epoch分学習したことになる。

epoch数, step数の目安

学習対象によって異なる。ただ、学習中Lossの推移を見ることで、学習の数が必要十分であるかどうかを判断することができる。

(Lossの値は学習中のProgressBarの右にloss=xxxのような形で表示されている。)

基本的に深層学習は、loss値というパラメータを算出しながら学習を進めていく。人間が考えるモデルの性能には様々な指標があるが、少なくともモデルを学習するためのプログラムは、このlossを低くすることを目的に膨大なパラメータを最適化する。その行為を学習と呼んでいる。

つまり、学習の初期はlossが高く、学習が進んでいく終盤につれてlossが減少するのが理想的である。

しかし、実際に学習を進めていくとlossが全く下がらなくなってしまうタイミングが訪れる。経験的には、そのあたりが学習の限界である。(諸説ある)

lossが下がらないということは、それ以上学習を進めても性能に変化が表れないということである。

sd_scriptsの場合、--logging_dirを設定することでtensorboardでログを確認することができる。一度確認してみるとsteps/epochs調整の参考になると考えられる。

https://github.com/kohya-ss/sd-scripts/blob/cf8021020f82398b3338019b72e15fe293863be6/docs/train_README-ja.md#%E5%AD%A6%E7%BF%92%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A

その他オプション系

--no-half-vae

sd-scriptsでNaN detected in latentsというエラーメッセージが出てきたりとか、生成したサンプルが全部真っ黒になっているとき、vaeを半精度にしない--no-half-vaeオプションを設定すると学習が正常に行われるようになった。SDXLで発生する。

--vae

学習の際には、vaeが指定できる。

--sdpa

torch 2.0を使用している場合は、このオプションを使うと学習速度がけっこう向上する。 UIではtorch 2.0のチェックボックスにチェックすると使用可能。

--resolution

sdxlの場合は1024,1024が基本。通常のものの場合は512--resolution="1024"みたいな感じで使える。

縦長や横長にもすることができる。詳しくは、ここ

--cache-latents

latentsをキャッシュする。このオプションを使用すると、学習が少し早くなる。なお、画像増幅(Augumentation)が--flip_augしか使用できなくなるので注意。

--save_model_as

--save_model_as="safetensors"ほぼ一択。

safetensorsは速くて安全。

ckptは、任意コード実行の脆弱性がある。悪意あるckptを利用すると、コンピュータが危険にさらされる可能性アリ。要注意。