SDXLのLoRAで Text Encoder の学習ありなしの違い

SDXLのLoRAで Text Encoder の学習ありなしの違いを確認します。

LoRAの学習

学習データ

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

パラメーター

SDXLで学習します。
exec.bat
accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --config_file=D:\data\c3lier-toricchi-xl5\config.toml
config.toml (U-NETのみ学習)
[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
network_alpha = 1

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

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

[dreambooth_arguments]
prior_loss_weight = 1.0
config.toml (U-NET テキストエンコーダー学習)
[model_arguments]
pretrained_model_name_or_path = "D:\\data\\model\\sdXL_v10.safetensors"

[additional_network_arguments]
network_module = "networks.lora"

[optimizer_arguments]
optimizer_type = "AdamW"
learning_rate = 1e-4
network_dim = 16
network_alpha = 1

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

[training_arguments]
output_dir = "D:\\data\\lora-toricchi-xl5\\output"
output_name = "toricchi"
save_every_n_epochs = 10
save_model_as = "safetensors"
max_train_steps = 1000
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\c3lier-toricchi-xl\toricchi'
caption_extension = '.txt'
num_repeats = 1

学習

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

プロンプト

次の3つのプロンプトで生成画像の結果を確認します。
Prompt1
Prompt: <lora:toricchi-000n00:1> toricchi, duck
Negative prompt: worst quality, low quality
Prompt2
Prompt: <lora:toricchi-000n00:1> toricchi, duck,1 girl, sunflower field background, blue sky
Negative prompt: worst quality, low quality
Prompt3
Prompt: <lora:toricchi-000n00:1> toricchi, duck, cyberpunk, dark city, battle
Negative prompt: worst quality, low quality

生成結果

U-NETのみ学習

Epoch100:step700

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像1
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像2
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像3

Epoch200:step1,400

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像4
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像5
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像6

Epoch300:step2,100

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像7
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像8
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像9

Epoch400:step2,800

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像10
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像11
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像12

Epoch500:step3,500

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像13
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像14
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像15

Epoch600:step4,200

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像16
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像17
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像18

Epoch700:step4,900

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像19
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像20
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像21

Epoch800:step5,600

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像22
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像23
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像24

U-NET, テキストエンコーダーを学習

Epoch100:step700

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像25
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像26
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像27

Epoch200:step1,400

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像28
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像29
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像30

Epoch300:step2,100

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像31
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像32
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像33

Epoch400:step2,800

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像34
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像35
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像36

Epoch500:step3,500

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像37
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像38
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像39

Epoch600:step4,200

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像40
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像41
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像42

Epoch700:step4,900

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像43
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像44
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像45

Epoch800:step5,600

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像46
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像47
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像48

評価・所感

同じ学習ステップ数の場合、U-NETのみの学習のほうが学習結果の反映され度合いが少ない印象です。 Epoch100時点で、テキストエンコーダーの学習をしている場合は、学習元画像の形状が出力されていますが、 U-NETのみ学習の場合は、アヒルの画像と混ざった状態での出力となり、Prompt2の画像でも女の子と一緒に表現されている 出力が多いです。
一方で、ステップ数が上がると、U-NETのみ学習の場合は崩れがやや多い印象です。

テキストエンコーダーを学習する場合の、低Epochの場合

Epoch100時点で学習元の形状がしっかり反映されてしまうため、さらに低いEpochでどのような結果になるか確認します。

LoRAなし

SDXLのモデルでアニメ絵を出力させるプロンプトではないにもかかわらず、Prompt2、Prompt3はアニメ絵的な出力になっています。
Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像49
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像50
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像51

Epoch10:step70

Epoch10では元のモデルの出力の影響が強いです。
Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像52
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像53
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像54

Epoch20:step140

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像55
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像56
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像57

Epoch30:step210

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像58
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像59
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像60

Epoch40:step280

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像61
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像62
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像63

Epoch50:step350

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像64
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像65
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像66

Epoch60:step420

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像67
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像68
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像69

Epoch70:step490

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像70
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像71
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像72

Epoch80:step560

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像73
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像74
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像75

Epoch90:step630

Prompt1
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像76
Prompt2
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像77
Prompt3
SDXLのLoRAで Text Encoder の学習ありなしの違い:画像78

評価・所感

学習画像の雰囲気はEpoch10程度の段階で学習効果が出始めています。 Epoch50付近では崩れが目立ち、その後、学習元画像の形状が忠実に出力されているように見えます。
Prompt2では、Epoch50以上では、女の子と一緒に出力されなくなるため、女の子と一緒に出力したい場合は、 女の子と一緒にいるtoricchiを学習させる必要がありそうです。

まとめ

U-NETのみ学習 テキストエンコーダーも学習
学習ステップ低 学習画像の形状が反映されにくい、絵柄は反映される 学習画像の形状が反映されやすい
学習ステップ高 学習画像の形状が反映されるが崩れが若干多い 学習画像の形状が反映される、元のモデルの絵柄が上書きされる印象

感覚的な印象ですが、絵の雰囲気のみを学習し、元のモデルの出力テイストを大きく変えたくない場合は、テキストエンコーダーは学習せず、 U-NETのみを学習し、比較的低いEpoch数で止めるのが良さそうです。今回の例では、Epoch200以下が良さそうです。
キャラクターの形状を忠実に出力したい場合は、テキストエンコーダーの学習も含め、Epoch 200から300程度の学習が良さそうです。 ただし背景や絵柄が学習画像に強く引っ張られるため、元のモデルの出力イメージはあまり反映されない可能性が高そうです。 元のモデルの雰囲気を出したい場合は学習元画像の枚数を増やし、元のモデルの背景と組み合わせた画像を学習画像に含めるなどの対応が必要かと考えられます。

他の比較結果と合わせた結果はこちらの記事も参照してください。

追記:2025/6

CLIP(テキストエンコーダ)の学習をすると、破滅的忘却(Catastrophic Forgetting)が発生するとされています。 特に小規模なデータセットで学習する場合に影響が大きくなるとされています。
そのため、LoRAの学習においても、大規模なデータセットでない限りは、テキストエンコーダーを学習しないほうが良い状況です。

参考


AuthorPortraitAlt
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。 最近は生成AIの画像生成の沼に沈んでいる。
作成日: 2023-08-12
Copyright © 1995–2025 iPentec all rights reserverd.