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

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

概要

LoRA学習のパラメータに network_alpha の値があります。アンダーフローを防ぐパラメーターとされていますが、 どの程度の値でどのような表現になるのかがよくわからないので確認します。
補足
network_dim を変化させた結果はこちらの記事を参照してください。

LoRAの学習

学習データ

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

パラメーター

SDXLで学習します。network_dim は 16で固定します。network_dim = 16はやや高めの値です。
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 = 16 
network_alpha = 1 #この値を変化させる (2,4,8,16,32)

[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

学習

上記の設定で学習します。

結果

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

network_alpha = 1

目が描かれないなど、崩れが若干発生しています。学習元画像は反映されています。

network_alpha = 2

目が描かれるようになり、崩れが減少しています。学習元の画像がより反映されています。

network_alpha = 4

学習元画像が反映されていますが、network_alpha = 2 より弱めの反映です。大量にキャラクターが生成されている結果も出ています。

network_alpha = 8

学習元画像が反映されていますが、目が描かれないなどの崩れが目立ちます。学習元画像の形状に忠実な出力結果です。

network_alpha = 16

学習元画像の形状が強く反映されていますが、崩れてしまっている画像も多いです。

network_alpha = 32

network_dim より大きい値の場合です。学習結果がほとんど反映されていないように見えます。

所感・評価

network_alpha の値を大きくすると、学習元の画像の形状に忠実になる印象です。一方で画像の崩れが発生しやすくなります。 network_alpha の値を network_dim より大きくすると学習されないため、network_dim より小さい値にしたほうが良さそうです。
network_alpha は network_dim の半分にするのが良いという設定方法もありますが、結果からも、学習元画像に忠実かつ崩れが比較的少ないのは network_alpha=8の結果のため、学習元画像を忠実に出力したいのであれば、network_dim の半分の設定はありかもしれません。 一方で画像の崩れを少なくしたいのであれば、4や2にするのもよさそうです。1の場合は元画像の形状があまり反映されない傾向にあります。 絵柄のみを学習させるのであれば、1が良さそうです。
学習回数を増やした場合は、network_alpha=1でも学習元画像が反映される可能性があるため、学習回数での比較の必要もありそうです。

著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2023-08-12
iPentec all rights reserverd.