LoRA学習のnetwork_dim の値を変更すると、生成画像にどのような違いがあるか確認する - Stable Diffusion

LoRA学習のnetwork_dimのパラメーターを変更してどのような違いが出るかを確認します。

概要

LoRA学習のパラメータに network_dim の値があります。数を増やすと「表現力が増す」、「学習画像に忠実になる」と言われていますが、 どの程度の値でどのような表現になるのかがよくわからないので確認します。
なお、値を増やすとLoRAのサイズが急激に増えるため、ファイルサイズも確認します。
補足
network_alpha を変化させた結果はこちらの記事を参照してください。

LoRAの学習

学習データ

こちらのページの「学習データ (テスト用 ミニ v4)」を利用します。

パラメーター

SDXLで学習します。
exec.bat
accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --config_file=D:\data\lora-toricchi-xl4\config.toml
config.toml
[model_arguments]
pretrained_model_name_or_path = "D:\\data\\model\\sdXL_v10.safetensors"

[additional_network_arguments]
network_train_unet_only = true
cache_text_encoder_outputs = true
network_module = "networks.lora"

[optimizer_arguments]
optimizer_type = "AdamW"
learning_rate = 1e-4
network_dim = 2 #この値を変化させる (2,4,8,16,32,64,128,256)
network_alpha = 1

[dataset_arguments]
dataset_config = "D:\\data\\lora-toricchi-xl4\\dataset.toml"
cache_latents = true

[training_arguments]
output_dir = "D:\\data\\lora-toricchi-xl4\\output"
output_name = "toricchi"
save_every_n_epochs = 10
save_model_as = "safetensors"
max_train_steps = 500
xformers = true
mixed_precision= "bf16"
gradient_checkpointing = true
persistent_data_loader_workers = true
keep_tokens = 1

[dreambooth_arguments]
prior_loss_weight = 1.0
dataset.toml
[general]
enable_bucket = true 

[[datasets]]
resolution = 1024
batch_size = 1

[[datasets.subsets]]
image_dir = 'D:\data\lora-toricchi-xl4\toricchi'
caption_extension = '.txt'
num_repeats = 1

学習

上記の設定で学習します。network_dimの値が大きいほどVRAMの使用量も増加し学習に時間がかかります。

結果

ファイルサイズ

network_dim の値 LoRAのファイルサイズ
2 20.5MB
4 40.8MB
8 81.4MB
16 162MB
32 324MB
64 649MB
128 1.26GB
256 2.53GB

70EpochのLoRAを利用し、次のプロンプトで出力画像を確認します。
Prompt
Prompt: <lora:toricchi-000070-dnn:1>toricchi duck
Negative prompt: worst quality, low quality
Settings:Steps: 20, Sampler: Euler a, CFG scale: 7, Size: 1024x1024, Model: sdXL_v10VAEFix

network_dim = 2

学習画像は反映されています。胴体が大きい出力が多く、アヒルらしさが残っています。

network_dim = 4

学習画像は反映されています。network_dim=2 と同様の印象です。

network_dim = 8

より学習画像が強く反映されている印象です。

network_dim = 16

目が描画されないケースが若干増え、崩れが増えた気がします。

network_dim = 32

背景が描画されるようになります。元の絵の反映度合いが減っているように見えます。

network_dim = 64

鴨のイラストに顔だけが反映されているイメージが生成されています。形状は元の鴨やアヒルの形状で顔などに学習画像が反映されているように見えます。

network_dim = 128

学習画像の反映がさらに減っている印象です。

network_dim = 256

学習画像の反映がさらに減っています。

参考:LoRAなし


所感・評価

network_dim のサイズを変えてみましたが、network_dim = 4 程度でも表現としては十分な印象です。 学習画像が強く反映されているのは network_dim = 8 の印象です。 それ以上のnetwork_dimの場合は、絵柄の特徴のみが反映され、形状の反映は弱くなる印象です。
ただし、学習回数(学習ステップ数)を増やすと、network_dim が大きい状態でも学習元の画像が結果に反映される可能性はありそうです。 network_dim が大きい場合の学習ステップ数の違いを確認したいです。また、network_dim が低い状態で、比較的少ない回数で学習した場合と、 network_dim が大きく多くの学習回数で学習した場合の違いも比較する必要がありそうです。 (比較記事はこちら)

また、network_dim = 256 は学習に非常に時間がかかり、10倍以上高速なハードウェアが用意できない限り、実用的ではない印象です。
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2023-08-12
iPentec all rights reserverd.