흐름 매칭과 정류 흐름(Flow Matching & Rectified Flows)

확산 모델(diffusion model)은 잡음(noise)에서 데이터(data)까지 굽은 경로(curved path)를 따라가기 때문에 표본 생성(sampling)에 20~50 단계(step)가 필요합니다. 흐름 매칭(Flow Matching; Lipman et al., 2023)과 정류 흐름(Rectified Flow; Liu et al., 2022)은 곧은 경로(straight path)를 학습합니다. 더 곧은 경로는 더 적은 단계와 더 빠른 추론(inference)을 뜻합니다. Stable Diffusion 3, Flux.1, AudioCraft 2는 모두 2024년에 흐름 매칭으로 전환했습니다.

유형: Build 언어: Python 선수 지식: Phase 8 · 06 (확산 모델 — DDPM 직접 구현), Phase 1 · 미적분(Calculus) 예상 시간: 약 45분

문제

DDPM의 역방향 과정(reverse process)은 N(0, I)에서 데이터 분포(data distribution)로 되돌아가는 1000 단계 확률적 행보(stochastic walk)입니다. DDIM은 이를 20~50 단계의 결정론적(deterministic) 과정으로 줄였습니다. 우리는 단계 수를 더 줄이고 싶고, 이상적으로는 1 단계로 끝내고자 합니다. 장벽은 역방향 과정을 푸는 상미분방정식(ODE)이 경직(stiff)되어 있고 경로가 굽어 있다는 점입니다.

만약 잡음에서 데이터까지의 경로가 *직선(straight line)*이 되도록 모델을 학습할 수 있다면, t=1에서 t=0까지 가는 오일러 단계(Euler step) 한 번이면 충분할 것입니다. 흐름 매칭은 이를 직접 구성합니다. x_1 ∼ N(0, I)에서 x_0 ∼ data까지 직선 보간(straight-line interpolation)을 정의하고, 신경망 벡터장(vector field) v_θ(x, t)가 그 시간 도함수(time derivative)를 맞추도록 학습한 뒤, 추론 시에는 이를 적분(integrate)합니다.

정류 흐름(Liu 2022)은 한 걸음 더 나아갑니다. 재흐름(reflow) 절차로 경로를 반복적으로 곧게 펴서, 점점 더 선형에 가까운 ODE를 만들어 냅니다. 두 번의 재흐름 반복(reflow iteration)을 거치고 나면 2 단계 표본기(sampler)가 50 단계 DDPM 품질에 맞먹게 됩니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.DDPM의 역방향 과정은 DDIM을 사용해도 20-50 단계가 필요합니다. 학습된 ODE 궤적의 어떤 근본적 성질이 단계 수를 더 줄이기 어렵게 만드나요?

2.조건부 흐름 매칭 손실(conditional flow matching loss)의 학습 목표(target)는 무엇인가요?

0/2 답변 완료

개념

flow matching: train on a straight line DDPM: curved path x_0 (data) x_T ~ N(0, I) 1000-step SDE DDIM collapses to ~50 steps flow matching: straight line x_0 x_1 ~ N(0, I) x_t = t · x_1 + (1-t) · x_0 2-8 Euler steps at inference loss = || v_θ(x_t, t) - (x_1 - x_0) ||² simulation-free training; target is a constant vector along the straight line rectified flow: iteratively straighten 1. train v_1 with random (x_0, x_1) pairs 2. sample paired (x_0, x_1) by integrating v_1 -> pairs are ODE-matched 3. retrain v_2 on those pairs -> genuinely straighter flow 2 reflow iterations enable 1-step inference (SDXL-Turbo, SD3-Turbo, Flux-schnell)

직선 흐름(Straight-line flow)

다음과 같이 정의합니다.

x_t = t · x_1 + (1 - t) · x_0,   t ∈ [0, 1]

여기서 x_0 ~ data, x_1 ~ N(0, I)입니다. 이 직선 위에서 시간 도함수는 상수입니다.

dx_t / dt = x_1 - x_0

신경망 벡터장 v_θ(x_t, t)를 정의하고 이 도함수를 맞추도록 학습합니다.

L = E_{x_0, x_1, t} || v_θ(x_t, t) - (x_1 - x_0) ||²

이것이 바로 조건부 흐름 매칭 손실(conditional flow matching loss)입니다(Lipman 2023). 학습은 시뮬레이션 없이(simulation-free) 진행됩니다. ODE를 풀어 펼칠(unroll) 필요 없이 (x_0, x_1, t)를 표집해 회귀(regress)할 뿐입니다.

표본 생성(Sampling)

추론 단계에서는 학습된 벡터장을 시간의 반대 방향으로 적분합니다.

x_{t-Δt} = x_t - Δt · v_θ(x_t, t)

x_1 ~ N(0, I)에서 시작해 t=0까지 오일러 단계를 내려갑니다.

정류 흐름(Rectified flow; Liu 2022)

직선 흐름을 학습해도 학습된 경로가 실제로 완전히 직선이 되지는 않습니다. 여러 x_0가 같은 x_1로 사상(mapping)될 수 있어 경로가 굽어지기 때문입니다. 정류 흐름의 재흐름 단계는 다음과 같습니다.

  1. 무작위로 짝지은(random pairing) 표본으로 흐름 모델 v_1을 학습합니다.
  2. x_1에서 v_1을 적분해 도착한 x_0를 짝으로 묶어 N개의 쌍 (x_1, x_0)를 만듭니다.
  3. 이렇게 ODE로 짝지은(ODE-matched) 예제로 v_2를 학습합니다. 쌍이 맞춰졌으므로 그 사이의 직선 보간자(interpolant)는 더 평평해집니다.
  4. 필요하면 반복합니다.

실제로 두 번의 재흐름 반복만으로도 거의 선형에 가까운 흐름이 되어, 2~4 단계 추론이 가능해집니다. SDXL-Turbo, SD3-Turbo, LCM은 모두 흐름 매칭 모델에서 증류(distill)된 계열입니다.

왜 2024년에 이미지 영역에서 승리했는가

세 가지 이유가 있습니다.

  1. 시뮬레이션 없는 학습(Simulation-free training) — 학습 중 ODE를 풀어 펼칠 필요가 없어 구현이 단순합니다.
  2. 더 나은 손실 기하(loss geometry) — 직선 경로는 신호 대 잡음비(signal-to-noise ratio; SNR)가 일정한 반면, DDPM의 ε-손실은 스케줄(schedule) 양 끝에서 SNR이 나쁩니다.
  3. 빠른 추론 — SDXL-Turbo 품질이면 4~8 단계로 충분하며, 일관성 증류(consistency distillation)를 더하면 1 단계까지 줄일 수 있습니다.

흐름 매칭과 DDPM의 정확한 연결 관계

가우시안 조건부 경로(Gaussian-conditional path)를 사용하는 흐름 매칭은 특정한 잡음 스케줄을 가진 확산과 같습니다. x_t = α(t) x_0 + σ(t) x_1 스케줄을 고르면 흐름 매칭은 스트라토노비치(Stratonovich) 형태로 다시 표현된 확산을 복원하며, 이때 v = α'·x_0 - σ'·x_1이 됩니다. 가우시안 경로에 한해 두 방식은 대수적으로 동치(algebraically equivalent)입니다.

흐름 매칭이 새로 더한 것은 목표값(target)의 명료성(단순한 속도 벡터), 더 깨끗한 손실, 그리고 비가우시안 보간자(non-Gaussian interpolant)를 실험할 수 있는 자유입니다.

직접 만들기

code/main.py는 두 봉우리 가우시안 혼합(two-mode Gaussian mixture)에서 1차원 흐름 매칭을 구현합니다. 벡터장 v_θ(x, t)는 직선 목표값으로 학습한 아주 작은 다층 퍼셉트론(MLP)입니다. 추론 시 1, 2, 4, 20 단계의 오일러 적분을 수행해 표본 품질을 비교합니다.

1단계: 학습 손실

def train_step(x0, net, rng, lr):
    x1 = rng.gauss(0, 1)
    t = rng.random()
    x_t = t * x1 + (1 - t) * x0
    target = x1 - x0
    pred = net_forward(x_t, t)
    loss = (pred - target) ** 2
    # 역전파 + 가중치 갱신

2단계: 다단계 추론

def sample(net, num_steps):
    x = rng.gauss(0, 1)
    for i in range(num_steps):
        t = 1.0 - i / num_steps
        dt = 1.0 / num_steps
        x -= dt * net_forward(x, t)
    return x

3단계: 단계 수 비교

4 단계 표본기가 이미 20 단계 품질에 맞먹는 결과를 보게 됩니다. 지연 시간(latency) 관점에서는 큰 차이입니다.

흔한 함정(Pitfalls)

  • 시간 매개변수화(time parameterization). 흐름 매칭은 t ∈ [0, 1]을 사용하며 t=0이 데이터, t=1이 잡음입니다. DDPM은 t ∈ [0, T]를 사용하며 t=0이 데이터, t=T가 잡음입니다. 방향은 같지만 스케일이 다릅니다. 논문에서도 이 부분을 자주 혼동합니다.
  • 스케줄 선택(schedule choice). 정류 흐름의 직선이 "유일한" 흐름 매칭 스케줄은 아닙니다. 코사인(cosine)이나 로짓-정규(logit-normal) t 표집을 사용해(SD3가 채택한 방식) 스케일 범위를 넓힐 수 있습니다.
  • 재흐름 비용(reflow cost). 재흐름용 짝 데이터셋을 만들려면 표본 하나마다 전체 추론 한 번이 필요합니다. 정말로 1~2 단계 추론이 필요할 때만 재흐름을 수행합니다.
  • 분류기 없는 안내(classifier-free guidance)는 여전히 적용됨. 선형 결합에서 ε 대신 v를 넣으면 됩니다. v_cfg = (1+w) v_cond - w v_uncond.

사용해보기

사용 사례2026년 추천 스택
최고 품질 텍스트-이미지(text-to-image)흐름 매칭 기반 SD3, Flux.1-dev
1~4 단계 텍스트-이미지증류된 흐름 매칭: Flux.1-schnell, SD3-Turbo, SDXL-Turbo
실시간 추론흐름 매칭 기반에서 일관성 증류한 LCM, PCM
오디오 생성흐름 매칭 기반 Stable Audio 2.5, AudioCraft 2
비디오 생성흐름 매칭과 확산이 혼합된 Sora, Veo, Stable Video
과학/물리(입자 궤적, 분자)등변(equivariant) 벡터장과 결합한 흐름 매칭

2025~2026년에 "확산보다 빠르다"는 표현이 나오는 논문은 거의 대부분 흐름 매칭과 증류의 조합입니다.

산출물 만들기

outputs/skill-fm-tuner.md로 저장합니다. 이 스킬은 확산 형식의 모델 명세(diffusion-style model spec)를 받아 흐름 매칭 학습 설정(training config)으로 변환합니다. 스케줄 선택, 시간 표집 분포(uniform / logit-normal), 옵티마이저(optimizer), 재흐름 계획(reflow plan), 목표 단계 수(target step count), 평가 프로토콜(eval protocol)을 결정합니다.

연습문제

  1. 쉬움. code/main.py를 실행하고 실제 데이터 분포 대비 1 단계와 20 단계의 평균제곱오차(MSE)를 비교합니다.
  2. 중간. 균일(uniform) t 표집을 로짓-정규(logit-normal) 표집으로 바꿉니다. 중간 t에 표집을 집중했을 때 모델 품질이 개선되는지 확인합니다.
  3. 어려움. 재흐름 반복을 한 번 구현합니다. 첫 번째 모델을 적분해 짝지어진 (x_0, x_1)을 생성하고, 두 번째 모델을 그 쌍 위에서 학습한 뒤 1 단계 표본 품질을 비교합니다.

핵심 용어

용어흔한 설명실제 의미
흐름 매칭(Flow matching)"직선 형태의 확산"보간자 위에서 v_θ(x, t)x_1 - x_0를 맞추도록 학습합니다.
정류 흐름(Rectified flow)"재흐름(reflow)"학습된 흐름을 반복적으로 곧게 펴는 절차입니다.
속도장(Velocity field)"v_θ"x_t를 움직일 방향을 출력하는 모델입니다.
직선 보간자(Straight-line interpolant)"경로(the path)"x_t = (1-t)·x_0 + t·x_1로, 목표 도함수가 단순합니다.
오일러 표본기(Euler sampler)"1차 ODE 풀이기"경로가 직선일수록 잘 동작하는 가장 단순한 적분기입니다.
로짓-정규 t(Logit-normal t)"SD3 표집"경사(gradient)가 가장 강한 중간 값 근처로 t 표집을 집중합니다.
일관성 증류(Consistency distillation)"1 단계 표본기"어떤 x_t에서도 곧바로 x_0로 가도록 학생(student) 모델을 학습합니다.
속도 CFG(CFG with velocity)"v-CFG"v_cfg = (1+w) v_cond - w v_uncond로, 같은 기법을 새 변수에 적용한 것입니다.

운영 노트: Flux.1-schnell은 가장 빠른 형태의 흐름 매칭이다

흐름 매칭의 운영 환경 성공 사례는 Flux.1-schnell입니다. Flux-dev급 품질을 유지하면서 1~4 단계 추론으로 증류된 흐름 매칭 기반 DiT입니다. Niels의 "Run Flux on an 8GB machine" 노트북은 표준적인 배포 레시피로, T5와 CLIP으로 텍스트를 인코딩하고, 양자화(quantized)된 MMDiT로 잡음 제거(denoise)를 수행하며(schnell은 4 단계, dev는 50 단계), 마지막으로 VAE 디코더로 이미지를 복원합니다. 비용은 다음과 같습니다.

변형(Variant)단계(Steps)L4에서 1024² 지연 시간상대 FLOPs
Flux.1-dev (원본)50약 15 s1.0×
Flux.1-schnell4약 1.2 s0.08× (12배 빠름)
SDXL-base30약 4 s0.25×
SDXL-Lightning 2-step2약 0.3 s0.03×

운영의 법칙은 단순합니다. 흐름 매칭 기반 + 증류(distillation) 조합이 2026년 빠른 텍스트-이미지의 기본값입니다. 주요 업체들은 모두 이 조합을 출시하고 있습니다. SD3-Turbo(SD3 + 흐름 + 증류), Flux-schnell(Flux-dev + 정류 흐름 직선화), CogView-4-Flash가 그 예이며, 순수 확산 기반 모델은 레거시 체크포인트로만 남아 있습니다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

fm-tuner

Convert a diffusion training plan into a flow-matching / rectified-flow config.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.흐름 매칭 모델을 학습한 후에도, 여러 데이터 점이 같은 노이즈 점으로 매핑될 수 있어 학습된 경로가 완전히 직선이 되지 않습니다. 정류 흐름(rectified flow)의 '재흐름(reflow)' 절차는 이를 어떻게 해결하나요?

2.SD3는 학습 시 균일(uniform) t 표집 대신 로짓-정규(logit-normal) t 표집을 사용합니다. 이것이 제공하는 이점은 무엇인가요?

3.Flux.1-schnell은 L4 GPU에서 4단계만으로 Flux-dev 품질을 달성합니다(1.2초 대 15초). 이를 가능하게 하는 기법 조합은 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다