| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- Consistent Video Depth Estimation
- Stable Diffusion #Image generation #Diffusion #AI #Generative model
- CNN
- Link Prediction
- Road network
- CityJSON
- Today
- Total
빙글빙글 돌아가는 바람개비
[Study] Diffusion Sampler - DDPM, DDIM, Euler, DPM 본문
[Sampler] 노이즈를 걷어내는 방법
앞서 살펴봤듯이 Stable Diffusion 은 완전한 잡음에서 시작해 노이즈를 단계적으로 제거하면서 이미지를 만들어낸다. CFG 가 "어느 방향으로 갈지" 를 결정한다면, Sampler 는 "그 방향으로 어떻게 걸어갈지" 를 결정한다. 같은 프롬프트, 같은 시드를 써도 Sampler 만 바꾸면 결과물의 품질과 생성 속도가 눈에 띄게 달라진다.
그런데 애초에 왜 한 번에 노이즈를 다 빼지 않고 굳이 여러 단계를 거쳐야 할까. 그리고 Sampler 의 종류는 왜 이렇게 많을까. 그 이유부터 시작해서 주요 Sampler 들의 핵심 아이디어를 차례로 짚어본다.
1. 왜 한 번에 빼면 안 되는지
"노이즈 예측기가 노이즈를 알아낼 수 있다면, 그냥 한 번에 다 빼버리면 되지 않나" 라고 생각할 수 있다. 막상 해보면 결과는 엉망이 된다.
이유는 학습 방식에 있다. Noise predictor 는 "노이즈가 조금 낀 이미지" 부터 "완전한 잡음" 까지, 다양한 노이즈 수준에서 노이즈를 예측하도록 학습됐다. 완전한 잡음 상태에서 한 번에 최종 이미지를 뽑아내는 건 모델이 한 번도 본 적 없는 작업이다.
따라서 노이즈를 여러 단계에 걸쳐 조금씩 제거해 나가야 한다. 각 단계에서 "지금 이 노이즈 수준에서 어느 방향으로 가야 하나" 를 다시 계산하면서 점진적으로 수렴한다. Sampler 는 이 단계별 계산 방식을 정의하는 알고리즘이다.
2. DDPM — 원조 방식
2020년에 처음 제안된 DDPM (Denoising Diffusion Probabilistic Models) 은 가장 단순하고 이론적으로 충실한 방식이다. 아이디어 자체는 직관적이다. Forward diffusion 에서 노이즈를 1,000단계에 걸쳐 더했으니, 역방향도 정확히 1,000단계에 걸쳐 빼낸다.
각 스텝에서 노이즈 예측기가 "지금 섞인 노이즈가 이것이다" 라고 예측하면, 그만큼을 빼고 다음 스텝으로 넘어간다. 이때 매 스텝마다 약간의 무작위 노이즈를 다시 더한다. 노이즈를 완전히 제거하지 않고 확률적으로 조금씩 이동하는 방식이 이론적으로 더 안정적인 결과를 만들어낸다.
문제는 단점도 명확하다는 점이다.
- 1,000 스텝이 필요하다. 매 스텝 U-Net 을 한 번씩 실행하므로, 이미지 한 장을 만드는 데 U-Net 을 1,000 번 돌려야 한다.
- 스텝을 줄이면 품질이 급격히 떨어진다. 매 스텝 무작위성이 개입하는 구조라, 스텝을 건너뛰면 이론적 토대가 무너진다.
- 같은 시드도 매번 다른 결과가 나온다. 각 스텝에서 노이즈를 다시 더하는 확률적 구조 때문에 동일한 결과를 재현하기 어렵다.
3. DDIM — 스텝을 건너뛰면서 생성하기
2020년 말에 제안된 DDIM (Denoising Diffusion Implicit Models) 은 DDPM 의 속도 문제를 해결한 첫 번째 큰 도약이다. 핵심 아이디어는 단순하다. 매 스텝 노이즈를 다시 더하는 과정을 없앤다.
DDPM 은 각 스텝에서 노이즈를 빼고 나서 다시 조금 더한다. 이 "다시 더하기" 가 스텝을 건너뛸 수 없게 만드는 주범이다. DDIM 은 이 과정을 통째로 빼버리고, 디노이징을 완전히 결정론적(deterministic) 으로 만들었다.
결정론적이라는 건, 같은 시작 노이즈(시드) 와 같은 프롬프트를 주면 항상 동일한 이미지가 나온다는 뜻이다. 중간 과정에 무작위성이 끼어들지 않으니까. 이 덕분에 시드 값이 이미지의 스타일을 고정하는 수단으로 쓰일 수 있게 됐다.
무작위성이 사라지자 또 하나의 효과가 따라왔다. 매 스텝마다 노이즈를 빼고 다시 더하던 DDPM 은 보폭이 작을 때만 그 빼고 더하는 양의 균형이 맞는 구조였다. 한 번에 두세 스텝치를 건너뛰면 그 비율이 어긋나서 결과가 망가진다. DDIM 은 노이즈를 빼기만 하기 때문에 이런 균형 문제가 없다. 보폭을 키워 한 번에 여러 스텝만큼 점프해도 같은 경로를 따라간다. 1,000 스텝을 다 밟지 않고 20 ~ 50 스텝만 밟아도 좋은 이미지가 나온다.
DDIM 이 가져다준 또 다른 능력이 있다. 이미지를 다시 잠재 공간의 노이즈로 되돌리는 것(DDIM Inversion) 이 가능해진 것이다. 결정론적이라 생성 과정을 정확히 역으로 추적할 수 있다. img2img 나 이미지 편집 기능이 여기에 기반한다.
4. Euler 와 DPM-Solver
DDIM 이 속도 문제를 크게 개선했지만, 연구자들은 거기서 멈추지 않았다. 디노이징 과정 전체를 미분방정식(ODE) 풀기 라는 수학적 관점으로 다시 보기 시작한 것이다. 노이즈가 가득한 상태에서 깨끗한 이미지로 이동하는 경로 자체가 하나의 연속적인 방정식으로 표현된다는 시각이다.
이 관점에서 보면 DDPM 과 DDIM 은 둘 다 수치해석의 "Euler 방법" 에 해당한다. Euler 방법은 현재 지점의 기울기(U-Net 이 예측한 노이즈 방향) 하나만 보고 다음 지점으로 이동하는 가장 단순한 방식이다. 단순한 만큼 오차가 크고, 오차를 줄이려면 보폭을 작게 — 즉 스텝을 많이 — 가져가야 한다.
Euler — 단순하지만 직관적
Stable Diffusion 의 Euler Sampler 는 이 Euler 방법을 그대로 디노이징에 가져다 쓴 것이다. 각 스텝에서 U-Net 이 예측한 방향으로 한 걸음씩 이동한다. 구조가 단순해서 구현이 쉽고 동작이 예측 가능하며, 20 스텝 정도면 안정적인 결과가 나온다.
이름 뒤에 "a" 가 붙는 Euler a (ancestral) 는 매 스텝 이동 후 DDPM 처럼 약간의 무작위 노이즈를 다시 더한다. 결정론적이지 않아서 같은 시드라도 스텝 수를 바꾸면 결과가 달라지지만, 그만큼 더 다양하고 창의적인 결과가 나온다. 아이디어를 탐색할 때 유리하다.
DPM-Solver
DPM-Solver 는 Euler 방법의 한계를 극복하려고 수치해석의 더 고급 기법을 끌어왔다. Euler 가 현재 지점의 기울기 하나만 보고 이동한다면, DPM-Solver 는 여러 지점의 기울기를 함께 참조해서 더 정확한 경로를 계산한다.
| Sampler | 이동 방식 |
|---|---|
| Euler | 현재 지점에서 기울기를 한 번 계산하고 그 방향으로 이동한다. 단순하지만 보폭이 클수록 실제 경로에서 벗어난다. |
| DPM-Solver | 중간 지점들의 기울기까지 미리 계산해 가중 평균을 낸다. 실제 경로에 훨씬 가깝게 이동할 수 있어서, 같은 스텝 수에서도 오차가 작다. |
Euler 는 "일단 기울어진 방향으로 걷는다", DPM-Solver 는 "조금 걷다가 다시 방향을 확인하고, 그걸 종합해서 실제로 이동한다" 라고 이해하면 된다. 덕분에 DPM-Solver 는 10~15 스텝만으로도 Euler 20~25 스텝과 비슷하거나 더 나은 품질을 낸다.
현재 가장 널리 쓰이는 DPM-Solver++ 는 여기서 한 발 더 나아간 개선판이다. 디노이징 경로의 수학적 구조를 분석해 오차를 더 줄였다. 스텝이 적을수록 Euler 대비 차이가 더 두드러진다.
그렇다고 무조건 DPM-Solver++ 가 정답인 건 아니다. 스텝이 충분히 많아지면(30 스텝 이상) 둘의 차이는 거의 사라진다. 스텝이 적을수록 DPM-Solver++ 의 이점이 커지는 구조다. Euler 는 구조가 단순해서 특정 모델이나 LoRA 와 궁합이 더 잘 맞는 경우도 있다.
'Image Generation > Study' 카테고리의 다른 글
| [Study] ControlNet으로 이미지 제어하기 (0) | 2026.03.20 |
|---|---|
| [Study] Textual Inversion의 원리 (0) | 2026.03.18 |
| [Study] LoRA(Low-Rank Adaptation)를 이용한 스타일 학습 (0) | 2026.03.17 |
| [Study] Classifier-Free Guidance의 원리 (0) | 2026.03.15 |
| [Study] Stable Diffusion 동작 원리 (0) | 2026.03.13 |