Continuous Normalizing Flows(CNF)는 딥러닝 기반 생성 모델, 특히 Normalizing Flows (NF) 계열에서 매우 중요하고 흥미로운 개념입니다. CNF는 K개의 이산적인 변환 fk를 사용하는 대신, 이 변환 과정을 무한히 작은 변환의 연속으로 일반화합니다.
발상의 전환: 여기서 K→∞가 되면, 이산적인 변환 zk=fk(zk−1)은 상미분방정식(Ordinary Differential Equation, ODE) 으로 기술할 수 있습니다.
CNF의 정의: 시간 t에 따른 상태 z(t)의 변화를 신경망 f로 모델링합니다. (이제부터 zt를 z(t)의 함수 꼴로 표기하겠습니다.) 이 신경망 f는 z(t)가 시간 t에서 어떻게 변해야 하는지(즉, 속도 dtdz)를 정의하는 벡터 필드(vector field) 역할을 합니다.
dtdz(t)=f(z(t),t,θ)
여기서 θ는 신경망 f의 파라미터입니다.
변환 과정:
샘플링 (Sampling, z→x):t=0에서의 초기값 z(0)∼pz를 위 ODE에 넣고 t=0부터 t=T까지 순방향으로 수치 적분(ODE 풀이)합니다. 그 결과가 x=z(T)입니다.
x=z(T)=z(0)+∫0Tf(z(t),t,θ)dt
밀도 추정 (Density, x→z):t=T에서의 값 x=z(T)를 ODE에 넣고 t=T부터 t=0까지 역방향으로 수치 적분합니다. 그 결과가 z(0)입니다.
z(0)=z(T)−∫0Tf(z(t),t,θ)dt=x+∫T0f(z(t),t,θ)dt
가장 큰 장점 (자유로운 아키텍처): Discrete NF에선 f의 역함수가 존재했어야 하나, CNF에선 그럴 필요가 없습니다! ODE는 f가 기본적인 조건(예: Lipschitz 연속)만 만족하면 해가 유일하게 존재하며, 시간을 거꾸로 돌리는 것만으로 역변환(x→z(0))이 보장됩니다. 따라서 f에 어떤 신경망 아키텍처(ResNet, MLP 등)든 자유롭게 사용할 수 있습니다.
1.1. CNF의 수식 유도
상미분방정식(ODE)이란?
상미분방정식(Ordinary Differential Equation, ODE) 은 한 개의 독립 변수(보통 '시간' t)에 대한 함수(z(t))와 그 함수의 도함수(dtdz) 사이의 관계를 기술하는 방정식입니다.
핵심 아이디어: 시스템의 현재 상태(z(t))가 주어졌을 때, 다음 순간의 변화율(dtdz)이 얼마인지 알려주는 규칙(rule)입니다.
예시: 가장 간단한 예로 dtdz=z가 있습니다. 이는 "함수 z의 변화율이 현재 z의 값과 같다"는 뜻이며, 이 규칙을 따르는 함수는 z(t)=Cet (지수 함수) 형태가 됩니다.
물리적 비유: 댐에서 물이 흐를 때, 각 위치(z)에서 물의 속도와 방향(dtdz)을 정의하는 유속 지도(vector field)와 같습니다.
K→∞가 ODE가 되는 이유
이산적인(discrete) 변환 zk=fk(zk−1)가 어떻게 연속적인(continuous) ODE가 되는지 이해하는 것이 핵심입니다.
Discrete NF, 특히 ResNet과 유사한 잔차 연결(residual connection) 형태의 변환을 생각해 보면 이해하기 쉽습니다.
tk와 tk−1 사이의 간격이 무한히 좁아지므로, 이 구간에서의 평균 변화율은 t라는 특정 시점에서의 순간 변화율(도함수)dtdz(t)로 정의된다.
우변 (RHS): limf(z(tk−1),tk−1)→f(z(t),t)
tk−1→t:K→∞ 극한에서, tk와 tk−1은 모두 동일한 특정 시점 t로 수렴한다. (간격 Δt가 0이 되므로) 따라서 이산적인 시간 인덱스 tk−1은 연속적인 시간 변수 t가 된다.
z(tk−1)→z(t):tk−1이 t로 수렴하므로, tk−1에서의 상태 z(tk−1) 역시 t에서의 상태 z(t)로 수렴한다. (함수 z가 연속적이라고 가정)
f(⋅)→f(⋅): 함수 f 자체(신경망)는 K가 변한다고 해서 바뀌지 않는다. f는 우리가 정의한 규칙일 뿐이다. 이 f가 연속 함수라고 가정하면 (ODE가 잘 정의되기 위한 기본 조건), 입력값이 극한으로 수렴할 때 함숫값도 극한의 함숫값으로 수렴한다.
즉, limf(z(tk−1),tk−1)=f(limz(tk−1),limtk−1)=f(z(t),t) 이다.
결론적으로, 좌변과 우변을 합치면 다음과 같다.
좌변은 t라는 시점에서의 순간 속도(dtdz)가 되었다.
우변은 t라는 시점의 상태(z(t))와 시각(t)을 입력받아 속도를 계산하는 함수(f)가 되었다.
따라서 이산적인(discrete) 관계식:
" tk−1부터 tk까지의 평균 속도(ΔtΔz)는 tk−1에서의 상태 z(tk−1)로 계산한 속도f(⋅)와 같다."
이것이 K→∞ 극한을 만나 연속적인(continuous) 관계식:
" t 시점에서의 순간 속도(dtdz)는 t 시점에서의 상태 z(t)로 계산한 속도f(z(t),t)와 같다."
라는 상미분방정식(ODE) 으로 일반화되는 것이다. (여기서 f는 학습 가능한 파라미터 θ를 가지므로 f(z(t),t,θ)로 θ를 추가하여 표기하기로 한다.)
1.2. dtdz(t)=f(z(t),t,θ)의 의미
이제 CNF 모델의 핵심적인 정의(definition) 로서 유도된 위 수식을 이해해보자.
dtdz(t): t라는 가상의 '시간'이 흐름에 따라 z가 얼마나 빠르고 어느 방향으로 변하는지 나타내는 순간 속도(velocity) 벡터입니다.
f(z(t),t,θ): 이 속도를 계산해내는 함수, 즉 벡터 필드(vector field) 입니다. 이 함수 f는 신경망으로 구현되며 θ는 이 신경망의 학습 가능한 파라미터입니다.
이 방정식의 의미는 다음과 같습니다.
"어떤 데이터 포인트 z가 t라는 시점에 특정 위치 z(t)에 있을 때, 이 z가 다음 순간(t+dt)에 어디로 얼마나 빠르게 움직여야 하는지(dtdz)는 신경망 f가 결정한다."
그리고 신경망 f의 입력과 역할은 다음과 같습니다.
1. z(t) (현재 위치): 속도는 현재 위치에 따라 달라야 합니다. (예: 강물의 유속은 강둑 근처와 중앙이 다릅니다.)
2. t (현재 시간): 벡터 필드(유속) 자체가 시간에 따라 변할 수 있습니다. (예: 밀물/썰물에 따라 강물의 흐름이 바뀔 수 있습니다.) 이는 모델의 표현력을 크게 높여줍니다.
3. θ (파라미터): 우리가 '학습'하는 대상입니다.
결론: 우리는 z가 pz(단순한 데이터 분포)에서 px(복잡한 데이터 분포)로 흘러가는 가장 그럴듯한 '흐름' 또는 '경로' 를 만들 수 있는 최적의 벡터 필드 f 를 딥러닝을 통해 학습하는 것입니다.
1.3. 샘플링(Sampling)과 밀도 추정(Density)의 수식 유도
이 두 과정은 모두 미적분학의 기본 정리(Fundamental Theorem of Calculus) 로부터 직접 유도됩니다.
핵심 방정식은 dtdz(t)=f(z(t),t,θ)입니다.
이 방정식의 양변을 t에 대해 ta부터 tb까지 적분해 봅시다.
∫tatbdtdz(t)dt=∫tatbf(z(t),t,θ)dt
미적분학의 기본 정리에 의해, 도함수(dtdz)를 적분하면 원시 함수의 차이(z(tb)−z(ta))가 됩니다.
z(tb)−z(ta)=∫tatbf(z(t),t,θ)dt
이것이 CNF의 모든 변환을 설명하는 일반 해(General Solution) 입니다. 이제 이 식을 두 가지 상황에 적용해 봅시다.
1.3.1. 순방향 샘플링 (Sampling, z→x) ➡️
목표: 간단한 분포 pz에서 뽑은 z(0)(초기 상태)로부터 실제 데이터 x=z(T)(최종 상태)를 생성합니다.
과정: 시간을 t=0에서 t=T까지 순방향으로 흐르게 합니다.
유도:
일반 해에서 ta=0, tb=T로 설정합니다.
z(T)−z(0)=∫0Tf(z(t),t,θ)dt
z(0)를 우변으로 넘기면, z(T)를 얻는 식이 나옵니다.
x=z(T) 이므로, 다음과 같이 정리됩니다.
x=z(T)=z(0)+∫0Tf(z(t),t,θ)dt
의미:t=0일 때의 초기값 z(0)에, 0초부터 T초까지 신경망 f가 계산해준 모든 '순간적인 변화(속도)'를 전부 더하면(∫0T) 최종 위치 x=z(T)를 알 수 있다는 뜻입니다. 이 적분은 실제로 ODE 솔버라는 수치해석 기법으로 풀게 됩니다.
1.3.2. 역방향 밀도 추정 (Density, x→z) ⬅️
목표: 주어진 데이터 x=z(T)(최종 상태)가 어떤 z(0)(초기 상태)로부터 왔는지 역추적합니다. (이 z(0)를 알아야 logpz(z(0)) 값을 계산할 수 있습니다.)
과정: 시간을 t=T에서 t=0까지 역방향으로 흐르게 합니다.
유도:
일반 해에서 ta=T, tb=0로 설정합니다. (시작이 T, 끝이 0)
z(0)−z(T)=∫T0f(z(t),t,θ)dt
z(T)를 우변으로 넘기면, z(0)를 얻는 식이 나옵니다.
x=z(T) 이므로, 다음과 같이 정리됩니다.
z(0)=z(T)+∫T0f(z(t),t,θ)dt=x+∫T0f(z(t),t,θ)dt
의미:t=T일 때의 값 x=z(T)에서 출발하여, 시간을 거꾸로(∫T0) 흐르게 하면서 신경망 f가 알려주는 변화를 (거꾸로) 더해가면, t=0일 때의 초기 위치 z(0)를 복원할 수 있다는 뜻입니다.
핵심 장점:f의 역함수 f−1를 따로 구할 필요 없이, 동일한 f를 사용하되 ODE 솔버를 반대 방향(T에서 0으로) 으로 작동시키기만 하면 역변환이 자동으로 계산됩니다. 이것이 CNF가 아키텍처에 제약이 없는 가장 큰 이유입니다.