SDE(Stochastic Differential Equation)를 활용한 Diffusion model에 대하여알아보자. Diffusion model은 그냥 디퓨전 모델이라고 불러보자.
디퓨전 모델?
디퓨전 모델이란 무엇일까? Data sample x \in \mathbb{R}^d 가 있다고 하자. x 는 어떤 분포 p_{data}(\cdot) 를 따를 것이다. p_{data}(\cdot) 는 데이터 분포의 pdf(probability density function)정도로 해두자. 디퓨전 모델은 x를 변형하고 가우시안 노이즈를 더해서 데이터 분포가 잡음이 많이 끼게 만든다. 데이터를 잡음으로 만들었으니 반대의 과정인 잡음에서 노이즈를 만드는 방법을 안다면 잡음에서 데이터 샘플을 만들 수 있다. 이러한 sense로 디퓨전 모델은 데이터를 가우시안 노이즈처럼 만들게끔 세팅하고 그 반대과정인 노이즈에서 데이터 샘플을 만드는 방법을 학습해서 데이터 샘플을 만드는 것을 의미한다.
Forward SDE (data 에서 노이즈로)
데이터에 어떻게 해서 노이즈를 추가할 것인가? 그거는 확률미분 방정식으로 표현된다.
\begin{equation} dx_t = f(x_t,t)dt + g(t) dw_t , 0\leq t \leq T \tag{Forward SDE} \end{equation}(Forward SDE)에서 f(x_t,t)\mathbb{R}^d는 drift coefficient , g(t)\in \mathbb{R} 는 diffusion coefficient, w_t 는 위너프로세스 (wiener process)를 의미한다. drift coefficient와 diffusion coefficient는 user의 세팅에 따라 달라진다. x_0 는 데이터 분포에서 나오는 random vector 라 생각하면 되고 (Forward SDE)에 의해 t=0 에서 t=T 까지 x_0 로부터 어떠한 stochastic process x_t 를 만들어낸다. x_t 는 diffusion coefficient에 의해 잡음이 끼게 된다. (Forward SDE)는 데이터 x_0 를 노이즈화 만드는 과정을 의미했고 그러면 반대인 노이즈에서 데이터분포를 만드는 방법은 어떻게 표현할까? 바로 Reverse SDE에 의해 표현된다.
기호정리 p_t (x_t)
설명을 이어나가기전에 하나를 정의하겠다. (Forward SDE)에서 x_0 로 부터 시작해서 stochastic process x_t 가 만들어진다. 그러면 x_t 는 randomness 를 갖는 확률벡터 (random vector)이다. 그러면 x_t 는 pdf를 갖게 되는데 이 pdf를 p_t(x_t) 라 표현하겠다.
좀더 들어가기전에 Score function \nabla_{x_t} \log p_t (x_t) 정의
p_t(x_t) 에 로그를 붙히고 미분한것을 score라고 부른다. \nabla_{x_t} p_t(x_t) 는 x_t 의 score라고 생각하면 된다.
Reverse SDE (노이즈에서 data로)
(Forward SDE)에서는 데이터를 노이즈로 만드는 것을 표현했고 이제는 반대과정인 노이즈에서 데이터를 만드는 과정을 표현하겠다. 데이터를 노이즈로 변화하는 과정을 SDE로 표현했었고 노이즈에서 데이터를 만드는 과정또한 SDE로 표현된다. 이러한 SDE를 Reverse SDE라고 부른다.
\begin{equation} dx_t = \left[f(x_t,t)-g(t)^2 \nabla_{x_t} \log p_t (x_t) \right]dt + g(t) d\tilde{w}_t \tag{Reverse SDE} \end{equation}, 0\leq t \leq T(Reverse SDE)에서 \tilde{w}_t 는 t = T 에서 t=0 방향으로 wiener process이다. reverse wiener process라고도 부른다. (Reverse SDE)는 t= T 에서 t=0로 가는 방향을 묘사한다. (엄밀한 얘기는 아니지만) Reverse SDE가 만들어내는 stochastic process와 Forward SDE가 만들어내는 stochastic process의 pdf p_t(x_t) 는 동일하다. (Reverse SDE)의 시작점인 x_T 는 p_T(x_T) 로 부터 샘플링 하고 (굉장히 노이즈 하겠죠) Reverse SDE를 통해 t=0로 보낸다면 p_data(x_0) 를 따르는 데이터 샘플이 생성될것이다. 그런데 여기서 문제는 Reverse SDE를 simulation 할 때 새로운 term \nabla_{x_t} \log p_t(x_t) 가 필요한데 이 값을 알 수가 없다. 디퓨전 모델에서는 score \nabla_{x_t} \log p_t(x_t) 를 추정하는 것이 중요한 문제이다.
디퓨전 모델에서 추정하고자 하는 대상
(Reverse SDE)에서 score \nabla_{x_t} \log p_t(x_t) 가 등장했고 (Reverse SDE)를 사용하기 위해서는 이 score가 필요하다. 디퓨전 모델에서는 이 score \nabla_{x_t} \log p_t(x_t) 를 추정하는 것이 필요하다!, score를 추정했다면 노이즈 x_T 로 부터 시작하여 (Reverse SDE)를 적분(수치적분)하여 데이터 샘플 x_0 를 찾는 것을 목적으로 한다.
참고글: [논문간단리뷰] Score-Based Generative Modeling through Stochastic Differential Equations