포스트

Diffusion, DDPM and DDIM

Diffusion, DDPM and DDIM

Diffusion은 최근 이미지 생성 분야의 표준처럼 자리 잡은 모델이에요. 논문을 읽다보면 diffusion이나 flow matching에 대한 이야기가 나오는데, 학교에서 관련 강의가 열리지 않아 Stanford Online으로 공부를 시작했어요. 이 글에서는 Stanford CME 296의 1강 내용을 바탕으로, Diffusion이 어떤 원리로 이미지를 만드는지 수식과 함께 차근차근 풀어볼게요.

Diffusion은 왜 노이즈에서 시작할까

Noising/De-noising steps

우리의 목표는 주어진 이미지 데이터 분포에서 새로운 이미지를 생성하는 거예요. 그런데 왜 하필 의미 없는 노이즈에서 출발할까요?

  • 노이즈는 샘플링이 쉬워요. 뒤에서 설명할 가우시안 분포에서 한 번 뽑기만 하면 돼요.
  • 무작위성을 자연스럽게 포함해서 매번 다른 이미지를 만들 수 있어요.
  • 가우시안 분포는 평균, 분산, 두 분포 사이의 거리까지 수식으로 깔끔하게 다뤄져요. 이 성질 덕분에 나중에 수식 유도가 극적으로 단순해져요.

Diffusion 모델은 불필요한 노이즈를 조금씩 깎아내는 방법을 배워요. 이제 이 아이디어를 수식으로 바꾸기 위해 필요한 배경지식부터 정리해볼게요.

확률 분포를 되짚어요

Diffusion을 이해하려면 확률 분포에 대한 몇 가지 도구가 필요해요. 이미 익숙하다면 건너뛰어도 괜찮지만, 뒤에서 나올 수식이 어디서 왔는지 궁금해질 때 다시 돌아오면 좋아요.

가우시안 분포에 대해

가우시안 분포(Gaussian distribution), 또는 정규분포는 자연 현상에서 자주 등장하는 종 모양의 확률 분포예요. 1차원에서 평균 $\mu$와 분산 $\sigma^2$로 특징지어져요. 확률 밀도 함수는 다음과 같아요.

\[p(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)\]
  • $\mu$는 분포의 중심이에요. 값을 뽑으면 이 근처가 가장 자주 나와요.
  • $\sigma^2$는 퍼짐의 정도예요. 크면 넓게 퍼지고, 작으면 뾰족하게 모여요.
  • $\exp$ 안의 $-(x-\mu)^2$는 중심에서 멀어질수록 확률이 빠르게 작아지게 해요.
  • 앞의 $\frac{1}{\sqrt{2\pi\sigma^2}}$는 전체 적분이 1이 되도록 맞춰주는 정규화 상수예요.

이미지처럼 고차원 데이터에서는 벡터로 확장돼요. $d$차원 벡터 $x$에 대한 다변량 가우시안은 다음과 같이 써요.

\[x \sim \mathcal{N}(\mu, \Sigma)\]
  • $\mu \in \mathbb{R}^d$는 평균 벡터예요.
  • $\Sigma \in \mathbb{R}^{d \times d}$는 공분산 행렬이에요. 대각 원소 $\Sigma^{(i,i)}$는 $i$번째 차원의 분산이고, 비대각 원소 $\Sigma^{(i,j)}$는 $i$번째와 $j$번째 차원이 어떻게 같이 움직이는지(공분산) 나타내요.

등방성 가우시안은 왜 편리할까

Diffusion에서는 주로 등방성(isotropic) 가우시안을 써요. 공분산 행렬이 $\Sigma = \sigma^2 I$ 형태예요. $I$는 단위 행렬이고, 모든 방향으로 분산이 같다는 뜻이에요.

\[p(x) = \frac{1}{(2\pi\sigma^2)^{d/2}} \exp\left(-\frac{\|x - \mu\|^2}{2\sigma^2}\right)\]

왜 편리할까요? 일반적인 가우시안은 $d \times d$ 크기의 공분산 행렬을 다뤄야 해요. $d$가 수만 차원인 이미지에서는 역행렬 계산이 거의 불가능해요. 반면 등방성 가우시안은 스칼라 $\sigma^2$만 있으면 되고, 각 차원이 독립이기 때문에 한 차원씩 따로 샘플링해서 합치는 방식으로도 처리할 수 있어요.

결합, 조건부, 주변 확률을 구분해요

여러 변수를 다룰 때는 세 종류의 확률을 구분해야 해요.

  • 결합(joint) 확률 $p(x, y)$: $x$와 $y$가 동시에 일어날 확률이에요.
  • 조건부(conditional) 확률 $p(x \mid y)$: $y$를 알고 있을 때 $x$의 확률이에요.
  • 주변(marginal) 확률 $p(x)$: 다른 변수를 평균 내서 없앤 $x$ 단독의 확률이에요.

세 확률은 하나의 식으로 연결돼요.

\[p(x, y) = p(x \mid y) \cdot p(y) = p(y \mid x) \cdot p(x)\]

여기서 마지막 등식을 재정리하면 유명한 베이즈 정리가 나와요.

\[p(x \mid y) = \frac{p(y \mid x)\, p(x)}{p(y)}\]

그리고 여러 시점의 결합 확률은 조건부 확률의 곱으로 풀어 쓸 수 있어요.

\[p(x_1, x_2, \ldots, x_T) = p(x_1) \cdot p(x_2 \mid x_1) \cdots p(x_T \mid x_1, \ldots, x_{T-1})\]

이 표현을 Diffusion에서 수없이 사용해요. 한 변수를 없애는 과정인 주변화(marginalization) 는 적분으로 이뤄져요.

\[p(x_1) = \int p(x_1, x_2, \ldots, x_T) \, dx_2 \cdots dx_T\]

여러 시점의 모든 가능한 값을 다 더해서 $x_1$ 하나만 남기는 셈이에요. 뒤에서 “로그 가능도 계산이 어렵다”고 말할 때, 바로 이 적분이 불가능에 가깝다는 뜻이에요.

Forward process는 이미지를 서서히 망가뜨려요

이제 본론으로 들어갈게요. Diffusion은 두 단계로 구성돼요.

  1. Forward process: 깨끗한 이미지 $x_0$에 노이즈를 조금씩 더해 $x_T \approx \epsilon$이 될 때까지 망가뜨려요.
  2. Reverse process: 망가진 $x_T$에서 다시 깨끗한 $x_0$로 되돌리는 과정을 신경망이 학습해요.

Forward는 우리가 직접 설계하기 때문에 수식으로 완전히 알 수 있어요. 시점 $t-1$에서 $t$로 노이즈를 한 스텝 더하는 공식은 다음과 같아요.

\[q(x_t \mid x_{t-1}) = \mathcal{N}\left(\sqrt{1 - \beta_t}\, x_{t-1},\; \beta_t I\right)\]

읽는 법을 풀어 볼게요. “이전 이미지 $x_{t-1}$이 주어졌을 때, 다음 이미지 $x_t$는 평균이 $\sqrt{1-\beta_t}\, x_{t-1}$이고 분산이 $\beta_t I$인 가우시안에서 뽑힌다”는 뜻이에요. 구체적으로는 이런 연산이에요.

\[x_t = \sqrt{1 - \beta_t}\; x_{t-1} + \sqrt{\beta_t}\; \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)\]

표준 가우시안 $\epsilon$에서 뽑은 노이즈를 더하는 거예요. 가우시안을 $\mu + \sigma \epsilon$ 형태로 쓰는 기법을 재매개변수화(reparameterization) 라고 불러요. 샘플링 과정을 결정론적 연산과 표준 노이즈로 분리할 수 있어서 나중에 역전파를 태우기 쉬워져요.

계수에 대해

두 계수에는 의도가 숨어 있어요. 먼저 이전 이미지의 신호가 얼마나 남는지 생각해봐요. 평균이 $\sqrt{1-\beta_t}\, x_{t-1}$이므로 신호의 크기는 대략 $\sqrt{1-\beta_t}$배로 줄어요. 동시에 $\beta_t$만큼의 분산으로 노이즈가 새로 섞여요. 두 값을 제곱해서 더하면 정확히 1이 돼요.

\[(1 - \beta_t) + \beta_t = 1\]

즉, 신호의 에너지와 노이즈의 에너지를 합친 총 에너지가 보존돼요. 이렇게 해야 $t$가 커져도 $x_t$의 분산이 폭발하거나 소실되지 않고 일정한 스케일로 유지돼요. 이 설계 덕분에 $x_T$의 분포가 결국 단위 가우시안 $\mathcal{N}(0, I)$에 가까워져요.

$\beta_t$는 시간이 갈수록 커지도록 스케줄해요.

\[0 \leq \beta_1 < \beta_2 < \cdots < \beta_T \leq 1\]

작은 $t$에서는 $\beta_t$가 매우 작아서 거의 원래 이미지예요. $t$가 커질수록 노이즈 비율이 올라가고, 결국 $T$에서는 이미지가 거의 보이지 않는 순수 노이즈가 돼요. $\beta_t$의 구체적인 값을 정하는 방식을 noise schedule이라고 해요. 선형으로 증가시키거나, 코사인 곡선처럼 완만하게 증가시키는 선택지가 있어요.

한 번에 $x_t$로 건너뛰는 공식이 필요해요

학습할 때 임의의 시점 $t$에서 $x_t$를 만들어야 해요. 그런데 정의 그대로라면 $x_0$부터 $t$번의 스텝을 하나씩 거쳐야 하죠. $T$가 1000 정도라면 너무 비효율적이에요.

다행히 가우시안 노이즈에는 멋진 성질이 있어요. 독립인 가우시안들의 합은 다시 가우시안이 된다는 거예요. 구체적으로, $X \sim \mathcal{N}(\mu_X, \sigma_X^2)$과 $Y \sim \mathcal{N}(\mu_Y, \sigma_Y^2)$가 서로 독립이면 다음이 성립해요.

\[X + Y \sim \mathcal{N}(\mu_X + \mu_Y,\; \sigma_X^2 + \sigma_Y^2)\]

평균과 분산이 그냥 더해지는 거예요. 이 성질을 Forward process의 정의에 재귀적으로 대입하면, $x_0$에서 $x_t$로 한 번에 건너뛰는 공식을 얻을 수 있어요.

\[q(x_t \mid x_0) = \mathcal{N}\left(\sqrt{\bar{\alpha}_t}\, x_0,\; (1 - \bar{\alpha}_t)\, I\right)\]

여기서 새로운 기호가 등장해요.

\[\alpha_t = 1 - \beta_t, \qquad \bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i\]
  • $\alpha_t = 1 - \beta_t$는 “한 스텝에서 신호가 얼마나 살아남는지”를 나타내요. $\beta_t$가 작을수록 $\alpha_t$는 1에 가까워요.
  • $\bar{\alpha}_t$는 $\alpha_1$부터 $\alpha_t$까지 곱한 값이에요. “지금까지 누적된 신호 생존율”이라고 볼 수 있어요. $t$가 커질수록 0에 가까워져요.

풀어 쓰면, 임의의 $t$에 대해 다음과 같이 $x_t$를 한 줄에 만들 수 있어요.

\[x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)\]

이 식이 학습 과정에서 핵심이 돼요. 어떤 $t$가 주어지든 한 번의 계산으로 $x_t$를 만들 수 있고, 그때 더해진 노이즈 $\epsilon$도 정확히 알고 있어요.

Reverse process는 학습으로 풀어야 해요

Forward는 우리가 설계한 과정이라 모든 것을 알고 있어요. 하지만 역방향 $q(x_{t-1} \mid x_t)$는 직접 계산할 수 없어요. 왜 그럴까요?

$x_t$만 보고 $x_{t-1}$을 맞추려면, 결국 “노이즈가 조금 섞인 이미지가 원래 어떤 이미지였을지”를 추정해야 해요. 이건 데이터 분포 $q(x_0)$를 알아야 풀 수 있는 문제예요. 세상의 모든 고양이 사진, 풍경 사진의 분포를 수식으로 알고 있다면 계산할 수 있지만, 당연히 우리는 모르죠. 알고 있다면 애초에 생성 모델이 필요하지 않아요.

그래서 파라미터 $\theta$를 가진 신경망으로 이 역과정을 근사해요.

\[p_\theta(x_{t-1} \mid x_t) = \mathcal{N}\left(\mu_\theta(x_t, t),\; \Sigma_\theta(x_t, t)\right)\]

모델이 가우시안의 평균과 분산을 출력하도록 만들어요. 우리가 원하는 건 결국 학습 이미지의 로그 가능도를 최대화하는 $\theta$예요.

\[\max_\theta \; \log p_\theta(x_0)\]

로그를 씌우는 건 두 가지 이유 때문이에요. 첫째, 로그는 단조 증가 함수라서 $p_\theta(x_0)$를 최대화하는 $\theta$와 $\log p_\theta(x_0)$를 최대화하는 $\theta$는 같아요. 둘째, 확률은 아주 작은 값들의 곱이라 그대로 다루면 수치적으로 불안정해요. 로그를 씌우면 곱이 합으로 바뀌고 계산이 안정돼요.

왜 로그 가능도를 직접 다루기 어려울까

문제는 $\log p_\theta(x_0)$를 계산하려면 모든 가능한 중간 경로 $x_1, \ldots, x_T$를 적분해야 한다는 거예요.

\[p_\theta(x_0) = \int p_\theta(x_0, x_1, \ldots, x_T) \, dx_1 \cdots dx_T\]

이 적분은 사실상 계산이 불가능해요. $x_t$가 수만 차원 벡터이고, $T$가 1000쯤 되니까 적분 공간이 천문학적이에요. 이걸 주변화가 intractable하다고 표현해요.

그래서 $\log p_\theta(x_0)$ 대신, 계산 가능한 하한(lower bound) 을 만들어 그 하한을 최대화해요. 하한을 올리면 원래 값도 최소한 그만큼은 올라가니까요. 이 아이디어를 구체화한 것이 변분 추론(variational inference) 이고, 결과물이 ELBO예요.

ELBO를 네 단계로 유도해봐요

Diffusion 논문을 읽다가 처음 마주치는 장벽이 바로 이 수식 유도예요. 하지만 큰 흐름은 네 단계로 단순해요. 각 단계가 어떤 수학적 도구를 쓰는지 정리하면서 가볼게요.

1단계: Jensen 부등식으로 하한을 얻어요

Jensen 부등식은 오목 함수(concave function)의 성질을 다루는 부등식이에요. $f$가 오목 함수일 때 다음이 성립해요.

\[f(\mathbb{E}[X]) \geq \mathbb{E}[f(X)]\]

기댓값을 먼저 씌우고 $f$를 적용한 값이, $f$를 먼저 씌우고 기댓값을 취한 값보다 크거나 같다는 뜻이에요. 직관적으로는 위로 볼록한 종 모양 함수에서 점들의 평균이 함수값들의 평균보다 위에 있다는 얘기예요. 로그 함수 $\log$는 대표적인 오목 함수예요.

로그 가능도에 이 부등식을 적용하기 위해, 가능도 식에 임의의 분포 $q$를 곱했다가 나누는 트릭을 써요.

\[\log p_\theta(x_0) = \log \int p_\theta(x_{0:T}) \, dx_{1:T} = \log \int q(x_{1:T} \mid x_0) \cdot \frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)} \, dx_{1:T}\]

그리고 적분을 기댓값으로 다시 쓰면 이렇게 돼요.

\[\log p_\theta(x_0) = \log \mathbb{E}_{x_{1:T} \sim q(x_{1:T} \mid x_0)}\left[\frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)}\right]\]

여기에 Jensen 부등식을 적용해서 $\log$를 기댓값 안으로 옮기면 부등호 방향이 보장돼요.

\[\log p_\theta(x_0) \geq \mathbb{E}_{x_{1:T} \sim q(x_{1:T} \mid x_0)}\left[\log \frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)}\right]\]

이 우변이 바로 ELBO (Evidence Lower BOund) 예요. “Evidence”는 $p_\theta(x_0)$의 또 다른 이름인 증거(evidence) 에서 왔고, 이 증거의 로그에 대한 하한이라는 뜻이에요. Diffusion에서는 Forward process의 분포 $q$를 그대로 $q(x_{1:T} \mid x_0)$로 사용해요. 우리가 이미 알고 있는 분포니까 계산이 쉬워요.

2단계: ELBO를 전개해서 KL divergence를 드러내요

1단계의 ELBO를 그대로 최대화하기엔 $T$개의 시점이 뒤엉켜 있어요. 이걸 시점별로 쪼개서 손에 잡히는 형태로 풀어볼게요.

Forward process가 마르코프(Markov) 성질을 가진다는 점을 이용해요. 마르코프 성질이란 현재 상태가 주어지면 모든 과거 상태가 필요 없다는 성질이에요. Diffusion에서는 $q(x_t \mid x_{t-1}, x_{t-2}, \ldots) = q(x_t \mid x_{t-1})$처럼 바로 이전 시점만 보면 충분해요. 덕분에 결합 확률이 간단한 곱으로 풀려요.

\[q(x_{1:T} \mid x_0) = \prod_{t=1}^{T} q(x_t \mid x_{t-1})\] \[p_\theta(x_{0:T}) = p(x_T) \prod_{t=1}^{T} p_\theta(x_{t-1} \mid x_t)\]

이걸 ELBO 식에 넣고, 로그의 곱을 합으로 풀고, 항들을 재배열하면 다음과 같은 형태가 나와요.

\[\text{ELBO} = -\sum_{t=2}^{T} \mathbb{E}_q\left[\text{KL}\Big(q(x_{t-1} \mid x_t, x_0) \,\|\, p_\theta(x_{t-1} \mid x_t)\Big)\right] + (\text{extra terms})\]

핵심 결과만 남았어요. 각 시점 $t$마다 하나의 KL divergence 항이 등장해요.

KL divergence는 두 확률 분포가 얼마나 다른지를 보여주는 지표예요. 분포 $p$와 $q$에 대해 다음과 같이 정의돼요.

\[\text{KL}(p \| q) = \mathbb{E}_{x \sim p}\left[\log \frac{p(x)}{q(x)}\right]\]

$p$에서 뽑은 샘플이 $q$에서 나올 만한 값인지 로그 비율로 재는 개념이에요. 0이면 두 분포가 같고, 멀어질수록 커져요. 단 대칭적이지 않아서 $\text{KL}(p | q) \neq \text{KL}(q | p)$예요. 그래서 엄밀히는 “거리”가 아니라 “divergence”라고 불러요.

ELBO를 최대화하려면 이 KL 항을 최소화해야 해요. 그러니까 학습은 $q(x_{t-1} \mid x_t, x_0)$와 $p_\theta(x_{t-1} \mid x_t)$가 서로 가깝도록 $\theta$를 조정하는 문제가 돼요.

3단계: $q(x_{t-1} \mid x_t, x_0)$을 계산 가능하게 만들어요

2단계의 KL 항을 계산하려면 $q(x_{t-1} \mid x_t, x_0)$을 알아야 해요. 이 분포는 “Forward의 역방향이지만 $x_0$을 알고 있는 경우”에 해당해요. 신기하게도 이 조건부 분포는 닫힌 형태로 계산할 수 있어요.

베이즈 정리를 한 번 쓰면 이렇게 풀려요.

\[q(x_{t-1} \mid x_t, x_0) = \frac{q(x_t \mid x_{t-1}, x_0) \cdot q(x_{t-1} \mid x_0)}{q(x_t \mid x_0)}\]

각 항이 우리가 이미 아는 값이에요.

  • $q(x_t \mid x_{t-1}, x_0) = q(x_t \mid x_{t-1})$: 마르코프 성질로 $x_0$를 지울 수 있어요. 앞서 본 Forward 한 스텝 공식이에요.
  • $q(x_{t-1} \mid x_0)$: 앞서 유도한 한 번에 건너뛰는 공식이에요.
  • $q(x_t \mid x_0)$: 같은 공식을 $t$에 적용한 결과예요.

세 가우시안의 곱과 나눔을 정리하면, 결과도 가우시안이에요. 가우시안의 지수부 이차식을 $(x_{t-1})$에 대해 제곱완성하면 평균과 분산이 깔끔하게 떨어져요.

\[q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(\tilde{\mu}_t, \tilde{\beta}_t I)\]

평균은 다음과 같이 나와요 (식 유도는 강의에서도 생략했어요).

\[\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}}\, \epsilon_t\right)\]

여기서 $\epsilon_t$는 $x_0$에서 $x_t$로 갈 때 실제로 더해진 노이즈예요. 즉 “현재 상태 $x_t$에서 실제 더해진 노이즈를 빼고 적절히 스케일하면 이전 상태의 평균”이라는 식이에요. 모델이 할 일은 이 $\epsilon_t$를 추정하는 것뿐이에요.

4단계: 두 가우시안의 KL divergence로 loss를 얻어요

모델 $p_\theta(x_{t-1} \mid x_t)$도 가우시안으로 가정했어요. 그러니 2단계의 KL 항은 결국 두 가우시안 사이의 KL divergence가 돼요. 두 가우시안 $\mathcal{N}(\mu_1, \sigma^2 I)$와 $\mathcal{N}(\mu_2, \sigma^2 I)$의 KL divergence는 유명한 닫힌 형태예요.

\[\text{KL}\Big(\mathcal{N}(\mu_1, \sigma^2 I) \,\|\, \mathcal{N}(\mu_2, \sigma^2 I)\Big) = \frac{\|\mu_1 - \mu_2\|^2}{2\sigma^2}\]

분산이 같다면 결국 평균의 차이의 제곱에 비례해요. DDPM 논문에서는 모델의 분산을 고정값으로 두고, 평균만 학습하도록 설계했어요. 그리고 평균 자체를 직접 예측하는 대신, 평균을 다시 파라미터화해서 노이즈를 예측하도록 바꿨어요. 3단계의 $\tilde{\mu}_t$ 식을 보면 알 수 있듯이, $\epsilon_t$만 맞추면 평균은 자동으로 맞아요.

두 평균을 정리해볼게요. 먼저 $\mu_1$은 3단계에서 유도한 $\tilde{\mu}_ t$예요. 이 값은 학습 과정에서 실제로 더해진 노이즈 $\epsilon$을 이용해 계산돼요. $\mu_2$는 모델이 예측한 평균 $\mu_\theta$예요. 이 값은 모델이 예측한 노이즈 $\epsilon_\theta$를 같은 공식에 대입해서 만들어요.

\[\mu_1 = \tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}}\, \epsilon\right)\] \[\mu_2 = \mu_\theta = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}}\, \epsilon_\theta\right)\]

두 식은 노이즈 자리에 들어가는 값만 다르고 나머지는 완전히 같아요. 그래서 둘의 차이를 구하면 $x_t$ 항과 $\frac{1}{\sqrt{\alpha_t}}$ 배율이 깨끗하게 상쇄되고, 노이즈의 차이 $\epsilon - \epsilon_\theta$에 비례하는 항만 남아요.

\[\mu_1 - \mu_2 = \frac{1}{\sqrt{\alpha_t}} \cdot \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot (\epsilon - \epsilon_\theta)\]

이 차이를 KL 공식에 대입하면 $|\mu_1 - \mu_2|^2$이 결국 $|\epsilon - \epsilon_\theta|^2$에 어떤 상수 계수를 곱한 형태가 돼요. 모델 학습에서 상수 계수는 최적화 방향에 영향을 주지 않아서 통째로 생략해도 괜찮아요. 이렇게 모든 상수를 떼어내고 남은 최종 loss는 놀랄 만큼 단순해요.

\[x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon\] \[\mathcal{L}_{\text{DDPM}} = \mathbb{E}_{t, x_0, \epsilon}\left[\left\| \epsilon_\theta(x_t, t) - \epsilon \right\|^2\right]\]

조건은 다음과 같아요.

\[t \sim \mathcal{U}\{1, T\}, \qquad x_0 \sim q_0(x_0), \qquad \epsilon \sim \mathcal{N}(0, I)\]

시점 $t$는 균등 분포에서, 이미지 $x_0$는 데이터에서, 노이즈 $\epsilon$은 표준 가우시안에서 뽑아요. 모델은 노이즈 섞인 이미지 $x_t$와 시점 $t$를 입력받아, 추가된 노이즈 $\epsilon$을 맞히도록 학습돼요. 복잡한 변분 추론이 뒤에 숨어 있지만, 실제 loss는 평범한 MSE 하나예요.

학습은 단순한 노이즈 맞추기예요

4단계에서 유도한 loss 식을 그대로 학습 루틴으로 바꾸면 이런 흐름이에요.

  1. 데이터에서 깨끗한 이미지 $x_0$를 하나 뽑아요.
  2. 시점 $t$를 ${1, \ldots, T}$에서 균등하게 뽑아요.
  3. 표준 가우시안에서 노이즈 $\epsilon$을 뽑아요.
  4. 한 번에 건너뛰는 공식 $x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon$으로 노이즈 이미지를 만들어요.
  5. 모델에 $(x_t, t)$를 넣어 예측 노이즈 $\epsilon_\theta(x_t, t)$를 얻어요.
  6. 예측 노이즈와 실제 $\epsilon$ 사이의 제곱오차를 계산하고 역전파해요.

모델 구조는 보통 U-Net을 써요. 이미지와 같은 크기의 노이즈를 예측해야 하니 encoder-decoder 구조에 skip connection이 있는 U-Net이 자연스러워요. 시점 $t$는 sinusoidal embedding으로 벡터화해서 모델 중간에 주입해요.

추론은 노이즈에서부터 거꾸로 걸어요

학습이 끝나면 순수 노이즈 $x_T \sim \mathcal{N}(0, I)$에서 시작해 한 스텝씩 거꾸로 내려와요. 업데이트 공식은 다음과 같아요.

\[x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}}\, \epsilon_\theta(x_t, t)\right) + \sigma_t z, \qquad z \sim \mathcal{N}(0, I)\]

복잡해 보이지만 각 부분의 역할을 따라가면 읽을 수 있어요.

  • 괄호 안의 뺄셈: 현재 $x_t$에서 예측한 노이즈 $\epsilon_\theta(x_t, t)$를 적당히 스케일해 빼는 부분이에요. 이게 “노이즈를 깎아낸다”는 직관에 해당해요. 3단계에서 유도한 $\tilde{\mu}_t$ 식과 완전히 같은 구조예요.
  • 앞의 $\frac{1}{\sqrt{\alpha_t}}$ 배율: 신호의 크기를 원래대로 되돌리는 역할이에요. Forward에서 $\sqrt{\alpha_t}$배로 줄였으니 역방향에서는 그 역수만큼 키워요.
  • 뒤의 $\sigma_t z$: 무작위성을 약간 다시 주입해요. ELBO 유도 과정에서 $p_\theta$를 가우시안으로 가정했기 때문에, 평균만 찍지 않고 샘플링을 해야 분포 전체를 제대로 흉내내게 돼요. 다만 마지막 스텝에서는 이 항을 제거하고 평균만 취해요.

이 과정을 $t = T, T-1, \ldots, 1$까지 반복하면 최종 이미지 $x_0$를 얻어요. 매 스텝마다 모델 $\epsilon_\theta$를 한 번씩 호출해야 해요.

DDPM은 추론이 너무 느려요

지금까지 설명한 접근이 바로 DDPM (Denoising Diffusion Probabilistic Models) 이에요. Ho et al. (2020)의 기념비적인 논문이에요. 학습은 단순하지만 추론이 느리다는 단점이 있어요.

  • 보통 $T = 1000$ 스텝 전체를 순회해야 해요.
  • VAE나 GAN이 한 번의 forward pass로 끝나는 것에 비해 수백~수천 배 느려요.
  • 고해상도 이미지 한 장에 수 분이 걸릴 수 있어요.

그럼 스텝을 건너뛰면 되지 않을까요? 순진하게 해보면 큰 점프 + 무작위성의 조합이 품질을 망가뜨려요. 이유는 두 가지예요. 첫째, 스텝 간격이 커지면 가우시안으로 근사했던 가정이 깨져요. 한 스텝이 작을 때는 역방향이 거의 가우시안이지만, 간격이 커지면 실제 분포가 멀티모달이 돼요. 둘째, 매 스텝마다 주입되는 $\sigma_t z$ 노이즈가 누적되면서 경로가 심하게 흔들려요. 즉 큰 점프를 원한다면 무작위성부터 제거해야 한다는 아이디어가 나와요.

DDIM으로 추론을 가속해요

DDIM 시간과 step 관계

DDIM (Denoising Diffusion Implicit Models) 은 Song et al. (2020)이 제안한 가속 기법이에요. 핵심 아이디어는 두 가지예요.

  1. 무작위성을 제거해요. $\sigma_t = 0$으로 두면 샘플링이 결정론적이에요.
  2. 스텝을 건너뛰어요. 무작위성이 없으면 큰 점프를 해도 품질 손상이 훨씬 적아요.

DDIM의 출발점은 흥미로운 관찰이에요. ELBO의 loss 식을 다시 보면 주변 분포 $q(x_t \mid x_0)$에만 의존하고, 스텝 간 조건부 $q(x_t \mid x_{t-1})$에는 의존하지 않아요. 같은 주변 분포를 유지하는 다른 경로를 만들어도 학습된 모델을 그대로 쓸 수 있다는 뜻이에요. 재학습이 필요 없어요.

이 자유도를 이용해 결정론적인 reverse process를 설계할 수 있어요. 핵심은 “현재 $x_t$에서 깨끗한 이미지 $\hat{x}_ 0$을 먼저 예측하고, 그 $\hat{x}_ 0$을 이용해 $x_{t-1}$을 계산하는” 순서예요.

$\hat{x}_0$을 예측해요

한 번에 건너뛰는 공식을 다시 꺼내요.

\[x_t = \sqrt{\bar{\alpha}_t}\, x_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon\]

이걸 $x_0$에 대해 풀면 다음과 같아요.

\[x_0 = \frac{x_t - \sqrt{1 - \bar{\alpha}_t}\, \epsilon}{\sqrt{\bar{\alpha}_t}}\]

모델이 예측한 $\epsilon_\theta(x_t, t)$를 $\epsilon$ 자리에 넣으면, 현재 $x_t$에서 바라보는 깨끗한 이미지 추정치 $\hat{x}_0$가 돼요.

\[\hat{x}_0(x_t, t) = \frac{x_t - \sqrt{1 - \bar{\alpha}_t}\, \epsilon_\theta(x_t, t)}{\sqrt{\bar{\alpha}_t}}\]

매 스텝마다 모델이 예측한 $\hat{x}_0$은 조금씩 달라져요. 처음에는 흐릿한 평균 이미지지만, 점점 선명해지면서 최종 결과에 수렴해요.

$x_{t-1}$로 결정적으로 이동해요

$\hat{x}_ 0$을 안다면 $x_{t-1}$은 다시 한 번에 건너뛰는 공식으로 만들 수 있어요. 단, 이번에는 무작위 노이즈 대신 모델이 예측한 $\epsilon_\theta$를 그대로 재사용해요.

\[x_{t-1} = \sqrt{\bar{\alpha}_{t-1}}\, \hat{x}_0(x_t, t) + \sqrt{1 - \bar{\alpha}_{t-1}}\, \epsilon_\theta(x_t, t)\]

이 식에는 가우시안 샘플링이 없어요. $x_t$가 주어지면 $x_{t-1}$이 유일하게 결정돼요. 같은 $x_T$에서 출발하면 항상 같은 이미지가 나와요. 이 성질 덕분에 latent 공간을 interpolation 하거나, 특정 이미지의 latent를 역으로 찾는 작업이 가능해져요.

스텝을 건너뛰어요

결정적 업데이트라면 굳이 $T$ 스텝을 모두 거칠 필요가 없어요. 전체 $T$ 스텝 중에서 부분 수열 $\tau_0 = 0 < \tau_1 < \cdots < \tau_S = T$를 골라, $S \ll T$개의 스텝만 돌려요. 업데이트는 다음과 같아요.

\[x_{\tau_{i-1}} = \sqrt{\bar{\alpha}_{\tau_{i-1}}}\, \hat{x}_0(x_{\tau_i}, \tau_i) + \sqrt{1 - \bar{\alpha}_{\tau_{i-1}}}\, \epsilon_\theta(x_{\tau_i}, \tau_i)\]

$T = 1000$을 $S = 50$으로 줄이면 20배 가속이에요. 선택하는 $\tau$ 스케줄은 하이퍼파라미터예요. 균등 간격으로 뽑거나, 앞쪽을 촘촘하게 뽑는 식으로 조절할 수 있어요.

속도와 품질의 trade-off

CIFAR10 실험에서 가속률에 따른 FID 변화를 측정한 결과를 보면, 10배 가속까지는 품질 손실이 거의 없어요. 반면 100배를 넘어가면 품질이 크게 나빠져요.

가속률 FID 변화
1x baseline
10x +3%
20x +16%
50x +70%
100x +330%

FID(Fréchet Inception Distance)는 생성 이미지의 품질을 재는 지표예요. 작을수록 좋아요. 표의 +%는 기준 대비 얼마나 나빠졌는지를 나타내요.

정리

Diffusion의 큰 그림은 이렇게 요약할 수 있어요.

Forward process는 우리가 설계한 노이즈 추가 과정이고, 가우시안의 성질 덕분에 $x_0$에서 $x_t$로 한 번에 건너뛰는 공식이 존재해요. Reverse process는 학습해야 하는 부분이지만, 로그 가능도가 직접 계산 불가능해서 ELBO라는 하한을 대신 최대화해요. ELBO를 네 단계로 전개하면 두 가우시안 사이의 KL divergence의 합으로 정리되고, 결국 노이즈 예측 MSE라는 단순한 loss로 귀결돼요.

학습한 모델로 추론할 때는 순수 노이즈에서 시작해 $T$ 스텝에 걸쳐 노이즈를 깎아내요. DDPM은 느리지만, DDIM처럼 결정적 경로로 바꾸면 품질 손실 없이 10배 이상 가속할 수 있어요. 같은 모델을 그대로 사용하기 때문에 재학습도 필요 없어요.

수식이 많아 보여도 Diffusion의 아이디어는 한 문장이에요. 노이즈를 예측하도록 학습시키고, 추론할 때는 거꾸로 걸어 내려와요. 변분 추론의 복잡한 외형 뒤에 숨은 이 단순함이 Diffusion의 매력이에요.

참고 자료

  • Ho et al., Denoising Diffusion Probabilistic Models, NeurIPS 2020.
  • Song et al., Denoising Diffusion Implicit Models, ICLR 2021.
  • Stanford CME 296, Diffusion & Large Vision Models, Lecture 1 (Spring 2026).
  • Github, afshinea/stanford-cme-296-diffusion-large-vision-models, MIT License.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.