ai 그림그리기 원리 / 어떻게 그림을 머신러닝으로 그리나 / how to / draw / machine learning / ML / 이미지 생성 모델
정리중…
pytorch 로 따라해보는 diffusion model
ref. 1 의 내용을 정리했다.
잡음제거 확산 확률 모델(Denoising Diffusion Probabilistic Models, DDPMs)은 확산모델(diffusion models), score-based generative models 또는 간단하게 autoencoders 라고 불린다.
이 방법은 2015년 쯤 소개되었지만,
- 2019년([1907.05600] Generative Modeling by Estimating Gradients of the Data Distribution),
- 2020년([2006.11239] Denoising Diffusion Probabilistic Models)
까지 계속 이 방법을 독립적으로 발전시켜왔다.
diffusion model 들에는 여러 관점들이 있다. 여기서는 dicrete-time perspective(이산시간 관점) 를 채용했다. (잠재변수모형, latent variable model) 다른 관점들도 꼭 확인해 봐야 한다.
유명한 예:
- OpenAI 의 GLIDE 와 DALL-E 2
- 하이델베르크 대학교(University of Heidelberg) 의 Latent Diffusion
- Google Brain 의 ImageGen
package 설치
pytorch 설치가 돼 있어야 한다.
pip install -q -U einops datasets matplotlib tqdm
설명
set-up(설정)은 2가지 프로세스로 이뤄진다.
- 우리의 선택에 대한 고정된(즉, 미리정의된) forward diffusion process \(q\) 가 있고, 이것은 pure noise 가 될때가지 점차적으로 Gaussian noise 를 이미지에 더한다.
- 학습된 reverse denoising diffusion procee \(p_{\theta}\) 에서는 신경망(neural network) 이 훈련된다. 실제 이미지가 나올때까지, pure noise 에서 시작해서, 점차적으로 이미지의 noise 를 없애는 것을 훈련하게 된다.
t 에 의해 인덱싱된 forward, reverse process 들 모두, 한정된 tiem step 수 T 동안 일어난다.(DDPM 저자들은 T = 1000
을 사용했다.) 당신의 ’data 분포’에서 t=0 을 가지고 시작한다. t=0 는 실제 이미지 x0 를 샘플링하는 시점이다.
forward process 는 각 time step t 에서 Gaussian distribution 의 몇몇 noise 를 샘플링한다. 그리고 그것을 이전 time step 의 image 에 더한다. ‘충분히 큰 T’ 와 ’각 time step 에서 noise 를 더하기 위한 잘 행동된 schedule’이 주어지면,
점차적인 과정을 통해서, t=T 인 시점에 isotropic Gaussian 분포 라 불리는 것을 얻을 것이다.
좀더 수학적인 설명
궁극적으로 다루기 쉬운 손실 함수(loss function)이가 필요하다. 이 loss function 은 우리의 neural network 가 최적화 작업을 하는데 필요 하다.
\(q(x_{0})\) 를 실제 데이터 분포라고 하자. 이 \(q(x_{0})\) 는 ‘실제 이미지’(real image) 이다. 우리는 이 분포에서 샘플을 채취하여 \(x_{0}\sim q(x_{0})\) 라는 이미지를 얻을 수 있다.
우리는 전방 확산 프로세스(forward diffusion process) 를 \(q(x_{t}|x_{t-1})\) 로 정의한다.
이 프로세스는 각 time step t 에서 가우스 노이즈(Gaussian noise)를 추가한다.
알려진 분산 스케줄(variance schedule) ‘\(0 < \beta_{1} < \beta_{1} < ... < \beta_{T} < 1\)’ 에 따라 \(q(x_{t}|x_{t-1})\) 는 다음과 같이 적을 수 있다.
- \(q(x_{t}|x_{t-1}) = N(x_{t}; \sqrt{1-\beta_{t}}x_{t-1}, \beta_{t}I)\)
가우시안 분포(Gaussian distribution)라고 부르는 정규분포(normal distribution) 는 2개의 parameter 로 정의되어 있다. ‘평균’(\(\mu\))과 ‘분산’(\(\sigma^{2}\)) 이다.
기본적으로, time step t 에서 각각의 새로운(미세하게 노이즈가 더 낀)이미지는
- 평균값 \(\mu_{t}\) 이 \(\sqrt{1-\beta_{t}}x_{t-1}\) 이고,
- 분산 \(\sigma_{t}^{2}\) 이 \(\beta_{t}\) 인
conditional Gaussian distribution (조건부 가우시안 분포)으로부터 그려진다.
이 분포는 우리가 \(\varepsilon \sim N(0, I)\) 에서 sample 을 가져오고, 그리고 나서 \(x_{t}\) 를 \(\sqrt{1-\beta_{t} }x_{t-1} + \sqrt{\beta_{t}}\epsilon\) 로 설정하면 얻을 수 있다.
각 time step \(t\) 에서 \(\beta_{t}\) 는 상수(constant) 가 아니다.
사실, 1 은 소위 이야기하는 variance schedule(분산 스케줄) 을 정의한다. 이 variance schedule은 1차 함수, 2차 함수, 코사인 함수등이 될 수 있다.
\(x_{0}\) 에서 시작하자. 우리는 \(x_{1}, ..., x_{t}, ..., x_{T}\) 로 끝난다. 여기서 \(x_{T}\) 는 순수한 Gaussian noise 이다. (단, 우리가 schedule 을 적절하게 설정했어야 한다.)
이제, 만약 우리가 조건 분포(conditional distribution) “\(p(x_{t-1}|x_{t})\)” 을 안다면, 우리는 역으로 process 를 실행할 수 있다.
random Gaussian noise \(x_{T}\) 샘플을 가져오고, 그리고 나서 점차적으로 그 noise 들을 제거(denoise)하여 우리는 실제 분포 \(x_{0}\) 의 샘플을 얻게 된다.
그러나, 우리는 \(p(x_{t-1}|x_{t})\) 를 모른다. 이것은 다루기 힘들다. 왜냐하면 이 조건부 확률(conditional probability) 를 계산하기 위해 모든 가능한 이미지들의 분포를 알아야 하기 때문이다. 그렇기 때문에, 우리는 이 조건부 확률 분포(conditional probability distribution) 의 근사치를 계산하기 위해 신경망(neural network) 을 지렛대로 이용할 것이다.
이것을 \(p_{\theta}(x_{t-1}|x_{t})\) 라고 부르자. 이것은 신경망의 parameter 인 \(\theta\) 를 가지고 있고, gradient descent 에 의해 update 된다.
뒷방향으로의 process (backward process)의 조건부확률 분포(conditional probability distribution) 을 표현하기 위해서 우리는 신경망이 필요하다. 이 reverse process 또한 Gaussian (정규분포)이라고 가정하자.
모든 Gaussian 분포는 2개의 parameter 들로 정의된다는 것을 떠올리자.
- 평균 : \(\mu_{\theta}\)
- 분산 : \(\sigma_{\theta}\)
그래서 우리는 다음과 같이 이 process 를 매개변수로 표현할 수 있다.
- \(p_{\theta}(x_{t-1}|x_{t}) = N(x_{t-1};\mu_{\theta}(x_{t}, t), \sum\nolimits_\theta (x_{t}, t))\)
평균, 분산 값은 또한 noise level \(t\)에 따라 달라진다.
그런이유로, 우리의 신경망은 ’평균’과 ’분산’을 학습(표현)하는 것이 필요하다.
그러나, DDPM 저자들은 ’분산’을 고정하기로 정했다. 그리고 신경망이 이 조건부확률 분포(conditional probability distribution)의 평균값 \(\mu_{\theta}\) 만을 학습하게 했다.
논문에서:
First, we set \(\sum\nolimits_\theta (x_{t}, t) = \sigma_{t}^{2}I\) to untrained time dependent constants. Experimentally, both \(\sigma_{t}^{2} = \beta_{t}\) and \(\sigma_{t}^{2} = \widetilde{\beta_{t}}\) (see paper) had similar results.
먼저, 우리는 \(\sum\nolimits_\theta (x_{t}, t) = \sigma_{t}^{2}I\) 를 설정했다. 훈련되지 않은, 시간에 종속적인 상수로 set했다. 실험에선, \(\sigma_{t}^{2} = \beta_{t}\) 과 \(\sigma_{t}^{2} = \widetilde{\beta_{t}}\), 둘다 비슷한 결과를 얻었다.
이것은 그리고 나서 나중에 Improved diffusion models paper 에서 향상됐다. 이곳에서 신경망은 또한 이 backward process 의 분산, 평균을 배운다.
그래서 우리는 신경망이 단순히 이 조건부 확률 분포(conditional probability distribution)의 ’평균’만을 배우면 된다고 가정할 것이다.
간단정리:
backward process 에 대한 식(model)을 구하려면, 모든 가능한 이미지들의 분포를 알아야 하는데, 이것은 어렵다. 그래서 근사치에 대한 model을 구하려한다. 그것을 위해 neural network 를 사용했다.
objective function 정의하기
backward process 의 평균을 학습하기위한 objective function(목적함수)를 유도하기 위해 저자들은 \(q\) 와 \(p_{\theta}\) 의 조합은 variational auto-encoder(VAE, 가변자동인코더) 처럼 보여질 수 있다.고 본다.(Kingma et al., 2013) 그런 이유로, variational lower bound(ELBO, 변동하한) 는 기초적인 실제 데이터 샘플 \(x_{0}\) 에 대한 음의 log 확률(negative log-likelihood)을 최소화하는데 사용되어질 수 있다.(ELBO 에 대한 자세한 사항에 대해서는 VAE 논문을 참조한다.)
이 process를 위한 ELBO 는 각 time step \(t\) 에서의 loss들의 합이다. 즉, \(L=L_{0} + L_{1} + ... + L_{T}\).
forward \(q\) process 와 backward process 의 구조에 의해 loss의 각 항(\(L_{0}\)는 제외) 은 실제적으로 2개의 정규분포 사이의 KL divergence 이다. 이 KL divergence는 평균에 대한 L2-loss로 명시적으로 기록된다.
구성된 forward procee \(q\)의 직접적인 결과는, Sohl-Dickstein et al.에 의해 보여진것처럼, 우리는 \(x_{0}\) 가 어떤 임의의 noise level 조건에 있더라도 \(x_{t}\) 를 샘플링할 수 있다. (왜냐하면, 가우시안(Gaussian)들의 합은 또한 가우시안이니까.) 이것은 매우 편리하다. 왜냐하면 \(x_{t}\)을 샘플링 하기 위해서 \(q\) 를 반복적으로 적용할 필요가 없기 때문이다.
- \(q(x_{t}|x_{0}) = N(x_{t};\sqrt{\overline{\alpha}_{t}}x_{0},(1 - \overline{\alpha}_{t})I)\)
- \(\alpha_{t} := 1 - \beta_{t}\) 와 \(\overline{\alpha}_{t} := \prod\nolimits_{s=1}^{t}\alpha_{s}\)
이 방정식을 ‘nice property’ 라고 부르자. 이 뜻은 가우시안 noise 를 샘플로 취할 수 있고, 적절하게 확장(scale)할 수 있다. 그리고 \(x_{0}\)에 더해서 \(x_{T}\)를 직접얻을 수 있다.
\(\overline{\alpha}_{t}\) 는 알려진 \(\beta_{t}\) variance schedule 에 대한 함수들이다. 알려졌기에, 미리 계산가능하다.
그래서 이것들은 훈련중에, loss function \(L\) 의 random 항목들을 최적화할 수 있게 해준다.
(다른말로 하면, 훈련중에 랜덤하게 \(t\)를 샘플링하고, \(L_{t}\)를 최적화 해준다.)
Ho et al. 등에서 보여진바와 같이, 이 property 의 또 다른 장점은 신경망이 ‘loss들을 구성하는 KL 항목들’ 내의 noise level \(t\) 에서 ‘네트워크 \(\varepsilon_{\theta}(x_{t}, t)\) 를 통해서 추가된 noise’ 를 학습하도록 하기위해 평균을 다시 매개변수화 한다.(reparametrize) (이 훌륭한 블로그 게시물을 참조하자.)
이 말은 우리의 신경망이 평균 예측기(mean predictor) 보다는 “noise predictor”(노이즈 예측기)가 된다는 뜻이다.
…
개인적인 해석
부인(Disclaimer): 이 해석은 틀릴 수 있다.
이것을 대략적으로 이해한 바를 적으면, DDPM 은 이미지를 추상화시키고(noise 라고 보면 될듯), 이 추상화된 이미지에서 부터 다시 구체적인 이미지를 뽑아내는 것인 듯 하다.
즉, 특정이미지의 변형을 뽑아내는 방법인 듯 하다. 그래서 아예 새로운 그림을 그리는 것이 아닌, 있는 그림의 변형을 만들어내는 방법인듯 보인다.
entropy
- 초보를 위한 정보이론 안내서 - Entropy란 무엇일까
- What’s an intuitive way to think of cross entropy? - Quora
- Information entropy (video) | Khan Academy
- Kullback-Leibler Divergence Explained — Count Bayesie
See Also
- [논문 리뷰] Denoising Diffusion Probabilistic Model(2020)
- Diffusion model 설명 (Diffusion model이란? Diffusion model 증명) - 유니의 공부
- Generating images with DDPMs: A PyTorch Implementation | by Brian Pulfer | MLearning.ai | Medium
- machine learning - Objective function, cost function, loss function: are they the same thing? - Cross Validated
- What are Diffusion Models? | Lil’Log
- Introduction to Diffusion Models for Machine Learning
댓글 없음:
댓글 쓰기