스코어 기반 생성 모델과 에너지 기반 모델의 확률 밀도 학습

Score-Based Generative Models와 Energy-Based Models의 학습 방식, 샘플링 전략, 운영 트레이드오프와 적용 기준을 정리한다.

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

확률장을 복원하는 방법과 에너지 지형을 만드는 방법

Score-Based Generative Models(SBGM)는 데이터 로그 밀도의 기울기, 즉 스코어 함수 ∇x log p(x)를 직접 추정한다. 노이즈가 더해진 데이터 분포의 스코어를 Denoising Score Matching(DSM)으로 회귀하거나 확률 미분방정식(SDE)을 기반으로 훈련한다. 생성 시에는 역확산 SDE 또는 확률흐름 ODE를 수치 적분한다. 확률흐름 ODE는 연속적인 확률 질량 이동을 모델링하므로 likelihood 추정에도 사용할 수 있다.

Energy-Based Models(EBM)는 에너지 함수 Eθ(x)를 통해 비정규화 분포 pθ(x) ∝ exp(−Eθ(x))를 표현한다. 정규화 상수를 직접 계산하는 대신 Langevin dynamics 같은 MCMC로 음성 샘플을 만들고 Contrastive Divergence(CD)로 학습한다. 에너지 경사 하강과 가우시안 잡음을 결합해 샘플을 얻으며, 조건부 생성과 제약 최적화에 유연하게 연결할 수 있다.

학습과 샘플링에서 달라지는 운영 지점

SBGM은 노이즈가 증가하는 전방 SDE와 노이즈를 줄이는 역 SDE 또는 ODE를 함께 정의한다. 해석적 역함수 대신 수치 적분으로 샘플을 얻기 때문에 시간 스텝과 DDIM, Heun, DPMSolver 같은 적분자 선택이 품질과 속도를 좌우한다. DSM의 가우시안 노이즈나 VE, VP, EDM 스케줄을 사용한 가중 MSE로 스코어를 회귀하며, 데이터와 시간에 대한 loss weighting으로 고주파·저주파의 균형을 조정한다.

EBM에서는 큰 Langevin 스텝이 모드 점프를 촉진할 수 있지만 지나치면 발산한다. 사전분포인 ℓ2와 스텝 크기, 반복 횟수를 함께 조율해야 한다. 학습에는 짧은 MCMC를 쓰는 CD-k, 영속 체인을 이용하는 PCD, NCE 또는 score matching 변형을 쓸 수 있다. 스펙트럴 정규화와 weight decay는 에너지 스케일을 안정화하는 데 사용된다.

모델 구조도 다르다. SBGM에는 시간 임베딩(sinusoidal)과 클래스 또는 텍스트 조건을 결합한 U-Net·ViT 기반 시공간 조건화 네트워크를 쓴다. EBM은 ResNet이나 ConvNet으로 에너지를 계산하고, 조건부 에너지 Eθ(x|y)로 확장할 수 있다. EBM은 암묵적 분포이므로 출력층 활성에 대한 제약이 필요하지 않다.

SBGM은 수백수천 스텝의 SDE 또는 ODE 적분이 필요하다. 적은 스텝의 고차 적분자, distillation(샘플러 지식증류), classifier-free guidance가 가속 경로가 된다. EBM은 수십수백 Langevin 스텝을 사용하며 초기화 품질이 중요하다. 메모리 체인을 재사용할 수 있고, 샘플링 비용은 조건 길이에 선형적이다.

충분한 데이터, 적절한 노이즈 스케줄, 정확한 적분이 갖춰지면 SBGM은 일관적인 근사가 가능하며 대규모 분산 학습과도 잘 맞는다. EBM은 정규화 상수 추정 없이 분포를 다룰 수 있는 대신 MCMC 믹싱 한계가 성능 병목이 된다. 고차원 환경에서는 체인의 혼합 상태를 지속적으로 관리해야 한다.

EBM 파이프라인SBGM 파이프라인입력 데이터학습 완료과대 스텝학습 완료발산실제 데이터 x노이즈 주입 x_t ~ q(x_t|x)스코어 네트워크 s_theta(x_t,t)DSM/EDM 손실 계산역전파/가중치 업데이트샘플러: SDE/ODE 적분체크: 스텝 폭, NaN스텝 감소/그라디언트 클리핑샘플 x_hatE_theta(x) 전방에너지CD/PCD 손실:E(x_pos)-E(x_neg)역전파/가중치 업데이트랜주뱅 MCMC: x_{k+1}=x_k -η∇E + √(2η)ζ체크: 발산/모드 정체η 감소, 노이즈 증가샘플 x_tilde생성 결과

선택 기준을 드러내는 비교

구분 성능(샘플 품질) 확장성(분산/데이터) 일관성(통계/우도) 안정성(훈련/샘플링) 운영 편의
SBGM 매우 우수(FID/SWD 선도) 우수(대규모 학습 검증) ODE로 우도 근사 가능 수치 적분 안정성 관리 필요 프레임워크/도구 다양
EBM 데이터·과업 의존 MCMC 병목으로 보통 정규화 불요, 우도 직접 어려움 MCMC 발산/정체 리스크 단순 구조, 체인 관리 부담

생성, 탐지, 제약을 다루는 적용 맥락

이미지와 오디오 생성에서는 SBGM이 고해상도 이미지 합성, 오디오 파형 및 스펙트로그램 생성에 쓰인다. 조건부 프롬프트를 통해 제어력을 높일 수 있다. EBM은 비교적 간결한 에너지 표현으로 스타일과 콘텐츠의 균형을 조정하고, 프라이어와 결합하기 쉽다.

이상치 탐지와 품질 평가에서는 EBM의 에너지를 판단 기준으로 사용할 수 있다. 낮은 에너지는 정상, 높은 에너지는 이상과 연결되며, 운영 중 온라인 재학습과 온도 조절로 감도를 보정한다. SBGM은 스코어 노름으로 데이터 농도를 추정하고, 확률흐름 ODE로 로그우도를 근사한다.

역문제에서는 SBGM을 데이터 프라이어로 사용해 노이즈 제거와 초해상도 같은 복원 문제를 정규화할 수 있다. 측정 연산자와 결합한 반복 복원도 가능하다. EBM은 에너지 항에 물리 제약과 규칙을 더해 목적함수를 최소화하고, 라그랑주 승수식과 결합할 수 있다.

보상 설계와 합성정책에서는 EBM의 보상형 에너지로 정책 샘플링을 안정화하고 모듈식 보상을 합성할 수 있다. SBGM은 스코어 기반 탐색을 가속하고 확률흐름을 통해 후보 경로를 생성한다.

품질 향상과 비용 사이의 간격

SBGM 채택 시 기존 GAN 대비 FID 1030% 개선과 샘플 다양성 증가가 가능하다. EBM 기반 이상치 탐지는 도메인에 따라 AUROC 25%p 향상을 기대할 수 있다.

두 모델 모두 조건과 제약을 통합하기 쉬우며, 데이터 분포를 구조적으로 이해하는 데 도움을 준다. 프라이버시 제약 환경에서는 비정규화 밀도 모델의 유연성도 활용할 수 있다.

다만 SBGM은 많은 샘플링 스텝으로 추론 지연이 증가할 수 있다. 고차 적분자와 증류를 사용하면 3~10배 가속이 가능하다. EBM은 MCMC 튜닝 비용이 발생하지만 체인 재사용으로 추론 비용을 완화할 수 있다.

운영 환경에 맞춘 도입 흐름

SBGM을 도입할 때는 데이터 정규화와 증강, VP·VE·EDM 노이즈 스케줄을 먼저 결정한다. 이어 U-Net 또는 ViT 백본, 가중 DSM, 학습률과 EMA를 설정한다. DPMSolver나 Heun 같은 샘플러를 선택한 뒤 스텝 수와 품질 사이의 트레이드오프를 조정한다. 운영 중에는 스텝 안정성, NaN·Inf, FID·KID·NIQE 지표를 관리한다.

EBM은 단순 ResNet 기반 에너지 네트워크와 스펙트럴 정규화부터 구성한다. Langevin 스텝 η, 반복 k, 노이즈 σ, PCD 체인 길이를 정한 뒤 CD-k 또는 PCD와 온도 스케줄링, 체인 재가동 정책을 적용한다. 발산과 정체, 에너지 분포 드리프트를 감시하고 리셋·리주열 정책을 준비한다.

Denoising Score Matching과 간단한 샘플러

전제: Python 3.10, PyTorch 2.2+, CUDA 옵션. 이미지 32×32, 채널 3 가정.

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

class TinyUNet(nn.Module):
    def __init__(self, c=3, h=64):
        super().__init__()
        self.tproj = nn.Sequential(nn.Linear(1, h), nn.SiLU(), nn.Linear(h, h))
        self.enc = nn.Sequential(nn.Conv2d(c, h, 3, 1, 1), nn.SiLU(),
                                 nn.Conv2d(h, h, 3, 1, 1), nn.SiLU())
        self.dec = nn.Sequential(nn.Conv2d(h, h, 3, 1, 1), nn.SiLU(),
                                 nn.Conv2d(h, c, 3, 1, 1))
    def forward(self, x, t):
        t = t.view(-1, 1)
        te = self.tproj(t).view(-1, 64, 1, 1)
        h = self.enc(x) + te
        return self.dec(h)

def dsm_loss(model, x):
    b = x.size(0)
    t = torch.rand(b, device=x.device) * 0.9 + 0.1  # t∈[0.1,1.0]
    sigma = t.view(-1,1,1,1)
    noise = torch.randn_like(x) * sigma
    xt = x + noise
    score_pred = model(xt, t)  # predict ∇x log p(xt)
    target = -noise / (sigma**2 + 1e-8)
    return F.mse_loss(score_pred, target)

@torch.no_grad()
def langevin_sampler(model, steps=200, step_size=0.01, noise_scale=0.01, shape=(16,3,32,32), device="cuda"):
    x = torch.randn(shape, device=device)
    for k in range(steps):
        t = torch.full((shape[0],), 0.2 + 0.8*(1 - k/steps), device=device)  # simple schedule
        grad = model(x, t)
        x = x + step_size * grad + noise_scale * torch.randn_like(x)
        if torch.isnan(x).any():  # 에러 핸들링
            step_size *= 0.5
            x = torch.nan_to_num(x).clamp(-3, 3)
    return x.clamp(-1, 1)

# usage
# model = TinyUNet().cuda()
# opt = torch.optim.AdamW(model.parameters(), lr=1e-4)
# for x in loader: x = x.cuda(); loss = dsm_loss(model, x); opt.zero_grad(); loss.backward(); opt.step()
# samples = langevin_sampler(model)

실제 SBGM에는 SDE·ODE 적분기인 DPMSolver 등을 권장한다. 위 샘플러는 개념을 단순화한 예시다.

Contrastive Divergence와 Langevin MCMC

import torch, torch.nn as nn, torch.nn.functional as F

class EnergyNet(nn.Module):
    def __init__(self, c=3, h=64):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(c, h, 3, 2, 1), nn.SiLU(),
            nn.Conv2d(h, h, 3, 2, 1), nn.SiLU(),
            nn.Flatten(), nn.Linear(h*8*8, 1)  # for 32x32
        )
    def forward(self, x): return self.net(x).squeeze(-1)

@torch.no_grad()
def mcmc_langevin(x0, E, steps=60, eta=1e-3, noise=1e-2):
    x = x0.clone().detach().requires_grad_(True)
    for _ in range(steps):
        e = E(x).sum()
        g, = torch.autograd.grad(e, x, retain_graph=False)
        x = (x - eta * g + noise * torch.randn_like(x)).clamp(-1, 1).detach().requires_grad_(True)
    return x.detach()

def cd_loss(E, x_pos, pool, k=60):
    x_neg0 = torch.randn_like(x_pos) if pool is None else pool
    x_neg = mcmc_langevin(x_neg0, E, steps=k)
    loss = E(x_pos).mean() - E(x_neg).mean()
    reg = 1e-4 * (x_pos**2).mean()  # prior regularization
    return loss + reg, x_neg

# usage
# E = EnergyNet().cuda(); opt = torch.optim.AdamW(E.parameters(), 1e-4)
# pool = None
# for x in loader:
#   x = x.cuda()
#   loss, pool = cd_loss(E, x, pool)
#   opt.zero_grad(); loss.backward(); opt.step()

스펙트럴 정규화를 적용하고 PCD로 pool을 지속한다. 발산하면 η를 낮추고 노이즈를 높인다.

안전성과 비용을 함께 관리하기

민감 이미지나 음성이 포함된 데이터는 합법적 수집과 익명화 절차를 준수해야 한다. 모델 카드와 사용 가이드도 함께 배포한다.

SBGM은 많은 추론 스텝에 대응하기 위해 배치, 캐시, 혼합정밀을 적용할 수 있다. EBM은 체인 재사용과 warm-start로 비용을 줄일 수 있다. OOD 입력이나 프롬프트에는 출력 제한을 두고, 스코어 또는 에너지 노름 임계값으로 차단한다. Energy drift와 FID degradation을 통해 과적합도 감시한다.

고품질 생성이 우선이면 SBGM이 적합하다. 이상치 탐지나 목적함수 기반 제약 문제가 중심이면 EBM이 더 맞을 수 있다. SBGM은 고품질과 느린 추론 사이의, EBM은 유연성과 MCMC 튜닝 난이도 사이의 균형을 요구한다. EBM prior와 SBGM sampler를 결합한 하이브리드도 실무적 가치가 있다.

생성 모델스코어 매칭에너지 기반 모델확률 밀도MCMC