콘텐츠로 이동
Data Prep
상세

Energy-Based Models

메타 정보

항목 내용
분류 Generative Models / Probabilistic Modeling / Unsupervised Learning
핵심 논문 "A Tutorial on Energy-Based Learning" (LeCun et al., 2006)
주요 저자 Yann LeCun (NYU/Meta), Yilun Du (MIT), Igor Mordatch (Google DeepMind), Yang Song (OpenAI), Will Grathwohl (U of T)
핵심 개념 데이터의 적합도를 스칼라 에너지 함수로 표현 -- 낮은 에너지 = 높은 확률
관련 시스템 IGEBM, JEM, CDRL, Energy Matching, VAEBM, Cooperative EBM
관련 분야 Score Matching, Diffusion Models, Contrastive Learning, Anomaly Detection, Compositional Generation

정의

Energy-Based Model (EBM)은 입력 데이터 x에 대해 스칼라 에너지 값 E(x)를 할당하는 함수를 학습하는 모델링 프레임워크다. 핵심 원칙은 "관측된 데이터에는 낮은 에너지를, 관측되지 않은 데이터에는 높은 에너지를 부여"하는 것이다.

핵심 프레임워크:

Boltzmann 분포를 통해 에너지를 확률로 변환:

  p_theta(x) = exp(-E_theta(x)) / Z_theta

  Z_theta = integral exp(-E_theta(x)) dx    (분배 함수, partition function)

기호 정리:
  E_theta(x): 파라미터 theta로 정의된 에너지 함수 (스칼라 출력)
  p_theta(x): 데이터 x의 모델 확률
  Z_theta:    정규화 상수 (분배 함수) -- 일반적으로 계산 불가능(intractable)

핵심 문제:
  Z_theta는 전체 데이터 공간에 대한 적분이므로 고차원에서 계산 불가
  -> EBM의 모든 학습 방법은 Z를 우회하거나 근사하는 전략에 기반

직관적 이해:
  에너지 "지형"(landscape)을 상상
  - 데이터가 많은 곳: 깊은 골짜기 (낮은 에너지)
  - 데이터가 없는 곳: 높은 고원 (높은 에너지)
  - 학습 목표: 데이터 분포에 맞는 에너지 지형 조각

배경: EBM의 역사와 위치

물리학에서 기계학습으로

통계물리학 기원:

1. Boltzmann Machine (Hinton & Sejnowski, 1983)
   - 최초의 EBM
   - 가시/은닉 유닛 간 완전 연결
   - 학습: Gibbs sampling 기반 (느림)

2. Restricted Boltzmann Machine (Smolensky, 1986; Hinton, 2002)
   - 층 내 연결 제거 -> 효율적 Gibbs sampling
   - Contrastive Divergence로 학습 가능
   - Deep Belief Network의 구성 요소

3. 현대적 EBM (Du & Mordatch, 2019)
   - 임의의 딥 네트워크를 에너지 함수로 사용
   - SGLD(Stochastic Gradient Langevin Dynamics)로 샘플링
   - CIFAR-10 수준의 이미지 생성 달성

4. EBM 르네상스 (2020~현재)
   - JEM: 분류기 = EBM (Grathwohl et al., ICLR 2020)
   - Score Matching -> Diffusion Models로 주류화
   - Energy Matching: Flow Matching과 EBM 통합 (Balcerak et al., NeurIPS 2025)

EBM의 범용 프레임워크 성격

많은 모델이 EBM의 특수 경우:

1. Softmax 분류기
   E(x, y) = -f_y(x)    (로짓이 음의 에너지)
   p(y|x) = exp(f_y(x)) / sum_y' exp(f_y'(x))

2. Boltzmann Machine / RBM
   E(v, h) = -b'v - c'h - v'Wh
   p(v) = sum_h exp(-E(v,h)) / Z

3. Autoregressive Model
   log p(x) = sum_t log p(x_t | x_{<t})
   E(x) = -sum_t log p(x_t | x_{<t})

4. Diffusion Model (시간 조건부 EBM)
   각 노이즈 레벨 sigma_t에서의 score
   s(x, sigma_t) = -grad_x E_{sigma_t}(x)

5. Contrastive Learning (InfoNCE)
   E(x, y) = -sim(f(x), g(y))
   대조 손실 = EBM의 NCE 학습과 동치

학습 방법

핵심 문제: 분배 함수 Z

Maximum Likelihood 학습의 그래디언트:

  grad_theta log p_theta(x) = -grad_theta E_theta(x) + E_{x'~p_theta}[grad_theta E_theta(x')]
                                ~~~~~~~~~~~~~~~~~~     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                양성 단계 (positive)    음성 단계 (negative)

양성 단계: 데이터의 에너지를 낮추라
음성 단계: 모델 분포에서 샘플한 점의 에너지를 높여라

문제: 음성 단계에서 p_theta(x')로부터의 샘플이 필요
      -> Z를 모르므로 직접 샘플링 불가
      -> MCMC 필요 (비용 높음)

해결책 분류:
  1. MCMC 근사: CD, PCD, SGLD
  2. Z 우회: Score Matching, DSM
  3. Z 추정: NCE
  4. 보조 모델: Adversarial, Cooperative Learning, Amortized MCMC
  5. Diffusion 기반: DRL, CDRL, Energy Matching

1. Contrastive Divergence (CD)

Hinton (2002) -- RBM 학습의 돌파구

핵심 아이디어:
  MLE의 음성 단계를 짧은 MCMC 체인으로 근사

CD-k 알고리즘:
  입력: 데이터 x_0
  1. x_0에서 시작하여 k번 MCMC 전이 (Gibbs sampling)
     -> x_k 얻음
  2. 그래디언트 계산:
     delta_theta = -grad_theta E(x_0) + grad_theta E(x_k)
  3. theta 업데이트

k=1 (CD-1):
  가장 많이 사용
  데이터에서 한 번만 Gibbs 전이
  편향 있지만 실용적으로 충분

Persistent CD (PCD, Tieleman 2008):
  MCMC 체인을 배치 간 유지 (초기화하지 않음)
  체인이 평형에 더 가까이 도달
  학습률이 크면 체인이 모델을 따라가지 못함

한계:
  - k가 작으면 모델 분포의 불완전한 근사
  - 고차원에서 mixing 느림
  - 에너지 함수가 깊은 네트워크면 모드 탐색 어려움

2. Score Matching

Hyvarinen (2005) -- Z 없이 직접 학습

핵심 관찰:
  Z는 theta에 무관할 수 있음 -> 그래디언트에서 소거
  하지만 일반적으로는 Z가 theta에 의존

Score 정의:
  s_theta(x) = grad_x log p_theta(x) = -grad_x E_theta(x)
  s_data(x) = grad_x log p_data(x)

Score Matching 목적함수:
  J(theta) = (1/2) E_{p_data}[ ||s_theta(x) - s_data(x)||^2 ]

s_data(x)를 모르지만, 부분적분으로 변환:
  J(theta) = E_{p_data}[ tr(grad_x s_theta(x)) + (1/2)||s_theta(x)||^2 ] + const

  -> p_data의 score를 알 필요 없이 최적화 가능
  -> Hessian(grad_x s_theta) 계산 필요 (비용 높음)

3. Denoising Score Matching (DSM)

Vincent (2011) -- Score Matching의 실용적 변형

핵심 아이디어:
  데이터에 노이즈를 추가하면 노이즈 분포의 score를 알 수 있음

알고리즘:
  1. 데이터 x에 가우시안 노이즈 추가: x_tilde = x + sigma * epsilon
  2. 노이즈 분포의 조건부 score:
     grad_{x_tilde} log p(x_tilde|x) = -(x_tilde - x) / sigma^2
  3. 이 score를 타겟으로 네트워크 학습:
     L = E_{x, epsilon}[ ||s_theta(x_tilde) - (-(x_tilde - x)/sigma^2)||^2 ]

장점:
  - Hessian 계산 불필요
  - 간단한 MSE 손실
  - 확장성 좋음

한계:
  - 단일 노이즈 레벨: 데이터 분포가 아닌 노이즈 분포의 score를 학습
  -> 해결: 다중 스케일 DSM (Song & Ermon, 2019) = NCSN
  -> 극한: 연속 노이즈 스케줄 = Diffusion Model (Song et al., 2021)

4. Noise Contrastive Estimation (NCE)

Gutmann & Hyvarinen (2010) -- 분류 문제로 변환

핵심 아이디어:
  "이 샘플이 데이터인가, 노이즈인가?"를 구분하는 분류 문제
  -> Z가 학습 가능한 파라미터로 추정됨

설정:
  - 데이터 분포 p_data(x)에서 n개 샘플
  - 노이즈 분포 p_noise(x)에서 kn개 샘플
  - k: 노이즈 비율 (하이퍼파라미터)

분류 학습:
  D(x) = log p_theta(x) - log(k * p_noise(x))
  L = E_{p_data}[log sigmoid(D(x))] + k * E_{p_noise}[log sigmoid(-D(x))]

log p_theta(x) = -E_theta(x) - log Z_theta

Z_theta를 학습 가능 파라미터 c로 대체:
  log p_theta(x) = -E_theta(x) + c

최적해에서 c = -log Z_theta

노이즈 분포 선택:
  - 균일 분포: 가장 간단
  - 가우시안: 연속 데이터에 적합
  - 데이터 기반: 적응적 NCE

한계:
  - 노이즈 분포가 데이터와 너무 다르면 분류가 쉬워져 학습 비효율
  - 고차원에서 적절한 노이즈 분포 선택 어려움

5. Langevin Dynamics 기반 학습 (SGLD)

Du & Mordatch (2019) -- 현대적 EBM의 부활

Stochastic Gradient Langevin Dynamics:

  x_{t+1} = x_t - (alpha/2) * grad_x E_theta(x_t) + sqrt(alpha) * z_t
  z_t ~ N(0, I)

학습 알고리즘:
  for each batch:
    1. 버퍼에서 x^- 초기화 (95% 버퍼, 5% 랜덤)
    2. K 스텝 SGLD로 x^- 정제
    3. 손실: L = E_theta(x^+) - E_theta(x^-)   (x^+: 데이터)
    4. theta 업데이트

샘플 버퍼 (Replay Buffer):
  핵심 기법 -- 이전 MCMC 샘플을 재사용
  - 매번 랜덤에서 시작하면 mixing 느림
  - 버퍼에서 시작하면 이미 에너지가 낮은 근처에서 출발
  - 점진적으로 모델 분포에 수렴

안정화 기법:
  1. 에너지 정규화: L_reg = alpha * (E(x^+)^2 + E(x^-)^2)
     -> 에너지 값이 발산하는 것을 방지
  2. Spectral normalization: 네트워크 가중치 정규화
  3. 그래디언트 클리핑: SGLD 스텝의 안정화

6. Diffusion Recovery Likelihood (DRL)

Gao et al. (ICLR 2021) -- Diffusion과 EBM의 결합

핵심 아이디어:
  전체 데이터 분포 대신, 노이즈에서 복원하는 "조건부" 확률을 최대화

다중 노이즈 레벨 EBM:
  sigma_0 < sigma_1 < ... < sigma_T

  각 레벨에서 EBM 정의:
  p_{theta,t}(x) = exp(-E_{theta,t}(x)) / Z_{theta,t}

Recovery Likelihood:
  한 레벨 높은 노이즈 버전 x_tilde가 주어졌을 때
  한 레벨 낮은 복원의 조건부 확률 최대화

  L = E_{x~data, epsilon}[ -log p_{theta,t}(x | x_tilde_{t+1}) ]

장점:
  - 전체 Z 대신 조건부 Z만 계산 (더 작은 영역)
  - Diffusion의 안정성 + EBM의 유연성
  - CIFAR-10 FID 9.58 달성

Cooperative DRL (CDRL, Gao et al., ICLR 2024):
  - 보조 초기화 모델(initializer)을 함께 학습
  - 초기화 모델: MCMC의 시작점 제공
  - EBM: 초기화 모델의 출력을 정제
  - 두 모델이 협력하여 학습 효율 극대화
  - CIFAR-10 FID 3.03 달성 (EBM SOTA)

7. Energy Matching

Balcerak et al. (NeurIPS 2025) -- Flow Matching과 EBM의 통합

핵심 관찰:
  Flow Matching은 벡터장(velocity field)을 학습
  이 벡터장이 보존적(conservative)이면 스칼라 포텐셜이 존재
  -> 그 포텐셜 = 에너지 함수

Energy Matching 목적함수:
  E_theta(x)를 학습하되,
  -grad_x E_theta(x)가 Flow Matching의 벡터장과 일치하도록

  L = E_{t, x_t}[ ||-grad_x E_theta(x_t) - v_t(x_t)||^2 ]

특징:
  - 시간 조건 없는 단일 에너지 함수
  - 보조 생성기/네트워크 불필요
  - Flow Matching의 안정된 학습 + EBM의 밀도 추정 능력
  - MCMC 없이 학습 가능

의의:
  EBM의 고질적 문제(MCMC 학습, 불안정)를 해결하면서
  에너지 함수의 해석 가능성을 유지하는 새로운 방향

샘플링 방법 상세

학습된 EBM에서 새 샘플을 생성하는 것이 핵심 도전

1. Langevin Dynamics (LD / SGLD)
   x_{t+1} = x_t - (alpha/2) * grad_x E(x_t) + sqrt(alpha) * z_t

   특성:
   - 에너지 그래디언트를 따라 하강 + 확률적 탐색
   - 스텝 수가 충분하면 p_theta(x)로 수렴
   - 실제로는 100~1000 스텝 필요 (느림)
   - 모드 간 전환 어려움 (에너지 장벽)

2. Hamiltonian Monte Carlo (HMC)
   보조 운동량 변수 v 도입:
   H(x, v) = E(x) + (1/2)||v||^2

   Leapfrog 적분기로 (x, v) 궤적 시뮬레이션
   -> LD보다 효율적인 탐색
   -> 고차원에서도 빠른 mixing

3. Amortized MCMC
   별도의 생성기 g_phi(z)가 MCMC 초기점 제공:
   a) z ~ N(0, I)
   b) x_0 = g_phi(z)      -- 좋은 시작점
   c) x_K = SGLD(x_0, K)  -- 소수 스텝으로 정제

   -> 100+ 스텝 -> 10~20 스텝으로 단축
   -> 생성기와 EBM을 교대 학습

4. Annealed MCMC (Simulated Annealing)
   고온(높은 노이즈)에서 시작하여 점진적으로 냉각
   -> 에너지 장벽을 넘기 쉬움
   -> Diffusion의 역과정과 유사

5. 결정론적 샘플링
   ODE 형태로 변환 (probability flow):
   dx/dt = -grad_x E(x_t)
   -> 노이즈 없이 에너지 최소화
   -> 다양성 부족하지만 빠름

조합 가능성 (Compositionality)

EBM의 가장 독특한 강점:

여러 EBM의 에너지를 합산하여 새로운 모델 생성

AND 조합 (교집합):
  E_{A AND B}(x) = E_A(x) + E_B(x)
  p_{A AND B}(x) proportional to p_A(x) * p_B(x)

OR 조합 (합집합):
  E_{A OR B}(x) = -log(exp(-E_A(x)) + exp(-E_B(x)))
  p_{A OR B}(x) proportional to p_A(x) + p_B(x)

NOT 부정:
  E_{NOT A}(x) = -E_A(x)

예시: 이미지 생성에서의 조합

  E("빨간 자동차")(x)
  = E("빨간")(x) + E("자동차")(x)

  각 속성을 독립적으로 학습하고 조합 -> 조합 폭발 문제 우회
  학습 시 본 적 없는 속성 조합도 생성 가능

Du & Mordatch (2020) "Compositional Visual Generation with Energy Based Models":
  - 색상, 위치, 크기를 독립 EBM으로 학습
  - 테스트 시 조합하여 새로운 장면 생성
  - 학습 데이터에 없는 조합도 성공

Liu et al. (2022) "Compositional Visual Generation with Composable Diffusion Models":
  - Diffusion에서도 동일 원리 적용
  - Classifier-free guidance의 일반화

주요 아키텍처

Implicit Generation EBM (IGEBM)

Du & Mordatch (2019)

아키텍처:
  - Wide ResNet을 에너지 함수로 사용
  - 입력: 이미지 x
  - 출력: 스칼라 에너지 E(x)
  - 최종 풀링 후 단일 linear layer

학습:
  - SGLD로 음성 샘플 생성
  - 샘플 버퍼 활용
  - 에너지 정규화

결과:
  - CIFAR-10: 생성 + OOD 탐지
  - 첫 현대적 심층 EBM

Joint Energy Model (JEM)

Grathwohl et al. (ICLR 2020)

핵심 관찰:
  표준 분류기의 로짓을 재해석하면 EBM이 됨

  분류기: p(y|x) = softmax(f(x))

  f_y(x) = -E(x, y)로 정의하면:

  p(x, y) = exp(f_y(x)) / Z
  p(y|x) = exp(f_y(x)) / sum_{y'} exp(f_{y'}(x))    -- 기존 분류기와 동일
  p(x) = sum_y exp(f_y(x)) / Z                        -- 생성 모델
  E(x) = -logsumexp_y f_y(x)                          -- OOD 점수

하나의 네트워크로:
  1. 분류 (p(y|x))
  2. 생성 (SGLD로 p(x)에서 샘플링)
  3. OOD 탐지 (E(x) 기반)
  4. 보정된 불확실성

학습:
  L = L_classification + L_generative
  L_generative = MLE + SGLD 샘플링

결과 (CIFAR-10):
  - 분류 정확도: 92.9%
  - OOD 탐지 AUROC: 0.67 (SVHN)
  - FID: 38.2
  -> 개별 전문 모델보다는 낮지만, 단일 모델로 세 가지 수행

VAEBM

Xiao et al. (NeurIPS 2021)

핵심:
  VAE의 decoder를 EBM으로 대체

  기존 VAE: p(x|z) = N(x; mu(z), sigma(z))
  VAEBM: p(x|z) proportional to exp(-E_theta(x, z)) * p_0(x|z)
         p_0: 기본 가우시안 decoder
         E_theta: 잔차 에너지 보정

장점:
  - VAE의 빠른 잠재 샘플링 + EBM의 날카로운 생성
  - 소수 MCMC 스텝으로 품질 대폭 개선
  - CIFAR-10 FID 12.2 (당시 EBM SOTA)

응용 분야

1. Out-of-Distribution (OOD) 탐지

EBM의 가장 자연스러운 응용:

원리:
  E(x)가 높으면 -> 학습 분포 밖 (이상치)
  E(x)가 낮으면 -> 학습 분포 내 (정상)

장점 (vs 다른 방법):
  - Softmax 확률보다 더 날카로운 경계
    (Softmax는 OOD 입력에도 높은 확률 할당 가능)
  - VAE의 ELBO보다 직접적인 밀도 추정
  - 별도 OOD 학습 데이터 불필요

JEM OOD 탐지:
  E(x) = -logsumexp_y f_y(x)
  임계값 설정: E(x) > tau이면 OOD

Manifold Projection-Diffusion Recovery (MPDR, NeurIPS 2024):
  - 데이터의 저차원 매니폴드를 활용
  - 매니폴드를 따라 섭동 후 복원 에너지 측정
  - 산업 결함 탐지에 적용

GAD-EBM (KDD 2024):
  - 그래프 이상 탐지에 EBM 적용
  - 노드/엣지 레벨의 에너지 점수 정의
  - 사이버 보안, 금융 사기 탐지에 응용

2. 조합적 생성 (Compositional Generation)

여러 속성을 독립 EBM으로 학습 후 조합:

E_total(x) = w_1 * E_1(x) + w_2 * E_2(x) + ...

Du et al. (2020):
  - 2D/3D 장면 생성에서 객체별 에너지 조합
  - 학습에 없는 조합도 생성 가능

Diffusion으로의 확장 (Liu et al., 2022):
  - Composable Diffusion Models
  - 각 조건을 score로 분해
  - score 합산 = 에너지 합산과 동치

실용적 의의:
  - 레이블 조합 폭발 없이 새로운 조합 생성
  - 제로샷 조합 일반화
  - 각 속성 모델을 독립적으로 학습/업데이트 가능

3. 강화학습

보상/정책을 에너지로 모델링:

역강화학습 (IRL):
  전문가 시연의 보상 함수를 EBM으로 학습
  R(s, a) = -E(s, a)
  전문가 행동 = 낮은 에너지

목표 조건부 정책:
  E(s, a, g) = 목표 g를 달성하지 못하는 정도
  에너지 최소화 = 목표 달성

Florence et al. (2022) "Implicit Behavioral Cloning":
  - 행동을 EBM으로 암묵적 모델링
  - 다중 모달 행동 분포 포착
  - 로봇 조작에서 SOTA

4. 단백질 구조 예측

물리적 에너지 함수와의 자연스러운 연결:

E(structure) = E_bond + E_angle + E_torsion + E_vdW + E_electrostatic + E_learned

학습된 에너지 항이 물리적 에너지를 보완
Du et al. (2024): 단백질 설계에 EBM 활용
  - 조합적 에너지로 다중 속성 최적화
  - 안정성 + 결합 친화력 + 용해성 동시 고려

Python 예시

기본 EBM 학습 (SGLD)

import torch
import torch.nn as nn


class EnergyNet(nn.Module):
    """스칼라 에너지를 출력하는 네트워크."""

    def __init__(self, input_dim: int, hidden_dim: int = 128):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.SiLU(),
            nn.Linear(hidden_dim, hidden_dim),
            nn.SiLU(),
            nn.Linear(hidden_dim, 1),
        )

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        return self.net(x).squeeze(-1)


def sgld_sample(
    energy_fn: nn.Module,
    x_init: torch.Tensor,
    n_steps: int = 100,
    step_size: float = 0.01,
    noise_scale: float = 0.005,
) -> torch.Tensor:
    """Stochastic Gradient Langevin Dynamics 샘플링."""
    x = x_init.clone().detach().requires_grad_(True)

    for _ in range(n_steps):
        energy = energy_fn(x).sum()
        grad = torch.autograd.grad(energy, x)[0]
        noise = torch.randn_like(x) * noise_scale
        x = x.detach() - (step_size / 2) * grad + noise
        x.requires_grad_(True)

    return x.detach()


def train_ebm(
    model: EnergyNet,
    data_loader,
    buffer_size: int = 10000,
    sgld_steps: int = 60,
    n_epochs: int = 100,
    lr: float = 1e-4,
    reg_alpha: float = 0.1,
):
    """CD + SGLD + Replay Buffer로 EBM 학습."""
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    # 리플레이 버퍼 초기화
    buffer = torch.randn(buffer_size, data_loader.dataset[0].shape[0])

    for epoch in range(n_epochs):
        for x_pos in data_loader:
            batch_size = x_pos.shape[0]

            # 버퍼에서 95%, 랜덤 5%로 초기화
            n_replay = int(0.95 * batch_size)
            idx = torch.randint(0, buffer_size, (n_replay,))
            x_neg_init = torch.cat([
                buffer[idx],
                torch.randn(batch_size - n_replay, x_pos.shape[1]),
            ])

            # SGLD로 음성 샘플 생성
            x_neg = sgld_sample(model, x_neg_init, n_steps=sgld_steps)

            # 버퍼 업데이트
            buffer[idx] = x_neg[:n_replay]

            # 에너지 계산
            e_pos = model(x_pos)
            e_neg = model(x_neg)

            # Contrastive Divergence 손실 + 정규화
            loss = e_pos.mean() - e_neg.mean()
            loss += reg_alpha * (e_pos ** 2 + e_neg ** 2).mean()

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        print(f"Epoch {epoch}: E+ = {e_pos.mean():.3f}, E- = {e_neg.mean():.3f}")

JEM: 분류기를 EBM으로 사용

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


class JEM(nn.Module):
    """Joint Energy Model: 분류기 = EBM."""

    def __init__(self, backbone: nn.Module, n_classes: int):
        super().__init__()
        self.backbone = backbone  # 로짓 출력 네트워크
        self.n_classes = n_classes

    def logits(self, x: torch.Tensor) -> torch.Tensor:
        """로짓 = -E(x, y)."""
        return self.backbone(x)

    def energy(self, x: torch.Tensor) -> torch.Tensor:
        """E(x) = -logsumexp_y f_y(x)."""
        logits = self.logits(x)
        return -torch.logsumexp(logits, dim=-1)

    def classify(self, x: torch.Tensor) -> torch.Tensor:
        """p(y|x) = softmax(f(x))."""
        return F.softmax(self.logits(x), dim=-1)

    def is_ood(self, x: torch.Tensor, threshold: float = 0.0) -> torch.Tensor:
        """에너지 기반 OOD 탐지."""
        return self.energy(x) > threshold


def train_jem(
    model: JEM,
    data_loader,
    sgld_steps: int = 20,
    n_epochs: int = 50,
    lr: float = 1e-4,
):
    """JEM 학습: 분류 + 생성 동시 학습."""
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)

    for epoch in range(n_epochs):
        for x, y in data_loader:
            # 1. 분류 손실
            logits = model.logits(x)
            loss_cls = F.cross_entropy(logits, y)

            # 2. 생성 손실 (CD)
            x_neg = sgld_sample(
                lambda inp: model.energy(inp),
                torch.randn_like(x),
                n_steps=sgld_steps,
            )
            loss_gen = model.energy(x).mean() - model.energy(x_neg).mean()

            # 3. 전체 손실
            loss = loss_cls + loss_gen

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

조합적 생성

def compose_energies(
    energy_fns: list,
    weights: list[float] | None = None,
) -> callable:
    """여러 EBM을 AND 조합 (에너지 합산)."""
    if weights is None:
        weights = [1.0] * len(energy_fns)

    def composed_energy(x: torch.Tensor) -> torch.Tensor:
        total = sum(w * fn(x) for w, fn in zip(weights, energy_fns))
        return total

    return composed_energy


# 사용 예시:
# e_red = EnergyNet(...)    -- "빨간" 속성의 에너지
# e_car = EnergyNet(...)    -- "자동차" 속성의 에너지
# e_combined = compose_energies([e_red, e_car])
# samples = sgld_sample(e_combined, x_init, n_steps=200)

평가 지표

1. FID (Frechet Inception Distance)
   생성 이미지의 품질과 다양성 동시 측정
   낮을수록 좋음
   기준: CIFAR-10에서 CDRL FID 3.03 (EBM SOTA)

2. IS (Inception Score)
   생성 이미지의 선명도와 다양성
   높을수록 좋음

3. Log-Likelihood
   비정규화 EBM에서는 직접 계산 불가
   AIS(Annealed Importance Sampling)로 근사
   또는 DRL에서 recovery likelihood로 대체

4. OOD Detection Metrics
   AUROC, AUPRC, FPR@95TPR
   에너지 점수 기반 이진 분류 평가

5. Calibration
   ECE (Expected Calibration Error)
   JEM 등에서 확률 보정 품질 평가

EBM과 Diffusion의 관계

Diffusion Model은 시간 조건부 EBM의 특수 경우:

Score Matching 관점:
  각 노이즈 레벨 sigma_t에서:
  s_theta(x, t) = -grad_x E_theta(x, t) = grad_x log p_t(x)

  Diffusion = 연속 노이즈 스케줄에서의 score 학습
  EBM = 단일 (또는 소수) 에너지 함수

Diffusion이 EBM보다 성공적인 이유:
  1. Z 문제 회피: MSE 손실로 직접 score 학습
  2. MCMC 불필요: 결정론적/확률적 역과정
  3. 안정적 학습: 단순한 회귀 문제로 환원
  4. 다중 스케일: 거친 구조 -> 세부 디테일 순차 생성

EBM의 반격:
  Energy Matching (NeurIPS 2025):
  - Diffusion의 학습 안정성 + EBM의 밀도 추정
  - 시간 조건 없는 단일 에너지 함수
  - MCMC 없이 Flow Matching 프레임워크로 학습

향후 전망:
  - EBM과 Diffusion의 경계가 흐려지는 추세
  - EBM의 이론적 우아함 + Diffusion의 실용성 통합
  - 조합적 생성, OOD 탐지에서 EBM의 고유 장점 유지

한계 및 주의사항

1. 느린 샘플링
   - MCMC 기반 샘플링은 본질적으로 순차적이고 느림
   - 100~1000+ 스텝 필요 (Diffusion의 20~50 스텝 대비)
   - 해결: Amortized MCMC, 짧은 체인 + 보조 생성기
   - Energy Matching: MCMC 없이 ODE 샘플링 가능

2. 불안정한 학습
   - 에너지 값 발산 (양/음 에너지가 무한대로)
   - MCMC 체인 발산 (비현실적 이미지 생성)
   - 해결: 에너지 정규화, spectral normalization, 그래디언트 클리핑

3. 모드 커버리지 부족
   - MCMC가 에너지 장벽을 넘지 못해 일부 모드만 탐색
   - 다중 모달 분포에서 특히 문제
   - 해결: 템퍼링, 다중 체인, annealed sampling

4. 평가의 어려움
   - Z를 모르므로 log-likelihood 직접 계산 불가
   - AIS로 근사 가능하나 비용 높음
   - FID/IS는 생성 품질만 측정, 밀도 추정 품질 미반영

5. 고차원 확장성
   - 이미지 공간(pixel-level) EBM은 확장 어려움
   - 잠재 공간(latent) EBM이 실용적 대안
   - 해결: VAEBM, Latent EBM 계열

6. 하이퍼파라미터 민감도
   - SGLD 스텝 크기, 스텝 수, 버퍼 크기, 정규화 강도 등
   - 잘못 설정하면 학습 실패
   - 해결: DRL/CDRL은 상대적으로 안정적

관련 연구 흐름

Boltzmann Machine (Hinton & Sejnowski, 1983)
    |
    +-- RBM (Smolensky, 1986; Hinton, 2002)
    |       |
    |       +-- Deep Belief Networks (Hinton et al., 2006)
    |       +-- Contrastive Divergence (Hinton, 2002)
    |
    +-- Score Matching (Hyvarinen, 2005)
    |       |
    |       +-- Denoising Score Matching (Vincent, 2011)
    |       +-- Sliced Score Matching (Song et al., 2019)
    |       +-- NCSN (Song & Ermon, NeurIPS 2019)
    |               |
    |               +-- Score SDE / Diffusion (Song et al., ICLR 2021)
    |
    +-- NCE (Gutmann & Hyvarinen, 2010)
    |       |
    |       +-- InfoNCE / Contrastive Learning (Oord et al., 2018)
    |
    +-- Modern Deep EBM (Du & Mordatch, NeurIPS 2019)
    |       |
    |       +-- JEM (Grathwohl et al., ICLR 2020)
    |       +-- Compositional EBM (Du et al., NeurIPS 2020)
    |       +-- VAEBM (Xiao et al., NeurIPS 2021)
    |
    +-- Diffusion Recovery (Gao et al., ICLR 2021)
    |       |
    |       +-- CDRL (Gao et al., ICLR 2024)
    |
    +-- Energy Matching (Balcerak et al., NeurIPS 2025)
    |       |
    |       +-- Flow Matching + EBM 통합
    |
    +-- Convex Potential Mirror Langevin (Yang et al., NeurIPS 2025)
            |
            +-- 효율적 MCMC 샘플링

참고 자료

핵심 논문

  1. LeCun, Y. et al. (2006). A Tutorial on Energy-Based Learning. In Predicting Structured Data.
  2. Hinton, G. (2002). Training Products of Experts by Minimizing Contrastive Divergence. Neural Computation.
  3. Du, Y. & Mordatch, I. (2019). Implicit Generation and Modeling with Energy Based Models. NeurIPS 2019.
  4. Grathwohl, W. et al. (2020). Your Classifier is Secretly an Energy Based Model and You Should Treat It Like One. ICLR 2020.

Score Matching / Diffusion 관련

  1. Hyvarinen, A. (2005). Estimation of Non-Normalized Statistical Models by Score Matching. JMLR.
  2. Vincent, P. (2011). A Connection Between Score Matching and Denoising Autoencoders. Neural Computation.
  3. Song, Y. & Ermon, S. (2019). Generative Modeling by Estimating Gradients of the Data Distribution. NeurIPS 2019.

최신 연구

  1. Gao, R. et al. (2021). Learning Energy-Based Models by Diffusion Recovery Likelihood. ICLR 2021.
  2. Gao, R. et al. (2024). Learning Energy-Based Models by Cooperative Diffusion Recovery Likelihood. ICLR 2024.
  3. Balcerak, M. et al. (2025). Energy Matching: Unifying Flow Matching and Energy-Based Models for Generative Modeling. NeurIPS 2025.
  4. Yang, Z. et al. (2025). Convex Potential Mirror Langevin Algorithm for Efficient Sampling of Energy-Based Models. NeurIPS 2025.

관련 개념