Section 01이미지에서 노이즈로
하나의 이미지를 물 한 컵으로 생각하자. 충분한 노이즈(잉크)를 떨어뜨리면 결국 이미지(물)는 완전한 노이즈 이미지(잉크물)로 변한다. 이미지 x₀는 거의 가우시안 노이즈 이미지 xₜ로 체계적으로 변환될 수 있다.
이미지가 순수 노이즈가 될 때까지 가우시안 노이즈를 도입하는, 사전 정의된 순방향 확산 과정 q를 사용한다. 이 과정은 q(xₜ | xₜ₋₁)로 표시되며, 역방향 과정 pθ(xₜ₋₁ | xₜ)는 아직 알려지지 않았다.
Section 02재매개변수화 트릭
연쇄 과정으로 단계 t의 노이즈 이미지를 계산하려면 1부터 t−1까지 전부 거쳐야 한다 — 비효율적이다. 재매개변수화(reparameterization) 트릭은 이 연쇄를 한 단계 계산으로 압축한다.
평균 μ, 분산 σ²인 가우시안 z ~ N(μ, σ²)는 ε ~ N(0,1)을 써서 z = μ + σε로 다시 쓸 수 있다. 이 발상을 확산 과정에 적용한다.
xₜ = √ᾱₜ · x₀ + √(1−ᾱₜ) · ε
import numpy as np from itertools import accumulate def get_product_accumulate(numbers): return list(accumulate(numbers, lambda x, y: x * y)) image = plt.imread("dog.png") image = image * 2 - 1 # [0,1] -> [-1,1] num_iterations, beta = 16, 0.05 betas = [beta] * num_iterations alpha_list = [1 - b for b in betas] alpha_bar = get_product_accumulate(alpha_list) target_index = 5 x_target = ( np.sqrt(alpha_bar[target_index]) * image + np.sqrt(1 - alpha_bar[target_index]) * np.random.normal(0, 1, image.shape) )
Section 03노이즈에서 이미지로: 훈련
이미지에 노이즈를 더하는 솔루션 — 순방향 확산 — 은 손에 넣었다. 반대로 노이즈에서 이미지를 복구하려면 역방향 단계 pθ(xₜ₋₁ | xₜ)를 구현할 방법이 필요하다. 그런데 이 단계는 추가적인 도움 없이는 다루기 어렵거나 계산 불가능하다.
해법은 신경망이다. 노이즈 데이터와 모든 노이즈 단계 데이터가 있으니, 이 과정을 역전시키는 신경망 — 일반적으로 UNet — 을 훈련할 수 있다.
import torch import torch.nn as nn # noise 는 이미지 x_t 모양의 ε ~ N(0,1) noise = torch.randn_like(x_t) # x_t 는 단계 t 의 노이즈 이미지, time_step 과 함께 입력 predicted_noise = model(x_t, time_step) loss = nn.MSELoss(noise, predicted_noise) # 역방향 가중치 전파 ...
Section 04샘플링 과정
모델에서 이미지를 샘플링한다는 것 — 역방향 확산으로 이미지를 생성하는 단계는 이렇게 진행된다. 먼저 평균 0, 분산 1의 완전한 가우시안 노이즈 xₜ ~ N(0,1)를 시작 이미지로 삼는다. 그리고 t = T에서 t = 1까지 루프한다.
Section 05분류기 가이던스
지금까지의 생성 과정은 무작위 가우시안 노이즈만을 입력으로 받아, 훈련 데이터셋을 기반으로 무작위로 이미지를 만든다. 하지만 우리는 가이드된 생성을 원한다 — "dog"라고 입력하면 개가 든 이미지가 나와야 한다.
2021년 OpenAI의 Dhariwal과 Nichol은 논문 "Diffusion Models Beat GANs on Image Synthesis"에서 분류기 가이던스를 제안했다. 훈련 단계에서 분류 레이블 — 더 나아가 텍스트 설명 임베딩 — 을 함께 제공하여, 무엇을 그릴지 모델을 안내한다.
노이즈 이미지 xₜ — 현재 단계의 노이즈가 있는 이미지 데이터.
time step t — 노이즈 제거가 어느 단계에서 일어나는지 알려준다.
텍스트 임베딩 — CLIP 모델이 생성한 조건부 텍스트 임베딩. 이 추가 입력이 이미지 생성을 텍스트로 가이드한다.