Review

Score-based generative modeling (SBGM)이란 무엇일까? (1)

AI&영상처리개발팀
AI&영상처리개발팀
등록일2024. 02. 16
Scorebased-generative-modeling-SBGM이란-무엇일까-1

 



 summary 
Score-based generative modeling (NCSN v1)은 데이터 분포를 이해하기 위한 접근법으로, Kingma가 2014년에 활용한 Variational Inference의 개념에서 출발하여 꼼꼼히 수식적으로 NCSN v1을 이해해본다.
 

Score-based model에 대한 이해 (Score-based generative modeling)
 

Score-based generatie modeling (SBGM)이란 무엇일까? 먼저 역사를 거슬러 올라가 볼 필요가 있다.

2014년 Kingma는[Variational Autoencoder]논문에서 autoencoder에 대한 접근을 variational inference를 통해 수행했다.
우리가 알고자 하는 것은 data의 distribution, \(p(x)\)
하지만, 이를 direct하게 얻는 것은 불가능하다. (이를 intractible이라고 부른다.)

따라서 우리는 정보량은 똑같은(1-1 대응이 있는)\(\log p(x)\)를 유추하게 되는데 이 과정이 variational inference (VI) 라고 불리는 과정이다.
구체적으로는 다음처럼 구성된다.
 

먼저, \(\log p(x)\)를 추론하기 위해 다음과 같은 트릭을 쓴다.

 

\(\log p(x) = 1\cdot \log p(x)\)


너무나도 쉬운 수식이다. 이제, 모든 확률분포는 전체 영역에 대해 적분하면 1이 나온다는 사실을 바탕으로 

 

\(\begin{align*}\log p(x) &= 1\cdot\log p(x)\\ &=\int_{\Omega}q(z|x)\log p(x)dz \end{align*} \)

 

라는 수식을 생각해볼 수 있다. 여기서 또 한번의 트릭을 쓰면,

 

\(\begin{align*}\log p(x) &= 1\cdot\log p(x)\\ &=\int_{\Omega}q(z|x)\log p(x)dz\\ &=\int_{\Omega}q(z|x)\log \bigg(p(x)\frac{q(z|x)}{q(z|x)}\bigg)dz \end{align*}\)

 

가 되는데, Bayes’ rule을 적용하면 \(p(x)=p(x|z)p(z)/p(z|x)\)가 되므로 위 식은

 

\(\begin{align*}\log p(x) &= 1\cdot\log p(x)\\ &=\int_{\Omega}q(z|x)\log p(x)dx\\ &=\int_{\Omega}q(z|x)\log \bigg(p(x)\frac{q(z|x)}{q(z|x)}\bigg)dz\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{p(z|x)}\frac{q(z|x)}{q(z|x)}\bigg)dz \end{align*} \)

 

로 정리할 수 있다. \(\log\)안의 식들을 잘 재분배하면 위 식은
 

\(\begin{align*}\log p(x) &= 1\cdot\log p(x)\\ &=\int_{\Omega}q(z|x)\log p(x)dx\\ &=\int_{\Omega}q(z|x)\log \bigg(p(x)\frac{q(z|x)}{q(z|x)}\bigg)dz\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{p(z|x)}\frac{q(z|x)}{q(z|x)}\bigg)dz\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{q(z|x)}{p(z|x)}\frac{p(x|z)p(z)}{q(z|x)}\bigg)dz \end{align*}\)

 

가 될 것이다. 이제 \(\log(ab)=\log a + \log b\) 라는 성질을 이용하면

 

\(\begin{align*}\log p(x) &= 1\cdot\log p(x)\\ &=\int_{\Omega}q(z|x)\log p(x)dx\\ &=\int_{\Omega}q(z|x)\log \bigg(p(x)\frac{q(z|x)}{q(z|x)}\bigg)dz\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{p(z|x)}\frac{q(z|x)}{q(z|x)}\bigg)dz\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{q(z|x)}{p(z|x)}\bigg)dz + \int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{q(z|x)}\bigg)dz \end{align*} \)

 

로 찢을 수 있고, Kullback-Leibler divergence (KLD)가 \(D_{KL}(f_1||f_2)=\int f_1\log(f_1/f_2)\) 라는 것을 상기하면 위 식은

 

\(\begin{align}\log p(x) &= 1\cdot\log p(x)\nonumber\\ &=\int_{\Omega}q(z|x)\log p(x)dz\nonumber\\ &=\int_{\Omega}q(z|x)\log \bigg(p(x)\frac{q(z|x)}{q(z|x)}\bigg)dz\nonumber\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{p(z|x)}\frac{q(z|x)}{q(z|x)}\bigg)dz\nonumber\\ &=\int_{\Omega}q(z|x)\log\bigg(\frac{q(z|x)}{p(z|x)}\bigg)dz + \int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{q(z|x)}\bigg)dz\nonumber\\ &=D_{KL}(q(z|x)\|p(z|x)) + \int_{\Omega}q(z|x)\log\bigg(\frac{p(x|z)p(z)}{q(z|x)}\bigg)dz\nonumber\\ &=D_{KL}(q(z|x)\|p(z|x))-D_{KL}(q(z|x)\|p(z))+\mathbb{E}_{q(z|x)}\big[\log p(x|z)\big] \end{align} \)

(1)
 

가 된다. 이것이 variational inference이다.
 

그렇다면 \(q\) 라는 분포는 무엇을 의미하는가? 우리가 디자인한 뉴럴 네트워크를 의미한다. 하지만 이 글은 VAE에 대한 글은 아니기 때문에 VI는 이정도로 마치고, 이것이 이후 SBGM에서 어떻게 쓰이는지 살펴보는 것이 낫겠다는 생각이 든다.
 

VI의 문제점은 무엇일까? 본인이 생각하기에 가장 큰 문제점은 \(D_{KL}(q(z|x)\|p(z|x))\) 를 포함한 KLD 항이지 않을까 한다. 실제로 데이터의 분포는 아까도 말했듯 intractible하다. 하지만 KLD를 정확하게 계산하기 위해서는 distribution의 closed form을 알아야 한다.
이는 적분을 통해 KLD가 계산이 되기 때문이다. 이렇게 data distribution의 likelihood를 추론하여 generation을 진행하는 모델은 태초부터 강력한 분포에 대한 가정을 끌고 들어가기 때문이다.
Generative adversarial network (GAN) 은 이러한 문제를 좀 우회하기는 하지만 학습에 대한 안정성이 문제가 된다.

 

따라서 본 논문에서는 이 문제들을 극복하는 방법으로 score-based modeling을 사용하였다. Score이라는 것은 Stein score을 줄여 말하는 것으로, 쉽게 말하면 network의 gradient matching을 수행하는 것을 말한다.
각설하고 score-based classification model의 핵심적인 아이디어를 보자. 기본적으로 classification model \(p(x)\)는 확률을 뱉어 주는 함수이므로 probability의 약자 \(p\)를 쓰도록 하자. 이 모델의 output이 softmax라면 해당 모델은 다음과 같은 형태를 띄고 있을 것이다:

 

\(p(x)=\frac{e^{f(x)}}{Z}\)

 

왜 이런 표현을 한 것일까? 먼저, softmax의 분모에 오는 \(Z\) 는 상수이다. 뿐만 아니라 해당 꼴은 분수와 exponential로 이루어져 있으므로 다음과 같이 분리가 가능하다.

 

\(\log p(x) = f(x) - \text{const}\)

 

즉, softmax를 한 층 덜 계산해도 된다는 것을 의미한다. 이제 단순히 probability를 direct하게 맞추는 것을 하지 말고, network output 자체를 맞추는 것을 하면 뭔가 좀 더 정확하게 학습이 가능해질 것만 같다. Neural network를 \(p_{\theta}(x)\) 로 쓰자. 그러면 

 

\(\log p_{\theta}(x) = f_{\theta}(x) + \text{const}\)

 

가 되니까 데이터 포인트 \(x\)에 대한 gradient는

 

\(s_{\theta}(x) := \nabla_x\log p_{\theta}(x) = \nabla_xf_{\theta}(x)\)

 

가 되고, 따라서 우리는 다음과 같은 objective function을 생각해 볼 수 있다.

 

\(\begin{equation}\mathcal{L}_{\theta}=\frac{1}{2}\mathbb{E}_{x\sim p_{data}(x)}\bigg[\big\|s_{\theta}(x)-\nabla_x\log p_{data}(x)\big\|^2\bigg]\end{equation}\)

(2)
 

이는 실제로 계산하기가 불가능하다. 왜 그럴까? 우리가 알고자 하는 것은 data의 분포이다. 즉, 우리가 알고자 하는 것이\(p_{data}(x)\) 이다.
이는 당연히 학습 당시에는 모르고 있고, 이것의 gradient또한 우리는 알 수 없다. 그런데 loss term에 들어가 있으므로 계산이 절대로 불가능할 것만 같아 보인다. 하지만 우리는 답을 찾을 것이다.
다음과 같은 방식으로 계산을 우회해보자. (단, \(s_{\theta}(x)\)와 \(\nabla_x\log p_{data}(x)\) 가 vector임에 주의하라. 정 계산이 힘들면 1차원으로 생각해도 이해하는데 크게 무리는 없다.)

 

\(\begin{align}\mathcal{L}_{\theta}&=\frac{1}{2}\mathbb{E}_{x\sim p_{data}(x)}\bigg[\big\|s_{\theta}(x)-\nabla_x\log p_{data}(x)\big\|^2\bigg]\nonumber\\ &=\frac{1}{2}\mathbb{E}_{x\sim p_{data}(x)}\bigg[\big\langle s_{\theta}(x)-\nabla_x\log p_{data}(x),s_{\theta}(x)-\nabla_x\log p_{data}(x)\big\rangle\bigg]\nonumber\\ &=\frac{1}{2}\mathbb{E}_{x\sim p_{data}(x)}\bigg[\big\|s_{\theta}(x)\|^2-2\big\langle s_{\theta}(x),\nabla_x\log p_{data}(x)\bigg\rangle+\big\|\nabla_x\log p_{data}(x)\big\|^2\bigg]\end{align} \)

(3)
 

그런데 \(p_{data}(x)\) 는 알지는 못하지만 이미 정해져 있는 값이므로 최적화 관점에서는 필요 없는 항이다. 따라서 (2)는 다음처럼 바꿀 수 있다.

 

\(\begin{align}\mathcal{L}_{\theta}=\frac{1}{2}\mathbb{E}_{x\sim p_{data}(x)}\bigg[\big\|s_{\theta}(x)\|^2-2\big\langle s_{\theta}(x),\nabla_x\log p_{data}(x)\big\rangle\bigg]\end{align} \)

(4)
 

위 식에서 

 

\(\begin{equation}\frac{1}{2}\mathbb{E}\bigg[-2\big\langle s_{\theta}(x),\nabla_x\log p_{data}(x)\big\rangle\bigg]\end{equation}\)

(5)
 

항을 살펴보자. 위 식을 성분별로 쓰면

 

\(=-\int p_{data}(x)\bigg(s^1_{\theta}(x)\nabla_x^1\log p_{data}(x)+s^2_{\theta}(x)\nabla_x^2\log p_{data}(x)+\cdots+s^N_{\theta}(x)\nabla_x^N\log p_{data}(x)\bigg)dx \)


가 된다. 이를 부분적분을 통해 계산하면 (\(i\)-번째 성분을 위첨자로 적었다.)

 

\(\begin{align}&=-\sum_{i=1}^N\int p_{data}(x)\cdot \bigg(s^i_{\theta}(x)\nabla_x^i\log p_{data}(x)\bigg)dx\nonumber\\ &=-\sum_{i=1}^N\int p_{data}(x)s^i_{\theta}(x)\frac{1}{p_{data}(x)}\cdot\frac{\partial p_{data}(x)}{\partial x_i}dx\nonumber\\ &=-\sum_{i=1}^N\int s^i_{\theta}(x)\frac{\partial p_{data}(x)}{\partial x_i}dx\\ &=-\sum_{i=1}^N\bigg(\bigg[s^i_{\theta}(x)p_{data}(x)\bigg] - \int\frac{\partial s^i_{\theta}(x)}{\partial x_i}p_{data}(x)dx\bigg)\\ &=\int\bigg(\frac{\partial s^1_{\theta}(x)}{\partial x_1}+\frac{\partial s^2_{\theta}(x)}{\partial x_2}+\cdots+\frac{\partial s^N_{\theta}(x)}{\partial x_N}\bigg)p_{data}(x)dx\nonumber\\ &=\int\text{tr}\big(\nabla_xs_{\theta}(x)\big)p_{data}(x)dx\nonumber\\ &=\mathbb{E}_{x\sim p_{data}(x)}\bigg[\text{tr}(\nabla_xs_{\theta}(x))\bigg]\nonumber \end{align}\)

(6)(7)
 

이 된다. 이 때 (6)에서 (7)로 넘어가는 과정에는 부분적분이 쓰였다. 즉, (3)의 최적화 공식은 다음을 최적화 하는 것과 동치이다.

 

\(\begin{equation}\mathbb{E}_{x\sim p_{data}(x)}\bigg[\text{tr}(\nabla_xs_{\theta}(x))+\frac{1}{2}\|s_{\theta}(x)\|^2\bigg]\end{equation}\)

 

이를 효율적으로 해결하기 위해서는 두 가지 테크닉이 있는데,  다음 편에서 더 상세하게 살펴보기로 한다.

#AI

#AI-Study

#Deep-learning

#SBGM

#Score-based model

#Corelinesoft

#Coreline AI

Contact

제품, 인재 채용, 투자 관련 또는 기타 문의사항이 있으신 경우 편하신 방법으로 연락주시기 바랍니다

문의하기