Diffusion Model(DDPM)

유승한·2024년 10월 21일
0

딥러닝

목록 보기
14/15

DDPM 구현은 DDPM 구현 포스트를 통해 봐주세요.

Diffusion 모델은 생성 모델 중 하나로, 데이터를 노이즈로 변환했다가 다시 원래 데이터로 복원하는 과정을 학습합니다. 이를 위해 확산(디퓨전, Diffusion) 과정을 거치며 노이즈를 추가하고, 그 반대의 역확산(Reverse Diffusion) 과정을 통해 노이즈를 제거합니다. 수식적으로 살펴보면 다음과 같습니다.

1. 정방향 확산 과정(Forward Diffusion Process)

정방향 과정에서는 원래 데이터 x0{x}_0에 점진적으로 노이즈를 추가하는 과정을 거칩니다. 이 과정은t 단계에서 노이즈 xt{x}_t를 생성하며, 노이즈는 주로 가우시안 분포를 따릅니다. 이를 수식으로 표현하면:
q(xtxt1)=N(xt;1βtxt1,βtI)q({x}_t | {x}_{t-1}) = \mathcal{N}({x}_t; \sqrt{1 - \beta_t} {x}_{t-1}, \beta_t I)

여기서:

  • βt\beta_t 는 각 시간 t 마다 정의되는 노이즈 척도(variance)로, 단계가 진행됨에 따라 증가합니다.
  • N\mathcal{N} 은 평균이 1βtxt1\sqrt{1 - \beta_t} \mathbf{x}_{t-1} , 분산이 βt\beta_t인 가우시안 분포입니다.

이를 전체 확산 과정으로 확장하면 x0{x}_0에서 xt{x}_t 로 직접 가는 확률은 다음과 같이 정의할 수 있습니다:

q(xtx0)=N(xt;αˉtx0,(1αˉt)I)q(\mathbf{x}_t | \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_t; \sqrt{\bar{\alpha}_t} \mathbf{x}_0, (1 - \bar{\alpha}_t) \mathbf{I})

여기서 αˉt=i=1tαi=i=1t(1βi)\bar{\alpha}_t = \prod_{i=1}^t \alpha_i=\prod_{i=1}^t (1 - \beta_i) 는 누적 노이즈 비율을 나타냅니다.

이렇듯 정방향 확산 과정은 x0x_0 데이터 분포에서 가우시안에 가까운 xTx_T를 만들어가는 과정입니다.

xTx_T가 항상 가우시안 분포를 따르도록 하기 때문에 사실상 tractable한 분포이며 q(xTx0)q(x_T|x_0)는 prior p(xT)p(x_T)와 거의 유사합니다. 또한, DDPM에서는 정방향 확산에서 분산을 상수로 고정시킨 후에 approximate posterior를 정의하기 때문에 posterior에는 학습 가능한 파라미터가 없기에, lost term은 항상 0에 가까운 상수이며, 학습 과정은 무시됩니다.

2. 역확산 과정(Reverse Diffusion Process)


생성 과정에서 우리는 노이즈 xT\mathbf{x}_T 에서 시작하여 원래의 데이터 x0\mathbf{x}_0로 점진적으로 복원합니다. 이 과정은 다음과 같은 확률 분포로 표현됩니다:

pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_t, t), \Sigma_\theta(\mathbf{x}_t, t))

여기서:

  • μθ(xt,t)\mu_\theta(\mathbf{x}_t, t) 는 신경망을 통해 학습된 평균으로, 이전 단계 t1t-1의 데이터를 예측합니다.
  • Σθ(xt,t)\Sigma_\theta(\mathbf{x}_t, t) 는 학습된 분산입니다.

이 역확산 과정은 학습된 파라미터 θ\theta 를 통해 원래 데이터를 복원하는 것을 목표로 합니다.

정리하면 아래 그림과 같습니다.

3. 손실 함수

Diffusion 모델에서 사용하는 손실 함수는 각 단계에서 원래 데이터에 대한 복원 오차를 최소화하는 방향으로 설계됩니다. 이를 위해 정방향 과정에서 사용된 노이즈 분포 q(xtxt1)q(\mathbf{x}_t | \mathbf{x}_{t-1})와 역방향 과정의 모델 분포 pθ(xt1xt)p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t) 사이의 KL Divergence를 최소화하는 방식으로 학습이 진행됩니다.

손실 함수는 다음과 같이 표현할 수 있습니다:

LTL_Tβ\beta를 learnable한 파라미터로 두는게 아니라 상수로서 Fix하기 때문에 고려를 하지 않아도 된다.

  1. q(xt1xt,x0)=N(xt1;μ~(xt,x0),β~tI)q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(x_{t-1}; \tilde{\mu}(x_t, x_0), \tilde{\beta}_t I)

where, μ~t(xt,x0):=αˉt1βt1αˉtx0+αt(1αˉt1)1αˉtxt, β~t:=(1αˉt1)1αˉtβt\text{where,} \ \tilde{\mu}_t(x_t, x_0) := \frac{\bar{\alpha}_{t-1} \beta_t}{1 - \bar{\alpha}t} x_0 + \frac{\alpha_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t, \ \tilde{\beta}_t := \frac{(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} \beta_t

  • αˉt1βt1αˉtx0\frac{\bar{\alpha}_{t-1} \beta_t}{1 - \bar{\alpha}t} x_0 : 원본 데이터 x0x_0의 가중치로, 타임스텝 t에서의 노이즈 수준을 고려한 비율입니다.
  • αt(1αˉt1)1αˉtxt\frac{\alpha_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t : 타임스텝 t에서의 데이터 xtx_t에 대한 가중치입니다.
  1. pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_t, t), \Sigma_\theta(\mathbf{x}_t, t))
  2. θ(xt,t)=σt2Iθ(xt,t)=σt2I∑_θ(x_t,t)=σ_t^2I∑_θ(x_t,t)=σ_t^2I
  3. μθ(xt,t)\mu_\theta(x_t,t) p의 평균

L=Eq(x0,x1,,xT)[t=1TKL(q(xt1xt,x0)pθ(xt1xt))]L = \mathbb{E}_{q(\mathbf{x}_0, \mathbf{x}1, \dots, \mathbf{x}T)} \left[ \sum_{t=1}^T \text{KL}(q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) || p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t)) \right]

즉, 각 단계에서의 복원 오차를 누적하여 모델을 학습시키는 구조입니다.

위 과정을 통해 μθ\mu_\theta를 얻어내면, 이를 활용해 우리는 pθ(xt1xt)p_\theta(x_{t-1}|x_t)를 샘플링할 수 있습니다.

Lt1L_{t-1}



요약

  • 정방향 확산 과정: 원래 데이터를 노이즈로 변환 x0\mathbf{x}_0 \to xT\mathbf{x}_T
  • 역방향 확산 과정: 노이즈에서 원래 데이터를 복원 xTx0\mathbf{x}_T \to \mathbf{x}_0
  • 손실 함수: 복원 과정에서의 오차를 최소화하는 KL Divergence 기반 손실.

이 과정에서 모델은 데이터의 점진적인 노이즈 추가 및 제거 과정을 학습하여 새로운 데이터를 생성할 수 있게 됩니다.

https://www.youtube.com/watch?v=uFoGaIVHfoE&t=171s

https://xoft.tistory.com/32

https://www.assemblyai.com/blog/diffusion-models-for-machine-learning-introduction/

https://openreview.net/pdf?id=-NEXDKk8gZ

https://huggingface.co/blog/annotated-diffusion

0개의 댓글