Skip to content
Published on

Text-to-Image 모델 학습 방법론 완벽 가이드: GAN에서 Flow Matching까지

Authors
  • Name
    Twitter

1. 서론: Text-to-Image 생성 모델의 발전사

Text-to-Image(T2I) 생성 모델은 자연어 텍스트 프롬프트로부터 고해상도 이미지를 생성하는 기술로, 지난 수년간 급격한 발전을 이루었다. 이 분야의 발전 궤적은 크게 네 가지 패러다임으로 구분할 수 있다.

[Text-to-Image 모델 발전 타임라인]

2014-2019          2017-2020          2020-2023              2023-현재
    |                  |                  |                      |
   GAN              VAE/VQ-VAE        Diffusion Models      Flow Matching
    |                  |                  |                  + DiT
    v                  v                  v                      v
 ┌──────────┐    ┌──────────┐    ┌────────────────┐    ┌──────────────┐
 │StackGAN  │    │ VQ-VAE   │    │ DDPM (2020)    │    │ SD3 (2024) │AttnGAN   │    │ VQ-VAE-2 │    │ DALL-E 2(2022) │    │ Flux (2024) │StyleGAN  │    │ dVAE     │    │ Imagen (2022)  │    │ Pixart-Sigma │BigGAN    │    │          │    │ SD 1.x (2022)  │    │              │
 │GigaGAN   │    │          │    │ SDXL (2023)    │    │              │
 └──────────┘    └──────────┘    └────────────────┘    └──────────────┘

특징:                특징:              특징:                   특징:
- Adversarial       - Discrete         - Iterative             - Straight paths
  Training            Latent Space       Denoising             - ODE-based
- Mode Collapse     - Codebook         - Classifier-Free      - Fewer steps
  문제                Learning           Guidance              - DiT backbone
- 빠른 생성         - Two-stage        - Latent Space          - Scalable
                      Training         - U-Net backbone

1.1 왜 학습 방법론이 중요한가

T2I 모델의 품질은 아키텍처 설계뿐 아니라 학습 방법론에 의해 결정적으로 좌우된다. 동일한 아키텍처라 하더라도 noise scheduling, conditioning 방식, 데이터 품질, 학습 전략에 따라 생성 품질이 극적으로 달라진다. 대표적인 예로 DALL-E 3는 아키텍처 변경 없이 캡션 품질 개선만으로 이전 모델 대비 극적인 성능 향상을 달성했다.

이 글에서는 각 패러다임별 핵심 학습 방법론을 논문 기반으로 심층 분석하고, 실전 학습 파이프라인 구성까지 다룬다.


2. 핵심 아키텍처별 학습 방법론

2.1 GAN 기반: Adversarial Training

**Generative Adversarial Network(GAN)**은 Generator와 Discriminator 두 네트워크가 경쟁적으로 학습하는 프레임워크다.

2.1.1 기본 학습 원리

GAN의 학습 목적함수(objective function)는 minimax game으로 정의된다:

min_G max_D  V(D, G) = E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1 - D(G(z)))]

- G (Generator): 랜덤 노이즈 z로부터 이미지 생성
- D (Discriminator): 실제 이미지와 생성 이미지 구분
- 학습 목표: GD를 속이고, D는 정확히 판별

2.1.2 StyleGAN 학습 전략

StyleGAN(Karras et al., 2019)은 Progressive Growing과 Style-based Generator를 도입하여 고품질 이미지 생성을 가능하게 했다.

핵심 학습 기법:

기법설명효과
Progressive Growing저해상도(4x4)에서 시작하여 점진적으로 해상도 증가학습 안정성 향상
Style Mixing서로 다른 latent code를 다른 레이어에 주입다양성 증가
Path Length RegularizationGenerator의 Jacobian 정규화생성 품질 향상
R1 RegularizationDiscriminator gradient penalty학습 안정화
Lazy Regularization정규화를 매 스텝이 아닌 16스텝마다 적용학습 효율 향상
# StyleGAN2 학습 루프 핵심 (simplified)
for real_images, _ in dataloader:
    # 1. Discriminator 학습
    z = torch.randn(batch_size, latent_dim)
    fake_images = generator(z)

    d_real = discriminator(real_images)
    d_fake = discriminator(fake_images.detach())

    d_loss = F.softplus(-d_real).mean() + F.softplus(d_fake).mean()

    # R1 Regularization (lazy: 매 16스텝마다)
    if step % 16 == 0:
        real_images.requires_grad = True
        d_real = discriminator(real_images)
        r1_grads = torch.autograd.grad(d_real.sum(), real_images)[0]
        r1_penalty = r1_grads.square().sum(dim=[1,2,3]).mean()
        d_loss += 10.0 * r1_penalty

    d_optimizer.zero_grad()
    d_loss.backward()
    d_optimizer.step()

    # 2. Generator 학습
    z = torch.randn(batch_size, latent_dim)
    fake_images = generator(z)
    d_fake = discriminator(fake_images)
    g_loss = F.softplus(-d_fake).mean()

    g_optimizer.zero_grad()
    g_loss.backward()
    g_optimizer.step()

2.1.3 BigGAN의 대규모 학습

BigGAN(Brock et al., 2019)은 GAN을 대규모로 스케일업한 모델로, 다음과 같은 학습 전략을 사용했다:

  • 대규모 배치: 배치 크기를 2048까지 증가시켜 학습 안정성과 품질 향상
  • Class-conditional Batch Normalization: 클래스 정보를 Batch Normalization 파라미터에 주입
  • Truncation Trick: 추론 시 latent 분포를 truncate하여 품질-다양성 트레이드오프 조절
  • Orthogonal Regularization: 가중치 행렬의 직교성을 유지하여 mode collapse 방지

2.1.4 GAN 기반 T2I의 한계

GAN 기반 접근법은 다음과 같은 근본적 한계로 인해 Diffusion 기반 모델에 주도권을 내어주게 되었다:

  • Mode Collapse: 생성 다양성이 제한됨
  • Training Instability: 학습이 불안정하여 하이퍼파라미터에 민감
  • Text Conditioning 어려움: 복잡한 텍스트 프롬프트를 정확히 반영하기 어려움
  • Scaling 한계: 대규모 스케일업 시 학습 불안정성 증가

2.2 VAE 기반: Codebook Learning과 Discrete Latent Space

2.2.1 VQ-VAE: Vector Quantized Variational Autoencoder

VQ-VAE(van den Oord et al., 2017)는 연속적인 latent space 대신 이산적(discrete) latent space를 학습하는 방식이다.

[VQ-VAE 아키텍처]

Input Image     Encoder      Quantization      Decoder      Reconstructed
  (256x256) --> [E(x)] --> z_e --> [Codebook] --> z_q --> [D(z_q)] --> Image
                             |        |
                             |   ┌────┴────┐
                             |   │ e_1     │
                             |   │ e_2     │  K개의 코드벡터
                             └──>...       (Codebook)
                                 │ e_K     │
                                 └─────────┘

  z_q = e_k  where k = argmin_j ||z_e - e_j||
  (가장 가까운 코드벡터로 양자화)

VQ-VAE 학습 손실함수:

L = ||x - D(z_q)||²                    # Reconstruction Loss
  + ||sg[z_e] - e||²                   # Codebook Loss (EMA 업데이트로 대체 가능)
  + β * ||z_e - sg[e]||²              # Commitment Loss

- sg[·]: Stop-gradient 연산자
- β: Commitment loss 가중치 (보통 0.25)
- z_e: Encoder 출력
- e: 선택된 codebook 벡터

양자화(quantization) 연산은 미분 불가능하므로, **Straight-Through Estimator(STE)**를 사용하여 gradient를 encoder로 전달한다. Codebook 자체는 Exponential Moving Average(EMA)를 통해 업데이트된다.

# VQ-VAE Codebook 학습 핵심 코드
class VectorQuantizer(nn.Module):
    def __init__(self, num_embeddings, embedding_dim, commitment_cost=0.25):
        super().__init__()
        self.embedding = nn.Embedding(num_embeddings, embedding_dim)
        self.commitment_cost = commitment_cost

    def forward(self, z_e):
        # z_e: (B, D, H, W) -> (B*H*W, D)
        flat_z = z_e.permute(0, 2, 3, 1).reshape(-1, z_e.shape[1])

        # 가장 가까운 codebook 벡터 찾기
        distances = (flat_z ** 2).sum(dim=1, keepdim=True) \
                  + (self.embedding.weight ** 2).sum(dim=1) \
                  - 2 * flat_z @ self.embedding.weight.t()
        indices = distances.argmin(dim=1)
        z_q = self.embedding(indices).view_as(z_e.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)

        # 손실 계산
        codebook_loss = F.mse_loss(z_q.detach(), z_e)      # commitment
        commitment_loss = F.mse_loss(z_q, z_e.detach())     # codebook
        loss = commitment_loss + self.commitment_cost * codebook_loss

        # Straight-Through Estimator
        z_q_st = z_e + (z_q - z_e).detach()
        return z_q_st, loss, indices

2.2.2 VQ-VAE-2: 계층적 코드북 학습

VQ-VAE-2(Razavi et al., 2019)는 다층 계층적 양자화를 도입하여 이미지 품질을 크게 향상시켰다.

[VQ-VAE-2 계층 구조]

                    Top Level (작은 해상도)
                    ┌─────────────┐
                    │  32x32 grid │  전역 구조 정보
Codebook     (구도, 전체 형태)
                    └──────┬──────┘
                    Bottom Level (큰 해상도)
                    ┌──────┴──────┐
                    │  64x64 grid │  세부 디테일 정보
Codebook     (텍스처, 엣지)
                    └─────────────┘

VQ-VAE-2의 이미지 생성 파이프라인은 다음 두 단계로 이루어진다:

  1. Stage 1: VQ-VAE-2를 학습하여 이미지를 계층적 discrete code로 인코딩
  2. Stage 2: PixelCNN 등 autoregressive 모델로 discrete code의 prior를 학습

이 접근법은 이후 DALL-E의 dVAE(discrete VAE)에 직접적인 영향을 주었다.


2.3 Diffusion 기반: 현재 T2I의 핵심

Diffusion Model은 현재 T2I 생성의 주류 패러다임이다. 데이터에 점진적으로 노이즈를 추가하는 forward process와, 노이즈로부터 데이터를 복원하는 reverse process를 학습한다.

2.3.1 DDPM: Denoising Diffusion Probabilistic Models

Ho et al.(2020)의 DDPM은 Diffusion Model을 실용적 수준으로 끌어올린 핵심 논문이다.

Forward Process (Diffusion):

q(x_t | x_{t-1}) = N(x_t; (1-β_t) * x_{t-1}, β_t * I)

- 매 timestep t에서 소량의 Gaussian 노이즈를 추가
- β_t: noise schedule (보통 linear 또는 cosine)
- T 스텝 후 x_T ≈ N(0, I) (순수 Gaussian 노이즈)

Closed-form으로 임의의 timestep t에서 직접 노이즈 추가 가능:

q(x_t | x_0) = N(x_t; (ᾱ_t) * x_0, (1-ᾱ_t) * I)

where ᾱ_t = ∏_{s=1}^{t} α_s,  α_t = 1 - β_t

=> x_t = (ᾱ_t) * x_0 + (1-ᾱ_t) * ε,  ε ~ N(0, I)

Reverse Process (Denoising):

p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), σ_t² * I)

- 신경망 ε_θ가 x_t에 추가된 노이즈 ε를 예측
- 예측된 노이즈를 제거하여 x_{t-1}을 복원

학습 목적함수 (Simple Loss):

L_simple = E_{t, x_0, ε} [ ||ε - ε_θ(x_t, t)||² ]

- t ~ Uniform(1, T)
- ε ~ N(0, I)
- x_t = (ᾱ_t) * x_0 + (1-ᾱ_t) * ε
# DDPM 학습 루프 핵심
def train_step(model, x_0, noise_scheduler):
    batch_size = x_0.shape[0]

    # 1. 랜덤 timestep 샘플링
    t = torch.randint(0, num_timesteps, (batch_size,))

    # 2. 노이즈 샘플링
    noise = torch.randn_like(x_0)

    # 3. Forward process: x_t 생성
    alpha_bar_t = noise_scheduler.alpha_bar[t]
    x_t = torch.sqrt(alpha_bar_t) * x_0 + torch.sqrt(1 - alpha_bar_t) * noise

    # 4. 노이즈 예측
    noise_pred = model(x_t, t)

    # 5. 손실 계산 (MSE)
    loss = F.mse_loss(noise_pred, noise)

    return loss

2.3.2 Noise Scheduling

Noise schedule은 forward process에서 각 timestep에 추가되는 노이즈의 양을 결정하며, 생성 품질에 결정적인 영향을 미친다.

Schedule수식특징사용 모델
Linearβ_t = β_min + (β_max - β_min) * t/T간단하지만 끝부분에서 급격히 노이즈 증가DDPM
Cosineᾱ_t = cos²((t/T + s)/(1+s) * π/2)부드러운 전이, 정보 보존 우수Improved DDPM
Scaled Linearβ_t = (β_min^0.5 + t/T * (β_max^0.5 - β_min^0.5))²SD 1.x에서 사용Stable Diffusion
Sigmoidβ_t = σ(-6 + 12*t/T)양 끝단에서 완만한 변화일부 연구
EDMσ(t) = t, log-normal 샘플링이론적으로 최적에 가까움Playground v2.5, EDM
Zero Terminal SNRSNR(T) = 0으로 보장순수 노이즈에서 시작 보장SD3, Flux

Playground v2.5(Li et al., 2024)는 EDM(Karras et al., 2022)의 noise schedule을 채택하여 색상과 대비를 크게 개선했다. 핵심은 Zero Terminal SNR을 보장하는 것으로, 학습 시 timestep T에서의 Signal-to-Noise Ratio(SNR)가 정확히 0이 되어야 한다.

# Cosine Schedule 구현
def cosine_beta_schedule(timesteps, s=0.008):
    steps = timesteps + 1
    x = torch.linspace(0, timesteps, steps)
    alphas_cumprod = torch.cos(((x / timesteps) + s) / (1 + s) * math.pi * 0.5) ** 2
    alphas_cumprod = alphas_cumprod / alphas_cumprod[0]
    betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1])
    return torch.clip(betas, 0.0001, 0.9999)

# EDM Noise Schedule (Karras et al., 2022)
def edm_sigma_schedule(num_steps, sigma_min=0.002, sigma_max=80.0, rho=7.0):
    step_indices = torch.arange(num_steps)
    t_steps = (sigma_max ** (1/rho) + step_indices / (num_steps - 1)
               * (sigma_min ** (1/rho) - sigma_max ** (1/rho))) ** rho
    return t_steps

2.3.3 Latent Diffusion Model (LDM) - Stable Diffusion의 핵심

Rombach et al.(2022)의 **Latent Diffusion Model(LDM)**은 pixel space 대신 latent space에서 diffusion을 수행하여 계산 효율을 극적으로 개선했다. 이것이 바로 Stable Diffusion의 핵심 아이디어다.

[Latent Diffusion Model 아키텍처]

                          Text Prompt
                         ┌────┴────┐
CLIPEncoder                         └────┬────┘
                              │ text embeddings
┌──────┐    ┌──────┐    ┌─────┴──────┐    ┌──────┐    ┌──────┐
│Image │    │ VAE  │    │   U-Net    │    │ VAE  │    │Output│
(512--->│Encode│---> (Denoising--->│Decode│--->│Image │
│x512) │    │  r   │    │  in Latent │    │  r   │    (512│      │    │      │    │   Space)   │    │      │    │x512)└──────┘    └──────┘    └────────────┘    └──────┘    └──────┘
              │                                 │
              │  64x64x4                        │
                (8x downsampling)              └─────────────────────────────────┘
                    Latent Space (z)

학습: Latent Space에서 Diffusion
추론: 랜덤 노이즈 z_T → U-Net DenoisingVAE Decode → 이미지

LDM의 학습 파이프라인:

  1. Stage 1 - Autoencoder 학습: VAE(KL-regularized)를 이미지 데이터셋으로 사전학습

    • Encoder: 이미지 x (H x W x 3) → latent z (H/f x W/f x c), f=8이 일반적
    • Decoder: latent z → 복원 이미지
    • 손실: Reconstruction + KL Divergence + Perceptual Loss + GAN Loss
  2. Stage 2 - Diffusion Model 학습: 고정된 Autoencoder의 latent space에서 diffusion

    • latent z_0 = Encoder(x)에 노이즈를 추가하여 z_t 생성
    • U-Net이 z_t에서 노이즈를 예측
    • Text conditioning은 cross-attention으로 주입
# Latent Diffusion 학습 핵심
class LatentDiffusionTrainer:
    def __init__(self, vae, unet, text_encoder, noise_scheduler):
        self.vae = vae              # 고정 (frozen)
        self.unet = unet            # 학습 대상
        self.text_encoder = text_encoder  # 고정 (frozen)
        self.noise_scheduler = noise_scheduler

    def train_step(self, images, captions):
        # 1. VAE로 latent encoding (gradient 불필요)
        with torch.no_grad():
            latents = self.vae.encode(images).latent_dist.sample()
            latents = latents * self.vae.config.scaling_factor  # 0.18215

        # 2. 텍스트 임베딩 (gradient 불필요)
        with torch.no_grad():
            text_embeddings = self.text_encoder(captions)

        # 3. 노이즈 추가
        noise = torch.randn_like(latents)
        timesteps = torch.randint(0, 1000, (latents.shape[0],))
        noisy_latents = self.noise_scheduler.add_noise(latents, noise, timesteps)

        # 4. 노이즈 예측
        noise_pred = self.unet(noisy_latents, timesteps, text_embeddings)

        # 5. MSE 손실
        loss = F.mse_loss(noise_pred, noise)
        return loss

2.3.4 U-Net Backbone의 구조

Stable Diffusion 1.x/2.x와 SDXL에서 사용되는 U-Net은 다음과 같은 구조를 갖는다:

[U-Net with Cross-Attention 구조]

Input z_t ─────────────────────────────────────────── Output ε_θ
    │                                                     ▲
    ▼                                                     │
┌────────┐  ┌────────┐  ┌────────┐      ┌────────┐  ┌────────┐
Down   │  │ Down   │  │ Down   │      │  Up    │  │  UpBlock  │──│ Block  │──│ Block  │──┐   │ Block  │──│ Block│ 64x64  │  │ 32x32  │  │ 16x16  │  │   │ 32x32  │  │ 64x64  │
└────────┘  └────────┘  └────────┘  │   └────────┘  └────────┘
    │            │            │     │        ▲           ▲
    │            │            │     ▼        │           │
    │            │            │  ┌────────┐  │           │
    │            │            └──│ Middle │──┘           │
    │            │               │ Block  │              │
    │            │               │ 16x16  │              │
    │            └───────────────└────────┘──────────────┘
                        (skip connections)
    └────────────────────────────────────────────────────┘

Block 내부:
┌──────────────────────────────────────┐
ResNet Block│  ├── GroupNormSiLUConv│  ├── Timestep Embedding 주입          │
│  └── GroupNormSiLUConv│                                       │
Self-Attention Block│  ├── LayerNormSelf-Attention│  └── Skip Connection│                                       │
Cross-Attention Block│  ├── LayerNorm│  ├── Q = Linear(latent features)│  ├── K = Linear(text embeddings)     │  ← Text Conditioning
│  ├── V = Linear(text embeddings)│  └── Attention(Q, K, V)│                                       │
Feed-Forward Block│  ├── LayerNormLinearGEGLU│  └── LinearSkip Connection└──────────────────────────────────────┘

SDXL(Podell et al., 2023)은 U-Net을 약 3배 확대(~2.6B 파라미터)하고, OpenCLIP ViT-bigG와 CLIP ViT-L 두 개의 텍스트 인코더를 사용하며, 다양한 aspect ratio에서 학습하는 개선을 적용했다.

모델U-Net 파라미터Text Encoder해상도VAE 다운샘플링
SD 1.5~860MCLIP ViT-L/14 (1개)512x5128x
SD 2.1~865MOpenCLIP ViT-H/14 (1개)768x7688x
SDXL~2.6BOpenCLIP ViT-bigG + CLIP ViT-L (2개)1024x10248x
SDXL Refiner~2.3BOpenCLIP ViT-bigG (1개)1024x10248x

2.3.5 Classifier-Free Guidance (CFG)

Ho & Salimans(2022)의 **Classifier-Free Guidance(CFG)**는 현대 T2I 모델의 핵심 학습 기법이다.

기존 Classifier Guidance의 문제:

  • 별도의 분류기(classifier)를 학습해야 함
  • noisy image에서 작동하는 분류기 필요
  • 추론 시 분류기의 gradient 계산 필요

Classifier-Free Guidance 핵심 아이디어:

학습 시 일정 확률(보통 10-20%)로 텍스트 conditioning을 빈 문자열("")로 대체하여, 하나의 모델이 conditional과 unconditional 생성을 동시에 학습한다.

학습 시:
  - 확률 p_uncond (: 10%): ε_θ(x_t, t,)  (unconditional)
  - 확률 1-p_uncond:          ε_θ(x_t, t, c)  (conditional)

추론 시:
  ε_guided = ε_θ(x_t, t,) + w * (ε_θ(x_t, t, c) - ε_θ(x_t, t,))

  - w: guidance scale (보통 7.5 ~ 15)
  - w=1: conditional 예측 그대로
  - w>1: 텍스트 조건 방향으로 더 강하게 이동
# Classifier-Free Guidance 학습 구현
def train_step_cfg(model, x_0, text_cond, p_uncond=0.1):
    noise = torch.randn_like(x_0)
    t = torch.randint(0, T, (x_0.shape[0],))
    x_t = add_noise(x_0, noise, t)

    # 랜덤하게 conditioning drop
    mask = torch.rand(x_0.shape[0]) < p_uncond
    cond = text_cond.clone()
    cond[mask] = empty_text_embedding  # null conditioning

    noise_pred = model(x_t, t, cond)
    loss = F.mse_loss(noise_pred, noise)
    return loss

# Classifier-Free Guidance 추론
def sample_cfg(model, x_T, text_cond, guidance_scale=7.5):
    x_t = x_T
    for t in reversed(range(T)):
        # Unconditional 예측
        eps_uncond = model(x_t, t, empty_text_embedding)
        # Conditional 예측
        eps_cond = model(x_t, t, text_cond)
        # Guided 예측
        eps = eps_uncond + guidance_scale * (eps_cond - eps_uncond)
        x_t = denoise_step(x_t, eps, t)
    return x_t

CFG는 생성 품질과 텍스트 일치도를 극적으로 향상시키지만, guidance scale이 너무 높으면 이미지가 과포화(oversaturated)되거나 아티팩트가 발생한다.

2.3.6 DALL-E 2: CLIP 기반 Diffusion

DALL-E 2(Ramesh et al., 2022)는 CLIP 임베딩 공간을 활용한 two-stage diffusion 아키텍처를 도입했다.

[DALL-E 2 학습 파이프라인]

Text ──→ CLIP Text Encoder ──→ text embedding
                              ┌─────┴─────┐
Prior    │  text emb → CLIP image emb
                               (Diffusion)                              └─────┬─────┘
CLIP image embedding
                              ┌─────┴─────┐
DecoderCLIP image emb → 64x64 image
                               (Diffusion)                              └─────┬─────┘
                                    │ 64x64
                              ┌─────┴─────┐
Super-Res  │  64x64 → 256x256 → 1024x1024
                               (Diffusion)                              └─────────── ┘

2.3.7 Imagen: T5 Text Encoder의 위력

Google의 Imagen(Saharia et al., 2022)은 T5-XXL(4.6B 파라미터) 텍스트 인코더를 사용하여 텍스트 이해력을 극대화했다.

핵심 발견:

  • 텍스트 인코더 크기를 키우는 것이 U-Net 크기를 키우는 것보다 더 효과적
  • T5-XXL > CLIP ViT-L (텍스트 이해 품질에서)
  • Dynamic Thresholding: 높은 CFG scale에서도 안정적인 생성
[Imagen 아키텍처]

Text ──→ T5-XXL (frozen) ──→ text embeddings
                              ┌─────┴─────┐
Base Model │  64x64 생성
                                (U-Net)   │  cross-attention
                              └─────┬─────┘
                              ┌─────┴─────┐
SR Model 1 │  64x64 → 256x256
                                (U-Net)                              └─────┬─────┘
                              ┌─────┴─────┐
SR Model 2 │  256x256 → 1024x1024
                                (U-Net)                              └─────────── ┘

2.3.8 DiT: Diffusion Transformer

Peebles & Xie(2023)의 **DiT(Diffusion Transformer)**는 U-Net을 Transformer로 대체한 아키텍처로, 최근 T2I 모델의 주류가 되고 있다.

[DiT Block 구조]

     Input Tokens (patchified latent)
    ┌──────┴──────┐
LayerNorm  │ ← adaLN-Zero (adaptive)
      (adaptive) │   γ, β = MLP(timestep + class)
    └──────┬──────┘
    ┌──────┴──────┐
Self-Attention    └──────┬──────┘
            (+ residual)
    ┌──────┴──────┐
LayerNorm  │ ← adaLN-Zero
      (adaptive)    └──────┬──────┘
    ┌──────┴──────┐
PointwiseFFN    └──────┬──────┘
            (+ residual, scaled by α)
     Output Tokens

DiT의 핵심 설계 결정:

  • Patchify: latent을 p x p 패치로 분할 후 linear projection → token sequence
  • adaLN-Zero: Adaptive Layer Normalization, timestep과 class 정보를 LN 파라미터로 주입
  • Scaling: 모델 크기(depth, width)에 따른 체계적 스케일링 법칙 확인
DiT 변형DepthWidthParametersGFLOPs
DiT-S/21238433M6
DiT-B/212768130M23
DiT-L/2241024458M80
DiT-XL/2281152675M119

2.4 Autoregressive 기반 T2I

2.4.1 DALL-E (원본): 토큰 기반 자기회귀 생성

DALL-E(Ramesh et al., 2021)는 이미지를 discrete token으로 변환한 후, 텍스트 토큰과 이미지 토큰을 하나의 시퀀스로 연결하여 autoregressive Transformer로 joint distribution을 학습한다.

[DALL-E 학습 파이프라인]

Stage 1: dVAE 학습
  Image (256x256) ──→ dVAE Encoder ──→ 32x32 grid of tokens (8192 vocabulary)
                                           ──→ dVAE Decoder ──→ Reconstructed Image

  Loss: Reconstruction + KL Divergence (Gumbel-Softmax relaxation)

Stage 2: Autoregressive Transformer 학습
  [BPE text tokens (256)] + [Image tokens (1024)] = 1280 tokens

  Transformer (12B params):
  - 64 layers, 62 attention heads
  - 학습 목적: next-token prediction (cross-entropy)
  - 텍스트 토큰은 causal attention (좌→우)
  - 이미지 토큰은 row-major order로 자기회귀 생성
  - 텍스트→이미지 cross-attention 포함

2.4.2 Parti: Encoder-Decoder 기반

Google의 Parti(Yu et al., 2022)는 T2I를 sequence-to-sequence 문제로 정의하고, ViT-VQGAN 토크나이저와 Encoder-Decoder Transformer를 결합했다.

핵심 특징:

  • ViT-VQGAN: Vision Transformer 기반 이미지 토크나이저
  • Encoder-Decoder: 텍스트 인코딩에 Encoder, 이미지 토큰 생성에 Decoder 사용
  • 스케일링: 350M → 3B → 20B 파라미터까지 체계적 스케일업
  • 20B 모델에서 Imagen과 대등한 품질 달성

2.4.3 CM3Leon: 효율적 멀티모달 자기회귀

Meta의 CM3Leon(Yu et al., 2023)은 autoregressive 방식의 효율성을 크게 개선했다:

  • Retrieval-Augmented Training: 학습 시 관련 이미지-텍스트 쌍을 검색하여 context에 추가
  • Decoder-Only: Parti와 달리 순수 decoder-only 아키텍처
  • Instruction Tuning: 다양한 태스크에 대한 supervised fine-tuning
  • 5x 적은 학습 비용: 유사 성능 대비 학습 컴퓨트를 1/5로 절감
  • MS-COCO zero-shot FID 4.88 달성

2.5 Flow Matching: 차세대 학습 패러다임

2.5.1 Flow Matching의 기본 원리

Flow Matching(Lipman et al., 2023)은 Diffusion의 stochastic process 대신 **deterministic ODE(Ordinary Differential Equation)**를 통해 노이즈 분포에서 데이터 분포로의 **직선 경로(straight path)**를 학습한다.

[Diffusion vs Flow Matching 비교]

Diffusion (Stochastic):              Flow Matching (Deterministic):
  x_0 ~~~> x_T                         x_0 ──────> x_1
  (곡선 경로, 많은 스텝 필요)              (직선 경로, 적은 스텝 가능)

  x₀ •                                x₀ •
     \  ← 곡선                            \  ← 직선
      \    경로                            \    경로
       \                                    \
        \                                    \
     x_T •                              x₁   (= noise)

dx = f(x,t)dt + g(t)dW              dx/dt = v_θ(x_t, t)
(SDE 기반)                           (ODE 기반, velocity field 학습)

Flow Matching 학습 목적함수:

L_FM = E_{t, x_0, x_1} [ ||v_θ(x_t, t) - u_t(x_t | x_0, x_1)||² ]

where:
  x_t = (1 - t) * x_0 + t * x_1      (linear interpolation)
  u_t = x_1 - x_0                      (target velocity: 직선 경로)
  t ~ Uniform(0, 1)                    (또는 logit-normal)
  x_0 ~ p_data (실제 데이터)
  x_1 ~ N(0, I) (가우시안 노이즈)

2.5.2 Rectified Flow

Rectified Flow(Liu et al., 2023, ICLR 2023 Spotlight)는 Flow Matching의 핵심 변형으로, Optimal Transport 관점에서 노이즈-데이터 쌍을 직선으로 연결하는 방법이다.

핵심 아이디어:

  1. 1-Rectified Flow: 데이터 x_0와 노이즈 x_1을 랜덤 페어링하여 직선 경로 학습
  2. 2-Rectified Flow (Reflow): 1-Rectified Flow로 생성한 쌍을 다시 직선화하여 경로를 더 직선에 가깝게 만듦
  3. Distillation: 직선화된 모델을 1-step 모델로 증류
# Rectified Flow 학습 핵심
def rectified_flow_train_step(model, x_0, x_1=None):
    """
    x_0: 실제 데이터 (latent)
    x_1: 노이즈 (None이면 랜덤 샘플링)
    """
    if x_1 is None:
        x_1 = torch.randn_like(x_0)

    # 시간 샘플링 (logit-normal for SD3)
    t = torch.sigmoid(torch.randn(x_0.shape[0]))  # logit-normal
    t = t.view(-1, 1, 1, 1)

    # Linear interpolation
    x_t = (1 - t) * x_0 + t * x_1

    # Target velocity (직선 방향)
    target_v = x_1 - x_0

    # Velocity 예측
    v_pred = model(x_t, t)

    # 손실
    loss = F.mse_loss(v_pred, target_v)
    return loss

2.5.3 Stable Diffusion 3의 Flow Matching 적용

SD3(Esser et al., 2024)는 Rectified Flow를 대규모 T2I 모델에 최초로 적용한 모델이다. 논문 "Scaling Rectified Flow Transformers for High-Resolution Image Synthesis"의 핵심 기여:

1. Logit-Normal Timestep Sampling:

균일 분포 대신 logit-normal 분포로 timestep을 샘플링하여, trajectory의 중간 부분(가장 어려운 예측 구간)에 더 많은 가중치를 부여한다.

# SD3의 Logit-Normal Timestep Sampling
def logit_normal_sampling(batch_size, m=0.0, s=1.0):
    """중간 timestep에 더 많은 가중치를 부여"""
    u = torch.randn(batch_size) * s + m
    t = torch.sigmoid(u)  # (0, 1) 범위
    return t

2. MM-DiT (Multi-Modal Diffusion Transformer):

SD3는 텍스트와 이미지를 위한 별도의 가중치를 사용하면서, 양방향 정보 흐름을 가능하게 하는 새로운 Transformer 아키텍처를 도입했다.

[MM-DiT Block]

  Image Tokens          Text Tokens
       │                     │
  ┌────┴────┐          ┌────┴────┐
  │adaLN(t)│adaLN(t)  └────┬────┘          └────┬────┘
       │                     │
       └──────┬──────────────┘
               (concatenate)
       ┌──────┴──────┐
Joint Self- │  ← 이미지-텍스트 토큰이
Attention  │     서로 attend
       └──────┬──────┘
               (split)
       ┌──────┴──────────────┐
       │                     │
  ┌────┴────┐          ┌────┴────┐
FFN   │          │   FFN   (image) (text)  └────┬────┘          └────┬────┘
       │                     │
  Image Out             Text Out

3. 스케일링 법칙:

모델BlocksParameters성능 (validation loss)
SD3-S15450M높음
SD3-M242B중간
SD3-L388B낮음 (최고 성능)

모델 크기와 학습 스텝 수가 증가할수록 validation loss가 안정적으로 감소하는 smooth scaling을 확인했다.

2.5.4 Flux: Black Forest Labs의 Flow Matching 모델

Flux(Black Forest Labs, 2024)는 SD3의 Rectified Flow + Transformer 아키텍처를 기반으로 한 모델이다.

변형학습 방법추론 스텝특징
FLUX.1 [pro]Full training25-50최고 품질, API만 제공
FLUX.1 [dev]Guidance Distillation25-50효율적 추론, 오픈 가중치
FLUX.1 [schnell]Latent Adversarial Diffusion Distillation1-4초고속 생성

Guidance Distillation: Teacher 모델(CFG 사용)의 출력을 Student 모델이 CFG 없이 재현하도록 학습하여, 추론 시 CFG 계산(2x forward pass)을 제거한다.

Latent Adversarial Diffusion Distillation (LADD): GAN의 adversarial loss와 diffusion distillation을 결합하여 1-4 스텝 생성을 가능하게 한다.


3. Text Conditioning 방법론

Text Conditioning은 T2I 모델에서 텍스트 프롬프트의 의미를 이미지 생성 과정에 주입하는 메커니즘이다. 텍스트 인코더의 선택과 conditioning 방식은 생성 품질에 결정적 영향을 미친다.

3.1 CLIP Text Encoder

OpenAI의 CLIP(Contrastive Language-Image Pre-training, Radford et al., 2021)은 4억 개의 이미지-텍스트 쌍으로 대조 학습된 모델이다.

[CLIP 학습 과정]

  Image ──→ Image Encoder ──→ image embedding ─┐
                                                 ├─ cosine similarity
  Text  ──→ Text Encoder  ──→ text embedding  ─┘

  학습 목적: 매칭 쌍의 similarity ↑, 비매칭 쌍의 similarity 
  (InfoNCE Loss)

CLIP Text Encoder의 특징:

  • 토큰 시퀀스 임베딩(sequence embeddings)과 [EOS] 토큰의 pooled embedding 모두 활용 가능
  • 최대 77 토큰 길이 제한
  • 이미지-텍스트 정렬(alignment)에 강함
  • 시각적 개념에 특화된 텍스트 이해
CLIP 변형파라미터사용 모델
CLIP ViT-L/14~124M (text)SD 1.x
OpenCLIP ViT-H/14~354M (text)SD 2.x
OpenCLIP ViT-bigG/14~694M (text)SDXL (primary)
CLIP ViT-L/14~124M (text)SDXL (secondary)

3.2 T5 Text Encoder

Google의 T5(Text-to-Text Transfer Transformer, Raffel et al., 2020)는 순수 텍스트 코퍼스에서 학습된 대규모 언어 모델이다.

T5의 장점 (Imagen 논문에서 입증):

  • CLIP보다 훨씬 큰 텍스트 코퍼스에서 학습 (C4 dataset)
  • 복잡한 문장 구조와 관계 이해에 우수
  • 공간적 관계, 수량, 속성 조합 등 복잡한 프롬프트 처리 능력
  • 텍스트 인코더 스케일링이 U-Net 스케일링보다 효과적 (Imagen 핵심 발견)
T5 변형파라미터사용 모델
T5-Small60M실험용
T5-Base220M실험용
T5-Large770M실험용
T5-XL3BPixArt-alpha
T5-XXL4.6BImagen, SD3, Flux
Flan-T5-XL3BPixArt-sigma

3.3 Cross-Attention Mechanism

Cross-attention은 U-Net 또는 DiT 내부에서 텍스트 정보를 이미지 feature에 주입하는 핵심 메커니즘이다.

# Cross-Attention 구현
class CrossAttention(nn.Module):
    def __init__(self, d_model, d_context, n_heads):
        super().__init__()
        self.n_heads = n_heads
        self.d_head = d_model // n_heads

        self.to_q = nn.Linear(d_model, d_model, bias=False)      # latent → Q
        self.to_k = nn.Linear(d_context, d_model, bias=False)     # text → K
        self.to_v = nn.Linear(d_context, d_model, bias=False)     # text → V
        self.to_out = nn.Linear(d_model, d_model)

    def forward(self, x, context):
        """
        x: (B, H*W, d_model) - 이미지 latent features
        context: (B, seq_len, d_context) - 텍스트 임베딩
        """
        q = self.to_q(x)          # 이미지가 Query
        k = self.to_k(context)    # 텍스트가 Key
        v = self.to_v(context)    # 텍스트가 Value

        # Multi-head reshape
        q = q.view(B, -1, self.n_heads, self.d_head).transpose(1, 2)
        k = k.view(B, -1, self.n_heads, self.d_head).transpose(1, 2)
        v = v.view(B, -1, self.n_heads, self.d_head).transpose(1, 2)

        # Attention
        attn = (q @ k.transpose(-2, -1)) / math.sqrt(self.d_head)
        attn = F.softmax(attn, dim=-1)
        out = attn @ v

        out = out.transpose(1, 2).reshape(B, -1, d_model)
        return self.to_out(out)

3.4 Pooled Text Embeddings vs Sequence Embeddings

현대 T2I 모델은 두 가지 유형의 텍스트 임베딩을 동시에 활용한다:

[텍스트 임베딩 유형]

Text: "a photo of a cat"
    ┌────┴────┐
TextEncoder    └────┬────┘
    ┌────┴──────────────────────┐
    │                           │
    ▼                           ▼
 Sequence Embeddings         Pooled Embedding
 (token-level)               (sentence-level)
 [h_1, h_2, ..., h_n]       h_pool = h_[EOS]
 Shape: (seq_len, d)         Shape: (d,)
    │                           │
    │                           │
    ▼                           ▼
 Cross-Attention에 사용       Global conditioning에 사용
 (세밀한 토큰별 정보)          (전체 문장 의미)
                              - Timestep embedding에 더하기
                              - adaLN 파라미터 조절
                              - Vector conditioning

SDXL에서의 dual text encoder 활용:

# SDXL Text Conditioning
def get_sdxl_text_embeddings(text, clip_l, clip_g):
    # CLIP ViT-L: sequence embeddings (77, 768)
    clip_l_output = clip_l(text)
    clip_l_seq = clip_l_output.last_hidden_state      # (77, 768)
    clip_l_pooled = clip_l_output.pooler_output        # (768,)

    # OpenCLIP ViT-bigG: sequence embeddings (77, 1280)
    clip_g_output = clip_g(text)
    clip_g_seq = clip_g_output.last_hidden_state       # (77, 1280)
    clip_g_pooled = clip_g_output.pooler_output        # (1280,)

    # Sequence embeddings 연결 → Cross-Attention에 사용
    text_embeddings = torch.cat([clip_l_seq, clip_g_seq], dim=-1)  # (77, 2048)

    # Pooled embeddings 연결 → Vector conditioning에 사용
    pooled_embeddings = torch.cat([clip_l_pooled, clip_g_pooled], dim=-1)  # (2048,)

    return text_embeddings, pooled_embeddings

SD3와 Flux는 여기에 T5-XXL sequence embeddings를 추가로 결합하여 3중 텍스트 인코더 구성을 사용한다:

인코더역할출력 형태용도
CLIP ViT-L시각적 정렬pooled (768) + seq (77, 768)pooled → vector cond
OpenCLIP ViT-bigG시각적 정렬pooled (1280) + seq (77, 1280)pooled → vector cond
T5-XXL텍스트 이해seq (max 256/512, 4096)cross-attn / joint-attn

4. 학습 데이터셋

T2I 모델의 품질은 학습 데이터의 규모와 품질에 직접적으로 의존한다. 주요 대규모 데이터셋을 정리한다.

4.1 주요 데이터셋 비교

데이터셋규모소스필터링 방법주요 사용 모델
LAION-5B58.5억 쌍Common CrawlCLIP similarity > 0.28 (영어)SD 1.x, SD 2.x
LAION-400M4억 쌍Common CrawlCLIP similarity 필터초기 연구
LAION-Aesthetics~1.2억 쌍LAION-5B subsetAesthetic score > 4.5/5.0SD fine-tuning
CC3M330만 쌍Google 검색자동 필터링 파이프라인연구용
CC12M1,200만 쌍Google 검색완화된 필터링연구용
COYO-700M7.47억 쌍Common Crawl이미지+텍스트 필터링연구용
WebLi100억 이미지웹 크롤링상위 10% CLIP 유사도PaLI, Imagen
JourneyDB~460만 쌍Midjourney고품질 프롬프트-이미지연구용
SAM11M 이미지다양한 소스수동 + 모델 기반세그멘테이션 + T2I
Internal (비공개)수십억 쌍비공개비공개DALL-E 3, Midjourney

4.2 LAION-5B 필터링 파이프라인

LAION-5B(Schuhmann et al., 2022)는 가장 널리 사용된 오픈 T2I 학습 데이터셋이다:

[LAION-5B 데이터 수집 및 필터링 파이프라인]

Common Crawl (웹 아카이브)
1. HTML 파싱: <img> 태그에서 src URL + alt-text 추출
2. 이미지 다운로드 (img2dataset)
   - 최소 해상도 필터: width, height ≥ 64
   - 최대 종횡비: 3:1
3. CLIP 유사도 필터링
   - OpenAI CLIP ViT-B/32로 image-text similarity 계산
   - 영어: cosine similarity ≥ 0.28
   - 기타 언어: cosine similarity ≥ 0.26
4. 안전성 필터링
   - NSFW 탐지 점수 (CLIP 기반)
   - Watermark 탐지 점수
   - Toxic content 탐지
5. 중복 제거 (deduplication)
   - 해시 기반 exact duplicate 제거
   - CLIP embedding 기반 near-duplicate 제거
최종: 58.5억 이미지-텍스트 쌍
 - 23.2억 영어
 - 22.6억 기타 100+ 언어
 - 12.7억 언어 미확인

4.3 데이터 품질 평가 (Data Quality Assessment)

최신 모델들은 데이터 양보다 데이터 품질에 집중하는 추세다:

1. CLIP Score 기반 필터링:

# CLIP Score 계산
from transformers import CLIPModel, CLIPProcessor
model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14")

inputs = processor(text=[caption], images=[image], return_tensors="pt")
outputs = model(**inputs)
clip_score = outputs.logits_per_image.item() / 100.0  # normalized

2. Aesthetic Score 필터링:

LAION-Aesthetics는 별도의 aesthetic predictor(CLIP embedding → MLP → score)를 학습하여, aesthetic score 4.5 이상인 이미지만 추출한 서브셋이다.

3. Caption Quality 개선 (DALL-E 3의 핵심 혁신):

DALL-E 3(Betker et al., 2023)는 아키텍처 변경 없이 캡션 품질 개선만으로 극적인 성능 향상을 달성했다:

  • 전용 이미지 캡셔닝 모델을 학습하여 상세한 synthetic caption 생성
  • 95% synthetic 캡션 + 5% 원본 캡션으로 학습
  • Short synthetic, detailed synthetic, human annotation 3가지 비교 실험
  • Detailed synthetic caption이 압도적으로 우수
[DALL-E 3 캡션 개선 효과]

기존: "cat on table"
      → 모호하고 세부 정보 부족

개선: "A fluffy orange tabby cat sitting on a round wooden
       dining table, natural sunlight streaming through a
       window behind, casting soft shadows. The cat has
       bright green eyes and is looking directly at the camera."
      → 상세한 속성, 공간 관계, 조명 정보 포함

4.4 데이터 전처리 기법

전처리 기법설명효과
Center Crop이미지 중앙을 정사각형으로 크롭해상도 표준화
Random Crop랜덤 위치 크롭데이터 증강
Bucket Sampling유사 종횡비 이미지를 그룹화다양한 종횡비 학습 (SDXL)
Caption Dropout일정 확률로 캡션을 빈 문자열로CFG 학습 지원
Multi-resolution저해상도 → 고해상도 단계적 학습학습 효율 + 품질
Tag Shuffling태그 순서 랜덤 셔플텍스트 순서 편향 감소

5. Fine-tuning & Customization 기법

사전학습된 T2I 모델을 특정 스타일, 주체, 제어 조건에 맞게 조정하는 fine-tuning 기법은 실전 활용의 핵심이다.

5.1 LoRA (Low-Rank Adaptation)

Hu et al.(2022)의 LoRA는 대규모 모델의 가중치를 효율적으로 fine-tuning하는 방법으로, T2I 모델에서도 핵심적으로 활용된다.

[LoRA 원리]

원본 가중치:  W_0R^{d×k}  (고정, frozen)
LoRA 업데이트: ΔW = B × A      where AR^{r×k}, BR^{d×r}

최종 출력: h = W_0 x + ΔW x = W_0 x + B(Ax)

- r << min(d, k): low-rank (보통 4, 8, 16, 32, 64)
- 학습 파라미터: AB (전체 대비 매우 적음)
- 원본 가중치는 고정 → 메모리 효율적
# LoRA 적용 예시 (Stable Diffusion U-Net의 attention layer)
class LoRALinear(nn.Module):
    def __init__(self, original_layer, rank=4, alpha=1.0):
        super().__init__()
        self.original = original_layer  # frozen
        in_features = original_layer.in_features
        out_features = original_layer.out_features

        # LoRA layers
        self.lora_A = nn.Linear(in_features, rank, bias=False)
        self.lora_B = nn.Linear(rank, out_features, bias=False)
        self.scale = alpha / rank

        # 초기화
        nn.init.kaiming_uniform_(self.lora_A.weight)
        nn.init.zeros_(self.lora_B.weight)  # B를 0으로 → 초기에는 원본과 동일

    def forward(self, x):
        original_out = self.original(x)        # 고정된 원본 출력
        lora_out = self.lora_B(self.lora_A(x)) # LoRA 업데이트
        return original_out + self.scale * lora_out

LoRA 학습 설정 (Diffusers 기반):

# Diffusers LoRA 학습 실행 예시
accelerate launch train_text_to_image_lora.py \
  --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \
  --dataset_name="lambdalabs/naruto-blip-captions" \
  --resolution=1024 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-04 \
  --lr_scheduler="cosine" \
  --lr_warmup_steps=0 \
  --rank=4 \
  --mixed_precision="fp16" \
  --output_dir="./sdxl-naruto-lora"
LoRA 파라미터일반적 범위영향
Rank (r)4-128높을수록 표현력 증가, 메모리 증가
Alpha (α)rank와 동일 ~ 2x학습률 스케일링
Target Modulesattn Q,K,V,O + FFN적용 범위
Learning Rate1e-4 ~ 1e-5수렴 속도
학습 시간5-30분 (단일 GPU)빠른 반복 가능
파일 크기1-200 MB공유 및 배포 용이

5.2 DreamBooth

Ruiz et al.(2023)의 DreamBooth는 3-5장의 이미지로 특정 주체(subject)의 개념을 모델에 주입하는 기법이다.

[DreamBooth 학습 과정]

입력: 특정 주체의 이미지 3-5+ 고유 식별자 "[V]"
      : "a [V] dog" (특정 강아지)

학습 전략:
1. 주체 이미지로 모델 fine-tuning
   - "a [V] dog" → 해당 강아지 이미지

2. Prior Preservation Loss (핵심!)
   - 원본 모델로 "a dog" 이미지를 미리 생성해두고
   - fine-tuning 중 "a dog" → 일반적인 강아지 생성 능력을 보존
   - language drift 방지

L = L_recon([V] images) + λ * L_prior(class images)
# DreamBooth + LoRA 학습 (권장 조합)
# diffusers 라이브러리 기반
accelerate launch train_dreambooth_lora.py \
  --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \
  --instance_data_dir="./my_dog_images" \
  --instance_prompt="a photo of sks dog" \
  --class_data_dir="./class_dog_images" \
  --class_prompt="a photo of dog" \
  --with_prior_preservation \
  --prior_loss_weight=1.0 \
  --num_class_images=200 \
  --resolution=1024 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --learning_rate=1e-4 \
  --lr_scheduler="constant" \
  --max_train_steps=500 \
  --rank=4 \
  --mixed_precision="fp16"

5.3 Textual Inversion

Gal et al.(2023)의 Textual Inversion은 모델 가중치를 전혀 수정하지 않고, 새로운 토큰 임베딩만 학습하는 방법이다.

[Textual Inversion]

기존 토큰 공간:  [cat] [dog] [car] [tree] ...
새로운 토큰 추가:               [S*] ← 학습할 새로운 개념
학습: 이미지 3-5장으로 [S*]의 embedding vector만 최적화
나머지 모델 전체는 frozen

장점: 파라미터 극소 (토큰 1= 768 또는 1024 float)
단점: 표현력이 LoRA/DreamBooth보다 제한적

5.4 ControlNet

Zhang & Agrawala(2023)의 ControlNet은 사전학습된 diffusion model에 **구조적 조건(edge, depth, pose 등)**을 추가하는 방법이다.

[ControlNet 아키텍처]

                   Control Input (: Canny edge)
                    ┌─────┴─────┐
ZeroConv                    └─────┬─────┘
                    ┌─────┴─────┐
Locked U-NetTrainable │  ← U-Net Encoder의 복사본
(원본 고정)Copy of       (학습 가능)
    │               │ U-Net Enc    │               └─────┬─────┘
    │                     │
    │               ┌─────┴─────┐
    │               │  Zero     │  ← 학습 초기에 출력이 0
    │               │  Conv          (원본 모델에 영향 없이 시작)
    │               └─────┬─────┘
    │                     │
    └─────── + ───────────┘  ← 원본 U-Net feature에 더함
              Final Output

ControlNet의 핵심 학습 기법 - Zero Convolution:

# Zero Convolution: 가중치와 바이어스를 0으로 초기화
class ZeroConv(nn.Module):
    def __init__(self, in_channels, out_channels):
        super().__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, 1)
        nn.init.zeros_(self.conv.weight)
        nn.init.zeros_(self.conv.bias)

    def forward(self, x):
        return self.conv(x)

# 학습 초기: zero conv 출력 = 0
# → ControlNet 추가해도 원본 모델 출력에 영향 없음
# → 학습이 진행되면서 점차 control signal 반영
조건 유형입력용도
Canny Edge엣지 맵윤곽선 기반 생성
Depth깊이 맵3D 구조 보존
OpenPose관절 위치인체 포즈 제어
Semantic Segmentation세그멘테이션 맵레이아웃 제어
Scribble낙서대략적 구도
Normal Map표면 법선 맵3D 형태 제어
Tile저해상도/타일Super-resolution

5.5 IP-Adapter

Ye et al.(2023)의 IP-Adapter(Image Prompt Adapter)는 이미지를 프롬프트로 사용하여 스타일이나 주체를 전달하는 어댑터다.

[IP-Adapter 아키텍처]

Reference Image ──→ CLIP Image Encoder ──→ image features
                                         ┌─────┴─────┐
Projection │  ← 학습 대상
Layer                                         └─────┬─────┘
                                         ┌─────┴─────┐
Decoupled │  ← 별도의 cross-attention
Cross-Attn     (텍스트 cross-attn과 분리)
                                         └─────┬─────┘
Original U-Net Cross-Attention ────── + ───────┘
(텍스트 conditioning)

출력 = Text_CrossAttn(Q, K_text, V_text) + λ * Image_CrossAttn(Q, K_img, V_img)

5.6 Fine-tuning 기법 비교

기법수정 대상학습 이미지 수학습 시간파일 크기주요 용도
LoRAAttention 가중치 (low-rank)수십~수천5-30분1-200MB스타일, 개념
DreamBooth전체 모델 or + LoRA3-105-60분2-7GB (전체) 또는 1-200MB (LoRA)특정 주체
Textual Inversion토큰 임베딩만3-1030분-수시간수 KB단순 개념
ControlNetU-Net Encoder 복사본수만~수십만수일~1.5GB구조적 제어
IP-AdapterProjection + Cross-Attn대규모수일~100MB이미지 프롬프팅

6. 최신 트렌드 (2024-2026)

6.1 Consistency Models

Yang Song et al.(2023)의 Consistency Models는 diffusion model의 다단계 생성을 1-step 또는 few-step으로 단축하는 방법이다.

[Consistency Models 핵심 아이디어]

Diffusion: x_T → x_{T-1}... → x_1 → x_0  (수백 스텝)

Consistency:
  PF-ODE trajectory 위의 모든 점 x_t가
  동일한 x_0로 매핑되도록 학습

  f_θ(x_t, t) = x_0  ∀t ∈ [0, T]

  핵심 제약: f_θ(x_0, 0) = x_0 (self-consistency)

     x_T ────→ f_θ ────→ x_0
      │                    ↑
     x_t ────→ f_θ ───────┘  (같은 x_0로 매핑!)
      │                    ↑
    x_t' ────→ f_θ ───────┘

두 가지 학습 방법:

방법설명장점단점
Consistency Distillation (CD)사전학습된 diffusion model 필요, PF-ODE 시뮬레이션높은 품질teacher 모델 필요
Consistency Training (CT)실제 데이터에서 직접 학습teacher 불필요CD보다 품질 다소 낮음

성능:

  • CIFAR-10: FID 3.55 (1-step), 2.93 (2-step)
  • ImageNet 64x64: FID 6.20 (1-step)

후속 연구인 **Improved Consistency Training (iCT)**와 **Latent Consistency Models (LCM)**은 이를 대규모 T2I 모델에 적용하여, SDXL 수준의 모델에서 2-4 step 생성을 가능하게 했다.

6.2 DiT (Diffusion Transformer) 아키텍처의 확산

2024년 이후 DiT는 U-Net을 대체하여 T2I의 주류 backbone이 되고 있다:

모델연도Backbone파라미터핵심 특징
DiT (원본)2023Transformer675M클래스 조건부, adaLN-Zero
PixArt-alpha2023DiT + Cross-Attn600MT2I, 저비용 학습
PixArt-sigma2024DiT + KV Compression600M4K 해상도, weak-to-strong
SD32024MM-DiT2B-8BFlow Matching, 3중 text encoder
Flux2024MM-DiT variant~12BDistillation 변형
Playground v2.52024SDXL U-Net~2.6BEDM noise schedule
Hunyuan-DiT2024DiT~1.5B중국어+영어 bilingual
Lumina-T2X2024DiT다양Multi-modal generation

6.3 PixArt-alpha 와 PixArt-sigma

**PixArt-alpha(Chen et al., 2023)**는 효율적 DiT 학습의 선구자적 모델이다:

핵심 혁신 - Training Decomposition (학습 분해):

[PixArt-alpha 3단계 학습]

Stage 1: Pixel Dependency 학습 (저비용)
  - ImageNet 사전학습된 DiT에서 시작
  - 클래스 조건부 → T2I 전환의 기초

Stage 2: Text-Image Alignment 학습
  - Cross-attention으로 텍스트 조건 주입
  - LLaVA로 생성한 고품질 synthetic caption 사용

Stage 3: High-quality Aesthetic 학습
  - 고품질 미적 데이터셋으로 fine-tuning
  - JourneyDB 등 활용

총 학습 비용: ~675 A100 GPU days
(SD 1.5~6,250 A100 GPU days 대비 10.8%)

**PixArt-sigma(Chen et al., 2024)**의 개선점:

  • Weak-to-Strong Training: PixArt-alpha를 기반으로 더 고품질 데이터로 강화 학습
  • KV Compression: Attention에서 Key와 Value를 압축하여 효율성 향상 → 4K 해상도 가능
  • 0.6B 파라미터로 SDXL(2.6B)과 대등한 성능

6.4 SDXL, SD3, Flux 비교

[세대별 Stable Diffusion 계보]

SD 1.x (2022)     SDXL (2023)       SD3 (2024)         Flux (2024)
    │                  │                │                   │
  U-Net 860M       U-Net 2.6B      MM-DiT 2-8B        MM-DiT ~12B
    │                  │                │                   │
  CLIP ViT-L       CLIP-L +          CLIP-L +            CLIP-L +
                   OpenCLIP-G        OpenCLIP-G +        OpenCLIP-G +
                                     T5-XXL               T5-XXL
    │                  │                │                   │
  Diffusion        Diffusion        Rectified            Rectified
  (DDPM)           (DDPM)           Flow                 Flow
    │                  │                │                   │
  512x512          1024x1024        1024x1024            1024x1024+
    │                  │                │                   │
  CFG 7.5          CFG 5-9          CFG 3.5-7            Guidance
                                                         Distillation

6.5 DALL-E 3의 학습 혁신

DALL-E 3(Betker et al., 2023)의 핵심 혁신은 학습 데이터 캡션 품질 개선에 있다:

  1. Image Captioner 학습: CoCa 기반 이미지 캡셔닝 모델을 별도 학습
  2. Synthetic Caption 생성: 학습 데이터 전체를 상세한 synthetic caption으로 재라벨링
  3. Caption Mixing: 95% synthetic + 5% original caption으로 학습
  4. Descriptive vs Short: 상세한 설명형 캡션이 짧은 태그형보다 우수

6.6 Playground v2.5의 3대 통찰

Playground v2.5(Li et al., 2024)는 SDXL 아키텍처 기반에서 학습 전략 개선으로 DALL-E 3, Midjourney 5.2를 능가했다:

1. EDM Noise Schedule 채택:

# EDM Framework (Karras et al., 2022)
# σ(t) 기반 noise schedule - Zero Terminal SNR 보장
# 기존 SD의 linear schedule 대비 색상/대비 크게 개선

def edm_precondition(sigma, x_noisy, F_theta):
    """EDM Preconditioning"""
    c_skip = 1.0 / (sigma ** 2 + 1)
    c_out = sigma / (sigma ** 2 + 1).sqrt()
    c_in = 1.0 / (sigma ** 2 + 1).sqrt()
    c_noise = sigma.log() / 4

    D_x = c_skip * x_noisy + c_out * F_theta(c_in * x_noisy, c_noise)
    return D_x

2. Multi-Aspect Ratio Training:

  • Bucketed dataset: 유사 종횡비 이미지를 그룹화하여 배치 구성
  • 학습 시 다양한 종횡비 지원 (1:1, 4:3, 16:9 등)

3. Human Preference Alignment:

  • 인간 선호도 데이터를 활용한 학습 전략
  • Quality-tuning으로 미적 품질 극대화

7. 학습 파이프라인 실전 가이드

7.1 학습 인프라

GPU 요구사항

학습 규모권장 GPUVRAM학습 기간비용 (추정)
LoRA Fine-tuningRTX 3090/4090 1대24GB5-30분< $1
DreamBoothA100 40GB 1대40GB30-60분$2-5
ControlNet 학습A100 80GB 4-8대320-640GB2-5일$500-2,000
SD 1.5 수준 학습A100 80GB 256대~20TB24일~$150K
SDXL 수준 학습A100 80GB 512-1024대~40-80TB수주~$500K-1M
SD3/Flux 수준 학습H100 80GB 1024+대~80TB+수주-수개월> $1M

분산 학습 전략

[대규모 분산 학습 구성]

┌─────────────────────────────────────────────────────┐
Data Parallel (DP/DDP)│                                                       │
GPU 0        GPU 1        GPU 2        GPU 3│  ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐       │
│  │Full  │    │Full  │    │Full  │    │Full  │       │
│  │Model │    │Model │    │Model │    │Model │       │
│  │Copy  │    │Copy  │    │Copy  │    │Copy  │       │
│  └──────┘    └──────┘    └──────┘    └──────┘       │
Batch 1     Batch 2     Batch 3     Batch 4│                                                       │
│  → All-Reduce로 gradient 동기화                       │
│  → 각 GPU에 서로 다른 데이터 배치                       │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
FSDP (Fully Sharded Data Parallel)│                                                       │
GPU 0        GPU 1        GPU 2        GPU 3│  ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐       │
│  │Shard │    │Shard │    │Shard │    │Shard │       │
│  │ 1/4  │    │ 2/4  │    │ 3/4  │    │ 4/4  │       │
│  └──────┘    └──────┘    └──────┘    └──────┘       │
│                                                       │
│  → 모델 파라미터를 GPU별로 분할(shard)│  → Forward/Backward 시 필요한 shard만 All-Gather│  → 메모리 효율 극대화 (8B+ 모델 학습 가능)└─────────────────────────────────────────────────────┘

7.2 대표적인 학습 프레임워크: Diffusers

HuggingFace의 Diffusers 라이브러리는 T2I 모델 학습의 사실상 표준이다.

# Diffusers 기반 Text-to-Image 학습 전체 파이프라인
from diffusers import AutoencoderKL, UNet2DConditionModel, DDPMScheduler
from transformers import CLIPTextModel, CLIPTokenizer
from accelerate import Accelerator
import torch

# 1. 모델 로드
vae = AutoencoderKL.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", subfolder="vae"
)
unet = UNet2DConditionModel.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet"
)
text_encoder = CLIPTextModel.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", subfolder="text_encoder"
)
tokenizer = CLIPTokenizer.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", subfolder="tokenizer"
)
noise_scheduler = DDPMScheduler.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler"
)

# 2. VAE, Text Encoder 고정
vae.requires_grad_(False)
text_encoder.requires_grad_(False)

# 3. Accelerator 설정 (분산 학습 + Mixed Precision)
accelerator = Accelerator(
    mixed_precision="fp16",          # or "bf16"
    gradient_accumulation_steps=4,
)

# 4. Optimizer
optimizer = torch.optim.AdamW(
    unet.parameters(),
    lr=1e-4,
    betas=(0.9, 0.999),
    weight_decay=1e-2,
    eps=1e-8,
)

# 5. EMA 설정
from diffusers.training_utils import EMAModel
ema_unet = EMAModel(
    unet.parameters(),
    decay=0.9999,
    use_ema_warmup=True,
)

# 6. 분산 학습 준비
unet, optimizer, dataloader = accelerator.prepare(unet, optimizer, dataloader)

# 7. 학습 루프
for epoch in range(num_epochs):
    for batch in dataloader:
        with accelerator.accumulate(unet):
            images = batch["images"]
            captions = batch["captions"]

            # Latent encoding
            with torch.no_grad():
                latents = vae.encode(images).latent_dist.sample()
                latents = latents * vae.config.scaling_factor

            # Text encoding
            with torch.no_grad():
                text_inputs = tokenizer(captions, padding="max_length",
                                       max_length=77, return_tensors="pt")
                text_embeds = text_encoder(text_inputs.input_ids)[0]

            # Noise 추가
            noise = torch.randn_like(latents)
            timesteps = torch.randint(0, 1000, (latents.shape[0],))
            noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)

            # Classifier-Free Guidance: 랜덤 caption dropout
            if torch.rand(1) < 0.1:  # 10% 확률로 unconditional
                text_embeds = torch.zeros_like(text_embeds)

            # Noise 예측
            noise_pred = unet(noisy_latents, timesteps, text_embeds).sample

            # 손실 계산
            loss = F.mse_loss(noise_pred, noise)

            # Backward
            accelerator.backward(loss)
            accelerator.clip_grad_norm_(unet.parameters(), 1.0)
            optimizer.step()
            optimizer.zero_grad()

            # EMA 업데이트
            ema_unet.step(unet.parameters())

7.3 Mixed Precision Training

Mixed Precision은 FP32와 FP16/BF16을 혼합 사용하여 메모리와 계산 효율을 높이는 기법이다.

[Mixed Precision Training]

Forward Pass:
  - 모델 가중치: FP16/BF16 (메모리 절반)
  - Activation: FP16/BF16

Loss Scaling:
  - Loss를스케일(: 2^16)로 곱하여 gradient underflow 방지
  - Backward 후 gradient를 다시 스케일 다운

Backward Pass:
  - Gradient: FP16/BF16

Optimizer Step:
  - Master Weights: FP32 (정밀도 유지!)
  - FP32 master weights 업데이트 후 FP16 사본 생성
Precision메모리연산 속도수치 안정성권장
FP324 bytes기준최고Optimizer State
FP162 bytes~2x낮음 (overflow 위험)Forward/Backward
BF162 bytes~2x높음 (넓은 범위)H100/A100에서 권장
TF324 bytes (저장)~1.5x높음A100 default
# BF16 Mixed Precision 설정 (accelerate 기반)
# accelerate config (YAML)
compute_environment: LOCAL_MACHINE
distributed_type: MULTI_GPU
mixed_precision: bf16
num_machines: 1
num_processes: 8

7.4 EMA (Exponential Moving Average)

EMA는 학습 중 모델 가중치의 이동 평균을 유지하여 추론 시 더 안정적인 결과를 얻는 기법이다. 거의 모든 T2I 모델 학습에서 사용된다.

[EMA 업데이트]

θ_ema ← λ * θ_ema + (1 - λ) * θ_model

- λ: decay rate (보통 0.9999 ~ 0.99999)
- θ_model: 현재 학습 중인 모델 가중치
- θ_ema: EMA 가중치 (추론 시 사용)
- 효과: gradient noise를 평활화하여 더 안정적인 가중치
# Diffusers의 EMA 구현
from diffusers.training_utils import EMAModel

# EMA 모델 생성
ema_model = EMAModel(
    unet.parameters(),
    decay=0.9999,              # decay rate
    use_ema_warmup=True,       # warmup 사용
    inv_gamma=1.0,             # warmup 파라미터
    power=3/4,                 # warmup 파라미터
)

# 매 학습 스텝마다 업데이트
ema_model.step(unet.parameters())

# 추론 시 EMA 가중치 적용
ema_model.copy_to(unet.parameters())

# 또는 context manager 사용
with ema_model.average_parameters():
    # 이 블록 안에서는 EMA 가중치 사용
    output = unet(noisy_latents, timesteps, text_embeds)

7.5 학습 하이퍼파라미터 가이드

하이퍼파라미터SD 1.5SDXLSD3/FluxLoRA
Learning Rate1e-41e-41e-41e-4 ~ 5e-5
Batch Size (총)204820482048+1-8
OptimizerAdamWAdamWAdamWAdamW / Prodigy
Weight Decay0.010.010.010.01
Grad Clip1.01.01.01.0
EMA Decay0.99990.99990.9999N/A
Warmup Steps10,00010,00010,0000-500
PrecisionFP32/FP16BF16BF16FP16/BF16
CFG Dropout10%10%10%10%
Resolution51210241024원본 해상도
Total Steps~500K~500K+~1M+500-15,000

8. 주요 논문 레퍼런스 정리

8.1 핵심 논문 테이블

#논문명저자연도핵심 기여링크
1Generative Adversarial NetworksGoodfellow et al.2014GAN 프레임워크 제안arXiv:1406.2661
2Neural Discrete Representation Learning (VQ-VAE)van den Oord et al.2017Vector Quantized 이산 잠재 공간arXiv:1711.00937
3A Style-Based Generator Architecture for GANs (StyleGAN)Karras et al.2019Style-based 생성기, Progressive GrowingarXiv:1812.04948
4Large Scale GAN Training (BigGAN)Brock et al.2019대규모 GAN 학습, Truncation TrickarXiv:1809.11096
5Generating Diverse High-Fidelity Images with VQ-VAE-2Razavi et al.2019계층적 VQ-VAE, 고해상도 생성arXiv:1906.00446
6Denoising Diffusion Probabilistic Models (DDPM)Ho et al.2020Diffusion 모델의 실용적 학습arXiv:2006.11239
7Learning Transferable Visual Models From Natural Language Supervision (CLIP)Radford et al.2021CLIP 대조 학습, 이미지-텍스트 정렬arXiv:2103.00020
8Zero-Shot Text-to-Image Generation (DALL-E)Ramesh et al.2021dVAE + Autoregressive Transformer T2IarXiv:2102.12092
9High-Resolution Image Synthesis with Latent Diffusion Models (LDM)Rombach et al.2022Latent Diffusion, Cross-Attention 조건화arXiv:2112.10752
10Hierarchical Text-Conditional Image Generation with CLIP Latents (DALL-E 2)Ramesh et al.2022CLIP 기반 2단계 Diffusion, Prior + DecoderarXiv:2204.06125
11Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding (Imagen)Saharia et al.2022T5-XXL 텍스트 인코더의 효과, Dynamic ThresholdingarXiv:2205.11487
12Classifier-Free Diffusion GuidanceHo & Salimans2022CFG 학습 기법, unconditional-conditional 동시 학습arXiv:2207.12598
13Scaling Autoregressive Models for Content-Rich Text-to-Image Generation (Parti)Yu et al.2022Autoregressive T2I, 20B 스케일링arXiv:2206.10789
14LoRA: Low-Rank Adaptation of Large Language ModelsHu et al.2022Low-rank fine-tuning 기법arXiv:2106.09685
15Elucidating the Design Space of Diffusion-Based Generative Models (EDM)Karras et al.2022체계적 Diffusion 설계 공간 분석, PreconditioningarXiv:2206.00364
16An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual InversionGal et al.2023새로운 토큰 임베딩 학습으로 개인화arXiv:2208.01618
17DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven GenerationRuiz et al.2023소수 이미지로 주체 개인화, Prior PreservationarXiv:2208.12242
18Adding Conditional Control to Text-to-Image Diffusion Models (ControlNet)Zhang & Agrawala2023구조적 제어(edge, depth, pose) 추가arXiv:2302.05543
19Consistency ModelsSong et al.20231-step 생성, PF-ODE 일관성 학습arXiv:2303.01469
20SDXL: Improving Latent Diffusion Models for High-Resolution Image SynthesisPodell et al.2023대형 U-Net, Dual Text Encoder, Multi-AR 학습arXiv:2307.01952
21Scalable Diffusion Models with Transformers (DiT)Peebles & Xie2023Diffusion + Transformer, adaLN-ZeroarXiv:2212.09748
22Flow Matching for Generative ModelingLipman et al.2023ODE 기반 Flow Matching 프레임워크arXiv:2210.02747
23Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified FlowLiu et al.2023Rectified Flow, Optimal TransportarXiv:2209.03003
24IP-Adapter: Text Compatible Image Prompt Adapter for Text-to-Image Diffusion ModelsYe et al.2023이미지 프롬프트 어댑터, Decoupled Cross-AttnarXiv:2308.06721
25Scaling Autoregressive Multi-Modal Models: Pretraining and Instruction Tuning (CM3Leon)Yu et al.2023효율적 자기회귀 T2I, Retrieval AugmentedarXiv:2309.02591
26PixArt-alpha: Fast Training of Diffusion Transformer for Photorealistic Text-to-Image SynthesisChen et al.2023저비용 DiT 학습, 학습 분해 전략arXiv:2310.00426
27Improving Image Generation with Better Captions (DALL-E 3)Betker et al.2023Synthetic 캡션으로 극적 품질 향상cdn.openai.com/papers/dall-e-3.pdf
28PixArt-Sigma: Weak-to-Strong Training of Diffusion Transformer for 4K Text-to-Image GenerationChen et al.2024Weak-to-Strong 학습, KV Compression, 4KarXiv:2403.04692
29Scaling Rectified Flow Transformers for High-Resolution Image Synthesis (SD3)Esser et al.2024MM-DiT, Rectified Flow 대규모 적용, Logit-NormalarXiv:2403.03206
30Playground v2.5: Three Insights towards Enhancing Aesthetic Quality in Text-to-Image GenerationLi et al.2024EDM Noise Schedule, Multi-AR, Human PreferencearXiv:2402.17245

8.2 추가 참고 논문

논문명연도핵심
LAION-5B: An Open Large-Scale Dataset for Training Next Generation Image-Text Models202258.5억 오픈 이미지-텍스트 데이터셋
Improved Denoising Diffusion Probabilistic Models2021Cosine schedule, learned variance
Denoising Diffusion Implicit Models (DDIM)2021Deterministic sampling, 속도 향상
Progressive Distillation for Fast Sampling of Diffusion Models2022단계적 증류로 추론 가속
InstaFlow: One Step is Enough for High-Quality Diffusion-Based Text-to-Image Generation2024Rectified Flow 1-step 생성
Latent Consistency Models2024LCM, SDXL 기반 few-step 생성
SDXL-Turbo: Adversarial Diffusion Distillation20241-4 step SDXL 생성
Stable Cascade2024Wuerstchen 기반 3단계 계층적 생성

9. 결론 및 전망

Text-to-Image 모델 학습 방법론은 GAN의 adversarial training에서 출발하여, Diffusion의 iterative denoising을 거쳐, 현재 Flow Matching + DiT라는 새로운 패러다임으로 수렴하고 있다.

핵심 트렌드 요약

[T2I 학습 방법론 발전 방향]

효율성:  Full Training ──→ LoRA/Adapter ──→ Prompt Tuning
         (수개월, $1M+)     (수분, <$1)      (수초)

아키텍처: U-Net ────────→ DiT ─────────→ MM-DiT + Flow Matching
          (SD 1.x-SDXL)    (DiT, PixArt)   (SD3, Flux)

생성 속도: 50-1000 steps ──→ 20-50 steps ──→ 1-4 steps
           (DDPM)            (DDIM, DPM++)   (LCM, LADD, CM)

데이터 품질: 웹 크롤링 ──→ 필터링 ──→ Synthetic Caption
            (LAION raw)    (aesthetic)  (DALL-E 3 방식)

텍스트 이해: CLIP only ──→ CLIP + T5 ──→ 3Encoder
             (SD 1.x)     (Imagen)      (SD3, Flux)

향후 전망

  1. 학습 효율성 극대화: PixArt-alpha가 보여준 것처럼, 학습 비용을 1/10 이하로 줄이면서 품질을 유지하는 방향이 지속될 것이다.

  2. 데이터 중심 접근법(Data-Centric AI): DALL-E 3가 입증한 것처럼, 아키텍처보다 데이터 품질과 캡셔닝이 더 중요해지고 있다.

  3. Few-Step / One-Step 생성: Consistency Models, LCM, LADD 등의 증류 기법이 발전하여 실시간 생성이 표준이 될 것이다.

  4. Unified Multi-Modal Generation: 텍스트-이미지뿐 아니라 비디오, 3D, 오디오를 통합하는 모델로 확장되고 있다.

  5. 개인화(Personalization) 고도화: LoRA, DreamBooth, IP-Adapter를 넘어 더 적은 데이터로, 더 정확한 주체 재현이 가능해질 것이다.

T2I 모델의 학습 방법론은 단순히 "더 큰 모델을 더 많은 데이터로 학습"하는 것을 넘어, 어떤 데이터를, 어떤 스케줄로, 어떤 conditioning과 함께 학습하느냐가 핵심이 되는 시대로 접어들었다. 이 글에서 다룬 방법론들을 기반으로 자신만의 T2I 모델을 학습하거나, 기존 모델을 효과적으로 커스터마이징하는 데 활용할 수 있기를 바란다.


참고 자료