diffusion flow 기반 이미지 생성 - modrpc/info GitHub Wiki
Diffusion / Flow 기반 이미지 생성 모델의 학습 원리
1. 전체 구조
이미지 생성 모델의 학습은 크게 다음과 같은 흐름으로 볼 수 있다.
Image
│
▼
VAE Encoder
│
▼
Clean Latent
│
├── Random Noise
│
▼
Noisy Latent
│
│ Caption
│ │
│ ▼
│ Text Encoder
│ │
│ ▼
└────────► Text Embedding
│
▼
Diffusion / Flow Model
│
▼
Prediction
│
▼
Loss
│
▼
Gradient
│
▼
Weight / LoRA Update
핵심은 모델이 이미지를 직접 외우는 것이 아니라 다음 정보를 이용하여 학습한다는 것이다.
- 이미지의 latent representation
- latent에 noise가 섞인 상태
- text condition
- 현재 noise level을 나타내는 timestep
그리고 모델은 noisy latent로부터 clean image 쪽으로 가는 방법을 학습한다.
2. Image와 Latent
2.1 Image
일반적인 RGB 이미지가 다음과 같은 크기라고 하자.
1024 × 1024 × 3
이는 대략 300만 개의 숫자로 구성된다.
이렇게 큰 pixel 데이터를 Transformer나 U-Net이 매번 직접 처리하는 것은 계산량이 크다.
그래서 대부분의 현대 이미지 생성 모델은 먼저 이미지를 압축한다.
Image
│
▼
┌──────────────┐
│ VAE Encoder │
└──────────────┘
│
▼
Latent
2.2 Latent란 무엇인가?
Latent는 이미지의 압축된 내부 표현이다.
개념적으로:
1024 × 1024 RGB Image
│
▼
VAE Encoder
│
▼
Smaller Latent Representation
Latent는 단순한 축소 이미지나 thumbnail은 아니다.
이미지의 여러 특징들이 수치적인 내부 표현으로 압축되어 있다.
예를 들면 다음과 같은 정보들이 포함된다.
- 전체 구조
- 물체의 형태
- 색
- texture
- 공간 배치
- 얼굴 특징
- 물체 간 관계
- 조명 특성
하지만 latent 안에 다음과 같이 명시적인 변수가 존재하는 것은 아니다.
eye = ...
nose = ...
shirt = ...
대신 이러한 정보는 많은 숫자들에 distributed representation 형태로 분산되어 표현된다.
3. 왜 Latent Space를 사용하는가?
가장 큰 이유는 계산 효율성이다.
Pixel space에서:
1024 × 1024 × 3
크기의 데이터를 계속 처리하는 것보다 훨씬 작은 latent representation을 처리하는 것이 효율적이다.
Stable Diffusion 계열의 핵심 아이디어도 여기에 있다.
Stable Diffusion은 본질적으로:
Latent Diffusion Model
이다.
즉 diffusion 과정이 pixel space가 아니라 대부분 latent space에서 일어난다.
4. VAE란 무엇인가?
VAE는 Variational Autoencoder의 약자다.
이미지 생성 모델에서 VAE의 역할을 아주 단순화하면:
Image
│
▼
VAE Encoder
│
▼
Latent
그리고 반대 방향으로:
Latent
│
▼
VAE Decoder
│
▼
Image
이다.
즉 VAE는:
pixel image와 latent representation 사이의 번역기
라고 생각할 수 있다.
전체 생성 pipeline에서는:
Prompt
│
▼
Diffusion / Flow Model
│
▼
Generated Latent
│
▼
VAE Decoder
│
▼
Final Image
처럼 사용된다.
5. Noise란 무엇인가?
Noise는 무작위 숫자 배열이다.
일반적으로 Gaussian distribution, 즉 정규분포에서 생성한다.
수학적으로는 흔히:
ε ~ N(0, I)
처럼 표현한다.
예를 들어 noise 배열의 일부는 다음처럼 생길 수 있다.
+0.82 -0.13 +1.25
-0.94 +0.22 -0.41
+0.07 +1.91 -0.62
이 숫자 자체에는 얼굴, 사람, 자동차 같은 의미 있는 구조가 없다.
6. 왜 이미지에 Noise를 넣는가?
Clean latent를 다음과 같이 부르자.
x₀
여기에 noise를 섞어서:
xₜ
라는 noisy latent를 만든다.
개념적으로:
Clean Latent x₀
│
│ + Random Noise ε
▼
Noisy Latent xₜ
t는 현재 noise level을 나타낸다.
7. Timestep
timestep은 현재 latent가 얼마나 noisy한지를 나타낸다고 생각하면 된다.
개념적으로:
t = 0
│
│ 거의 clean image
│
▼
t = 0.25
│
│ 약간 noisy
│
▼
t = 0.5
│
│ 상당히 noisy
│
▼
t = 0.75
│
│ 이미지 구조가 희미함
│
▼
t = 1
거의 pure noise
이미지 관점으로 보면:
[선명한 이미지]
↓ noise 증가
[조금 흐트러진 이미지]
↓
[형태만 희미하게 보임]
↓
[거의 random noise]
8. High Noise와 Low Noise
Noise level에 따라 모델이 처리해야 하는 문제도 다르다.
High-noise 영역
이미지가 거의 noise인 상태에서는 세부적인 눈이나 피부를 논하는 것이 아직 의미가 없다.
이 단계에서는 주로:
- 전체 composition
- 사람의 위치
- 큰 pose
- 물체의 배치
- 장면의 대략적인 구조
가 결정된다.
Almost Noise
│
▼
"여기에 사람이 있다"
│
▼
"사람은 이런 pose다"
│
▼
"배경 구조는 이렇다"
Low-noise 영역
이미지가 이미 상당 부분 형성된 상태에서는:
- 눈
- 코
- 입
- 머리카락
- 피부 texture
- 옷의 세부
- 작은 구조
등이 중요해진다.
Mostly Formed Image
│
▼
face details
│
▼
skin texture
│
▼
fine structure
이 개념이 Wan 2.2의:
High-noise Expert
Low-noise Expert
구조와 직접 연결된다.
9. Caption과 Text Encoder
예를 들어 training caption이:
JR wearing a white shirt outdoors
라고 하자.
컴퓨터가 이 문장을 그대로 처리하는 것은 아니다.
먼저 Text Encoder가 문장을 숫자 vector로 변환한다.
"JR wearing a white shirt outdoors"
│
▼
┌──────────────┐
│ Text Encoder │
└──────────────┘
│
▼
Text Embedding
이 숫자 representation을 text embedding이라고 한다.
10. Conditioning
Text embedding은 생성 모델에게:
어떤 방향의 이미지를 만들어야 하는가
를 알려주는 조건이다.
그래서 text를 흔히 conditioning이라고 부른다.
예를 들어:
"JR"
이라는 condition과:
"mountain"
이라는 condition은 같은 noise에서 출발하더라도 서로 다른 방향으로 image generation을 유도한다.
Random Noise
●
/ | \
/ | \
/ | \
▼ ▼ ▼
JR cat mountain
11. Training 시 모델의 입력
학습 시 모델은 대략 다음 세 가지를 입력으로 받는다.
1. Noisy latent xₜ
2. Timestep t
3. Text embedding c
구조로 보면:
Caption
│
▼
Text Encoder
│
▼
Text Embedding c
│
│
Noisy Latent xₜ ├────► Model
│
Timestep t ──────┘
12. 모델은 무엇을 예측하는가?
여기서 모델에 따라 학습 방식이 조금 달라진다.
12.1 전통적인 Diffusion Model
Stable Diffusion 1.x나 SDXL 같은 모델에서는 흔히 noise 자체를 예측하도록 학습한다.
Model Output ≈ ε
즉 모델에게:
현재 noisy latent에 어떤 noise가 들어가 있는지를 맞혀라.
라고 가르치는 것에 가깝다.
개념적으로:
Noisy Latent
│
▼
Model
│
▼
Predicted Noise
│
▼
Actual Noise와 비교
13. Flow Matching
Z-Image, FLUX, SD3 같은 최근 모델에서는 flow matching 또는 그에 가까운 formulation이 많이 사용된다.
여기서는 모델이 noise 자체보다:
현재 latent가 clean image 쪽으로 어느 방향으로 이동해야 하는가
를 예측한다고 이해하는 것이 좋다.
즉 모델 출력은 일종의:
velocity
또는:
flow vector
다.
14. Flow를 그림으로 이해하기
Latent space를 아주 단순하게 2차원 공간으로 생각해보자.
Noise Region
● xₜ
\
\
\ correct direction
\
● x₀
Image Region
모델이 하는 일은 현재 위치 xₜ에서:
어느 방향으로 움직여야 image 쪽으로 가는가
를 예측하는 것이다.
공간 전체에서 이런 방향을 학습하면:
↘ ↓ ↙
↘ ↓ ↙
↘↓↙
●
Image Region
같은 vector field를 배우는 셈이다.
그래서 flow matching이라는 이름이 나온다.
15. Target은 무엇인가?
Training image를 알고 있기 때문에 우리는 올바른 방향을 계산할 수 있다.
이를:
v_target
이라고 하자.
모델의 예측은:
v_pred
이다.
즉 학습은:
Model Prediction
v_pred
│
│ compare
▼
Correct Direction
v_target
을 비교하는 과정이다.
16. Loss Function
가장 단순화하면 loss는 다음과 비슷하다.
Loss = ||v_pred - v_target||²
즉:
모델이 예측한 방향과 실제 정답 방향의 차이
를 측정한다.
예를 들어:
정답 방향 ↘
모델 예측 ↓
이면 차이가 크다.
반대로:
정답 방향 ↘
모델 예측 ↘
이면 loss가 작다.
17. Training의 Goal
Training의 목표는 결국 하나다.
Loss를 최소화하는 것
구조적으로:
Model
│
▼
Prediction
│
▼
Compare with Target
│
▼
Loss
│
▼
Backpropagation
│
▼
Gradient
│
▼
Optimizer
│
▼
Weight Update
18. Gradient란 무엇인가?
Gradient는:
각 parameter를 어느 방향으로 움직이면 loss가 줄어드는가
를 알려준다.
산을 내려가는 문제로 생각하면 쉽다.
Loss
● 현재 위치
/
/
/
●
/
/
● 최소점
Gradient는 현재 위치에서:
어느 쪽으로 내려가야 하는가
를 알려준다.
19. Optimizer
Gradient가 계산되었다고 해서 parameter를 그대로 gradient만큼 움직이지는 않는다.
Optimizer가 update를 조절한다.
대표적으로:
- Adam
- AdamW
- AdamW8bit
등이 있다.
구조는:
Loss
│
▼
Gradient
│
▼
Optimizer
│
▼
Parameter Update
이다.
Learning Rate는 이 update의 크기를 결정하는 주요 요소 중 하나다.
20. Full Fine-tuning
Full fine-tuning에서는 base model의 원래 weight 자체를 수정한다.
Original Weights W
│
▼
Training
│
▼
Modified Weights W'
수십억 개의 parameter를 가진 모델 전체를 수정할 수 있기 때문에 학습 비용이 매우 크다.
21. LoRA
LoRA에서는 base model weight를 그대로 고정한다.
W_base
│
└── Frozen
대신 작은 추가 weight를 학습한다.
ΔW_LoRA
Inference 때 실제 동작은 개념적으로:
W_effective = W_base + ΔW_LoRA
가 된다.
그래서:
Huge Base Model
████████████████████████████████
frozen
████████████████████████████████
+
Small JR LoRA
████
↓
Base Model that also knows JR
처럼 볼 수 있다.
22. LoRA의 Rank
LoRA는 큰 ΔW matrix를 직접 저장하지 않는다.
대신:
ΔW = B × A
형태로 작은 matrix 두 개로 분해한다.
예를 들어 원래 weight가:
4096 × 4096
이라고 하자.
Rank가 16이면:
A : 16 × 4096
B : 4096 × 16
만 학습한다.
따라서 parameter 수가 크게 줄어든다.
Rank가 커지면
rank ↑
하면 일반적으로:
- 표현 능력 증가
- 학습 parameter 증가
- LoRA file size 증가
- VRAM 사용 증가
- 과적합 가능성 증가
가 발생한다.
Person LoRA에서는 rank 8~32 정도가 흔히 사용되며:
rank = 16
은 비교적 합리적인 출발점이다.
23. Image + TXT Pair에서 Input과 Target
예를 들어 training dataset에:
001.jpg
001.txt
가 있다고 하자.
001.txt에는:
JR wearing a white shirt outdoors
라고 적혀 있다.
이때 단순히:
Text → Image
를 직접 학습하는 것이 아니다.
실제 과정은 다음과 같다.
001.jpg
│
▼
VAE
│
▼
Clean Latent x₀
│
│ + noise
▼
Noisy Latent xₜ
동시에:
001.txt
│
▼
Text Encoder
│
▼
Text Embedding c
그리고 모델에는:
INPUT =
noisy latent xₜ
+ timestep t
+ text embedding c
가 들어간다.
정답은:
TARGET =
correct noise / flow / velocity
이다.
24. Caption은 정답이 아니다
중요한 점이다.
Caption:
JR wearing a white shirt outdoors
은 target label이 아니다.
Caption은:
generation을 어떤 의미 방향으로 유도할 것인가
를 알려주는 condition이다.
실제 target은 image latent에서 만들어지는 diffusion 또는 flow target이다.
즉 classification과는 다르다.
Classification
Image
│
▼
Model
│
▼
"cat"
Diffusion / Flow Training
Noisy Image Latent
+
Text Condition
+
Timestep
│
▼
Model
│
▼
Noise / Flow Prediction
25. JR Person LoRA에서 무슨 일이 일어나는가?
여러 training image가 있다고 하자.
Image 1:
JR wearing a white shirt
Image 2:
JR sitting in a cafe
Image 3:
JR walking outdoors
Image 4:
JR smiling indoors
모든 caption에서 공통으로 나타나는 것은:
JR
이다.
반면:
white shirt
cafe
walking
outdoors
smiling
indoors
는 각 이미지마다 달라진다.
모델은 반복 학습을 통해:
JR
↓
여러 이미지에 공통으로 존재하는 visual features
↓
Identity
를 배우게 된다.
26. Caption을 자세히 쓰는 이유
만약 모든 caption이:
JR
하나뿐이라면 모델 입장에서는 다음 모든 것을 JR의 의미라고 생각할 수 있다.
- 얼굴
- 옷
- 배경
- pose
- 조명
- 카메라 angle
예를 들어 training image 대부분에서 검은 옷을 입었다면:
JR
이라는 trigger가 검은 옷까지 강하게 연상할 수 있다.
반대로:
JR, wearing a black jacket, outdoors
JR, wearing a white shirt, indoors
JR, sitting in a cafe, smiling
처럼 설명하면 모델은:
JR
→ identity
black jacket
→ clothing
outdoors
→ environment
sitting
→ pose
smiling
→ expression
처럼 개념을 분리하기 쉬워진다.
27. 여러 사람을 동시에 학습할 수도 있다
예를 들어 두 명의 identity를 하나의 LoRA에 넣을 수 있다.
JR
Alice
각각 다른 trigger를 사용한다.
JR, wearing a black shirt outdoors
JR, sitting in a cafe
Alice, wearing a white dress indoors
Alice, walking in a park
그러면 모델은:
JR
↓
Person A
Alice
↓
Person B
를 학습할 수 있다.
Inference에서:
JR and Alice are walking together
처럼 두 identity를 동시에 호출하는 것도 가능하다.
다만 인원이 많아질수록 identity interference가 증가할 수 있다.
28. Epoch
Epoch는 dataset 전체를 한 번 학습한 것을 의미한다.
예를 들어 이미지가 23장이고:
batch size = 1
이라면:
1 epoch ≈ 23 training steps
이다.
따라서:
100 epochs
면 대략:
23 × 100 = 2300 steps
가 된다.
29. Training Step
하나의 training step에서는 대략 다음 일이 일어난다.
1. Image 하나 또는 batch 선택
2. Caption 읽기
3. Image → latent
4. Random timestep 선택
5. Random noise 생성
6. Noisy latent 생성
7. Model prediction
8. Target 계산
9. Loss 계산
10. Backpropagation
11. LoRA weight update
그리고 다음 training sample로 넘어간다.
30. avr_loss
Training log에서:
avr_loss = 0.40
처럼 표시되는 값은 average loss다.
여러 training step의 loss를 평균하거나 running average로 나타낸 것이다.
예를 들어:
step 1 loss = 0.35
step 2 loss = 0.51
step 3 loss = 0.39
step 4 loss = 0.44
같은 값들이 있을 때 평균적인 학습 오차를 보여주는 것이다.
31. avr_loss = 0.4의 의미
다음과 같은 의미는 아니다.
40% 틀렸다
Loss 값의 scale은 training formulation에 따라 다르다.
그래서:
avr_loss = 0.4
라는 숫자 하나만 보고:
좋은 모델이다.
또는:
나쁜 모델이다.
라고 판단할 수 없다.
32. Loss가 Oscillation하는 이유
Diffusion이나 flow training에서는 loss가 매우 흔들릴 수 있다.
예:
0.38
0.42
0.51
0.37
0.62
0.40
0.44
이것이 반드시 문제라는 뜻은 아니다.
왜냐하면 training step마다:
- 다른 image
- 다른 random noise
- 다른 timestep
- 다른 caption
을 사용하기 때문이다.
특히:
batch size = 1
이면 변동성이 더 크다.
33. 좋은 Loss Curve란?
이상적인 classification training처럼:
0.8
0.7
0.6
0.5
0.4
0.3
0.2
식으로 매끄럽게 내려갈 필요는 없다.
Diffusion / flow LoRA에서는:
0.42
0.38
0.46
0.37
0.41
0.39
0.43
처럼 일정 범위에서 oscillation하면서 학습될 수 있다.
중요한 것은:
- NaN이 발생하지 않는가
- loss가 장기적으로 폭발하지 않는가
- validation 결과가 좋아지는가
- identity가 잘 나타나는가
- prompt flexibility가 유지되는가
이다.
34. Loss와 Image Quality는 같은 것이 아니다
Loss가 낮아졌다고 항상 생성 결과가 좋아지는 것은 아니다.
예를 들어:
Epoch 40
loss = 0.35
Epoch 80
loss = 0.25
Epoch 100
loss = 0.20
이라고 해도 실제 결과는:
Epoch 40
→ 아직 JR과 약간 다름
Epoch 80
→ identity와 다양성이 가장 좋음
Epoch 100
→ training image를 너무 많이 따라함
이 될 수 있다.
따라서 최적 checkpoint는:
loss가 가장 낮은 checkpoint
가 아니라:
identity fidelity와 generalization의 균형이 가장 좋은 checkpoint
이다.
35. Overfitting
Person LoRA에서는 매우 중요한 문제다.
우리가 원하는 것은:
JR
↓
Identity
이다.
하지만 너무 오래 학습하면:
JR
↓
Identity
+ 특정 옷
+ 특정 배경
+ 특정 pose
+ 특정 조명
+ 특정 camera angle
까지 함께 암기할 수 있다.
이를 overfitting이라고 한다.
36. Overfitting의 증상
다음과 같은 현상이 나타날 수 있다.
- 다른 옷을 요청해도 training 옷이 계속 나옴
- 다른 배경을 요청해도 training 배경이 따라옴
- 비슷한 pose만 반복됨
- 표정이 항상 비슷함
- LoRA strength를 올리면 얼굴이 과도하게 고정됨
- prompt를 바꿔도 이미지 다양성이 부족함
37. Underfitting
반대로 training이 부족하면:
JR
이라고 prompt를 주어도 identity가 잘 나오지 않는다.
증상은:
- generic한 사람으로 나옴
- 매 seed마다 얼굴이 크게 달라짐
- LoRA strength를 높여도 JR 특징이 약함
이다.
38. 최적 Training Point
Person LoRA에서는 보통:
Underfitting
│
▼
Identity를 배우기 시작
│
▼
Good Generalization
│
▼
Best Point
│
▼
Overfitting
과 같은 과정이 있다.
따라서 여러 checkpoint를 비교하는 것이 중요하다.
예:
20 epoch
40 epoch
60 epoch
80 epoch
100 epoch
39. Checkpoint 비교 방법
비교할 때는 다음 요소를 모두 고정한다.
- Base model
- Prompt
- Seed
- Resolution
- Sampler
- Steps
- CFG
- LoRA strength
그리고 LoRA checkpoint만 바꾼다.
예:
Prompt:
JR is walking on a city street,
facing the camera,
natural daylight,
photorealistic
Seed:
123456789
LoRA strength:
1.0
그리고:
40 epoch
60 epoch
80 epoch
100 epoch
결과를 비교한다.
40. Inference
Training이 끝나면 실제 image generation을 한다.
Inference는 random noise에서 시작한다.
Random Noise
│
▼
Model
│
▼
Slightly Structured Latent
│
▼
Model
│
▼
More Structured Latent
│
▼
...
│
▼
Clean Latent
│
▼
VAE Decoder
│
▼
Final Image
41. Training과 Inference의 관계
Training에서는:
Image
│
▼
Latent
│
▼
Noise 추가
│
▼
모델이 되돌아가는 방법을 배움
Inference에서는 반대로:
Noise
│
▼
배운 방향을 따라 이동
│
▼
Image Latent
│
▼
Image
가 된다.
42. Seed
Inference는 random noise에서 시작한다.
이 최초 noise를 결정하는 값이 seed다.
예:
Seed 100
↓
Noise A
↓
Image A
Seed 200
↓
Noise B
↓
Image B
따라서 같은 prompt라도 seed가 다르면 결과가 달라진다.
43. Seed를 고정하는 이유
Training checkpoint를 비교할 때 seed를 고정하면 시작 noise가 완전히 동일하다.
즉:
same noise
same prompt
same parameters
different LoRA
상태가 된다.
그래서 LoRA 차이만 비교할 수 있다.
44. Sampling Steps
Inference에서는 noise를 한 번에 image로 바꾸지 않는다.
여러 단계로 이동한다.
Pure Noise
│
step 1
▼
Less Noise
│
step 2
▼
More Structure
│
step 3
▼
...
│
▼
Final Latent
이 반복 횟수가 sampling steps다.
45. Turbo Model
일반 모델은 많은 step이 필요할 수 있다.
예:
20
30
50 steps
Turbo model은 distillation을 통해:
4
8
정도의 적은 step으로도 이미지를 생성하도록 학습되어 있다.
Z-Image-Turbo도 이런 종류다.
46. Distillation
큰 teacher model이 여러 step에 걸쳐 수행하는 작업을 더 적은 step으로 수행하도록 student model을 학습시키는 것을 distillation이라고 볼 수 있다.
개념적으로:
Teacher
Noise
↓
1
↓
2
↓
3
↓
4
↓
5
↓
6
↓
7
↓
8
↓
...
↓
Image
를:
Turbo Student
Noise
↓
1
↓
2
↓
3
↓
...
↓
8
↓
Image
처럼 줄이는 것이다.
속도는 빨라지지만 학습 flexibility가 줄어들 수 있다.
47. Z-Image-Turbo와 De-Turbo
Z-Image-Turbo는 빠른 inference에 최적화되어 있다.
Z-Image
│
▼
Distillation
│
▼
Z-Image-Turbo
De-Turbo 계열 checkpoint는 Turbo의 강한 distillation 특성을 일부 완화해 fine-tuning이 더 쉽도록 만든 파생 모델이라고 이해할 수 있다.
그래서:
Turbo
→ inference에 유리
De-Turbo
→ training / fine-tuning에 유리
한 경우가 있다.
48. JR is walking이 가능한 이유
Base Z-Image는 이미 많은 일반 개념을 알고 있다.
예를 들면:
person
walking
street
car
chair
hotel
beach
restaurant
black suit
sunlight
등이다.
JR LoRA에서는 새롭게:
JR
이라는 identity를 학습한다.
그래서 inference에서:
JR + walking
을 조합할 수 있다.
즉:
Base Model
"walking"
│
│
├────────┐
│ │
▼ ▼
JR LoRA
"JR"
│
▼
JR walking
이 된다.
49. Model이 Image를 기억하는 방식
모델 안에:
JR.jpg
같은 이미지 파일이 저장되는 것은 아니다.
대신 model weight가 변화해서 latent space의 flow가 조금 달라진다.
LoRA를 붙이기 전에는:
"JR"
│
▼
generic human region
으로 갈 수 있다.
LoRA를 붙인 후에는:
"JR"
│
▼
JR identity region
쪽으로 trajectory가 휘게 된다.
50. Latent Space와 Manifold
이미지 latent space에는 무작위로 모든 이미지가 흩어져 있다고만 생각하기보다, 의미적으로 비슷한 이미지들이 어느 정도 구조를 가진다고 생각할 수 있다.
개념적으로:
Cat Region
● ● ● ●
Human Region
● ● ● ● ●
Landscape Region
● ● ● ●
JR LoRA는 Human region 안에서:
JR identity
에 해당하는 영역으로 generation trajectory를 더 잘 유도하도록 한다.
51. Text Prompt가 하는 일
Prompt는 trajectory의 방향을 바꾼다.
예를 들어:
Random Noise
│
▼
Latent Space
/ | \
/ | \
▼ ▼ ▼
cat JR mountain
같은 starting noise라도 text condition에 따라 다른 영역으로 이동한다.
52. LoRA가 하는 일
LoRA는 이 vector field의 일부를 수정한다.
개념적으로:
Base Model
↘
↘
generic person
JR LoRA를 붙이면:
Base + JR LoRA
↘
↘
JR
처럼 특정 condition에서 trajectory를 조금 바꾼다.
53. LoRA Strength
Inference에서 LoRA strength를 조정할 수 있다.
예:
0.5
0.8
1.0
1.2
1.5
일반적으로:
strength 낮음
→ base model 영향 큼
→ identity 약할 수 있음
→ 자유도 높음
strength 높음
→ LoRA 영향 큼
→ identity 강함
→ overfitting 특성도 강해질 수 있음
따라서:
0.8 ~ 1.2
정도를 중심으로 테스트하는 경우가 많다.
54. 전체 Training Pipeline
TRAINING
Image
│
▼
┌────────────────┐
│ VAE Encoder │
└────────────────┘
│
▼
Clean Latent x₀
│
│
├──────────── Random Noise ε
│
▼
Noisy Latent xₜ
│
│
│ Caption
│ │
│ ▼
│ ┌──────────────┐
│ │ Text Encoder │
│ └──────────────┘
│ │
│ ▼
│ Text Embedding
│ │
│ │
└──────────┬──────────┘
│
│
Timestep t
│
▼
┌─────────────────────┐
│ Diffusion / Flow │
│ Transformer Model │
└─────────────────────┘
│
▼
v_pred
│
│
compare with
│
▼
v_target
│
▼
Loss
│
▼
Gradient
│
▼
Optimizer
│
▼
Update LoRA Weights
55. 전체 Inference Pipeline
INFERENCE
Prompt
"JR is walking on a street"
│
▼
┌──────────────┐
│ Text Encoder │
└──────────────┘
│
▼
Text Embedding
│
│
▼
Random Noise ◄── Seed
│
▼
┌──────────────────────┐
│ Z-Image + JR LoRA │
└──────────────────────┘
│
▼
Less Noisy Latent
│
▼
┌──────────────────────┐
│ Z-Image + JR LoRA │
└──────────────────────┘
│
▼
More Structured Latent
│
▼
...
│
▼
Clean Latent
│
▼
┌──────────────────────┐
│ VAE Decoder │
└──────────────────────┘
│
▼
Final Image
56. Stable Diffusion과 최근 Flow Model의 차이
넓은 의미에서는 모두 diffusion 계열 이미지 생성 기술로 묶여서 이야기되는 경우가 많지만 학습 formulation과 network architecture에는 차이가 있다.
| Model | 주요 학습 방식 | 주요 Network |
|---|---|---|
| Stable Diffusion 1.x | Noise Prediction Diffusion | U-Net |
| Stable Diffusion 2.x | Diffusion | U-Net |
| SDXL | Diffusion | U-Net |
| SD3 | Flow Matching 계열 | Transformer |
| FLUX | Flow Matching 계열 | Transformer |
| Z-Image | Flow 계열 | Transformer |
| Wan | Diffusion/Flow 계열 | Transformer |
57. U-Net과 Transformer
전통적인 Stable Diffusion에서는 중심 network가 U-Net이었다.
Text
│
▼
CLIP
│
▼
U-Net ◄──── Noisy Latent
│
▼
Denoised Latent
최근 모델들은 DiT 계열 Transformer를 많이 사용한다.
Text Embedding
│
▼
┌──────────────────┐
│ Transformer │
│ / DiT │
└──────────────────┘
▲
│
Image Latent
58. DiT란?
DiT는 Diffusion Transformer를 의미한다.
기존 diffusion의 핵심 neural network였던 U-Net 대신 Transformer architecture를 사용하는 방식이다.
최근 image/video generation model에서는 Transformer 계열이 매우 중요해지고 있다.
59. Training을 가장 압축해서 표현하면
Image generation model의 training은 결국 다음 문제라고 볼 수 있다.
Given:
Noisy Latent
+
Timestep
+
Text Condition
Predict:
Correct Denoising / Flow Direction
즉:
현재 noisy latent가 text condition에 맞는 clean image 쪽으로 가려면 어느 방향으로 이동해야 하는지를 학습한다.
60. Person LoRA를 가장 압축해서 표현하면
JR LoRA training의 목표는:
Base model이 이미 알고 있는 사람, 걷기, 옷, 배경, 조명 등의 일반 개념은 그대로 사용하면서
JR이라는 새로운 text condition과 JR의 visual identity 사이의 관계만 추가로 학습하는 것이다.
그래서 inference에서:
JR
이라는 새로운 identity와:
walking
이라는 기존 개념을 조합하여:
JR is walking
같은 새로운 장면을 생성할 수 있다.
핵심 개념 요약
| 개념 | 의미 |
|---|---|
| Image | 실제 pixel 데이터 |
| VAE | Image ↔ Latent 변환기 |
| Latent | 이미지의 압축된 내부 representation |
| Noise | 무작위 Gaussian 숫자 |
| Timestep | 현재 noise level |
| Caption | 이미지의 의미를 설명하는 text condition |
| Text Encoder | Text를 embedding으로 변환 |
| Embedding | 의미를 나타내는 numerical representation |
| Conditioning | 생성 방향을 제어하는 정보 |
| Diffusion | Noise 제거 과정을 학습하는 방법 |
| Flow Matching | Image 쪽으로 가는 velocity/vector field를 학습 |
| Target | 올바른 noise 또는 flow |
| Loss | Prediction과 Target의 차이 |
| Gradient | Loss를 줄이기 위한 parameter 변화 방향 |
| Optimizer | Gradient를 이용하여 weight를 update하는 알고리즘 |
| Learning Rate | 한 번의 update 크기 |
| LoRA | Base model을 고정하고 작은 correction weight만 학습 |
| Rank | LoRA의 표현 capacity |
| Epoch | Dataset 전체를 한 번 학습 |
| Step | 한 번의 parameter update |
| avr_loss | Training loss의 평균적 값 |
| Overfitting | Identity보다 training example 자체를 암기 |
| Underfitting | Identity를 충분히 학습하지 못한 상태 |
| Seed | Inference 시작 noise를 결정하는 값 |
| Sampling Steps | Noise에서 image로 이동하는 반복 횟수 |
| CFG / Guidance | Text condition의 영향 정도 |
| Turbo | 적은 sampling step으로 생성하도록 distilled된 모델 |
| DiT | Diffusion Transformer |
| U-Net | 전통적인 diffusion model의 핵심 network architecture |
가장 중요한 세 문장
-
이미지 생성 모델은 pixel image 자체보다는 VAE로 압축된 latent space에서 주로 학습한다.
-
Diffusion / Flow training은 noisy latent와 text condition을 받아 clean image 방향으로 가는 올바른 noise 또는 vector field를 예측하도록 학습하는 과정이다.
-
JR LoRA는 base model 전체를 다시 학습하는 것이 아니라,
JR이라는 text concept이 JR의 visual identity 쪽으로 generation trajectory를 유도하도록 작은 weight correction을 추가로 학습하는 것이다.