이번에는 지난 번 알아봤었던 생성 모델들 (GAN, VAE, Flow-based models) 보다 더 좋은 성능을 보여주며 최근에 많이 활용되고 있는 디퓨전 모델(Diffusion Model)에 대해서 알아보겠습니다.
[딥러닝 with Python] GAN (Generative Adversarial Network)
[딥러닝 with Python] VAE (Variational Auto Encoder) 개념 정리
[딥러닝 with Python] 노멀라이징 플로(Normalizing Flow)
먼저 알아볼 내용은 DDPM(Denoising Diffusion Probabilistic Models) 이라는 논문이 되겠습니다.
1. DDPM (Denoising Diffusion Probabilistic Models)
- 디퓨전 모델은 non-equilibrium thermodynamics(비평형 열역학)에서 영감을 받아서 나온 모델입니다.
* 이는 에너지나 물질이 시간에 따라 변하면서 시스템의 균형을 이루지 않는 상태에서 일어나는 과정을 연구하는 분야로, 이 개념을 활용해 점진적으로 노이즈를 추가하다가 이를 역으로 제거하는 과정을 통해 데이터를 생성하는 방법을 말합니다.
* 이때 이러한 노이즈의 확산 단계는 Markvoian process(각 상태가 그 이전 상태에만 의존)으로 정의하여 점차 노이즈가 추가될 수록 원본 상태와는 점차 멀어지게 만들고, 이렇게 원본과 멀어진 데이터에서 Denoising을 하는 과정을 학습하면서, 결과적으로는 완전한 노이즈 상태에서도 실제 있을법한 새로운 데이터를 생성하는 것을 목적으로 하고 있습니다.
- 또한, 디퓨전 모델은 다른 생성 모델들처럼 Input data의 정보를 압축하지 않고, 원본 차원을 유지하면서 상대적으로 고차원적인 정보를 활용하는 것이 특징이 되겠으며, 이를 통해 더 좋은 품질의 결과물이 나오게 되었다고도 볼 수 있습니다.
- Denoising Diffusion model은 크게 2단계로 구성되어있으며, noise를 추가해가는 forward diffusion process와 denoising하는 backward denoising process 입니다.
- 먼저 forward diffusion process를 확인해보자면
* 아래와 같이 q라는 diffusion kernel을 활용해, 이전 단계의 데이터(t-1 스텝)에 가중치인 sqrt(1-Beta t)를 곱해, 원본 정보의 비중을 점차 줄여가고, 이때 Beta t를 곱한 가우시안 노이즈의 분산을 나타낸 항을 활용합니다.
* 이때 Reparameterization trick을 통해 Normalization이 되도록 해주는데요
- 이 과정을 정리하면 아래와 같습니다.
1. 노이즈 추가 비율 정의
* 여기서 Beta t는 각 시점에서 노이즈의 비율을 조정하는 하이퍼파라미터이며, 작은 값은 적은양의 노이즈를 추가하고 큰 값은 더 많은 노이즈를 추가하는 것을 말합니다.
2. 누적 알파를 의미하며, 단계 t 까지의 모든 alpha 값을 누적 곱한 값을 의미합니다.
3. 각 단계에서의 데이터 상태인 xt는 이전 단계의 xt-1에 squared root alpha t를 곱하고, 노이즈에 squared root 1 - alpha t를 곱해줍니다.
* 여기서 노이즈는 평균은 0이고 분산이 1인 정규분포에서 샘플링한 것입니다.
4. 단계 t 에서의 데이터 상태를 초기 상태 x0로 표현하면 이와 같습니다.
5. 노이즈가 추가된 데이터의 확률분포를 의미하며,
6. 샘플링은 xt를 위 식과 같이 생성하는데 이때 에러가 표준 정규분포에서 샘플링 된 것입니다.
- 이때 디퓨전 커널은 가우시안 convolution이라고 보면 되며 아래와 같이 점차 T에 가까워질수록 데이터의 분포는 가우시안 분포에 가까워집니다.
- 이제 Reverse Denoising Process에 대해서 알아보겠습니다.
* x가 t 스텝일때의 확률은 N(0,1)을 따르는 가우시안 분포이고,
* 한단계 전의 상태로 이동할 확률분포는 위와 같이 나오게 되는데 이때 평균은 시간 t와 현재 노이즈 상태인 xt에 따른 평균 값으로 네트워크가 학습하여 예측하고, 노이즈의 분산은 각 단계에서 일정하거 학습을 통해 조절될 수 있습니다.
* 이를 전체 확률로 나타내면 P theta가 되며, 이 식은 초기의 완전 노이즈 상태 xt에서 출발하여, 점진적으로 노이즈를 제거해가며 깨끗한 이미지인 x0를 복원하는 과정을 말합니다.
* 이때 학습 가능한 네트워크는 주로 Unet이나 Denoising AutoEncoder를 활용합니다.
- 해당 논문에서는 아래와 같이 U-Net 아키텍처에 ResNet block을 결합하고 Self Attention Layer를 추가해서 학습 가능한 네트워크를 구성합니다.
* Diffusion 과정에서 시간 정보 t는 굉장히 중요한 요소이며, 시간 정보는 Fully Connected Layer를 통해 신경망에 전달되며 Sinusoidal PE 또는 Random Fourier Features와 같은 방식으로 임베딩이 됩니다. 이 시간 정보는 Unet의 각 Residual Block에 전달됩니다.
- 이를 구조화해보면 아래와 같습니다.
* x0는 원본 이미지에서 샘플링을 하고, t는 임의의 시간 단계로 설정합니다.
* 랜덤 노이즈를 샘플링하여 xt를 생성하고,
* 네트워크의 손실함수는 예측된 노이즈와 실제 노이즈 간의 차이를 최소화하는 방향으로 설계됩니다.
- 즉 , 각 단계 xt에서 원본 이미지와 현재 노이즈 수준을 이해하고 추가된 노이즈를 정확히 예측하는 방향으로 학습이 됩니다.
* 각 단계별로 U-Net이 작동하는데 예를 들어 t=T 즉 가장 노이즈가 많은 상태부터 시작해 t=0까지 역순으로 진행되는데, 이때 U-Net은 매 단계에서 현재 노이즈가 포함된 이미지 xt와 시간 정보 t를 입력으로 받아서 해당 단계에서의 노이즈를 예측하는 것입니다.
* 그리고, 예측된 노이즈를 사용해 다음 단계 이미지를 생성하고, 각 단계에서 예측된 노이즈를 제거해가며 점차 깨끗한 이미지인 x0에 가까워지도록 복원하는 것을 목표로 합니다.
* 이때 시간 정보인 t는 단계별로 현재 노이즈 수준을 모델이 이해할 수 있도록 돕는 역할을 하기에 중요하다고 할 수 있습니다.
* 결국 U-Net은 각 단계에서 반복적으로 적용되며, xt에서 x0까지의 모든 단계에서 노이즈를 예측하고 제거하는 역할을 수행하게 됩니다.
- 아래는 Forward diffusion process에서 고주파 성분이 빠르게 교란되면서 원본 신호가 사라지고 노이즈로 가득차게 되는 것을 설명해줍니다. 작은 t에서는 원본 신호의 구조가 보존되지만, 큰 t에서는 고주파 노이즈가 원본 신호를 덮어버리게 되는 것입니다.
- 다음은 Reverse denoising process에서,
* 초기 단계(큰 t)의 모델은 이미지의 저주파 성분(coarse content), 즉 이미지의 거친 형태나 전반적인 구조를 복원하는데 중점을 두고 있지만,
* 후반 단계(작은 t)에서는 이미지가 점차 복원되면서, 노이즈가 줄어들고 세부적인 정보가 필요해지며, 이때 고주파 성분(high frequency), 즉 이미지의 세부적인 디테일을 복원하는데 집중이 되는 것입니다.
* 이에 따라 각 단계에서 복원해야하는 주파수 성분이 다르기 때문에, 각 시간 단계별로 손실 함수에 가중치를 다르게 부여하는 것이 중요하다고 볼 수 있습니다.
-
'딥러닝 with Python' 카테고리의 다른 글
[딥러닝 with Python] 디퓨전 모델(Diffusion Model) (3) / Classifier Guidance (0) | 2024.11.12 |
---|---|
[딥러닝 with Python] 디퓨전 모델(Diffusion Model) (2) DDIM (0) | 2024.11.11 |
[딥러닝 with Python] GAN (Generative Adversarial Network) (1) | 2024.11.09 |
[딥러닝 with Python] Vision Transformer(ViT) 파이썬 코드 구현(파이토치 / 코랩) (2) | 2024.11.08 |
[딥러닝 with Python] Segment Anything / Segment Anything Model(SAM) (0) | 2024.11.08 |
댓글