[Diffusion] DDPM 논문 리뷰: Denoising Diffusion Probabilistic Models

whateverpartysover·2025년 3월 11일

Diffusion

목록 보기
1/5

wav 도메인 잘 하구 있다가 왜 갑자기 이걸하느냐.. 면접이 잡혔는데 내가 했던거 논문 내용 물어보믄 어뜩해..^^
발등 불똥 모드 바로 켜졌습니다..

논문: https://arxiv.org/abs/2006.11239
데모 (발전된 형태들 포함): https://huggingface.co/diffusers/ddpm-cifar10-32-demo
코드 (tf v1으로 구현된..): https://github.com/hojonathanho/diffusion

핵심 요약

2015년에 Diffusion 방법을 처음 다룬 논문 이 나왔었다. 실제 확산 현상 같은거에서 아이디에이션을 했다는 요 논문을 가지고 좀 더 발전시켜서 고퀄리티 생성에 Diffusion Model을 쓸 수 있음을 보여준게 DDPM 모델이다.
DDPM 자체도 사실 맨처음 나왔을 때는 그렇게 주목 받는 정도는 아니었는데, 이후 속도도 개선하고 성능도 더 끌어올리면서 Diffusion Model을 적용한 제품들이 충격과 공포를 가져다 주었고... 그제서야 부랴부랴 디퓨전 논문 뒤적거렸던 나같은 범부놈은 완전히 새로운 개념과 수식에 충격과 공포를 느꼈다.
아무튼 왜 2015 Diffusion이 좀 들 언급되는지는 모르겠을 정도로 이론관련 내용의 상당부분은 2015 Diffusion 내용과 겹치기는 하는데...
사실 DDPM 수식이 토나와서 그렇지 뭐랄까 더 친절한거 같기는 하다.. 이거만 봐도 이전 Diffusion 이해가 쌉가능하기도 하고.. 그래서 DDPM 보면서 공부 시작하게된 사람이 많지 않았을까.. 아무튼 여기서는 기존 Diffusion의 내용들도 다 같이 설명하는 것으로..
뭐랄까 핵심요약이라기엔 그냥 썰풀이 인트로 같지만 abstract 배껴쓰기:

  • Diffusion Probabilistic Models을 이용해 고품질 이미지 합성 결과를 제시함.

  • 새로운 변분 하한 설계를 통해 모델을 학습함. 이를 통해 더 나은 최적화가 가능해지고, 높은 품질의 샘플을 생성할 수 있음.

  • DPM은 자연스럽게 Progressive Lossy Decompression 구조를 가지며, 이를 Autoregressive 디코딩의 일반화된 형태로 해석할 수 있음.

  • CIFAR-10 최고 성능

    • Inception Score(IS): 9.46

    • FID(Fréchet Inception Distance): 3.17 (SOTA, 최고 성능)

    • LSUN(256×256) 데이터셋에서도 ProgressiveGAN 수준의 샘플 품질을 달성함.

개인적으로 abstract가 몬가 핵심적이라는 느낌이 안든다.. (알못이라면 ㅈㅅ합니다)

기술 개요

Diffusion Model 기본 개념

t 시점의 상태는 t-1 시점의 상태에만 의존하는 확률 과정을 Markov property를 띠는 Markov process 라고 한다.

p(xtxt1,...,x2,x1,x0)=p(xtxt1)p(x_t|x_{t-1}, ... , x_2,x_1,x_0) = p(x_t|x_{t-1})

이 Markov process를 기반으로 한 연속적인 상태 전이 모델을 Markov Chain이라고 한다.
Diffusion Model은 데이터에 점진적으로 노이즈를 추가하는 과정을 학습하고, 반대로 노이즈를 제거하는 방식으로 샘플을 생성하는 parameterized Markov chain 이다.
Markov property를 유지해가며, x0x_0 상태에서 점진적으로 noise를 추가해가는 과정을 forward process라고 하며, 역시 Markov property를 유지하여 noise를 점진적으로 제거하는 과정을 reverse process 라고 한다.

Forward Process

Markov 가정 하에서 forward process의 분포 qq는 다음과 같은 조건부 확률로 분해된다:

q(𝑥1:Tx0)=t=1Tq(xtxt1)q(𝑥_{1:T}|x_0)=\prod_{t=1}^{T}q(x_t|x_{t-1})  

이 Forward process에서 각 스텝의 조건부 확률 분포는

q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t \mid x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I)

(베타는 노이즈 얼마나 많이 넣을건지)

이렇게 설계했다. → 왜 이렇게 설계했을까?
이렇게 설계하면 다음 세 가지 조건을 만족할 수 있기 때문이다. (어 논문에 실제 이렇게 있는건 아니고 제가 이해하기 편한 방식대로 서술한건데.. 틀렸다면 말해주세요 근데 보는사람 없는거같음)

(i) q(xT)q(x_T)가 가우시안에 근접하게 됨

Forward 확산의 목표는 데이터 x0x_0에서 시작해서 점진적으로 노이즈를 추가하여, 마지막 xTx_T가 완전한 가우시안 노이즈 N(0,I)\mathcal{N}(0, I)가 되도록 만드는 것이다.

xT=t=1T1βtx0+t=1Tβtϵtx_T = \prod_{t=1}^{T} \sqrt{1 - \beta_t} x_0 + \sum_{t=1}^{T} \sqrt{\beta_t} \epsilon_t

결과적으로 tTt \to T가 되면 원본 데이터 정보가 사라지고 순수한 가우시안 노이즈가 남게 된다.

q(xT)N(0,I)q(x_T) \approx \mathcal{N}(0, I)

(ii) 확률 분포를 선형 Gaussian으로 유지할 수 있음

Forward 과정의 확률 분포가 항상 Gaussian 형태로 유지되도록 설계해야 한다. 이를 위해, 각 스텝에서 선형 변환만 수행하도록 만들었다.
이렇게 하면 reverse process에서도 Gaussian 형태를 유지할 수 있어서, 복원이 쉬워진다.

(iii) 선형 Gaussian이므로 닫힌 형태 해(closed-form solution)로 xtx_t를 샘플링할 수 있음

Forward 과정이 선형 Gaussian이면, 여러 단계 계산 없이 x0x_0에서 바로 xtx_t를 샘플링할 수 있는 공식을 유도할 수 있다:

xt=αˉtx0+1αˉtϵ,ϵN(0,I)x_t = \bar{\alpha}_t x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)

여기서:

  • αt=1βt\alpha_t = 1 - \beta_t
  • αˉt=s=1tαs\bar{\alpha}_t = \prod_{s=1}^{t} \alpha_s (누적곱)

이를 통해 forward process에서 효율적인 샘플링을 수행할 수 있다.

Reverse Process

Forward 과정의 분포 q(xt1xt)q(x_{t-1} | x_t)를 직접 계산하는 것은 intractable하다. 베이즈 정리로 풀어보면 알수 있다.

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1} | x_t) = \frac{q(x_t | x_{t-1}) q(x_{t-1})}{q(x_t)}

여기서 분모 q(xt)q(x_t)를 계산하기 위해 모든 가능한 xt1x_{t-1}에 대해 적분해야 하므로, closed-form solution을 얻기가 어렵다.
따라서 직접 계산하는 대신, 모델 pθ(xt1xt)p_\theta(x_{t-1} | x_t)를 학습하여 근사하는 방식을 사용한다.

Reverse Kernel 정의

Reverse 과정의 확률 분포를 다음과 같은 정규 분포로 가정한다:

pθ(xt1xt)=N(xt1;μθ(xt,t),θ(xt,t))p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \sum_\theta(x_t, t))

즉, xtx_t로부터 xt1x_{t-1}을 생성하는 분포를 정규 분포로 가정하고,
그 평균 μθ(xt,t)\mu_\theta(x_t, t)와 분산 θ(xt,t)\sum_\theta(x_t, t)을 신경망 파라미터 θ\theta로 결정되는 함수로 두는 것이다.

논문에서는 분산 θ\sum_\theta를 시간에 따른 고정값으로 설정하거나 간단한 형태로 제한하였다.
예를 들어, Forward 과정의 posterior 분산 값인 β~t\tilde{\beta}_t를 사용하기도 한다.
실제로 고정값을 사용해도 성능에 큰 차이가 없었다구 한다.

Forward Posterior를 활용한 μθ(xt,t)\mu_\theta(x_t, t) 도출

Reverse 분포 pθ(xt1xt)p_\theta(x_{t-1} | x_t)를 유도하기 위해, Forward Posterior를 활용한다.

Forward 과정에서 베이즈 정리를 적용하면 다음과 같은 posterior 분포를 얻을 수 있다:

pθ(xt1xt,x0)=N(xt1;μ~t(xt,x0),β~tI)p_\theta(x_{t-1} | x_t, x_0) = \mathcal{N}(x_{t-1}; \tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I)

여기서 μ~t(xt,x0)\tilde{\mu}_t(x_t, x_0)xtx_tx0x_0의 선형 결합으로 표현된다:

μ~t=α~t1βt1α~tx0+αt(1α~t1)1α~txt\tilde{\mu}_t = \frac{\sqrt{\tilde{\alpha}_{t-1}} \beta_t}{1 - \tilde{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t} (1 - \tilde{\alpha}_{t-1})}{1 - \tilde{\alpha}_t} x_t

이를 활용해, Reverse 과정의 평균 μθ(xt,t)\mu_\theta(x_t, t)를 도출할 수 있다.

Neural Network를 활용한 근사

실제로는 x0x_0을 알 수 없으므로, 대신 신경망이 예측한 x^0\hat{x}_0을 사용한다.
이를 이용하여 Forward Posterior의 평균을 그대로 사용하되, x0x_0을 신경망이 예측한 값으로 대체하면 다음과 같다:

μθ(xt,t)=αˉt1βt1αˉtx^0+αt(1αˉt1)1αˉtxt\mu_{\theta}(x_t, t) = \frac{\bar{\alpha}_{t-1} \beta_t}{1 - \bar{\alpha}_t} \hat{x}_0 + \frac{\alpha_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t

즉, Forward Posterior의 평균을 그대로 가져오되, x0x_0 대신 신경망이 예측한 x^0\hat{x}_0을 넣는 방식으로 근사한 것이다.

x0x_0을 어떻게 예측하는가?

DDPM에서는 x0x_0을 직접 예측하는 대신, 신경망이 노이즈 ϵ\epsilon을 예측하도록 학습하는 방식을 사용한다.

즉, 신경망 ϵθ(xt,t)\epsilon_{\theta}(x_t, t)xtx_t에 포함된 노이즈를 예측하면, 이를 이용해 x0x_0을 다음과 같이 추정할 수 있다:

x^0=1αˉtxt1αˉtαˉtϵθ(xt,t)\hat{x}_0 = \frac{1}{\bar{\alpha}_t} x_t - \frac{1 - \bar{\alpha}_t}{\bar{\alpha}_t} \epsilon_{\theta}(x_t, t)

이렇게 예측된 x^0\hat{x}_0을 앞서 도출한 μθ(xt,t)\mu_{\theta}(x_t, t) 식에 대입하면,
Forward Posterior의 평균을 따라가는 방식으로 Reverse 확률 분포를 근사할 수 있다.

Loss 유도

Diffusion Model은 MLE 문제로서 목표자체가 Eq[logpθ(x0)]\mathbb{E}_{q}\big[-\log p_\theta(x_0)\big] 최소화가 된다. 하지만 이 또한 intractable 하기 때문에 변분 추론의 방식을 사용하여 식을 변형한다.
joint distribution을 통해

pθ(x0)=pθ(x0:T)pθ(x1:Tx0)p_{\theta}(x_0) = \frac{p_{\theta}(x_{0:T})}{p_{\theta}(x_{1:T} \mid x_0)}

이걸 좀 만지작 거려서

Eq[logpθ(x0)]=Eq[logpθ(x0:T)q(x1:Tx0)]+Eq[logq(x1:Tx0)pθ(x1:Tx0)]\mathbb{E}_q \left[ -\log p_{\theta}(x_0) \right] = \mathbb{E}_q \left[ -\log \frac{p_{\theta}(x_{0:T}) }{q(x_{1:T} \mid x_0)} \right] + \mathbb{E}_q \left[ \log \frac{q(x_{1:T} \mid x_0)}{p_{\theta}(x_{1:T} \mid x_0)} \right]

로 쓸 수 있다.

KL Divergence는 항상 0 이상이므로

LELBO=Eq[logpθ(x0:T)q(x1:Tx0)]L_{\text{ELBO}} = \mathbb{E}_q \left[ -\log \frac{p_{\theta}(x_{0:T})}{q(x_{1:T} \mid x_0)} \right]

요 ELBO를 최소화하는 문제로 바꿀 수 있다. 아마 요까지가 기존 Diffusion Model의 loss

이제 식을 더 전개하면 (appendix A 수식 전개 참고..^^)

L=Eq[DKL(q(xTx0)p(xT))+t>1DKL(q(xt1xt,x0)pθ(xt1xt))logpθ(x0x1)]L = \mathbb{E}_q \left[ D_{\text{KL}}(q(x_T|x_0)||p(x_T)) + \sum_{t>1}D_{\text{KL}}(q(x_{t-1}|x_t,x_0)||p_\theta(x_{t-1}|x_t))-\log p_\theta(x_0|x_1) \right]

의 형태로 정리될 수 있다.

t별로 항을 나누어 설명

  • LTL_T 항: xTx_T에 대한 모델과 실제 분포 차이.
    보통 p(xT)=N(0,I)p(x_T) = \mathcal{N}(0,I) , q(xT)N(0,I)q(x_T)\approx \mathcal{N}(0,I) 이므로 그냥 상수로 간주

  • Lt1L_{t-1} 항: 각 시간 스텝 tt에 대해 q(xt1xt,x0)q(x_{t-1}\mid x_t,x_0)pθ(xt1xt)p_\theta(x_{t-1}\mid x_t) 사이의 KL Divergence
    즉 모델의 한 스텝 역복원 성능을 측정하는 항으로, Forward 과정의 posterior (참고값)와 모델의 예측 분포가 얼마나 가까운지를 평가한다. Forward의 posterior는 x0x_0에 조건부이므로 학습 시에는 x0x_0를 알고 있을 때의 target 분포로 간주할 수 있다.
    요 친구가 사실상 핵심이 된다. KLD 식을 한번 다시 풀어보면,

    KL(p,q)=p(x)logq(x)dx+p(x)logp(x)dx=12log(2πσ22)+σ12+(μ1μ2)22σ2212(1+log2πσ12)\text{KL}(p,q)=-\int p(x)\log q(x)dx + \int p(x)\log p(x)dx \\ =\frac{1}{2}\log (2\pi\sigma^2_2) + \frac{\sigma_1^2 + (\mu_1-\mu_2)^2}{2\sigma^2_2} - \frac{1}{2}(1+\log 2\pi\sigma_1^2)

    pθp_\theta의 표준편차 (위 식에서 σ2\sigma_2는 상수로 취급을 하기로 했으므로, 사실상 남는건 (μ1μ2)2(\mu_1-\mu_2)^2 밖에 없으므로 최종적으로

    Lt1=Eq[12σt2μ~t(xt,x0)μθ(xt,t)2]+CL_{t-1} = \mathbb{E}_q \left[ \frac{1}{2\sigma_t^2}|| \tilde \mu_t(x_t,x_0) - \mu_\theta(x_t,t) ||^2 \right] + C

    의 식만 남는다.

  • L0L_0 항: q(x0x1,x0)q(x_0\mid x_1,x_0) vs pθ(x0x1)p_\theta(x_0\mid x_1), 사실상 x0x_0 재구성 오차이다. x0x_0 자체는 데이터를 직접 제공하므로 따로 모델이 예측할 필요가 없고, 생략하는게 구현도 간단하고 오히려 더 잘된다구 한다.

아무튼 Lt1L_{t-1} 빼고 싹다 죽여버렸다.. 각 forward posterior와 모델이 학습하는 평균을 각각 계산을 더 해주면... (이제 중간과정 쓰기 힘들어요 논문을 보자)

Et,x0,ϵ=[ϵϵθ(α~tx0+1α~tϵ,t)2],ϵN(0,1)\mathbb{E}_{t, x_0, \epsilon} = \left[ || \epsilon - \epsilon_\theta(\sqrt{\tilde\alpha_t}x_0 + \sqrt{1-\tilde\alpha_t}\epsilon, t) ||^2 \right], \quad \epsilon \sim \mathcal{N}(0,1)

아무튼 요롷게 되면 Diffusion 문제 자체의 해석을 다른 시각으로 할수 있다. 즉 noise를 MSE 형태로 학습하여 노이즈 생성을 예측하는 것이다.
대장정의 막을 내렸읍니다..

알고리즘 설명 (훈련 및 생성 단계)

훈련

  1. 데이터셋에서 실제 데이터 x0x_0을 샘플링한다.
  2. 임의의 타임스텝 t{1,,T}t \in \{1, \dots, T\}를 선택한다.
  3. Gaussian Noise \epsilon 을 샘플링한다.
  4. 모델이 예측한 노이즈 ϵθ(xt,t)\epsilon_\theta(x_t, t)와 실제 추가된 노이즈 ϵ\epsilon 간의 MSE 손실을 계산하고 역전파를 통해 모델 파라미터 θ\theta를 업데이트한다.
  5. 위 과정을 반복하여, 모델이 각 시간 단계별 노이즈 제거 작업을 학습하도록 만든다.

생성은 훈련의 역순

  1. 우선 xTN(0,I)x_T \sim \mathcal{N}(0, I) 형태의 무작위 노이즈 이미지를 초기값으로 설정한다.
  2. xTxT1x0x_T \to x_{T-1} \to \dots \to x_0 순서로 점진적으로 아래 과정을 반복한다.
  3. t>1t>1일 때는 확률적으로 약간의 노이즈를 추가하여 다양성을 부여하고, t=1t=1에서는 더 이상 노이즈를 추가하지 않는다.
  4. 현재 노이즈 이미지 xtx_t와, 모델이 예측한 노이즈 ϵθ(xt,t)\epsilon_\theta(x_t, t)를 이용해 xt1x_{t-1}을 샘플링한다.
  5. 반복이 끝나면 최종적으로 모델이 생성한 데이터 샘플 x0x_0을 얻는다.

Reverse 확산을 TT번 반복해야 하므로 생성 속도가 겁나 느리다.
이건 이후에 이 diffusion 과정을 다른 방식으로 해석하면서 (DDIM, Flow Matching 등) 개선이된다.

이전에 실험 결과 어쩌구도 넣었었는데.. 요렇게 옛날 모델 같은경우 특히 그냥 공부할 목적으로 보다보니 결과 정리할 의미는 잘 모르겠다.. 가방끈이 짧아가 이래 생각하는걸수도 있습니다

글이 몬가 후루룩 끝난거같다면 사실입니다
DDIM과 Flow Matching도 면접 준비상 필요한건 맞는데 요건 제가 정리를 따로 해둔 상태라... 일단 LDM으로 넘어간다

profile
인공지능 못해요

0개의 댓글