Normalizing flow에 대해 알아보자. Normalizing flow는 어떤 distribution을 알고 싶을 때 사용하는 기법이다. 어떤 상황에서 사용되는지 보자.
Normalizing flow 수학적으로 표현하기
랜덤벡터 $\mathbf{X}$가 있을 때 이것의 확률밀도함수 (pdf: probability density function) $p_{\mathbf{X}}(\mathbf{x})$를 추정할 때 Normalizing flow를 적용할 수 있다.
랜덤벡터 $X$가 있을 때 이것의 pdf $p_{X}(x)$를 구하고 싶다. $p_{X}(x)$는 알턱이 없다. 알기가 어렵다. pdf가 알려진 어떤 랜덤벡터 $Z_0$로부터 $X$의 분포를 근사하는 방법을 취할 수 있다.
$Z_0$를 랜덤벡터이며 이것의 pdf는 $p_{Z_0}$라고 하자.
Normalizing flow가 하는 방식은 $Z_0$를 어떤 mapping을 이용해 변형해서 랜덤벡터의 pdf를 이용해 $X$의 분포를 추정하는 방식이다.
$f_1,f_2,…,f_N$를 $Z_0$를 변형하는데 필요한 일대일 대응함수라고 하고, $i=1,2,…,N$에 대하여 $Z_i = f(Z_{i-1})$라고 하자. 그리고 $Z_i$마다의 pdf를 $p_{Z_i}$라고 하자. 최종목적은 $f_1,f_2,…,f_N$을 잘 찾아서 $p_{Z_N}(x)$가 $p_{X}(x)$가 비슷해지길 바라는 것이다. 위에서 언급한대로 $z_i = f(z_{i-1})$라고 하고 특별히 $i=N$에 대하여 $z_N = x$라고 표시하자.
$p_X$의 분포를 잘 추정하기 위해서는 실제 샘플 $x$에 대하여 $p_{Z_N}(x)$가 굉장히 크면 좋겠다.
어 그러면 $p_{Z_N}(x)$의 값은 어떻게 구할 수 있을까?
$f_i$는 다 1대 1함수이므로 $x$가 주어지면 $x=f_N(z_{N-1}), z_i = f_i (z_{i-1})$인 $z_i$가 다 정해진다.
그러면, $p_{Z_N}(x)$는 아래와 같아진다.
$$ p_{Z_n}(x) = p_{Z_{N-1}}(z_{N-1}) \lvert det J_{f_{N}^{-1}}(z_{N-1}) \rvert$$
다시 $ p_{Z_{N-1}}(z_{N-1}) $ 변환법을 적용하면 아래와 같다.
$$ p_{Z_{N-1}}(z_{N-1}) =p_{Z_{N-2}}(z_{N-2})\lvert det J_{f_{N-1}^{-1}}(z_{N-2}) \rvert$$
이 사실을 이용하면 아래와 같은 식이 유도된다.
$$ p_{Z_n}(x) = p_{Z_{N-2}}(z_{N-2}) \lvert det J_{f_{N-1}^{-1}}(z_{N-2}) \rvert \lvert det J_{f_{N}^{-1}}(z_{N-1}) \rvert$$
변수변환법을 $ p_{Z_{N-2}}$와 앞으로 생겨날 $p_{Z_{i}}$에 적용하면 아래와 같은 결과가 나온다.
$$p_{Z_n}(x) = p_{Z_0}(z_0) \prod_{i=1}^{N} \lvert det J_{f_{i}^{-1}}(z_{i-1})\rvert$$
어떤 함수의 역함수의 자코비안 행렬은 본래의 함수의 자코비안 행렬의 역행렬이라는 사실과 역행렬의 determinant는 본래 행렬의 determinant라는 사실을 이용하면 아래와 같이 나타낼수 있다.
$$ p_{Z_n}(x) = p_{Z_0}(z_0) \prod_{i=1}^{N} \lvert det J_{f_{i}}(z_{i-1})\rvert^{-1}$$
따라서 loglikelihood는 아래와 같이 나온다.
$$\log p_{Z_n}(x) = \log p_{Z_0} (z_0) -\sum_{i=1}^N \log det J_{f_{i}}(z_{i-1})$$
Normalizing flow에서는 위의 likelihood를 최대화하도록 $f_i$들을 학습한다.
Normalizing flow 주의사항
normalizing flow에서는 $f_i$가 일대일 대응함수이어야 한다는 점과 $f_i$의 자코비안 행렬을 계산하기 편해야 한다.