🤖 Deep Learning
Denoising Diffusion Probabilistic Models (DDPM)
date
Jul 2, 2025
slug
ddpm
author

status
Public
tags
Deep Learning
Generative Models
Diffusion Models
summary
Noise를 한 번에 추가하고, 한 스텝씩 걷어내는 방법
type
Post
thumbnail
category
🤖 Deep Learning
updatedAt
Jul 3, 2025 02:00 AM
Denoising Diffusion Probabailistic Models (DDPM)

Introduction

- GAN: 를 가지고 이미지를 만들어내면, 그 이미지랑 실제 이미지를 가지고 discriminator가 진짜인지 아닌지 판단
- VAE: 기본적으로 AE니까 encoder를 이용해 를 만들었다가 decoder를 이용해 을 만들어 내는 구조
- Diffusion: 열역학 제 2법칙(엔트로피가 점점 증가한다. 즉, 자연은 무질서해지는 방향으로 이동한다)과 비슷함. 픽셀마다 noise를 더해주거나 빼주거나 하는 작업을 1000번을 함.
Forward (Diffusion) Process

- : 가 주어졌을 때, 부터 까지 순차적으로 만드는 것은 : 전 단계 이 주어졌을 때, 다음 단계 를 만드는데 라는 분포를 사용한다.
- 는 정규 분포를 따르는데, 평균은 전 단계 에 어떤 가중치 가 붙어있는 값이고 분산은 를 가짐.
- 만약 가 0이라면 이전 단계와 같아지며, 반대로 1이라면 완전 noise가 될 것. 즉, 가 커질 수록 noise가 커짐.

- 대신 을 넣으면 가 되고, 이걸 까지 함.
- Gaussian 분포에서 분산이 다를 때 merge 시키면 초록색 상자와 같이 분산끼리만 합쳐진 것처럼 정리가 됨.
- 최종 부터 까지 다 noise를 추가했을 때의 분포가 에서 1스텝 추가했을 때와 식의 형태가 똑같음. (그냥 값들만 다 곱해주면 됨!)
- 를 Diffusion kernel이라고 부름. (생성이 아니라 noise 추가하는 함수)
⇒ 한 번에 그냥 noise 추가하고 sampling 하면 똑같다.
Reverse (Denoising) Process

- 사실 원하는 건 에서 로 거꾸로 가는 를 알고 싶음.
- 왜냐면 한 번에 에서 으로 가는 건 열역학 제 2법칙에 위배되므로 너무 어려움. 그러나 에서 한 단계 noise 걷어내는 정도는 해볼만 함.
- 는 평균 0, 분산 인 정규 분포를 따르는데, 그 중에서 하나를 샘플링해서 한 단계씩만 denoising 한 들을 다 곱하면 0부터 까지 다 복원이 될 것 이다. ==
⇒ : 최종적으로 한 단계 denoising한 은 어떤 평균과 분산을 따르는 분포를 갖는데, 그걸 를 가지고 추론을 해보자

- 목표: 실제 세상에서 이미지()가 나올 확률 구하기
⇒ 결국 를 최소화 하면, 우리가 원하는 목표도 같이 optimize 될 것

- 분자: 1에서 까지 noise 추가하는 forward 과정, 분모: 에서 0까지 denoising하는 reverse 과정
- 파란 부분에 약간의 트릭이 필요함. 가 뜬금없이 조건으로 주어지는데 만약 가 주어지지 않으면 3가지 다 알 수가 없음(열역학 제 2법칙 위배). 그런데 원래 이미지()가 주어지고 1스텝만 걷어내 봐는 할만 할 것 같음. (실제로 이 주어지지 않으면 잘 안 된다고 함)
- 정의랑 마지막 그대로 쓰면 최종 식이 됨.

- 그래서 이걸 최소화 하면 우리가 원하는 이 세상에 이미지가 존재할 확률의 확률을 최적화 할 수 있음.
- 노란색 term: 학습할 수 있는 parameter가 없음
- 파란색 term: 별도의 Gaussian sample 만들어서 하면 해결이 된다고 함
- 빨간색 term: 에서 로 denoising하는 를 실제 로 근사하는 것

- 는 noise를 추가하는 과정이므로 앞에서 정의한 diffusion kernel 사용 후 정규 분포 미분한 것 (※ 정규 분포 미분 참고: PDF)
- 모델링 하고자 하는 것이 이니까 으로 묶음
⇒ 결국 Gaussian 분포 3개를 → Gaussian 분포 1개로 만들고 싶어서 하는 것

- 먼저 완전 제곱꼴로 만들건데, 정규 분포랑 같은 형태임
- 그리고 를 완전 제곱꼴로 만드는 공식 적용하면 와 를 구할 수 있음
- 지금 를 구하는 이유는 를 (를 받지 않는) 알고 싶기 때문이므로 를 없애고 싶어서 diffusion kernel을 사용
⇒ 에다가 어떤 noise 만큼 더해주고 상수배 해주면 이 됨 (즉, 배워야 되는 평균과 분산의 문제가 나온 것임)

- Optimize하려고 했던 loss function에서, 노란 부분이 위에서 구한 것임
- 모델 이 정답에 근사하게 하고자 하는 게 목적

- 다시 정리하자면, 가 주어졌을 때 로 한 단계 noise 걷어내는 걸 하고 싶은 건데 ( )
정답으로 삼을 건 까지 추가로 주어졌을 때, 한 번 걷어낸 것이고 ( )
그걸 을 통해 minimize 시키는 것
- 정의대로 변환하고, 정답에서 나온 평균과 예측한 평균에 각각 대입
- 는 noise 시점까지 더해준 거니까 그냥 forward process 그대로 전치해주고,
- 앞에 상수항이 나올 건데, 이게 수학적으로 알맞지(?) 않아서 실제로도 저것 때문에 불안정하다고 함 → 그냥 무시하고 뒤에만 minimize하니까 더 잘 되더라~
이제 noise 를 예측하면 됨
⇒ input은 부터 noise가 추가되어왔던 1. 이미지와 몇 번째 단계인지를 알려주는 2.
이걸 가지고 단계에서 얼만큼 noise가 추가 됐는지 찾아내는 모델

- input과 output 크기가 같아야 하고 같은 noise 만큼 제거해야 하기 때문에 U-Net이 잘맞는 fit임
- 하나의 모델을 가지고 모든 스텝에 대해서 해줘야 하기 때문에, 시간에 대한 representation 배워서 넣는 거 하나만 추가



- 너무 오래 걸리더라
Score-Based Generative Modeling with Stochastic Differential Equations (SDEs)


- Score matching: Data의 manifold에 있는 분포를 gradient를 가지고 모델링을 해서 어디서 출발하든 데이터가 모여 있는 방향으로 이동할 수 있는 지형도를 만들고, Langevin dynamics를 이용해서 sampling하는 방법
- DDPM: 매번 정답이 되는 noise를 맞춰서 제거하는 방법

- 둘이 전혀 다른 것 같은데 알고 보니 서로 비슷한 방법임!
- NCSN 식에 DDPM의 식 을 대입 → DDPM Loss function과 비슷해지네?

- 반대로 DDPM에서 출발해도 마찬가지
⇒ 철학은 거의 똑같다!


