본문 바로가기
Book Review/[만들면서 배우는 생성형 AI] 리뷰

6장. 노멀라이징 플로 모델(normalizing flow model)

by 3n952 2024. 5. 16.

 

이번 포스팅에서 변수 변환을 활용하여 데이터 분포를 직접 모델링하는 노멀라이징 플로 모델에 대해 알아보자!

 

Normalizing flow 모델은 데이터를 간단한 분포에 매핑할 수 있다.

하지만 매핑 함수에 제약이 어느정도 있기 때문에 이를 고려할 필요가 있다.

어떠한 제약이 있는 지, 그리고 이를 해결한 모델은 어떤 것이 있는지 공부해보자.

 

1. Normalizing flow

노멀라이징 플로는 VAE와 개념이 유사하다.

VAE가 인코더를 학습하여 복잡한 분포와 샘플링이 가능한 간단한 분포 사이를 매핑하고 

디코더를 학습하여 단순한 분포에서 복잡한 분포로 매핑하는 것과 같이,

 

노멀라이징 플로도 마찬가지로 간단한 분포로의 매핑과 복잡한 분포로의 매핑이 이뤄진다.

하지만 신경망은 일반적으로 반전 가능하지 않다.

따라서 노멀라이징 플로 모델은 딥러닝 모델로 복잡한 분포와 단순한 분포를 서로 반전 가능하도록

하는 과정을 만든다.

이 과정을 변수 변환(change of variables)이라고 한다.

 

간단한 2차원 예제로 변수 변환의 개념을 이해해 보자.

2차원 위에 정의된 확률 분포 Px(x)가 있다고 가정하겠다.

 

 

이 함수를 분포의 영역으로 적분하면 1이 되어 잘 정의된 확률 분포가 된다.

(x1 = [1, 4], x2 =[0, 2])

 

이 분포에 scaling + translation을 적용하여 단위 정사각형 Z에 대해 정의한다고 하면,

x = (x1, x2)는 새로운 변수 z = (z1, z2)에 매핑되어야 한다.

 

이 매핑 함수가 다음과 같다면 모든 z를 이에 해당하는 x로 다시 매핑할 수 있는 함수 g가 존재한다.

이를 통해 두 확률 분포 사이의 공간을 일관되게 매핑할 수 있게 된다.

 

이러한 변수 변환이 확률 분포 px(x)에 얼마나 영향을 미치는 지 알아야 한다.

g에 대한 방정식을 px(x)에 대입하여 z로 정의되는 함수 pz(z)로 변환하면 이를 알 수 있다.

 

이 식을 단위 면적에 대해 적분하면 1/6이 되므로 유효한 확률 분포라고 볼 수 없게 된다.

따라서 새로운 확률 분포 pz(z)에 대한 상대적인 면적 변화에 해당하는 정규화 계수가 곱해져야 적분 결과를 1로 만들 수 있을 것이다.

정규화 계수는 다행이도 야코비 행렬식의 절댓값으로 대체된다고 한다.

 

이제서야 이 두가지를 가지고 변수 변환 과정을 하나의 방정식으로 표현할 수 있다.

|det()|의 식이 야코비 행렬에 대한 값(정규화 계수의 역할)이다.

 

결과적으로 노멀라이징 플로 모델은 변수 변환 함수 f가 반전 가능하며, 행렬식을 쉽게 계산할 수 있는 신경망을 활용해야 

변수 변환 방정식을 적용할 수 있다는 것이다.

 

2. RealNVP

노멀라이징 플로 모델로 복잡한 데이터 분포를 간단한 가우스 분포로 변환하는 신경망의 모델이다.

즉, 역변환이 가능하고 야코비 행렬을 쉽게 계산하게 했다는 것이다.

 

RealNVP를 이해하려면 커플링 층을 이해하면 된다.

2.1 coupling layer 커플링 층

커플링 층은 입력의 각 원소에 대해서 스케일 계수와 이동 계수를 만든다.

 

데이터가 커플링 층에 전달 될 때 마스킹 되는 방식은 다음과 같다.

 

처음 d차원이 처음 커플링 층에 주입되면 남은 D-d차원은 마스킹이 된다.

즉 s, t에 대한 값이 마스킹 후보가 되는 것이다.

그 다음 입력의 나머지 절반인 D-d가 역 마스킹되어 처음 d차원이 마스킹 되어 커플링 층을 통과한다.

이렇게 하는 이유는 야코비 행렬 구조를 하삼각 행렬로 만들어 내기 위함이다.

 

커플링 층에 대한 야코비 행렬 구조는 위의 행렬과 같다.

이를 표현하면 다음과 같다.

 

 

대각선 위쪽 원소가 모두 0이 되므로 하삼각 행렬이 만들어진다.

하삼각 행렬의 행렬식은 단순히 대각 원소의 곱과 같으므로 대각 아래에 대한 복잡한 도함수와 관련이 없어 계산에 용이하다.

 

이런식으로 커플링층을 쌓고 마스킹을 뒤집으면 앞서 언급한 '변환 함수 f가 반전 가능하며, 행렬식을 쉽게 계산할 수 있는 신경망'이 완성되는 것이다.