우선 DDPM의 “학습(Training)”과 “샘플링/생성(Sampling)” 과정을 구분해서 생각해보면 이해가 좀 더 수월합니다. 1. 학습(Training) 단계에서의 모델 동작 학습 단계에서는 다음 과정을 거쳐 모델을 훈련합니다. 1. **(Forward 과정) x0에서 xt 만들기** xt=√ˉαtx0+√1−ˉαtϵ,ϵ∼N(0,I). - 이 때 x0는 우리가 알고 있는 **실제 데이터(ground truth)** 입니다. - ˉαt는 스케줄에 따라 정의된 누적 노이즈 계수이며, ϵ은 가우시안 노이즈입니다. 2. **(모델 예측) 네트워크가 xt로부터 ˆxθ(xt,t) 예측** - 실제 DDPM 구현에서는 ˆxθ 대신 ˆϵθ (노이즈 예측) 형태로도 많이 사용하지만, 여기서는 x0 직접 예측 형태로 생각해도 좋습니다. - 학습 시에는 실제 x0를 알고 있으므로, 모델이 만들어낸 ˆxθ(xt,t)와 진짜 x0 사이의 차이를 최소화하도록 학습합니다. 3. **(손실 함수) ‖ (또는 \|\epsilon - \hat{\epsilon}_\theta(x_t, t)\| )** \\ - 위 오차(혹은 노이즈 예측 오차)를 최소화하도록 모델을 학습시킵니다. \\ 결과적으로, **훈련이 끝난 뒤**에는 “임의의 시점 t ”에서 “노이즈가 섞인 x_t ”가 들어오면 ** x_0 를 잘 복원(혹은 그에 대응하는 노이즈를 잘 예측)** 해내는 모델 \hat{x}_\theta를 얻게 됩니다. \\ 2. 샘플링(생성, Inference) 단계에서의 모델 동작 \\ 2.1. 단번에 x_0 를 뽑아내면 되지 않을까? \\ 학습이 끝난 모델은 x_t 가 주어졌을 때, “직접적으로” x_0 를 예측할 수 있습니다. 하지만 **샘플링/생성 단계**에서는 “아예 랜덤한 노이즈”에서부터 시작해 **“역으로”** 데이터 샘플을 만들고자 합니다. - 즉, x_T \sim \mathcal{N}(0,I) 같은 순수 노이즈에서부터 x_0 을 생성해야 하는 상황입니다. - 이 때 T 는 noising step(시간 스텝)의 최댓값입니다. “학습된 모델이 x_t \rightarrow x_0 를 바로 뽑아줄 수 있지 않나?” 하고 생각할 수 있지만, 다음 문제가 있습니다. 1. **단계별 샘플링 분포와 일치해야 함** DDPM은 “정해진 노이즈 추가(Forward) 공정”과 “그것을 역추적하는(Reverse) 공정”이 **마르코프 체인** 형태로 연결되어 있습니다. - 수식으로는 q(x_t | x_0) \quad \leftrightarrow \quad p_\theta(x_{t-1}|x_t) 의 관계를 만족해야 합니다. - 즉, “ x_T 에서 단번에 x_0 를 예측”하는 것이 아니라, “ x_T \rightarrow x_{T-1} \rightarrow \cdots \rightarrow x_1 \rightarrow x_0 ” 식으로 **단계적으로** 샘플링해야 “우리가 정의한(학습한) 분포”에 부합하는 올바른 샘플링을 얻게 됩니다. 2. **확률적(무작위) 샘플링 과정 반영** - 단순히 “\hat{x}_\theta(x_t, t) = x_0\)”라고 한 번에 찍으면, 그 결과는 “확률적”이지 않고, 네트워크가 학습한 평균(혹은 모드) 근처로 바로 매핑되는 결과일 가능성이 큽니다. - DDPM의 묘미는 “스텝마다 \mu_\theta(x_t, t)와 \sigma_\theta(x_t, t) (분산)를 이용해 **무작위** 샘플을 뽑으며** 데이터 분포를 복원한다는 점”입니다. - 요컨대, **“조건부 분포”** p_\theta(x_{t-1}|x_t) 를 따르면서, 다양한 결과물을 생성할 수 있게 됩니다. 3. **분산(variance), 표준편차에 대한 고려** - DDPM 역과정에서 “평균(\mu_\theta) 뿐 아니라, 분산(또는 표준편차)”도 중요합니다. - 한 번에 x_0 를 찍어내면, 분산 정보가 제대로 반영되지 않아, 결과적인 생성품이 **학습 시 정의한 확률분포**와 괴리가 생길 수 있습니다. \\ 2.2. 그래서 \mu_\theta(x_t, t)를 왜 쓰나? \\ 학습 과정에서 얻은 \hat{x}_\theta(x_t, t) (혹은 \hat{\epsilon}_\theta)을 **역추적 과정의 “평균”**에 대입하여 \mu_\theta(x_t, t) = \frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})\,x_t + \sqrt{\bar{\alpha}_{t-1}}(1-\alpha_t)\,\hat{x}_\theta(x_t,t)}{1-\bar{\alpha}_t} 같은 **가우시안 분포의 평균**을 구성합니다. 그리고 샘플링에서는 x_{t-1} \sim \mathcal{N}\Bigl(\mu_\theta(x_t, t), \;\Sigma_\theta(t)\Bigr) 의 형태(분산 \Sigma_\theta(t) 포함)를 따라 표본을 뽑습니다. 이렇게 “(평균 + 가우시안 랜덤)” 방식으로 매 스텝마다 조금씩 노이즈를 제거하며(denoising) 최종적으로 x_0 에 도달합니다. \\ 정리 \\ - **학습 시에는** “노이즈가 섞인 x_t 에서 x_0 를 복원”하도록 가르칩니다. \\ - 실제 x_0 가 존재하기 때문에, 모델이 예측한 \hat{x}_\theta(x_t, t)를 진짜 x_0 와 비교해 오차를 줄이도록 학습합니다. \\ - **하지만 생성(샘플링) 시에는** “랜덤 노이즈 x_T 에서부터” 여러 단계(T \to T-1 \to \dots \to 0)에 걸쳐 분포적으로 올바른 시퀀스를 거쳐야, \\ - 모델이 학습해둔 “데이터 분포”에 맞게 샘플을 생성할 수 있습니다. \\ - 이 마르코프 체인 역과정에서 사용되는 **가우시안 분포의 평균**이 \mu_\theta(x_t, t) 이며, 그 안에 \hat{x}_\theta(x_t, t)가 들어가게 됩니다. \\ 즉, **“학습에서 x_0 예측이 가능하니 샘플링 때 단번에 x_0 를 뽑으면 되지 않을까?”** 라는 궁금증은 자연스럽지만, \\ DDPM이 정의하는 **“확률적 역과정”**에 충실하려면 매 단계마다 \mu_\theta와 (필요 시) 분산을 반영하여 **확률 샘플**을 뽑아야 “진짜” diffusion 모델이 의도한 **분포적 생성**을 얻을 수 있다는 점이 핵심입니다. 그러므로 1. ** x_t 로부터 x_0 예측:** 각 시간 스텝 t 에서 네트워크 \hat{x}_\theta(x_t, t) 를 사용해 x_0 를 예측합니다. 2. ** \mu_\theta(x_t, t) 계산:** 예측한 x_0 를 이용해, 역과정의 평균인 \mu_\theta(x_t, t) 를 아래와 같이 계산합니다. \mu_\theta(x_t, t) = \frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})\,x_t + \sqrt{\bar{\alpha}_{t-1}}(1-\alpha_t)\,\hat{x}_\theta(x_t,t)}{1-\bar{\alpha}_t} 3. **가우시안 분포에서 샘플링:** 계산된 \mu_\theta(x_t, t) 와 정해진(또는 네트워크가 예측한) 분산 \Sigma_\theta(t)을 이용해, x_{t-1} \sim \mathcal{N}\left(\mu_\theta(x_t, t),\, \Sigma_\theta(t)\right) 의 방식으로 x_{t-1} 를 샘플링합니다. 이 과정을 t = T 에서 t = 0 까지 반복하면서 최종적으로 x_0 에 도달하게 됩니다. 즉, 각 스텝마다 x_0 를 예측하여 그 예측값을 기반으로 가우시안 분포를 구성하고, 이를 통해 점진적으로 노이즈를 제거해 나가는 방식입니다.
'학술 > deep learning' 카테고리의 다른 글
[질문/답] DDPM에서 pθ(xt−1∣xt)를 학습할 때는 q(xt−1∣x0)에 일치 시키면 안되는가? (0) | 2025.03.24 |
---|---|
DDPM에서 노이즈 예측 신경망 평균 공식 유도 (0) | 2025.03.21 |
윈도우에서 tensorrt 설치 하기 및 python 확인 (2) | 2022.05.20 |