https://arxiv.org/abs/2006.11239
Denoising Diffusion Probabilistic Models
We present high quality image synthesis results using diffusion probabilistic models, a class of latent variable models inspired by considerations from nonequilibrium thermodynamics. Our best results are obtained by training on a weighted variational bound
arxiv.org
요즘 핫한 Diffusion model에 대해 알아보도록 하자. 본 포스팅은
https://www.youtube.com/watch?v=_JQSMhqXw-4
를 참고한다.
Diffusion이란?
- Diffusion(확산)은 사전적인 의미로 동역학에서 특정한 물질이 조금씩 번지며 같은 농도로 바뀌는 현상을 말한다.
- 2015년 ICML에서 발표되었던 Deep Unsupervised Learning using Nonequilibrium Thermodynamics 에서 처음으로 비지도학습을 위한 방법론으로 활용되었다.

그림에서 볼 수 있듯이 이미지가 시간이 지나면서 noise(Guassian noise)로 변환하는데 이를 diffusion process 라고 한다.
Prerequisite
- Markov chain
Markov chain은 Markov 성질을 갖는 이산 확률과정이다.
Markov 성질은 특정 상태의 확률 (t+1)은 오직 현재(t)의 상태에 의존한다 라는 것을 의미하고, 이산 확률 과정은 말 그대로 이산적인 시간(0sec,1sec,2sec,... ) 속에서의 확률적 현상을 의미한다.
이 말은 현재 상태 (t)는 그 전의 상태(t-1)을 따르며 이를 반복하여 다음과 같은 식이 도출된다.
와 같이 나타낼 수 있다. 이러한 markov chain에 대한 예시는 일상생활에서도 많이 쓰는 말처럼
"내일의 날씨는 오늘의 날씨만 보고 알 수 있다" 라는 말과 같다. 이는 즉, 내일의 날씨는 오로지 오늘의 날씨만을 조건부로 하는 확률적인 과정인 것이다.
- Normalizing Flow
Normalizing flow는 심층 신경망 기반의 확률적 생성 모형 중 하나이다. latent variable Z 기반의 확률적 생성모형으로 latent variable Z를 얻기 위하여 변수 변환 공식을 활용한다. 변수 변환 공식은 다음의 식을 따른다.
변수 변환은 입력 데이터 샘플 x를 사전에 정의한 prior 분포(ex. gaussian distribution)로 mappping을 하여 latent variable의 분포 z를 추론하는 함수 f를 학습하는 방식으로 진행된다. 이러한 학습은 한 번에 학습이 되는 것이 아니라 단계별로 학습을 하여 z를 모델링한다. 이와 반대로 inverse를 하여 z에서 원본 x로 복원을 한다.

Overview of Generative models

GAN은 adversarial training으로 generator와 discriminator의 minmax 를 통해 학습.
VAE는 variational lower bound를 maximize하는 방향으로 학습
flow based models은 앞서 언급한 normalizing flow로 생각하면 되고, 마지막 diffusion model은 점진적으로 guassian noise를 추가하고 이를 반대로 복원하는 작업이다.
diffusion 모델은 iterative 변화를 활용한다는 점에서 flow based model과 유사하고, 분포에 대한 변분추론을 통해 학습을 진행한다는 점에서 VAE와 유사하다.
최근엔 adversarial training을 활용한 Diffusion-GAN의 방법도 생겨났다.
Overview of Generative models
대부분의 generative model은 latent variable로 생성과정을 시작한다. simple한 sample을 input으로 받아서 학습된 모델을 통해 특성한 패턴의 distribution을 따르게 한다.

결국 generative model은 input으로 매우 간단한 분포(Z)를 필요로 하고, 이를 통해 특정한 패턴을 갖는 분포로 변환하는 과정(mapping,m transformation, sampling) 하는 것이다. 따라서 대부분의 generative model은 주어진 input data로 부터 latent variable(Z)를 얻어내고, 이를 변환하는 역량을 학습하고자 한다.
이러한 과정을 각각 모델에 따라 어떻게 학습 전략을 세우는지 알아보자.
- VAE
VAE는 학습된 Decoder를 통해 latent variable을 target distribution으로 mapping한다. 여기에 VAE는 Encoder를 추가하여 Latent variable , Encoder, Decoder를 모두 학습한다.
VAE는 likelihood를 maximize하는 방향으로 학습을 한다.
VAE에 대한 식은 Encoder에선
따라서
를 극대화하는 방향으로 학습을 하는 것이다.

- GAN
GAN도 마찬가지로 simple 한 latent variable을 특정한 데이터로 변화시키고자 하고, 이를 위해 학습된 Generator가 사용된다. 즉, 학습된 Generator를 통해 latent variable을 특정한 패턴의 분포로 mapping 하는 것이 목표이다. 이러한 Generator를 학습시키기 위해 Discriminator를 이용하여 Generator에서 나온 분포와 실제분포와 맞는지를 판단한다. 따라서 Generator와 Discriminator의 균형을 맞추는 방향으로 학습을 하는 것이 GAN이다.

- Flow-based Model (Normalizing flow)
normalizing flow도 비교적 간단한 prior distribution을 복잡한 패턴으로 변화시키고자 한다. 이를 위해 학습한 function의 inverse가 활용이 된다. 그리고 이러한 inverse function을 chain 형태로 곱해주는데 이를 flow라고 칭한다. 이러한 inverse function을 학습하기 위해 invertible function을 학습한다.
즉, 정리하자면 flow based model은 inverse mapping을 통해 latent variable을 특정한 패턴의 분포로 mapping 시켜서 새로운 것을 generation을 하기 위한 목적이고, inverse mapping에 활용하는 function을 학습하기 위해 invertible function을 학습시킨다.

- Diffusion-based generative model
diffusion도 마찬가지로 prior distribution을 특정한 분포로 만드는 function이 필요하다. 아래의 그림처럼
diffusion 모델은 다른 모델과 달리 특정한 분포 x에서 latent variable로 가는 과정을 따로 학습하지 않는다. 학습 대신, 사전에 정의된 noise 삽입과정으로 latent variable을 만든다. 따라서 diffusion process 가 아닌 sampling process에서만 학습을 한다.

diffusion process와 sample process 모두 chain으로 이루어져 있고, 이는 모두 markov chain 과정을 따른다. ddpm에선 약 1000번의 step으로 학습을 한다.
이제 Diffusion 모델에 대해 더욱 자세히 알아보도록 하자.
Diffusion Model (Overview)
diffusion 모델은 학습된 데이터의 패턴을 latent variable로 생성해내는 모델이다. 이를 위해 학습된 데이터의 패턴을 학습을 한다. 이러한 패턴을 학습하기 위해 먼저 noise를 삽입(Nosing)하면서 패턴을 무너트리고(Diffusion Process), 그리고 이를 다시 복원(Denosing)하는 조건부 probability distribution function을 학습(reverse process)한다.
이러한 과정을 간단하게 식으로 나타내면
을 따라 원래의 이미지를 조건으로 받는 조건부 분포를 나타내고, Reverse Process(RP 라고 자의적으로 표현)
로 noise가 낀 이미지를 조건으로 받는 조건부 분포로 나타낸다.
앞서, diffusion process는 따로 학습을 안해도 된다고 언급하였다. 이 이유는 t-1 시점을 조건으로 gaussian noise를 주입한 t 시점의 분포는 사전에 정의한 noise에 따라 형성이 되기 때문이다.
그러면 diffusion process(
cf)
그러면 reverse process 는 어떻게 학습을 할까?
이를 학습하기 위해 q와 비슷한
로 정의되고
정리하자면 diffusion process와 reverse process 모두 조건부 guassian distribution을 바탕으로 하는 markov chain이 되는 것이다.
Diffusion Model (Forward)
diffusion process는 gaussian noise를 점진적으로 주입하는 과정이다. 이는 조건부 guassian
이러한
위 식으로부터 알 수 있듯이 noise의 크기
이러한
import torch
def make_beta_schedule(schedule='linear', n_timesteps = 1000, start = 1e-4, end = 0.02):
if schedule == 'linear':
betas = torch.linspace(start,end, n_timesteps)
elif schedule == 'quad':
betas = torch.linspace(start**0.5, end**0.5, n_timesteps)**2
elif schedule == 'sigmoid':
betas = torch.linspace(-6,6,n_timesteps)
betas = torch.sigmoid(betas * (end-start) + start
retrun betas
다시 돌아와서 gaussian noise를 점진적으로 주입하는 과정이 diffusion process이다. 앞서 본 식에서 VAE의 reparameterization trick 을 사용한다.
으로 나타낼 수 있다. 따라서 이를 코드로 나타내면
import torch
def forward_process(x_start, n_steps,noise=None):
x_sequence = [x_start]
for n in range(n_steps):
beta_t = noise[n]
x_t_1 = x_sequence[-1]
epsilon_t_1 = torch.rand_like(x_t_1)
x_t = (torch.sqrt(1-beta_t) * x_t_1) + (torch.sqrt(beta_t) * epsilon_t_1)
x_sequence.append(x_t)
return x_sequence
다음과 같이 나타내진다. 여기서 x_start 는 dataset의 start step (

위 그림은 diffusion model을 latent variable의 관점에서 바라본 것이다. gaussian noise를 한 번 주입할 때의 모든 이미지들을 latent variable로 취급한다. 따라서 다수의 latent variable이 있다는 점에서 이는 Hierarchical VAE와 유사한 접근 방식을 사용한다고 볼 수 있다. 즉, 이는 초기 이미지인
Diffusion Model (Reverse)
Reverse process 는 diffusion process의 역과정으로 삽입한 noise들을 제거하여 특정한 패턴을 만들어가는 과정이다.
diffusion process는 우리가 알고 있는 분포였지만(gaussian distribution) , reverse distribution은 우리가 모르는 조건부 가우시안 분포라는 점이 가장 큰 차이다. 분포자체를 알 수 없기 때문에 각 시점의 guassian 분포의 평균
식을 보면
를 따르고 여기서
즉, model의 output은 평균과 분산이 되어야한다. 결국 이러한 모델이 학습하여 나오는 output들은 각 t 시점에서
이에 따른 코드는 다음과 같다.
def p_mean_variance(model, x, t):
out = model(x,t.to(device))
mean, log_var = torch.split(out, 2, dim=1)
var = torch.exp(log_var)
return mean, var
그럼 이러한 reverse process의 loss function은 어떻게 될까
결론부터 말하자면 Negative log likelihood가 되고 이를 최대화하는 것이 diffusion model의 목적식이다.
loss를 살펴보면 다음의 그림과 같다.

이에 대한 자세한 도출은 https://developers-shack.tistory.com/8 을 참고해야된다. (나중에 참고해서 올릴 예정)
diffusion loss는 VAE loss와 비교 되는데, 이를 위해 VAE와 diffusion에 대한 모델 구조를 비교하면 다음 그림과 같다.

VAE는 하나의 latent variable을 이용하여 X를 복원하는 것이고, Diffusion 모델은 반복적으로 설명한 것과 같이 markov chain으로 여러 latent variable을 이용하여 X를 복원하는 것이다. 이러한 차이는 결국 loss에 대한 차이로 이어진다.

VAE는 reconstruction loss와 regularization loss로 나눠져 있다. 결국 X' 를 복원하는 것이 reconstruction이고 최종적인 latent variable을 구성하는것이 regularization이다. 따라서 VAE의 loss는
로 구성되어 있는데 KLD 부분이 Encoder의 regularization 부분이고, Expectation 부분이 reconstruction 부분이다.
이와 유사하게 diffusion 모델의 loss는

이렇게 구성되어 있는데 VAE와 동일하게 첫 항의 KLD 부분을 reugularization 부분이고, Expectation 부분은 reconstruction 부분이다. 그럼 여기서 차이는 바로 두번째 항이다.
두번째 항은 denoising process로 시점에 따른 q라는 reverse process를 나타내는 조건부 가우시안 분포와 p라는 diffusion process를 나타내는 조건부 가우시안 분포와의 차이(KLD)를 나타내는 loss이다. p라는 reverse process는 q라는 diffusion process와 비슷하게 만들기 위함이다.
이를 수식으로 정리하자면
로 된다.

결국 정리하자면 VAE loss와 다른 점은 Denoising Process 이다.
DDPM
앞서 봤던 Diffusion loss는 다음과 같이 간단하게 정리가 가능하다.
이를 보면 결국 MSE 구조와 비슷함을 알 수 있다. 여기서
그러면 어떻게 diffusion loss에서 DDPM loss로 변경되는지 살펴보자

1. diffusion loss에서 Regularization term을 제외한다.
regularization term은 결국 T 시점의 latent variable이 gaussian distribution을 따르도록 강제하기 때문이다. 즉, regularization term은 1000 번에 걸쳐서 noise를 주입하기 때문에 gaussian distribution을 따르게 되기 때문인 것이다.
이는 평균이
2. Denoising process 의 재구성
앞서 말한것 처럼 평균과 분산을 return 을 하도록 학습을 해야한다고 말하였다. 이를 위해 학습 대상인 평균과 분산에 대해 다시 알아보자. DDPM은 분산을 학습하는 것이 아닌 평균만 학습하게 한다. 즉, 분산을 constant 형태로 바꾸는 것이다.
이러한 방법은 regularization term에서 가져간 방법에 근간하여 구성하게 된다.
주입된 noise의 크기인
이에 따라
따라서 학습 대상은 평균으로 줄어들고 DDPM 이전과 DDPM 이후를 비교해서 살펴보면 다음과 같다.

결국 학습대상은 mean 으로 줄어드는 것을 볼 수 있다.
그렇다면 학습대상인 평균
denoising process는
이렇게 구성되는데 여기서 는
이렇게
와 같이 정리된다.
그리고 DDPM은 여기서 한걸음 더 나아가 Denoising matching 이라는 개념으로 발전한다.
이러한 Denoising matching을 표현하기 위해 t 시점의 x를 다음과 같이 정의한다.
그리고 여기서
각
이렇게 정의될 수 있는 이유는
그럼 여기서 우리가 이미 알고 있는 값들을 정리해보면
reparameterization trick으로 얻어낸
와 같이 정리된다.
결국 위 식에 따르면 학습할 mean function
가 된다.
따라서
와
를 조합하면 새로운 목적식
이 된다.
DDPM은 여기에 한걸음 더 나아가서 계수 상수를 지운다. 이에 따라 최종적으로 loss 는 더 간소화되고 다음과 같이 나타난다.
이러한 loss를 간소화 시키는 과정(Denoising matching)이 DDPM의 가장 큰 contribution라고 말할 수 있다.
Experiments
첫번째 실험으로 unconditional한 상태일 떄의 CIFAR 10 dataset에 대한 실험이다.

cifar10 에 대해 unconditional한 상태일 때 FID score가 현저하게 좋음을 알 수 있다.
여기서 앞서 말한 계수 term을 제외한 것이

각 4가지에 대한 loss function에 대한 성능 비교이다.
수식 1,2 는 각각 mean function을 예측하도록 하는 것이고, 2는 1에서 계수가 제거된 상태이다. 그리고 수식 3,4는
이에 대한 결과는 위 표에 대해 나타나져 있고, 표에서의 "learned diagonal"은 fixed noise scheduling을 사용하지 않는 것이다. 따라서 결론적으로는
여기서 유의미한 점은 계수 term 이 제거됨에 따라 성능이 높아지는 것이다. 계수 term을 coefficient term 이라고 정의하고 , coefficient term은 t가 증가할 수록 작아지는 경향을 갖게 된다는 것을 보였다. 따라서 이러한 coefficient term이 존재할 경우, T 시점(가장 noisy 한 경우)의 loss가 상대적으로 down-weight 되는 효과가 발생한다. 따라서 이를 제거함으로써, 더욱 noisy 한 상황에서의 loss 비중을 높일 수 있게 한다. 이를 통해 모델이 noise가 심한 이미지의 denoising에 집중하도록 유도하는 효과를 준다.

Appendix
- diffusion 모델에 대한 튜토리얼 코드 실습
https://drive.google.com/drive/folders/1nF4LtKfwbiiVLOVonFXAkghj5awSOzvu
Score_diffusion_tutorial - Google Drive
이 폴더에 파일이 없습니다.이 폴더에 파일을 추가하려면 로그인하세요.
drive.google.com
- Inception score (the higher, the better)
Inception score(IS)는 image sample quailty에 대한 평가지표 이다. inception image classifier를 사용하여 inception이라는 이름이 붙었다. IS는 Image quailty와 Image diversity , 2가지의 특성을 통해 생성된 이미지의 품질을 평가한다.
Image quailty는 생성된 이미지가 명확히 object 를 표현하고 있는지에 따른 평가다. 생성된 이미지들이 명확한 object 를 갖는다면 각각의 likelihood 분포의 summation은 균일한 분포를 가진다는 것에 따른 평가이다. 다음 그림을 보면 이해가 명확할 것이다.

Inception을 통과하여 예측된 확률에 대한 값이 코끼리일 확률에 대한 노란색 바, 고양이일 확률에 대한 초록색 바, 강아지일 확률에 대한 파란색 바를 모두 합쳐서 분포로 만드는 것이다. 이러면 각 class 에 대한 확률이 모두 높다면 분포는 균등 분포에 수렴할 것이다.
다음으로 image diversity는 다양한 object 들이 생성되는 지에 대한 평가이다. 예를 들어 'dog' 라는 class에 bulldog, poodle 등의 여러가지 강아지 종류들이 나타난다는 것이다. 그래서 생성된 이미지들이 다양한 object를 가질 수 있다면 각각 이미지의 likelihood 분포의 summation은 균일하지 않은 분포를 가질 것이다.
이러한 분포를 구하고 둘 간의 KLD로 최종적인 Inception score를 구한다.
- FID (the lower, the better)
FID는 Pre-trained된 image classification model을 활용하여 추출한 feature representation 간의 거리를 score로 활용하는 것이다. 이 때, 거리는 frechet distance로 측정을 한다. frechet 거리는 곡선을 이루는 좌표의 위치와 순서를 고려해 두 곡선 간의 유사도를 측정하는 지표로 정규분포일 때는 다음과 같은 식을 따른다.
이러한 feature 들의 정보는 모델의 후반부 layer에서 추출한 high level representation을 활용한다.
따라서 정리하자면 FID score는 다음과 같은 순서로 진행된다.
1. pretrained image classification model 을 정의( ex. inception)
2. embedding ( feature representation) - real image 를 모델에 통과, generated image를 모델에 통과
3. frechet distance 계산
'논문 정리' 카테고리의 다른 글
PFMs for Natural Language Processing (0) | 2023.03.14 |
---|---|
[Task 파악] Phrase Grounding & Weakly Supervised learning (0) | 2022.11.10 |
Zero-shot Learning (2) | 2022.09.05 |
Signing at Scale: Learning to Co-Articulate Signs for Large-Scale Photo-Realistic Sign Language Production (CVPR2022) (0) | 2022.08.23 |
Taming Transformers for High Resolution Image Synthesis (VQGAN) (0) | 2022.07.28 |
댓글