기본기 다지기

[기본이론] Step-by-Step Diffusion: An Elementary Tutorial (Ch.1)

syveany 2026. 7. 22. 23:56

Diffusion 계열 모델들을 계속 다루면서 내가 뭔가 정확히 알고있지 않은 상태에서 생각을 하려고 하고 있는 것 같아서

차분하게 차근차근 기초부터 다지기로 했다.

지금이 딱 적기이다. 지금 다지지 않으면 한없이 모래성을 쌓게 될 것이므로 빡 집중해서 공부해보기로 했다.

 

아래 pdf를 보고 공부했다.

https://arxiv.org/pdf/2406.08929?

 

1. Fundamentals of Diffusion

Generative modeling의 목표는 미지의 분포 p*(x)에서 나온 i.i.d. 샘플들이 주어졌을 때, 이와 거의 같은 분포에서 새로운 샘플을 생성하는 샘플러를 만드는 것이다. 예를 들어서, p_dog 분포로부터 강아지 이미지 데이터가 주어졌을 때 이 분포로부터 새로운 강아지 이미지를 생성하는 방법을 원하는 것이다.

와 첫 문장부터 어렵다. 이게 무슨 소리람?

알고보니 '거의 같은 분포'라고 표현하는 이유는 그 분포를 정확히 알 수 없기 때문이다. 예를 들어서, 세상에 강아지 이미지는 무수히 많은데 우리가 가진 강아지 사진이 100만장인 경우이다. 강아지 사진이 유한개이므로 세상의 강아지 이미지가 어떤 확률로 나타나는지를 나타내는 실제 분포 p_{dog}를 정확히 알 수 없다.

이 문제를 해결하기 위한 한 가지 큰 방향은, 가우시안 노이즈처럼 샘플링하기 쉬운 분포를 목표 분포 p*로 변환하는 방법을 학습하는 것이다.

되게 clever한 방법이다. 완전한 노이즈에서 한 번에 강아지 이미지를 만드는 것은 어렵지 여러 번의 샘플링을 통해서 차차 강아지 이미지에 다가가는 것이 훨씬 쉽기 때문이다.

Diffusion 모델들은 이러한 변환을 학습하기 위한 general한 framework를 제공한다.

바로 다음에 나오는 gaussian diffusion 예제를 통해서 가장 잘 설명할 수 있다.

 

1.1 Gaussian Diffusion

가우시안 diffusion에서 R^d 차원의 확률변수 x_0가 있다고 하자. 뭐 앞에서 든 예시를 따라서 강아지 이미지라고 할 수 있다.

그 다음에 \eta_t ~ N(0, \sigma^2)인 \eta_t를 연속적으로 더해서 확률변수 $x_1, x_2, ..., x_T$를 만든다. 수식은 아래와 같다.

 

즉, $x_t = x_0 + \sum_{i=0}^{t-1} \eta_i$이다.

이 과정을 forward pass라고 한다. Data 분포를 노이즈 분포로 변환한다.

 

수식에서 $p(x_0, x_1, ..., x_T)$라는 결합분포를 정의할 수 있다.

그리고 특정 timestep t의 x_t만 따로 봤을 때의 주변분포를 p_t라고 한다.

 

T가 충분히 크면 p_T가 거의 가우시안이 됨을 알 수 있다. 그래서 그냥 가우시안 분포에서 샘플링하면 된다.

그림으로 나타내면 아래와 같다.

 

자, 이제 주변분포가 p_t인 샘플이 주어졌을 때, 주변분포가 p_{t-1}인 샘플을 만드는 문제를 해결할 수 있다고 가정하자.

이를 reverse sampler라고 부를 것이다.

Reverse sampler가 있다면 가우시안 샘플에서 시작해서 reverse sampling을 계속 적용해서 최종적으로 p_0=p*에서 샘플을 얻을 수 있을 것이다.

즉 핵심적인 통찰은, diffusion의 각 중간단계를 reverse하는 것이 목표 분포에서 함 번에 샘플링하는 것보다 쉬울 수 있다는 것이다!

여러 가지 방법이 있지만 먼저 일반적 diffusion sampler인 DDPM sampler 부터 보자.

 

이상적인 DDPM sampler는 가장 자연스러운 전략을 택한다.

시간 t에서 input z ~ p_t가 주어졌을 때, 조건부 분포 $p(x_{t-1} | x_t = z)$에서 샘플 하나를 출력한다.

이게 맞는 reverse sampler이긴 한데, 모든 x_t에 대해서 p(x_{t-1} | x_t)를 학습해야 하고 이게 엄청 복잡할 수 있다는 문제가 있다.

근데 만약에 한 step마다 추가하는 노이즈 \sigma가 엄청 작으면 이 조건부 분포가 단순해짐을 알 수 있다. x_t랑 x_{t-1}이 거의 같기 때문이다.

Fact1 (Diffusion Reverse Process).
\sigma가 충분히 작고 식 $x_t = x_0 + \sum_{i=0}^{t-1} \eta_i$을 사용할 때, 조건부 분포 p(x_{t-1} | x_t)는 가우시안 분포에 가까워진다. 즉, 모든 시간 t랑 조건 z에 대해서 어떤 평균 벡터값 \mu가 존재한다.
수식으로 나타내면 아래와 같다.

유도는 2.1에서 할 것이다.

 

이 fact가 문제를 엄청나게 단순하게 만들어준다.

처음부터 임의의 분포 p(x_{t-1} | x_t) 전체를 학습하는 대신 이 분포의 평균만 알아내면 된다!

해당 분포에서 알아야하는 게 평균, 분산인데 분산이 \sigma^2임을 알았기 때문이다. 

이 평균을 \mu_{t-1}(x_t)라고 쓰겠다. 

\sigma가 충분히 작을 때 posterior를 가우시안으로 근사할 수 있다는 사실은 아래 그림에서 보여준다.

 

 

조건부 분포 p(x_{t-1} | x_t)의 평균 E[x_{t-1} | x_t]은 회귀로 구할 수 있다. (엥 어케 구함?)

이는 일반적인 regression loss를 최적화하는 방법으로 구할 수 있다.

 

수식으로 나타내면 아래와 같다.

\mu_{t-1}(z) := E[x_{t-1} | x_t = z]

: 현재 상태 x_t가 z라고 주어졌을 때, 그 이전 상태 x_{t-1}은 평균적으로 무엇이었을지를 \mu_{t-1}(z)라고 부르겠다.

f(x_t): AI가 예측한 사진, x_{t-1}: 한 단계 이전의 실제 상태. x_t보다 노이즈가 조금 덜 낀 데이터

-> f(x_t) - x_{t-1}: 오차

argmin: 가장 작은 값을 만드는 함수를 찾아라

=> \mu_{t-1} = argmin E|| f(x_t) - x_{t-1} ||^2: 평균 제곱 오차가 가장 작아지도록 함수 f를 학습하면 그 출력이 \mu_{t-1}가 된다!

 

이런 회귀 문제는 몇몇 분야에서 이미 잘 연구되어 있다.

만약에 목표 p*가 이미지에 대한 분포라면 해당 회귀 문제는 정확히 이미지 denoising 문제가 되고, CNN과 같은 익숙한 방법으로 해결할 수 있게 된다!

 

지금까지 한 이야기를 정리해보면,

우리는 지금 임의의 복잡한 분포에서 샘플을 생성하는 문제를 일반적인 회귀 문제로 바꾼 것이다!

 

1.2 Diffusions in the Abstract

이제 가우시안 세팅에서 벗어나서 다양한 diffusion-like 모델(e.g. deterministic samplers, discrete domains, flow-matching)을 포함할 수 있도록 추상적인 방식으로 정의해보자.

추상적으로 말하면 diffusion-like 생성모델을 다음과 같이 정의할 수 있다.

목표 분포 p*에서 시작하고, 샘플링하기 쉬운 기본 분포 q(x)를 하나 선택한다. (e.g. 가우시안, 비트)

그 다음에 p*랑 q(x)를 interpolate하는 분포 p_0, p_1, ..., p_T를 만든다. 여기서 p_0=p*이고, p_T=q(x)이다.

그리고 분포 p_t를 p_{t-1}로 바꾸는 reverse sampler를 학습한다.

인접한 분포들이 서로 매우 가깝기 때문에 학습하기가 쉽다.

 

Reverse Sampler를 엄밀하게 정의하면 아래와 같다.

주변분포 p_t가 주어졌을 때, step t에서의 reverse sampler는 잠재적 확률함수 F_t이다.

만약 x_t가 p_t에서 나온 샘플이라면 F_t(x_t)의 주변분포는 정확히 p_{t-1}이 된다!

 

Reverse sampler 종류는 여러 가지가 있다. 심지어 *deterministic한 reverse sampler도 만들 수 있다.

*deterministic하다: 같은 입력이면 항상 같은 출력이 나온다!

그리고 같은 중간분포 p_t가 주어져도 reverse sampler는 하나로 정해지지 않는다.

역으로 되돌리는 방법에는 여러 가지가 가능하기 때문이다!

Section 2.1에서 DDPM sampler, section 3에서 DDIM sampler, section 4에서 flow-matching model들에 대해서 볼 것이다.

 

1.3 Discretization

더 진행하기 전에 p_t랑 p_{t-1}이 'close'하다는 것이 무엇인지를 정확히 하고자 한다.

우리는 p_0, p_1, ..., p_T가 시간에 따라서 변하는 함수 p(x,t)를 discretization한 것으로 생각하고자 한다.

t=0일 때 목표 분포 p_0이고 t=1일 때 노이즈 분포 p_T이다.

수식으로 나타내면 아래와 같다.

T가 클수록 더 close 해진다!

 

p_T가 단계수 T에 영향을 받지 않도록 하기 위해서 (T가 커져도 노이즈는 똑같이 들어가야 하기 때문) 각 단계에서 추가하는 노이즈의 분산도 더 구체적으로 정해야 한다.

그냥 넣으면 x_T ~ N(x_0, T \sigma^2)이기 때문에 그냥 \sigma^2로 맞추기 위해서 표준편차를 $\sigma = \sigma_q \sqrt{\delta t}$로 한다.

 

이제 t는 index가 아니라 time을 나타낸다고 할 수 있다. 예를 들어서 x_t는 discrete time t에서의 x를 나타낸다.

따라서 왼쪽 식이 오른쪽 식처럼 바뀐다.

그리고 아래임을 알 수 있다.

 

 

---

확실히 서사부터 공부하니 기초가 쌓이는 느낌이다.

차근차근 끝까지 공부해보자.

파이팅!