본문 바로가기
논문 정리

Denoising Diffusion Probabilistic Models(DDPM)

by winston1214 2022. 11. 8.
반응형

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)을 따르며 이를 반복하여 다음과 같은 식이 도출된다.

$$ P[s_{t+1} | s_{t}] = P[s_{t+1} | s_{1}, \cdots .s_{t}] $$

와 같이 나타낼 수 있다. 이러한 markov chain에 대한 예시는 일상생활에서도 많이 쓰는 말처럼

"내일의 날씨는 오늘의 날씨만 보고 알 수 있다" 라는 말과 같다. 이는 즉, 내일의 날씨는 오로지 오늘의 날씨만을 조건부로 하는 확률적인 과정인 것이다.

- Normalizing Flow

Normalizing flow는 심층 신경망 기반의 확률적 생성 모형 중 하나이다. latent variable Z 기반의 확률적 생성모형으로 latent variable Z를 얻기 위하여 변수 변환 공식을 활용한다. 변수 변환 공식은 다음의 식을 따른다.

$$ p_{x}(x) = p_{z}(z) | \frac{dz}{dx} | $$

변수 변환은 입력 데이터 샘플 x를 사전에 정의한 prior 분포(ex. gaussian distribution)로 mappping을 하여 latent variable의 분포 z를 추론하는 함수 f를 학습하는 방식으로 진행된다. 이러한 학습은 한 번에 학습이 되는 것이 아니라 단계별로 학습을 하여 z를 모델링한다. 이와 반대로 inverse를 하여 z에서 원본 x로 복원을 한다.

Overview of Generative models

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에선 \( q_{\theta}(z|x)) \)로 학습을 하고, decoder에선 \(P_{\theta}(x|z) \)로 학습을 하고자 한다.

따라서 

$$P_{\theta}(x) = \frac{P_{\theta}(x|z) P_{\theta}(z)}{P_{\theta}(z|x)} $$ 

를 극대화하는 방향으로 학습을 하는 것이다.

VAE 과정

- 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이 필요하다. 아래의 그림처럼 \( p_{z}(z) \sim N \)을 따르는 latent variable을 \( P_{\theta}(x|z) \)로 latent variable을 조건으로 특정한 x를 sampling 한다. 이를 통해 특정한 패턴의 분포를 획득하게 된다.

 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)한다.

이러한 과정을 간단하게 식으로 나타내면 \( X_{t-1} \) 이라는 이미지(노이즈를 삽입하지 않은 이미지)와 Noise를 삽입한 이미지 \( X_t \)가 있을 때, diffusion process (DP 라고 자의적으로 표현하겠음)

$$ DP = q(X_{t}| X_{t-1}) $$

을 따라 원래의 이미지를 조건으로 받는 조건부 분포를 나타내고, Reverse Process(RP 라고 자의적으로 표현)

$$ RP = q(X_{t-1} | X_{t}) $$

로 noise가 낀 이미지를 조건으로 받는 조건부 분포로 나타낸다.

앞서, diffusion process는 따로 학습을 안해도 된다고 언급하였다. 이 이유는 t-1 시점을 조건으로  gaussian noise를 주입한 t 시점의 분포는 사전에 정의한 noise에 따라 형성이 되기 때문이다. 

그러면 diffusion process( \( q(X_{t}| X_{t-1}) \) )는 학습을 안해도 되는데 단순히 뒤집은 reverse process (\( q(X_{t-1} | X_{t}) \) )는 diffusion process를 통해 바로 알 수 있을까? 아니다. 이게 된다면 굳이 diffusion model은 학습할 필요가 없어지는 것이다. 따라서 reverse process는 학습이 필요하다.

cf) \( q(X_{t}|X_{t-1} ) \) 이 guassian distribution을 따르면 \( q(X_{t-1} | X_{t}) \)도 guassian distribution을 따른다. (이미 증명)

그러면 reverse process 는 어떻게 학습을 할까?

이를 학습하기 위해 q와 비슷한 \( p_{\theta} \)를 추종하도록 하고, 즉 이는

$$ p_{\theta}(X_{t-1} | X_{t}) \approx q(X_{t-1} | X_{t}) $$

로 정의되고 \( p_{\theta} \)가 \( q(X_{t-1} | X_{t}) \)가 되도록 학습을 하는 것이다. 이를 학습하는 것은 하나의 step이 아닌 chain 형태로 markov chain을 통해 1000번으로 나누어 학습을 진행한다. 이러한 방법은 본 논문에선 "large number of small perturbations" 라고 표현을 한다.

정리하자면 diffusion process와 reverse process 모두 조건부 guassian distribution을 바탕으로 하는 markov chain이 되는 것이다.

 

Diffusion Model (Forward)

diffusion process는 gaussian noise를 점진적으로 주입하는 과정이다. 이는 조건부 guassian \( q( X_{t} | X_{t-1}) \)의 markov chain으로 구성된다. 이러한 guassian noise의 크기는 사전에 정의가 되고 이 때문에 diffusion process는 학습 대상이 아니다. 이렇게 사전에 정의된 guassian noise가 주입되는 양은 \( \beta_{t} \)라고 한다. 

이러한 \( \beta_{t} \)로 diffusion process를 진행할 t 시점의 gaussian 조건부 분포는 다음과 같이 정의된다.

$$ q(X_{t} | X_{t-1}) := N(X_{t} ; \mu_{X_{t-1}} , \Sigma_{X_{t-1}}) := N(X_{t} ; \sqrt{1 - \beta_{t}} X_{t-1} , \beta_{t} \cdot I) $$

위 식으로부터 알 수 있듯이 noise의 크기 \( \beta_{t} \)에 따라 gaussian distribution의 분산의 크기도 커지게 된다.

이러한 \( \beta_{t} \)를 구성하는 방법은 다음과 같이 3가지가 있고 이를 코드로 표현하면 다음과 같다.

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 을 사용한다. \( \epsilon \sim N(0,I) \) 을 이용하여 \( X_{t} \)를 

$$ \sqrt{1-\beta_{t}}X_{t-1} + \sqrt{\beta_{t}}\epsilon_{t-1} $$

으로 나타낼 수 있다. 따라서 이를 코드로 나타내면

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 ( \( X_0 \)을 나타내는 것이고, n_step은 diffusion process를 몇번 시행할 것인지, noise는 앞서 정의한 noise set을 말한다.

diffusion process

위 그림은 diffusion model을 latent variable의 관점에서 바라본 것이다. gaussian noise를 한 번 주입할 때의 모든 이미지들을 latent variable로 취급한다. 따라서 다수의 latent variable이 있다는 점에서 이는 Hierarchical VAE와 유사한 접근 방식을 사용한다고 볼 수 있다. 즉, 이는 초기 이미지인 \(X_0\)를 조건부로 \(X_{t}\)까지의 latent variable을 생성한다고 볼 수 있다. 이러한 과정을 통해 생성된 최종적인 \( X_{T} \) 는 gaussian noise가 많이 주입되었기 때문에 pure isotropic gaussian 이라고 볼 수 있다.

 

Diffusion Model (Reverse)

Reverse process 는 diffusion process의 역과정으로 삽입한 noise들을 제거하여 특정한 패턴을 만들어가는 과정이다.

diffusion process는 우리가 알고 있는 분포였지만(gaussian distribution) , reverse distribution은 우리가 모르는 조건부 가우시안 분포라는 점이 가장 큰 차이다. 분포자체를 알 수 없기 때문에 각 시점의 guassian 분포의 평균 \( \mu_{t} \)와 분산 \( \Sigma_{t} \)를 모델이 학습해야한다. 

식을 보면 

$$ p_{\theta}(X_{0:T}) := p(X_{T}) \prod^{T}_{t=1}q(X_{t-1}|X_{t}) $$

$$ p_{\theta}(X_{t-1} | X_{t}) := N(X_{t-1} ; \mu_{\theta} (X_t , t) , \Sigma_{\theta} (X_{t},t)) $$

를 따르고 여기서 \( \mu_{\theta} \)와 \( \Sigma_{\theta} \)는 학습대상이 되는 것이다.

즉, model의 output은 평균과 분산이 되어야한다. 결국 이러한 모델이 학습하여 나오는 output들은 각 t 시점에서 \( \beta_{t} \)를 넣은 guassian distribution의 평균과 분산과 유사해지도록 학습을 하는 것이 목표이다.

이에 따른 코드는 다음과 같다.

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를 살펴보면 다음의 그림과 같다.

diffusion 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

VAE는 reconstruction loss와 regularization loss로 나눠져 있다. 결국 X' 를 복원하는 것이 reconstruction이고 최종적인 latent variable을 구성하는것이 regularization이다. 따라서 VAE의 loss는 

$$ L_{VAE} = D_{KL}( q(z|x) || p_{\theta}(z)) - E_{z \sim q(z|x)} [ \log P_{\theta} (x|z) ] $$

로 구성되어 있는데 KLD 부분이 Encoder의 regularization 부분이고, Expectation 부분이 reconstruction 부분이다.

이와 유사하게 diffusion 모델의 loss는 

diffusion loss.

이렇게 구성되어 있는데 VAE와 동일하게 첫 항의 KLD 부분을 reugularization 부분이고, Expectation 부분은 reconstruction 부분이다. 그럼 여기서 차이는 바로 두번째 항이다.

두번째 항은 denoising process로 시점에 따른 q라는 reverse process를 나타내는 조건부 가우시안 분포와 p라는 diffusion process를 나타내는 조건부 가우시안 분포와의 차이(KLD)를 나타내는 loss이다. p라는 reverse process는 q라는 diffusion process와 비슷하게 만들기 위함이다. 

이를 수식으로 정리하자면

$$ p_{\theta} (X_{t-1} | X_{t}) \thickapprox q(X_{t-1} | X_{t}, X_{0}) $$

로 된다.

결국 정리하자면 VAE loss와 다른 점은 Denoising Process 이다.

 

DDPM

앞서 봤던 Diffusion loss는 다음과 같이 간단하게 정리가 가능하다.

$$ L_{DDPM} = \mathbb{E}_{x_{0},\epsilon} [ | \epsilon - \epsilon_{\theta} ( \sqrt{\tilde{\alpha}_t} + \sqrt{1 - \tilde{\alpha}_t \epsilon},t) |^2 ]$$

이를 보면 결국 MSE 구조와 비슷함을 알 수 있다. 여기서 \( \epsilon \)은 ground truth이고, 학습대상은 \( \epsilon_{\theta} \)이다. 그러면 이 loss 식은 ground truth와 학습대상의 차이를 최소화 하는 식으로 볼 수 있다. 결론적으로는 각 t라는 시점에 대한 noise \( \epsilon \)을 모델이 예측하도록 하는 loss다.

그러면 어떻게 diffusion loss에서 DDPM loss로 변경되는지 살펴보자

diffusion loss.

1. diffusion loss에서 Regularization term을 제외한다.

regularization term은 결국 T 시점의 latent variable이 gaussian distribution을 따르도록 강제하기 때문이다. 즉, regularization term은 1000 번에 걸쳐서 noise를 주입하기 때문에 gaussian distribution을 따르게 되기 때문인 것이다.

\( \beta_{t} \) 를 굳이 학습시키지 않아도 regularization term은 gaussian distribution을 따른다. 

\( \beta_{t} \)에 대한 scheduling을 linear 하게 증가시키는 linear noise scheduling으로 설정할 경우 최종적인 latent variable ( \( Z_{T} = X_{T} \)는 다음과 같은 분포를 따르게 된다.

$$ q (X_{T} | X_{0}) = N ( X_{T} ; 0.00635 \cdot x_0 , 0.9995 \cdot I ) $$

이는 평균이 \( x_0 \)에 가깝고 분산이 I와 가깝기 때문에 이는 충분히 isotropic 한 gaussian distribution을 따른다고 말할 수 있다. 따라서 \( \beta \)도 fixed schedule 에 따라 형성되기 때문에 학습대상에서 제외된다.

2. Denoising process 의 재구성

앞서 말한것 처럼 평균과 분산을 return 을 하도록 학습을 해야한다고 말하였다. 이를 위해 학습 대상인 평균과 분산에 대해 다시 알아보자. DDPM은 분산을 학습하는 것이 아닌 평균만 학습하게 한다. 즉, 분산을 constant 형태로 바꾸는 것이다.

이러한 방법은 regularization term에서 가져간 방법에 근간하여 구성하게 된다.

주입된 noise의 크기인 \( \beta \)는 이미 알고 있는 정보이다. 따라서 알고 있는 \( \beta \)를 통해서 분산을 대신한다. 분산은 각 시점에 대해 누적된 noise의 크기로 분산을 대신하는 것이다.

\( \sigma^{2}_{t}  = \tilde{\beta}_t = \frac{1- \overline{\alpha_{t-1}}}{1 - \overline{\alpha_t}} \beta_t \) 가 되게 되고 여기서 \( \overline{\alpha_t} \)는 \( \prod^{t}_{s=1} \alpha_s \)에 근사하고 ,\( \alpha_t = 1 - \beta_t \) 이다. 

이에 따라 \( \sigma^{2}_{t} \cdot I  = \tilde{\beta}_t \cdot I\)가 되게 되고 이는 t 시점까지의 누적된 noise를 뜻하기 떄문에 결국 variance는 constant가 된다. 

따라서 학습 대상은 평균으로 줄어들고 DDPM 이전과 DDPM 이후를 비교해서 살펴보면 다음과 같다.

결국 학습대상은 mean 으로 줄어드는 것을 볼 수 있다.

그렇다면 학습대상인 평균 \( \mu_{\theta} (X_t , t) \) 관점에서 다시 정의해보자.

denoising process는 

$$ \sum_{t=2}D_{KL}( q(x_{t-1} | x_{t}, x_0) || P_{\theta} ( x_{t-1} | x_{t} )) $$

이렇게 구성되는데 여기서 는 \( q ( x_{t-1} | x_{t} , x_0 ) \) gaussian distribution의 조건부 분포이므로 이는

\( \mathcal{N} ( x_{t-1} ; \tilde{\mu_t} (x_t , x_0), \tilde{\beta}_t \cdot I ) \)로 바꿀 수 있다. 그리고 \( P_{\theta} ( x_{t-1} | x_{t} ) \)도 \( \mathcal{N} ( x_{t-1} ; \mu_{\theta} (x_{t} , x_{0}) \tilde{\beta}_{t} \cdot  I ) \) 로 된다.

이렇게 \( \mu \)로 나타낸 식에 대해 KLD를 구하게 되면 

$$ \mathbb{E}_q [ \frac{1}{2 \sigma^{2}_t} || \tilde{\mu}_t ( x_t , x_0) - \mu_{\theta} (x_t , t) || ^{2}] $$

와 같이 정리된다.

그리고 DDPM은 여기서 한걸음 더 나아가 Denoising matching 이라는 개념으로 발전한다.

이러한 Denoising matching을 표현하기 위해 t 시점의 x를 다음과 같이 정의한다.

$$ x_t (x_0 , \epsilon ) = \sqrt{ \bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t}\epsilon$$ 

그리고 여기서 \( \epsilon \) 은 \( \epsilon \sim \mathcal{N} (0,I) \)를 따른다.

각 \( \alpha \)에 대해선 \( \bar{\alpha_t} := \prod^{t}_{s=1} \alpha_s\) , \( \alpha_t = 1 - \beta_t \)가 된다. 이는 즉 \( \alpha \)는 noise의 크기인 \( \beta \)에서 1을 빼는 것이니 노이즈의 크기가 되는 것이고, 그리고 이를 모두 곱하여 chain 형태로 나타낸 것이 \( \hat{\alpha} \)인 것이다.

이렇게 정의될 수 있는 이유는  \( q(x_t | x_{t-1} ) := \mathcal{N} (x_{t-1} ; \sqrt{1-\beta_t}x_{t-1} , \beta_t \cdot I) \) 이기 때문이다.

그럼 여기서 우리가 이미 알고 있는 값들을 정리해보면 \( \beta \)에 의해 결정되는 \( \alpha \) 값들, 그리고 diffusion process에서 이미 계산되는 \( x_0 \)도 알고 있다. 그럼 결국엔 \( \epsilon \)만 모르는 상황이다. 그럼 결국 알지못하는 \( \epsilon \) 하나만 학습을 하면 되는 것이다. 

reparameterization trick으로 얻어낸  \( x_{t} = \sqrt{ 1- \beta_{t} } x_{t-1} + \sqrt{\beta_t} \epsilon_{t-1} \ where, \epsilon \sim \mathcal{N} (0,I ) \)을 앞서 정의한 \( \mu \)에 대한 KLD 식에 넣으면 

$$ \mathbb{E}_{x_0 , \epsilon} [ \frac{1}{2 \sigma^{2}_{t}} || \frac{1}{\sqrt{\alpha_t}} ( x_t ( x_0 , \epsilon) - \frac{\beta}{\sqrt{1-\bar{\alpha}_t}}\epsilon) \mu_{\theta} (x_t (x_0, \epsilon),t)||^{2}] $$

와 같이 정리된다.

결국 위 식에 따르면 학습할 mean function \(\mu_{\theta} (x_t (x_0, \epsilon),t)\) 는 주어진 시점에 \(\frac{1}{\sqrt{\alpha_t}} ( x_t ( x_0 , \epsilon)\)를 예측하는 것이고, 여기서 알지 못하는 변수는 t 시점의 noise \( \epsilon \) 뿐이다. 따라서 \( \epsilon \)에 \( \theta \)를 부여하여 학습 모델 \( \mu_{\theta}(x_t , t) \)를 새롭게 정의하면 

$$ \mu_{\theta}(x_t , t) = \frac{1}{\sqrt{\alpha_t}} ( x_t - \frac{\beta}{\sqrt{1- \bar{\alpha}_t}} \epsilon_{\theta}(x_t , t) ) $$

가 된다.

따라서 

$$ \mathbb{E}_{x_0 , \epsilon} [ \frac{1}{2 \sigma^{2}_{t}} || \frac{1}{\sqrt{\alpha_t}} ( x_t ( x_0 , \epsilon) - \frac{\beta}{\sqrt{1-\bar{\alpha}_t}}\epsilon) \mu_{\theta} (x_t (x_0, \epsilon),t)||^{2}] $$

$$ \mu_{\theta} (x_{t},t) = \frac{1}{\sqrt{\alpha_{t}}} (x_{t} - \frac{\beta}{ \sqrt{1 - \bar{\alpha}_{t}}} \epsilon_{\theta}(x_{t},t) ) $$

를 조합하면 새로운 목적식

$$ \mathbb{E}_{x_0 , \epsilon} [ \frac{\beta^2}{2 \sigma^{2}_{t} \alpha_t (1 - \bar{\alpha}}_t) || \epsilon - \epsilon_{\theta} ( \sqrt{\bar{\alpha}_t x_0} + \sqrt{1 - \bar{\alpha}_t}\epsilon , t) ||^{2}$$

이 된다.

DDPM은 여기에 한걸음 더 나아가서 계수 상수를 지운다. 이에 따라 최종적으로 loss 는 더 간소화되고 다음과 같이 나타난다.

$$ L_{DDPM} = \mathbb{E}_{x_{0} , \epsilon} [ || \epsilon - \epsilon_{\theta} ( \sqrt{\bar{\alpha}_{t} x_{0}} + \sqrt{1 - \bar{\alpha}_{t}} \epsilon, t) ||^{2}]$$

이러한 loss를 간소화 시키는 과정(Denoising matching)이 DDPM의 가장 큰 contribution라고 말할 수 있다.

Experiments

첫번째 실험으로 unconditional한 상태일 떄의 CIFAR 10 dataset에 대한 실험이다.

cifar10

cifar10 에 대해 unconditional한 상태일 때 FID score가 현저하게 좋음을 알 수 있다. 

여기서 앞서 말한 계수 term을 제외한 것이 \( L_{simple} \) 이고, 제외하지 않은 것이 \( L \)인데, \( L_{simple} \)이 NLL 이 높지만, FID score가 월등히 높음을 알 수 있다. 

목적식에 따른 변화

각 4가지에 대한 loss function에 대한 성능 비교이다. 

수식 1,2 는 각각 mean function을 예측하도록 하는 것이고, 2는 1에서 계수가 제거된 상태이다. 그리고 수식 3,4는 \( \epsilon \)을 예측하는 것이고 4는 3에서의 계수를 제거한 식이다. 

이에 대한 결과는 위 표에 대해 나타나져 있고, 표에서의 "learned diagonal"은 fixed noise scheduling을 사용하지 않는 것이다. 따라서 결론적으로는 \( \epsilon \)을 학습하는 것이 성능이 가장 좋았고, fixed noise scheduling을 사용하는 것이 가장 좋았다. 

여기서 유의미한 점은 계수 term 이 제거됨에 따라 성능이 높아지는 것이다. 계수 term을 coefficient term 이라고 정의하고 , coefficient term은 t가 증가할 수록 작아지는 경향을 갖게 된다는 것을 보였다. 따라서 이러한 coefficient term이 존재할 경우, T 시점(가장 noisy 한 경우)의 loss가 상대적으로 down-weight 되는 효과가 발생한다. 따라서 이를 제거함으로써, 더욱 noisy 한 상황에서의 loss 비중을 높일 수 있게 한다. 이를 통해 모델이 noise가 심한 이미지의 denoising에 집중하도록 유도하는 효과를 준다.

DDPM sample

 

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은 균일한 분포를 가진다는 것에 따른 평가이다. 다음 그림을 보면 이해가 명확할 것이다.

IS

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 거리는 곡선을 이루는 좌표의 위치와 순서를 고려해 두 곡선 간의 유사도를 측정하는 지표로 정규분포일 때는 다음과 같은 식을 따른다.

$$ d(X,Y) = ( \mu_X - \mu_Y )^2 + ( \sigma_X - \sigma_Y )^2 $$

이러한 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 계산

 

반응형

댓글