공부정리/Computer Vision

Denoisiong Diffusion Probabilistic Models (1) Diffusion model's Forward & Reverse Process

sillon 2024. 1. 12. 10:33
728x90
반응형

해당 게시물은 아래의 유튜브 영상을 정리한 글입니다.
https://www.youtube.com/watch?v=_JQSMhqXw-4

Introduction

Markov Chain

  • Markov 성질을 갖는 이산 확률 과정
    • Markov 성질: “특정 상태의 확률(t+1)은 오직 현재(t)에 상태에 의존한다”
    • 이산확률 과정: 이산적인 시간(0초,1초,2초, …) 속에서 확률적 현상

Pasted image 20240111150406.png

Nomalizing Flow

  • 심층 신경망 기반 확률적 생성 모형 중 하나
  • 잠재 변수(z) 기반 확률적 생성 모형으로서, 잠재변수(Z)흭득에 ‘변수 변환’ 공식을 활용
    • 변수변환 공식
    • Pasted image 20240111152540.png

OverView of generative models

Pasted image 20240111152613.png

  • 반복적인 변화(iterative transformation)를 활용한다는 점에서 Flow-basedmodels 와 유사
  • 분포에 대한 변분적 추론을 통한 학습을 진행한다는 점은 VAE와 유사
  • 최근에는 Diffusion 모델의 학습에 Adverarial training 을 활용하기도 함

GAN 과 diffusion 은 별개의 기술이긴 하지만 비슷하게 접목하여 학습하는 기술도 많이 생기는 중

Generative model overView

Latent Variable Model

Pasted image 20240111155243.png

  • 결국 생성 모델로 원하는 것은 매우 간단한 분포(Z)를 특정한 패턴을 갖는 분포로 변환(mapping, transformatio, sampling)하는 것
  • 그렇기에 대부분의 생성 모델이 주어진 입력 데이터로 부터 latent variable(z)을 얻어내고, 이를 변환하는 역량을 학습하고자함

VAE

Pasted image 20240111155613.pngPasted image 20240111155628.png

GAN

Pasted image 20240111155804.pngPasted image 20240111155830.png

Flow-based Model

Pasted image 20240111160230.png

학습한 function의 inverse가 활용됨
이러한 inverse function chain이 flow생성에 활용됨

Pasted image 20240111160344.png

Diffusion based generative model

Pasted image 20240111160429.png


조건부 네트워크를 학습시키기 위해 다른 네트워크를 학습시키지 않음
-> 다른 생성 모델과 구분되는 점

기본적인 DDPM 에서는 Forward 부분은 학습 부분이 아님

Pasted image 20240111160456.png

DDPM에서 사전에 정의된 스케줄에 따라서 노이즈를 서서히 넣어줌
학습 대상이 되는 것은 빨간색 Sampling

Marcov chain 은 여러개의 짧은 스텝으로 쪼개져서 이용

Diffusion model overview

Pasted image 20240111160835.png

파란색의 reverse process 를 학습함

빨간색의 forward는 가우시안 노이즈를 주입한 사전의 t로 정의된 값을 이용하므로 학습X

Pasted image 20240111161253.png

그렇다면 조건부를 반대로 하는 분포를 알아낼 수 있을까 -> 어려워잉

바로 알 수 없기 때문에 diffusion을 학습시키는 것

Pasted image 20240111161428.pngPasted image 20240111165333.png


Diffusion Process - Forward

Phase 1: Diffusion Process (Forward)

  • Diffusion Process 는 Gaussian noise를 점진적으로 주입하는 과정
  • 주입되는 gaussian noise크기는 사전 적으로 정의되고 이를 로 표기

Pasted image 20240111165601.png

가우시안 값을는 분산 값 평균 가깝게 녹아들게 됨
최종적으로는 의 값이 커지면서 조건부 가우시안 분포의 분산 또한 에 비례해 커진다.

T 시점에 가면 가우시안 분포와 같은 분포가 형성이 됨

  • 의 사전적 정의(scheduling)는 크게 3가지를 고려함
    • Linear Schedule
    • Quad Schedule
    • Sigmoid Schedule

Code Example

 def make_beta_schedule(schedule = 'linear', n_timesteps=1000, start =1e-4, end=0.02): 	
 	if schedule == 'linear':
    	betas = torch.linspace(start,end,n_timestpes) 	
    elif schedule == 'quad':
    	betas = torch.linspace(start**0.5,end**0.5,n_timestpes)**2 	
    elif schedule == 'sigmoid':
        betas = torch.linspace(-6,6,n_timestpes)
        betas = torch.sigmoid(betas) * (end - start) + start
    return betas

Pasted image 20240111171121.png


각 스케줄링에 따른 베타 값

점진적으로 주어지는 노이즈를 통해 이미지 패턴이 사라지는 것을 볼 수 있음

Pasted image 20240111171150.png

패턴이 점점 와해 되면서 노이즈 화 된다.

  • Diffusion Process 는 Gaussian noise를 점진적으로 주입하는 과정 (=Conditional Gaussian distribusion)

(Reparameterization trick)

code example

def forward_process(x_start, n_steps, noise = None):
    """
    Diffuse the data (t == 0 means diffused for 1 step)

    x_start:tensor = dataset at start step(X_0)
    n_steps:int = the number of convert iterations in diffusion process
    noise:scheduled noise set
    """
	x_sequence = [x_start] 	
    for i 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)
        x_sequence.append(x_t)
    return x_seq
  • Diffusion process 는 점진적으로 단계적 gaussian noise를 갖는 다수의 latent variable()를 흭득
  • 다수의 latent variable()를 상정한다는 점에서 Hierarchical VAE(계층적 VAE)와 유사한 접근
    Pasted image 20240111174215.png
  • Diffusion Process 는 Contitional Gaussian의 joint-distribution으로서, 를 조건부로 Latent Variables()를 생성해내는 과정
    • 가장 마지막 Latent Variable()로 pure isotropic gaussian을 획득
      Pasted image 20240111174435.png

Diffusion Process - Reverse Process

Phase 2: Diffusion Process (Reverse Process)

  • Diffusion Model 은 Generative Model로서 학습된 데이터의 패턴을 생성해내는 역할을 함
  • 패턴 생성 과정을 학습하기 위해 고의적으로 패턴을 무너트리고(Noising), 이를 복원하는 조건부 pdf를 학습함(Denoising)
  • 는 Diffusion Process의 역 과정(Denoising)을 학습
    Pasted image 20240111174747.png
  • 는 Diffusion Process의 역 과정(Denoising)으로, Gaussian noise를 제거하며 특정한 패턴을 만들어가는 과정

여기서 학습 대상은

Pasted image 20240112091822.png

Code Example

def p_mean_variance(model,x,t):
	# make model prediction
	out = model(x, t.to(devide))
	# Extract the mean and variance
	mean, log_var = torch.split(out, 2, dim = 1)
	var = torch.exp(log_var)
	return mean, log_var

Pasted image 20240112092144.png


이러한 학습이 완료되엇다 했을 때,
reverse process 가 이루어 지는 과정은 denoising이 되면서 특정한 패턴이 선명하게 나타나게 된디

Phase 2: Reverse Process Loss

  • Denoising 과정인 Reverse Process 는 학습이 이루어지는 과정이므로 Loss 가 생성된다.

이 글은 옵시디언 프로그램을 통해 티스토리에 게시되었습니다.

728x90
반응형