본문 바로가기
Machine Learning/유튜브, 책, 아티클 정리

만들면서 배우는 생성 AI 정리 6장 - Normalizing Flow 모델

by W_log 2023. 12. 8.

이번 장에서는 노멀라이징 플로 모델에 대해서 살펴봅니다.

 

 

1. 개요

 

 

생성 AI모델의 대부분은 위와 같은 형태를 따르고 세부적으로 이걸 어떻게 구현하느냐에 따라서 모델의 분류가 갈린다고 볼 수 있습니다. 지금까지 배운 모델들을 아래와 같이 정리해볼 수 있습니다. (Autoregressive는 위의 방식과 다름)

 

 

오늘 배울 노멀라이징 플로 모델(RealNVP 중심으로 설명)은 우리가 생성하려는 데이터셋의 분포를 저차원의 분포로 변환시켜주는 함수를 학습시키는 신경망 모델이라고 할 수 있습니다.

 

만일 우리가 신경망을 통해서 이 함수를 학습할 수 있고, 만일  이 함수가 역함수를 가진다면 우리는 역으로 간단한 분포에서 복잡한 이미지를 만들어낼 수 있지 않을까?가 이 모델의 핵심 아이디어입니다. 더 나아가 다른 모델과 다르게 우리는 저차원의 분포를 알고 있다면 우리는 생성 이미지의 정확한 분포를 추론할 수 있다는 점에서 설명력이 높은 모델이라고 볼 수 있습니다.

 

 

아이디어

이제 디테일하게 이를 구현하기 위해 어떤 아이디어들이 필요할지 정리해보았습니다.

 

1. 기본적으로 잘 변환해야합니다.

2. 역함수가 존재해야합니다.(기껏 학습시켜놓고 역함수가 안되면.. 이미지를 생성할 수 없습니다. 그럴거면 VAE를 사용하는게..)

3. 계산이 용이해야합니다. (모든 모델과 컴퓨터 기술은 계산 비용을 낮추는 방향으로 발전해왔습니다.)

 

책을 보면 이런 설명 없이 바로 어려운 용어가 나오는데 우선은 책을 한번 읽고 해당 이론의 핵심이 무엇인지 정리 후에 디테일을 보니 좀 더 이해가 쉬웠습니다. 

 

 

위 아이디어를 구현하기 위해 설명이 필요한 개념들을 먼저 정리해보았습니다.

 

1. Jacobian 행렬

1) 선형변환

어떠한 행렬은 특정 벡터(x,y)를 다른 차원(u,v)으로 변환해주는 역할을 한다. 이에 대한 자세한 설명은 아래에서 볼 수 있다. 또한 (2X2)행렬에서 ad-bc라고도 불리는 determinant는 선형변환으로 생기는 도형의 넓이를 의미한다. 

 

https://angeloyeo.github.io/2019/08/06/determinant.html

 

2) Jacobian 행렬이란?

위에서 행렬이란 특정 벡터를 선형변환해준다는 것을 의미한다. 자코비안은 무엇을 선형변환해주는 행렬인지를 살펴보자. 자코비안은 (x,y) -> (u,v)가 아니라, (dx, dy) -> (du, dv)를 변환시킬 수 있는 행렬을 의미한다. 정의 자체가 그렇다. 자코비안에 대한 식 도출도 여기 아래에서 볼 수 있다. 

 

https://blog.naver.com/jerrypoiu/221532945268

 

3) 그럼 이게 왜 의미가 있을까? 

 

우리가 x-> z로 변하는 함수를 찾을 수 있다면 jacobian을 통해서 x에 대한 확률분포도 알 수 있다는 점에서 생성모델링에서 의미가 있다.

 

 

2. Coupling layer

 

이제 자코비안이 확률분포를 구하는데 기여를 한다는 것은 배웠습니다. 하지만 딥러닝에서 행렬은 무수히 많은 차원을 가지고 있기 때문에 이 jacobian의 Determinant를 구하는 것이 어렵다는 단점이 있습니다. 논문에서는 이를 해결하기 위해 Coupling layer라는 것을 도입했습니다.

2차 행렬에서의 jacobian determinant

 

일반적으로 자코비안 determinant는 대각행렬의 곱과 비대각행렬간의 차이를 계산하는 것입니다. 하지만 차원이 깊어질수록 이를 계산하는 것이 복잡해지기 때문에 논문에서는 아래와 같은 형태의 행렬로 변형해서 연산을 간편하게 만들어줬습니다.

 

 

 

아까 (x, y) -> (u, v)로 변환하는 함수에 대해서 자코비안을 구하듯이 일종의 수학적 테크닉을 사용해서 인풋을 두개로 나누어서 다시 합치는 작업을 통해 이렇게 우측 상단의 값을 0으로 바꿔줄 수 있습니다. 논문에서는 y라고 표현하는데 위의 예시로 대입해보면, 학습하려고 하는 데이터는 x이고 latent space를 z라고 생각하시면 됩니다.

 

위 변환에 대한 자코비안 계산

 

 

*사실 이 coupling layer를 사용하는건 MICE라는 논문에서 먼저 사용되었는데 거기서는 단순 s,t 없이 X1+X2를 사용했습니다. Coupling layer를 어떻게 구현했느냐가 주요 아이디어라고 볼 수 있습니다.

 

모델

 

1. 모델 구조

 

위의 개념을 종합해서 아래와 같은 생성모델링을 만들 수 있습니다. 이 아이디어의 핵심은 X라는 훈련 데이터셋의 분포를 Z라는 임의의 분포(보통 정규분포를 사용)로 변환할 수 있는 함수가 여러개 있을텐데, 그 중 역변환이 가능하고 자코비안 연산이 간단해지도록 위의 방식을 적용했습니다.

 

 

 

2. Loss Function 

 

 

위의 식을 다시 가져와보았습니다. x와 유사한 이미지가 생성될 확률을 높이는 것이 목표이기 때문에 p(x)를 최대화시켜야 합니다.

하지만, 로그를 씌워, 곱셈의 문제를 덧셈의 문제로 변환시키고 -를 곱해주면 이 값을 최소화하게 되므로 논문에서는 negative log likelihood를 사용했습니다.

 

 

문제점

 

1. 정보 손실 : 차원을 고정시켜서, 일부 차원(m차원)은 정보가 고정되고, 나머지 정보(m+1 ~ N차원)만 변경되기 때문에 정보의 손실을 초래할 수 있음.

 

2. 채널 간 상호작용 제한 : RealNVP는 차원을 정리하는 과정에서 채널을 중심으로 분리할 수도 있고, 채널 안에서 일부 차원을 분리하는 방식으로 진행했는데 이 차원에서 색상이 영향을 받을 수 있다.

 

 

 

개선 모델

1. GLOW 모델

 

위의 정보 손실을 방지하기 위해서, affine coupling layer 앞에 1X1 convolution layer를 통하게 만든다. 그래서 어느정도 정보를 섞어준 다음에 차원을 고정해서 나누어서 문제를 해결했다.

 

 

 

2. FFJORD 모델 

굉장히 수학적 공식이 많이 들어가는 부분이라서, 간단하게 개념만 설명하려고 한다.

 

방금 전까지의 모델은 f를 구하는 과정의 문제를 단계(1단계, 2단계, 3단계)별로 x -> z로 변환시켜가는 과정을 거쳤다면, 개념상 이걸 무수히 많은 연속적인 단계로 변경하는 문제로 바꾼 방식이다. 따라서 데이터 x를 시간 t에 따라 변화하는 것으로 취급한다.(연속적인 단계로 변경하기 위해)

 

이런 시간에 따른 변화를 해결하는 문제가 상미분 방정식이고 이를 빠르게 해결할 수 있는 공식(solution)이 black box ode solver이다. 논문에서는 이를 사용해서 학습시켜서 문제를 해결했다.

 

t0 -> t1의 시점으로 연속적인 형태로 변환을 시킨다고 보면 된다.

 

Discrete 방식과의 차이는 아래와 같다.

 

1. black-box ODE에 활용할 함수는 신경망으로 설계한다.

2. 최종 t시점(연구자가 설정)에 주어진 결과값이 우리가 원하는 분포(z)와의 차이를 손실로 기록한다.

3. 이 손실을 log-likelihood를 Loss function으로 해서 역전파로 교육시킨다.

 

 

 

참고 사이트

 

1. https://angeloyeo.github.io/2020/07/24/Jacobian.html

2. https://blog.naver.com/jerrypoiu/221532945268 (자코비안 도출)

3. https://ar5iv.labs.arxiv.org/html/1605.08803  

4. https://www.youtube.com/watch?v=TywKpiZJ7P4&t=1s ( ffjord 설명 )

5. https://seewoo5.tistory.com/12  (ffjord 설명)