확산 모델과 정규화 흐름, 생성 모델 선택의 기준

Diffusion Models와 Flow-Based Models, Normalizing Flows의 학습 방식·우도·샘플링 특성을 비교하고 생성 모델 선택 기준을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

생성 경로가 달라지면 운영의 우선순위도 달라진다

생성 모델은 데이터 분포를 학습한 뒤 새로운 샘플을 만드는 모델군이다. 이미지, 오디오, 시뮬레이션처럼 생성 결과의 품질이 중요한 작업에서 널리 쓰이지만, 모델마다 분포를 표현하고 샘플을 얻는 방식은 다르다.

Diffusion Models, Flow-Based Models, Normalizing Flows(NF)는 모두 생성 모델에 속한다. 다만 확산 모델은 잡음을 더했다가 제거하는 과정에 기반하고, 흐름 계열은 가역 변환으로 단순 분포와 데이터 분포를 연결한다. 이 차이는 우도 계산, 추론 속도, 안정성 관리 방식까지 이어진다.

잡음을 거꾸로 풀어내는 Diffusion Models

Diffusion Models는 전방 과정에서 데이터에 점진적으로 잡음을 섞고, 역과정에서 그 잡음을 제거하도록 학습하는 확률적 생성 모델이다. 생성은 이 denoising 역과정을 따라 수행된다.

학습에서는 노이즈 예측(ε-parameterization)이나 데이터 예측(x0/v-parameterization) 회귀를 사용하며, 변분하한(ELBO)을 근사해 최적화한다. 다단계 역확산은 수십~수천 스텝을 거칠 수 있어 학습 안정성은 높은 편이지만, 샘플 생성 지연은 운영상 제약이 된다.

역확산은 마르코프 체인 형태로 다룰 수 있고, DDPM/DDIM/Probability Flow ODE처럼 확률 또는 ODE 기반의 경로도 사용한다. Classifier Guidance와 Classifier-free Guidance는 조건부 생성을 강화하는 수단이다. 텍스트, 스케치, 마스크 같은 입력을 연결하기 쉬운 점도 확산 모델의 특징이며, 컨트롤넷 등 관련 생태계도 성숙해 있다.

가역 변환으로 밀도를 계산하는 Flow 계열

Flow-Based Models는 표준 가우시안 같은 단순 분포와 데이터 분포 사이를 가역 변환으로 연결한다. 핵심은 이 변환을 통해 정확한 로그우도를 계산할 수 있다는 점이다.

Normalizing Flows는 이 계열의 대표적인 구현군이다. RealNVP, Glow, Masked Autoregressive Flow처럼 유한한 가역 변환을 연결하고, 체인룰과 변수변환 공식을 사용해 log p(x)를 정확하게 구한다. 연속시간으로 확장한 형태는 CNF(Continuous Normalizing Flows)로 분류되며 Neural ODE를 포함한다.

NF/Flow는 최대우도(MLE)로 학습하기 때문에 밀도추정과 이상탐지에 유리하다. 반면 결합층이나 스플라인 같은 가역 구조를 설계해야 하고, 야코비안의 구조와 수치 안정성을 함께 관리해야 한다. CNF에서는 ODE 적분 안정성도 별도 과제다.

우도, 샘플링, 운영 제약을 함께 본다

Diffusion은 변분 근사와 노이즈 예측 손실 최소화를 사용하며 정확 우도를 제공하지 않는다. 대신 샘플 품질이 우수하다. NF/Flow는 정확 로그우도를 제공하지만, 훈련 시 야코비안 로그결정자 계산 비용을 감당해야 한다.

샘플링 방식도 대조적이다. Diffusion은 역확산 과정을 반복하는 반면, NF는 z~N(0,I)를 뽑은 뒤 역함수를 한 번 통과시켜 x를 생성한다. CNF만은 ODE 적분이 필요하다. 따라서 NF는 추론에서 단일 패스로 빠르게 동작할 수 있지만, Diffusion은 대규모 학습 비용과 메모리·분산 학습 인프라를 고려해야 한다.

최근에는 DPM-Solver++, Consistency, Flow-Matching 같은 고속 샘플러로 Diffusion의 스텝을 줄이는 접근이 사용된다. NF는 배치와 메모리 최적화가 중요하고, CNF는 적분 Tolerance 튜닝이 필요하다.

관점 Diffusion Models Flow-Based/NF 선택 시 고려점
성능(샘플 품질) 최고 수준(FID/IS 우수) 중상(아키텍처 의존) Diffusion 우세, NF도 도메인별 경쟁력
확장성 대규모·고해상도 검증됨 메모리/야코비안 제약 NF는 커스텀 설계 필요
일관성(로그우도) 근사(ELBO) 정확(MLE) 이상탐지·밀도추정은 NF 강점
안정성 학습 안정, 샘플링 수치 튜닝 필요 구조 설계·CNF 적분 안정성 이슈 스케줄/허용오차 튜닝 중요
운영 편의 생태계/툴 풍부, 샘플 느림 추론 빠름, 훈련 설계 난이도 제품화 대상에 따라 선택

Flow Matching, Rectified Flow 등 최신 모델 동향도 존재한다. 세부 성능은 최신 정보 확인이 필요하다.

학습과 생성 흐름

Flow_NF아니오입력: 데이터 xz=fθ(x)log p(x)=log p(z)+log|detJ|MLE 최적화CNF 사용 여부ODE 적분 tol/step 튜닝샘플: x=fθ^{-1}(z)Diffusion과다/불안정입력: 데이터 x0전방과정 q(x_t|x_{t-1})로잡음 추가모델 εθ(x_t,t|c) 학습 (MSE)샘플링 스텝 T 설정스케줄·클리핑·고속샘플러 조정출력: 샘플 x

생성 품질과 우도가 필요한 지점

고해상도 이미지 생성과 편집에서는 Diffusion이 인페인팅, 업스케일링, 조건부 텍스트-이미지 작업에 쓰인다. 프로덕션에서는 Safety/NSFW 필터와 가이드 스케일을 관리해야 한다. 실시간 스타일 변환이나 고속 샘플링이 필요한 환경은 NF를 검토할 수 있다.

밀도추정, 이상탐지, 불량 검출에서는 NF의 정확 로그우도가 임계값 설정에 도움이 된다. 다만 OOD에서 우도 역전 문제가 생길 수 있으므로 에너지, 마하라노비스 같은 보조 스코어를 결합하는 방식을 권장한다.

과학 시뮬레이션과 역문제에서는 Diffusion/Flow Matching에 스코어 정합이나 PDE 조건 같은 물리 제약을 포함할 수 있다. 이는 불확실성 정량화에도 유리하다. 오디오와 스피치 합성에서는 Diffusion이 Grad-TTS, WaveGrad 같은 고품질 TTS에 쓰이며, 실시간 처리에는 고속 샘플러와 지연 완화가 필요하다. NF는 Flow-based Vocoder로 저지연 스트리밍을 운영할 수 있다.

운영 단계에서는 데이터 품질 필터링, 정규화, 조건 라벨 정합부터 점검한다. 학습 단계에서는 스케줄과 아키텍처를 스윕하고 DDP, 체크포인트, EMA를 관리한다. 서빙에서는 Diffusion의 스텝-품질-지연 곡선과 NF의 배치·메모리 사용량을 각각 최적화해야 한다. 품질(FID/CLIPScore), 안정성(NaN/발산), 지연·비용 SLO와 함께 라이선스, 콘텐츠 안전, 데이터 출처도 관리 대상이다.

Diffusion 기반에서는 동일 데이터셋 기준 연구 보고치로 FID 1040% 개선 사례가 다수 있으며, 환경 의존성이 있다. NF 추론은 단일 패스에서 수 ms수십 ms가 걸릴 수 있고, 이는 배치와 해상도에 따라 달라진다. Diffusion은 1050 스텝으로 최적화할 때 50300ms@256²(A100 기준, 상이 가능) 범위를 보인다. 스텝 축소, 혼합정밀, EMA를 적용하면 훈련·서빙 비용을 20~40% 절감할 수 있다.

조건부 생성, 가이드, 컨트롤넷은 품질과 제어성을 높인다. NF의 해석 가능한 우도와 Diffusion의 학습 안정성은 신뢰성 측면에서 서로 다른 장점이 된다. ONNX/TensorRT/FP16·INT8 최적화 여지도 있다.

PyTorch≥2.1에서 보는 학습 코드

Diffusion의 노이즈 예측 학습 스텝은 DDPM 스타일로 작성할 수 있다.

# pip install torch torchvision
import torch, torch.nn as nn

class TinyUNet(nn.Module):
    def __init__(self, d=64):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(4, d, 3, 1, 1), nn.SiLU(),
            nn.Conv2d(d, d, 3, 1, 1), nn.SiLU(),
            nn.Conv2d(d, 3, 3, 1, 1),
        )
    def forward(self, x, t_embed):
        # x: Bx3xHxW, t_embed: Bx1xHxW (sin/cos 임베딩 가정)
        return self.net(torch.cat([x, t_embed], 1))

def train_step(model, x0, betas, optimizer):
    B = x0.size(0)
    t = torch.randint(0, len(betas), (B,), device=x0.device)
    alpha = torch.cumprod(1 - betas, dim=0)[t].view(B,1,1,1)
    eps = torch.randn_like(x0)
    xt = torch.sqrt(alpha) * x0 + torch.sqrt(1 - alpha) * eps
    t_embed = torch.sin(t.float().view(B,1,1,1) / 1000)  # 단순 임베딩
    pred = model(xt, t_embed.expand_as(xt[:, :1]))
    loss = torch.mean((pred - eps) ** 2)
    optimizer.zero_grad(); loss.backward(); optimizer.step()
    return loss.item()

Normalizing Flow는 RealNVP 스타일의 결합층으로 구성할 수 있다.

import torch, torch.nn as nn

class Coupling(nn.Module):
    def __init__(self, d):
        super().__init__()
        self.s = nn.Sequential(nn.Linear(d//2, 128), nn.ReLU(), nn.Linear(128, d//2))
        self.t = nn.Sequential(nn.Linear(d//2, 128), nn.ReLU(), nn.Linear(128, d//2))
    def forward(self, x, reverse=False):
        x1, x2 = x.chunk(2, dim=1)
        s, t = self.s(x1), self.t(x1)
        if not reverse:
            y2 = (x2 * torch.exp(s)) + t
            logdet = s.sum(dim=1)
            return torch.cat([x1, y2], 1), logdet
        else:
            y2 = (x2 - t) * torch.exp(-s)
            logdet = (-s).sum(dim=1)
            return torch.cat([x1, y2], 1), logdet

class RealNVP(nn.Module):
    def __init__(self, d, K=4):
        super().__init__()
        self.layers = nn.ModuleList([Coupling(d) for _ in range(K)])
    def f(self, x):
        logdet = 0
        for c in self.layers: x, ld = c(x); logdet += ld
        return x, logdet
    def finv(self, z):
        logdet = 0
        for c in reversed(self.layers): z, ld = c(z, reverse=True); logdet += ld
        return z, logdet

def nll_step(model, x):
    z, logdet = model.f(x)
    log_pz = (-0.5*(z**2 + torch.log(torch.tensor(2*3.141592))).sum(dim=1))
    nll = -(log_pz + logdet).mean()
    return nll

데이터 전처리(정규화/크롭)와 EMA, gradient clipping 같은 안정화 기법을 권장한다. Diffusion 샘플링에서는 DPM-Solver++/DDIM/CFGD 스케줄을 조정해야 하며, NF에서는 초기화·스케일 바인딩·스플라인 변환 선택이 수렴에 영향을 준다.

요구사항에 맞춰 모델을 고르는 기준

생성·편집 품질을 우선한다면 Diffusion이 적합하다. 학습 안정성이 높고 고속 샘플러로 샘플링 지연을 완화할 수 있다.

정확한 우도, 이상탐지, 저지연 스트리밍이 핵심이라면 NF/Flow가 더 잘 맞는다. 이 경우 가역 구조 설계와 수치 안정성 관리는 피할 수 없는 비용이다. 품질과 속도, 제어성과 우도를 함께 요구하는 환경에서는 Flow Matching, Consistency, 2-Stage 같은 하이브리드 구성을 고려할 수 있다.

생성 모델확산 모델정규화 흐름밀도추정머신러닝