Denoisiong Diffusion Probabilistic Models (1) Diffusion model's Forward & Reverse Process
해당 게시물은 아래의 유튜브 영상을 정리한 글입니다.
https://www.youtube.com/watch?v=_JQSMhqXw-4
Introduction
Markov Chain
- Markov 성질을 갖는 이산 확률 과정
- Markov 성질: “특정 상태의 확률(t+1)은 오직 현재(t)에 상태에 의존한다”
- 이산확률 과정: 이산적인 시간(0초,1초,2초, …) 속에서 확률적 현상
Nomalizing Flow
- 심층 신경망 기반 확률적 생성 모형 중 하나
- 잠재 변수(z) 기반 확률적 생성 모형으로서, 잠재변수(Z)흭득에 ‘변수 변환’ 공식을 활용
- 변수변환 공식
OverView of generative models
- 반복적인 변화(iterative transformation)를 활용한다는 점에서 Flow-basedmodels 와 유사
- 분포에 대한 변분적 추론을 통한 학습을 진행한다는 점은 VAE와 유사
- 최근에는 Diffusion 모델의 학습에 Adverarial training 을 활용하기도 함
GAN 과 diffusion 은 별개의 기술이긴 하지만 비슷하게 접목하여 학습하는 기술도 많이 생기는 중
Generative model overView
Latent Variable Model
- 결국 생성 모델로 원하는 것은 매우 간단한 분포(Z)를 특정한 패턴을 갖는 분포로 변환(mapping, transformatio, sampling)하는 것
- 그렇기에 대부분의 생성 모델이 주어진 입력 데이터로 부터 latent variable(z)을 얻어내고, 이를 변환하는 역량을 학습하고자함
VAE
GAN
Flow-based Model
학습한 function의 inverse가 활용됨
이러한 inverse function chain이 flow생성에 활용됨
Diffusion based generative model
조건부 네트워크를 학습시키기 위해 다른 네트워크를 학습시키지 않음
-> 다른 생성 모델과 구분되는 점
기본적인 DDPM 에서는 Forward 부분은 학습 부분이 아님
DDPM에서 사전에 정의된 스케줄에 따라서 노이즈를 서서히 넣어줌
학습 대상이 되는 것은 빨간색 Sampling
Marcov chain 은 여러개의 짧은 스텝으로 쪼개져서 이용
Diffusion model overview
파란색의 reverse process 를 학습함
빨간색의 forward는 가우시안 노이즈를 주입한 사전의 t로 정의된 값을 이용하므로 학습X
그렇다면 조건부를 반대로 하는 분포를 알아낼 수 있을까 -> 어려워잉
바로 알 수 없기 때문에 diffusion을 학습시키는 것
Diffusion Process - Forward
Phase 1: Diffusion Process (Forward)
- Diffusion Process 는 Gaussian noise를 점진적으로 주입하는 과정
- 주입되는 gaussian noise크기는 사전 적으로 정의되고 이를 로 표기
가우시안 값을는 분산 값 평균 가깝게 녹아들게 됨
최종적으로는 의 값이 커지면서 조건부 가우시안 분포의 분산 또한 에 비례해 커진다.
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
각 스케줄링에 따른 베타 값
점진적으로 주어지는 노이즈를 통해 이미지 패턴이 사라지는 것을 볼 수 있음
패턴이 점점 와해 되면서 노이즈 화 된다.
- 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)와 유사한 접근
- Diffusion Process 는 Contitional Gaussian의 joint-distribution으로서, 를 조건부로 Latent Variables()를 생성해내는 과정
- 가장 마지막 Latent Variable()로 pure isotropic gaussian을 획득
- 가장 마지막 Latent Variable()로 pure isotropic gaussian을 획득
Diffusion Process - Reverse Process
Phase 2: Diffusion Process (Reverse Process)
- Diffusion Model 은 Generative Model로서 학습된 데이터의 패턴을 생성해내는 역할을 함
- 패턴 생성 과정을 학습하기 위해 고의적으로 패턴을 무너트리고(Noising), 이를 복원하는 조건부 pdf를 학습함(Denoising)
- 는 Diffusion Process의 역 과정(Denoising)을 학습
- 는 Diffusion Process의 역 과정(Denoising)으로, Gaussian noise를 제거하며 특정한 패턴을 만들어가는 과정
여기서 학습 대상은
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
이러한 학습이 완료되엇다 했을 때,
reverse process 가 이루어 지는 과정은 denoising이 되면서 특정한 패턴이 선명하게 나타나게 된디
Phase 2: Reverse Process Loss
- Denoising 과정인 Reverse Process 는 학습이 이루어지는 과정이므로 Loss 가 생성된다.
- Diffusion의 Loss는 VAE와 비교 이해 가능
- 자세한 도출 과정 참고 https://developers-shack.tistory.com/8
이 글은 옵시디언 프로그램을 통해 티스토리에 게시되었습니다.