Post

NICE: Non-Linear Independent Components Estimation

NICE: Non-Linear Independent Components Estimation

Flow Matching For Generative Modeling

NICE: Non-Linear Independent Components Estimation

Introduction

이 논문은 여타 다른 생성형 모델과 마찬가지로, 데이터 분포를 가우시안 분포와 같은 알기 쉬운 분포로 매핑하는데, 이를 함수 $f$ 로 나타낸다면, 이 함수의 역함수 $f^{-1}$ 을 통해 샘플링한다.

즉, $z = f(x)$ 로 나타내는데, 이때 잠재 공간 $z \in \mathbb{R}^{D}$ 는 각 요소 $z_{i} \quad (i = 1,…,D)$ 들이 모두 독립인, 이 논문의 표현으로는 Factorize 로 가정한다.

\[p_{Z}(z) = \prod_{d}p_{z_{d}}(z_{d})\]

이렇게 가정함으로써, 우리가 음… VAE에서의 사람 얼굴 데이터로 예시를 들자면, 잠재공간 $z$ 의 특정 차원이 사람 얼굴의 특정 특징 (이목구비, 머리색깔 등) 의 정보를 나타냈었고, 이 특정 차원의 값을 조절하면 전체 이미지에서 해당하는 특징만 바뀌는 것을 볼 수 있었다. 뭐.. 간편을 위해서도 있고, 다른 논문들도 거의 이렇게 정의하긴 하지만, 아무튼 그렇다.

그래서 결국에는 데이터 공간의 확률 $P_{X}(x)$ 를 최대화해야 하는데, Change of variable 을 통해 잠재공간과 연관지을 수 있다. $X \to Y$ 로 변수가 변하더라도, $p_{X}(x)$ 와 $p_{Y}(y)$ 의 전체 확률의 합은 1로 동일하다는 것을 이용한 것인데, 먼저 스칼라의 경우로 보자.

일단… 어… 간단하게 스칼라의 값을 가지는 $z = f(x)$ 를 보면, 다음과 같이 확률의 총량은 같다.

\[p_{X}(x)|dx| = p_{Z}(z)|dz|\]

이제 서커스를 진행해보자.

\[\begin{align} p_{X}(x)|dx| &= p_{Z}(z)|dz| \\ p_{X}(x) &= p_{Z}(z) \left|\frac{dx}{dz}\right| \\ p_{X}(x) &= p_{Z}(z) \left|f'(x)\right| \end{align}\]

즉, 원래 밀도는 변형된 공간의 밀도와 공간이 늘어난 비율의 곱과 같다는 것이다. 이를 행렬로 확장시키면 다음과 같다.

\[p_{X}(x) = p_{Z}(f(x))\left|\det \frac{\partial f(x)}{\partial x}\right|\]

여기서 $\frac{\partial f(x)}{\partial x}$ 는 함수 $f$ 의 $x$ 에서의 Jacobian 행렬이다. …그리고 잠재공간 $z$ 의 차원은 데이터 $x$ 의 차원과 같다.

아무튼 …즉, $p_{X}(x)$ 를 최대화한다는 것은, 우변을 최대화하는 것과 같다. 이를 로그 우도함수로 나타내면, 다음과 같다.

\[\begin{align} \log (p_{X}(x)) &= \log (p_{Z}(f(x))) + \log (\left|\det \frac{\partial f(x)}{\partial x}\right|) \\ \therefore \log (p_{X}(x)) &= \sum_{d=1}^{D}\log (p_{Z_{d}}(f_{d}(x))) + \log (\left|\det \frac{\partial f(x)}{\partial x}\right|) \end{align}\]

여기서 $f(x) = (f_{d}(x)){d \leq D}$ 이고, $p{Z}$ 는 사전 분포로 가우시안 분포같은 걸 사용한다.

식을 보면, 첫번째 항을 통해 모델이 단순하게 데이터를 사전분포의 평균 부분으로 이빠이 압축하여 전체 값을 최대화하는 꼼수를 부릴 수 있는데, 식의 두번째 항인 Jacobian 행렬식 부분이 이렇게 압축되면 음의 값을 가져 패널티를 부여하도록 한다. 따라서 높은 밀도 부분을 확장시키도록 하여 이러한 꼼수를 방지한다.

아무튼 이 식을 Non-lienar Independent Components Estimation, Nice 라고 하는데, 이름처럼 나이스하다.

또한 샘플링과정도 굉장히 야무지게 쉬운데, 다음으로 끝이다.

\[\begin{align} z &\sim p_{Z}(z) \\ x &= f^{-1}(z) \end{align}\]

짜잔… 그러면 이제, 선택의 시간이 왔다. 결국 함수 $f$ 를 어떻게 정할 것이냐가 문제인데, 위 두 식을 보면, 함수 $f$ 의 Jacobian 과, 역함수 $f^{-1}$ 이 사용된다. 즉, 이 두 값을 우리가 쉽게 계산할 수 있어야 한다는 건데, 논문에서 어떻게 짱구를 굴려보는지 알아보자.

Prior Distribution

일단 짱구 굴리기 전에, 잠시 쉬는 시간 겸, 사전 분포를 논문에선 어떻게 정의하는지 알아보자면, 다음과 같이 일단 Factorize 되도록 정의한다.

\[p_{Z}(z) = \prod_{d=1}^{D}p_{Z_{d}}(z_{d})\]

여기서, 보통 가우시안분포 또는 로지스틱 분포를 사용한다.

\[\begin{align} \therefore \log(p_{Z_{d}}) &= -\frac{1}{2}(z_{d}^{2} + \log(2\pi)) \\ \therefore \log(p_{Z_{d}}) &= -\log(1 + \exp(z_{d})) - \log(1 + \exp(-h_{d})) \end{align}\]

논문에서는 로지스틱 분포를 사용한다.

How to choose Transformation $f$

자.. 일단 데이터공간에서 잠재 공간으로 매핑하는 함수 $f$ 를 봐야하는데… 일단 데이터 공간이 어떻게 생겨먹었는지도 모르고, 그 데이터 공간을 막 찌그러 뜨려서 서커스를 해야하는데…

위 사진을 막 서커스를 해서 노이즈로 바꾼다고 해보자. 서커스하는데 정신팔려서 신나게 노이즈로 바꿔도, 다시 원래대로 하라고 하면 머리가 지끈지끈하다. 방 어지럽히는건 쉬운데 치우는건 드럽게 하기 싫은 그런 느낌..? 잡설은 집어 치우고, 아무튼 이 복잡한 매핑 함수 $f$ 에 대해서, 그 역함수와 Jacobian 행렬식을 구하는건 드럽게 힘드니까, 이 복잡한 매핑 함수 $f$ 를 간단한 매핑 함수 $f_{i}$ 의 조합으로 나타낸다. 즉,

\[f = f_{L} \circ f_{L-1} \circ \cdots \circ f_{1}\]

이렇게 나타낸다. 이렇게 하면, 기존 매핑 함수 $f$ 의 계산은 그냥 $f_{L}(f_{L-1} (\cdots f_{1}(x) \cdots ))$ 로 나타내고, Jacobian 행렬식은 각 레이어 $f_{l}$ 의 Jacobian 행렬식의 곱으로 나타낼 수 있다.

\[\det (\frac{\partial f}{\partial x}) = \det (\frac{\partial f_{L}}{\partial x}) \times \cdots \times \det (\frac{\partial f_{1}}{\partial x})\]

그러면 이제!!!! 이 각 $f_{l}$ 을 어떻게 나타낼 것이냐.. 이게 남았는데, 논문에서는 행렬식이 간단하게 대각성분의 곱으로 나타나고, 역행렬도 기존 행렬의 $O(N^{3})$ 나 걸리던 연산과 비교해 야무지게 빠르게 계산할 수 있는 삼각행렬 또는 대각행렬을 생각했다.

그래서 각 레이어를 이제 위와 같은 형태의 가중치 행렬을 가진 모델로 나타내려고 하는데, 이 가중치 행렬의 형태가 정해지다보니, 모델 구조가 아무래도 제약이 너무 심한 것이다.

그래서 이 논문 저자들이 짱구를 굴리는데, 그건 모델의 가중치 행렬은 그냥 행렬로 나타내고, Jacobian 행렬의 행렬식을 계산하기 쉽게 삼각행렬로 나타내자..!! 라는 것이다.

한번 알아보자.

Coupling Layer

그래서, 앞서 Jacobian의 행렬식이 삼각행렬 형태가 되고, 역 과정도 쌈뽕하게 계산되는 함수 $f$ 를 정의하려고 하는데, 논문에서는 다음과 같이 Coupling layer 라는 형태를 제시한다.

먼저 데이터 $x \in \mathbb{R}^{ㅇ}$ 가 주어졌을 때, 이를 두 개의 구간 $I_{1}, I_{2}$ 로 나눈다. 즉, $d=|I_{1}|$ 이라면, $[1,D]$ 이 구간에서 $[1,d]$ 가 $I_{1}$ 의 구간이고, 나머지 $D-d$ 길이의 구간이 $I_{2}$ 가 된다. 즉, $[1,D] \to (I_{1},I_{2})$ 로 나타낸건데, 이 두 구간에 속하는 각 데이터 $x_{I_{1}},x_{I_{2}}$ 에 대해서, $y=(y_{I_{1}},y_{I_{2}})$ 를 다음과 같이 정의한다.

\[\begin{align} y_{I_{1}} &= x_{I_{1}} \\ y_{I_{2}} &= g(x_{I_{2}}; m(x_{I_{1}})) \end{align}\]

여기서 $m$ 은 $\mathbb{R}^{d}$ 에서 정의된 어떠한 함수로 Compling function 이라 하고, $g: \mathbb{R}^{D-d} \times m(\mathbb{R}^{d}) \to \mathbb{R}^{D-d}$ 를 Coupling Law 로, 어.. 한국말로는 뭐라할지 깔끔하게 단어 선택을 못하겠어서.. 논문의 표현을 그대로 가져오자면, an invertible map with respect to its first argument given the second 이다.

어.. 그니까 위 사진처럼, 사진을 왼, 좌 로 절반을 딱 나눴을 때, 왼쪽 부분 $y_{I_{1}} = x_{I_{1}}$ 은 그대로지만, 오른쪽 부분은 기존 부분에, 왼쪽 부분의 어떠한 함수가 통과된 $m(x_{I_{1}})$ 이 값이 추가로 어떠한 $g$ 에 입력되어 서커스하며 변환된다. 즉, 서로 자기는 안건드리고, 상대만 겁나게 건드리는 것이다. 내로남불 끝판왕 완전 이기적이다.

아무튼 이렇게하면, 전체 $y$ 의 $x$ 에 대한 Jacobian 은 다음과 같이 하삼각행렬의 형태로 나타나진다.

\[\frac{\partial y}{\partial x} = \begin{bmatrix} I_{d} & 0 \\ \frac{\partial y_{I_{2}}}{\partial x_{I_{1}}} & \frac{\partial y_{I_{2}}}{\partial x_{I_{2}}} \end{bmatrix}\]

여기서 $I_{d}$ 는 크기 $d$ 의 항등 행렬로, 따라서, $\det \frac{\partial y}{\partial x} = \det \frac{\partial y_{I_{2}}}{\partial x_{I_{2}}}$ 가 된다.

또한 저 형태의 매핑 $f_{l}$ 는 다음과 같이 역함수로 간단히 나타낼 수 있다.

\[\begin{align} x_{I_{2}} &= g^{-1}(y_{I_{2}}; m(y_{I_{1}})) \\ x_{I_{1}} &= y_{I_{1}} \end{align}\]

그러면 이제!!! Compling Law $g(.)$ 와, Compling Layer $m$ 을 정의해야 한다.

논문에서는 Compling Law $g(a; b) = a + b$ 로 나타내었는데, 즉, 다음과 같다.

\[\begin{align} y_{I_{2}} &= x_{I_{2}} + m(x_{I_{1}}) \\ x_{I_{2}} &= y_{I_{2}} - m(y_{I_{1}}) \end{align}\]

$g(a; b) = a + b$ 의 형태로 정의하니, 역함수가 그냥 뭐 너무나도 쉽게 계산할 수 있다. 또한 이렇게 하면 $\det \frac{\partial y_{I_{2}}}{\partial x_{I_{2}}} = 1$ 이 되어, 행렬식도 그냥 상남자처럼 딱 $1$ 하나. 진짜 나이스하다.

아무튼 보면, 함수 $m(.)$ 이 역함수 계산해도, Jacobian 행렬식 계산에도, 그 어디에도 영향을 안끼치니까, 우리가 어떠한 제약도 받지 않는다. 따라서 논문에서는 $d$ 개의 입력 유닛을 받아 $D-d$ 개의 출력 유닛을 뽑아내는 모델로 구현한다.

그래서 이렇게 정의한 Coupling layer 들을 합치면 되는데, 하나의 레이어를 거친 과정을 나타낸 위 사진의 예시로 봤을 때, 왼쪽 부분은 오른쪽 부분에 영향을 주지만, 왼쪽 부분은 그대로다. 왼쪽 부분도 오른쪽 처럼 이빠이 변형되어야 하기 때문에, 논문에서는 특정 레이어에선 왼쪽 부분을 변형시키고, 다음 레이어에선 오른쪽 부분을 변형시키고, 다시 다음 레이어에서 왼쪽을 변형시키는 식으로, 레이어마다 변형시키는 구간을 번갈아가며 수행한다. (왼쪽 오른쪽 부분은 위 사진을 예시로 든거일 뿐이다.)

그래서 최소 3개의 Coupling layer가 있어야 모든 부분이 서로에게 영향을 끼치는데, 논문에서는 4개의 Coupling layer를 사용한다. 물론 디퓨전 처럼 하나의 모델을 가지고, 뭐..레이어 단계 $l$ 도 같이 입력받아서 모든 레이어에 대해 공유되는 파라미터를 가진 하나의 모델로 $m$ 을 구현하는게 아니라, 그냥 Comping layer 4개면, 4개의 $m(.)$ 에 대해 4개의 서로 다른 파라미터를 가진 모델로 구현한다.

…아무튼 이러한 Compling layer들을 통해 전체 데이터 분포를 가우시안과 같은 사전 분포로 매핑되게끔 한다.

Rescaling

앞선 형태의 매핑함수 $f$ 를 봤을 때, 각 레이어의 Jacobian 행렬식이 모두 $1$ 인 것을 볼 수 있었다. 행렬을 차원의 변형이고, 행렬식이 변환된 차원의 부피 변화 비율이므로, 레이어를 얼마나 쌓든 전체 부피가 보존된다는 것이다.

이게 문제인데, 이미지의 각 특징을 담담하는 각 차원마다 분산이 다르기 때문이다. 어…. 예시를…. 음…

  

위의 멍청해보이는 플로로(명조) 라는 캐릭터의 이미지로 예시를 들자면, 어.. 눈 위치나, 입 모양 과 같은 특징들은 겁나게 다채로운 반면에, 저기저 구석탱이 배경 부분은 그냥 하얀색 배경으로 변동성이 적다.

그래서 아무튼 각 차원마다 분산을 조절해줘야 하는데, 기존 매핑 $f$ 는 행렬식이 $1$ 이라 각 차원의 분산의 변화가 없다.

그래서! 이를 위해서 매핑 $f$ 이후, 마지막에, 대각행렬 형태의 스케일링 $S$ 를 추가하는데, 이는 각 차원의 출력에 $S_{ii}$ 를 곱하여, 해당 축을 늘리거나 줄인다. 이를 통해 앞서 살펴본 배경처럼 비교적 변동이 거의 적은 쓸모 없는 차원은 이빠이 압축하고, 변동성이 큰 부분은 늘려서 밀도를 널널하게 만들 수 있다.

또한 $S_{ii} \to \infty$ 처럼 무한대로 커지면, 해당 차원 $i$ 는 무시되어, 데이터의 실질적인 차원이 1차원 깎이는 효과가 나타나는데, 어.. 예를 들어 매핑 $f$ 이후, $z_{i} = S_{ii}x_{i}$ 가 되는데, $x_{i} = \frac{h_{i}}{S_{ii}}$ 과 같은 형태로 생각할 수 있다. 즉, $x_{i} \to 0$ 으로 고정되는 것이다. 그래서, 해당 차원이 아무리 난리를 치고 쏼라쏼라해도 해당 차원의 출력은 항상 $0$ 이므로, 스스로 매니폴드 차원 축소를 학습할 수 있다는 것이다.

…아무튼, 최종식은 다음과 같다.

\[\therefore \log (p_{X}(x)) = \sum_{d=1}^{D}\log (p_{Z_{d}}(f_{d}(x))) + \log(|S_{ii}|)\]

찌라시시

…flow-based model을 한 번 살펴보려고, flow matching 한번 봤는데, 어……그냥 진짜 뭔가… 뭔 느낌인진 알겠는데, 뭔가… 거시기한 느낌이 들어서 이 논문부터 차근차근 살펴보려고 한다.

그냥.. 어떤 느낌인지만 간단하게 알아보는거라.. 따로 구현은 안하고 그냥 핵심 아이디어만 살펴보는 목적이라.. 의식의 흐름대로 작성하고 따로 문장들 매끄럽게 수정 안하고 바로 끝내고자 한다… 마찬가지로 구현도.. 넘어가고, 나중에 flow matching 에서 구현하도록 하겠다.. 아니면 중간중간 다른 논문 보다 해보고 싶으면 해보고 뭐…

그리고 3학년 복학까지 2개월 남았는데, 옆에서 같이 하는 사람 없이 혼자 방안에 틀어박혀서 이렇게 공부만 하니, 내가 잘 이해한건지도 모르겠고, 뭔가.. 이해는 하겠는데, 그 핵심 아이디어를 도대체 어떻게 생각해낸건지 그 배경은 절대 모르겠고, 그럴 때마다 수학 공부는 더 열심히 해야겠다고 생각하고.. 내가 기본기가 있는건지 아닌지도 모르겠고, 이렇게 글쓰는 것도 그냥 논문 내용을 내가 말로 설명하듯 써서 이해했는지, 중간에 놓친 지식과 지식들간의 연결점을 알아보려는 느낌이라..

아 모르겠다. 복학하고 학부연하려고 슬슬 교수님들께 메일 보내보려고 한다. 이런거 해본적도 없어서 이게 맞는진 모르지만..

아무튼 자기객관화를 위해서 논문을 작성해보려고 한다… 그냥.. 경험용 도 있고.. 잘 못 썼다고 잡혀가진 않으니까..

어.. 거창한건 아니고..

남들 쓴거 보니까 파인튜닝, 모델 응용 이런 주제가 많던데, 한번 짱구 굴려보면서 어떤 주제로 써볼지 생각해보겠다.

..아무튼 이 논문 보면서 Coupling layer 부분이 진짜 내 기준에선 쌈뽕하게 느껴졌는데, 도대체 어떻게 그런 생각을 한건지 평범한 학부생인 나로서는 그냥 외계인 보는거 같다. 요걸 어떻게 막 써볼가 해서 디퓨전에 적용해볼까! 생각 들자마자 와 나 개천재라고 생각했는데, 생각해보니 내가 공부하려는 flow-based 가 이미.. 다시 자기 객관화 열심히 하고 있다.

..진짜 말 그대로 서커스를 펼친거로 보여서 나도 이런 쌈뽕한 아이디어 갑자기 하늘에서 툭 떨어졌으면 좋겠다.

…뭔가 잡생각을 있는 그대로 작성하긴 했는데, 글로 다시 봐도 그냥 디퓨전마냥 두서 없는데, 그래도 글로 적으니 내 생각은 나름대로 정리되는거 같다. ..나름대로.

아무튼… 옛날에 선형대수 등 수학 공부한거 빼고는, 논문 읽을 때 그때그때 마다 탑다운으로 따로 공부하긴 했는데, 수학 꾸준히 하면 지금 당장은 득은 없더라도 실은 절대 없다라고 생각이 든다.

..그래서 수학을 자투리 시간에 꾸준히 공부해보려 한다… 다시! 기초로 돌아가서, 선형대수부터.. 그래서 뭐… 가끔 수학 글이 올라올 수 있다. ..그냥 남한테 설명하는거 연습 겸 쓰는거지만..

…무림이나 회귀물 같은걸 보면, 주인공이 천마한테 죽임 당하고 다시 회귀했을 때, 편법 없이 기초부터 내공을 단련하여 세계관 최강자가 되는데, 이 마인드로 다시 공부간다. 아.. 휴학 1년 더 하고 싶다.

아무튼 아래 사진으로 마무리한다.

This post is licensed under CC BY 4.0 by the author.