Flow Matching for Generative Modeling 리뷰
by DINHO
오늘은 Flow Matching에 대해서 이야기 해보도록 하겠습니다. 어떤 모델에 대한 논문을 읽을 때는 벽을 느끼진 않았는데, 이 논문을 처음 읽었을 때는 정말 벽을 느꼈습니다.😥 그만큼 수학이 중요하다 생각이 드는 요즘입니다… 그래도 최대한 이야기해보도록 하겠습니다!!
Flow Matching for Generative Modeling(Yaron Lipman et al. 2022) 논문에서 나온 내용입니다. 논문의 저자가 직접 논문을 설명한 영상이 유튜브에 있는데, 오늘은 이 영상 내용을 그대로 옮겨 적는다는 마인드로 포스팅을 해보겠습니다. 포스팅에 사용된 이미지는 원본 영상 에서 pdf로 받아 보실 수 있습니다. 원본 영상이 한 시간 정도의 분량이라 오늘 내용이 조금 많을 수 있습니다.
이 발표를 요약하는 단 하나의 슬라이드는 바로 이것입니다. 여기서 저자는 위에서 아래로 이어지는 주제의 계층 구조를 따라 이야기를 풀어나갑니다.
생성 모델(Generative Models) 안에는 Flows 혹은 Continuous Normalizing Flows(연속 정규화 플로우) 라는 하위 클래스가 있고, 그 안에 Flow Matching 이 있으며, 확산 모델은 이 Flow Matching의 특수한 경우로 포함됩니다. 생성 모델의 공간에는 확장성(Scalability) 과 일반성(Generality) 사이의 트레이드오프가 존재하는데, 저자가 이번 발표를 통해 주장하고 싶은 것은 Flow Matching이 이 둘 사이의 균형을 잘 맞추고 있으며, 새로운 디자인 선택과 아이디어를 융합하여 새로운 애플리케이션을 이끌어낼 수 있다는 점입니다.
처음엔 생성 모델에 대해 이야기하고, 거기서부터 풀어나가겠습니다.
생성 모델에서는 기본적으로 어떤 소스 분포 \(P\) (Source distribustion) 가 있습니다. (보통 표준 가우시안으로 가정하지만 임의의 분포일 수 있습니다.) 그리고 목표는 이 분포를 알 수 없는 분포 \(Q\) , 즉 훨씬 더 복잡한 데이터 분포(Data Distribution) 로 매핑하는 어떤 맵(Map)을 찾는 것입니다.
확률론적으로 말하자면, 우리가 실제로 하고 싶은 것은 소스 분포인 \(x_0\) 에서 샘플을 하나 뽑은 다음, 이를 맵 \(\Psi\) (프사이) 를 통과시켜 미지의 데이터 분포에서 샘플을 얻고자 하는 것입니다. 그리고 목표는 이를 달성하는 맵 \(\Psi\) 를 찾아내는 것입니다.
이것이 생성 모델의 주된 목표일 수 있지만, 또 다른 흥미로운 측면이 있습니다. 샘플을 생성하는 것 외에도 주어진 샘플의 확률을 정량화하고 싶을 수 있습니다. 최근 몇 년간은 다소 인기가 덜하지만 여전히 중요한 응용 분야입니다.
여기서 big question은 고차원의 대규모 데이터셋에 대해 실제 환경에서 이를 어떻게 구현할 것인가 하는 점입니다. 물론 실제로는 데이터 분포나 그 확률에 직접 접근할 수 없고, 여기 빨간 점들로 표시된 것처럼 해당 미지의 데이터 분포에서 추출된 학습 데이터 샘플만 주어집니다. 즉, 여기 보이는 빨간 점들이 훈련 세트(Training set) 입니다.
이제 넘어가서, 널리 쓰이는 생성 모델 중 하나가 바로 Flows 입니다. Flows는 생성 맵 \(\Psi\) 를 표현하기 위해 속도장(Velocity Field, \(v\) ) 을 선택합니다. 그림에서 왼쪽이 속도장인데, 이는 시간과 위치를 입력받아 그 지점에서의 속도 벡터를 생성하는 맵입니다. 여기 보시는 것은 2D에서의 속도장 예시입니다.
Flows는 이 속도장을 적분하여 생성 모델, 즉 변환 \(\Psi\) 를 정의합니다. 샘플 \(x_0\) 에서 시작하여 시간 1이 될 때까지 속도장을 따라가는 것이죠. 수학적으로 이는 상미분 방정식(ODE) 으로 정의되며, 궤적의 속도는 현재 위치에서의 속도장과 같다는 것을 의미합니다. 이를 적분하면 공간의 변형(Deformation), 즉 미분동형사상(Diffeomorphism)이 일어납니다. (원본 영상을 보시면 조금 더 직관적으로 이해할 수 있을 겁니다.)
우리는 이를 \(x_t\) 라는 간결한 표기법으로 사용할 텐데, 이는 기본적으로 \(x_0\) 에서 시작해 시간 \(t\) 까지 적분한다는 뜻입니다. 즉, 우리는 매개변수 \(t\) 에 따른 변형들의 가족(family)을 생성하며, 시간 \(t=1\) 에서의 변형이 우리가 원하는 생성 모델이 됩니다.
이 생성 모델(맵 \(\Psi\) )과 함께, 시간에 따라 진화하는 결합된(coupled) 확률 분포가 존재합니다. 다시 확률론적 관점에서 보면, 분포 \(P\) (노이즈)에 따라 분포된 확률 변수 \(x_0\) 를 샘플링하고 , 속도장이나 흐름(flow)을 사용하여 시간 \(t\) 까지 밀어내면, \(p_t\) 라고 표기하는 분포를 따르는 확률 변수 \(x_t\) 를 얻게 됩니다. 위 그림은 시간에 따라 진화하는 밀도의 시각화입니다. 원본 영상을 함께 보시는 것을 추천드립니다.
속도장과 확률 사이의 관계를 이해하기 위해 우리는 생성 흐름(Generative Flows)의 기본 방정식인 연속 방정식(Continuity Equation) 을 사용합니다. 이것은 편미분 방정식(PDE)이며 공간 미분항도 포함되어 있습니다. 기본적으로 이 방정식이 의미하는 바는 고정된 지점에서의 확률 변화를 정량화한다는 것입니다. 공간상의 한 점을 고정했을 때, 그 지점에서의 확률 변화는 흐름(Current, 확률 \(\times\) 속도)의 발산(Divergence)과 같습니다. 즉, 들어오고 나가는 확률의 유속(Flux)을 정량화하여 특정 지점에서의 확률 값 변화를 설명합니다. 이것은 매우 기본적인 방정식으로, 우리가 곧 보게 될 플로우 매칭뿐만 아니라 많은 플로우 알고리즘의 동기가 됩니다.
이제 생성 모델을 훈련하려고 할 때, 우리에게는 representation(속도장)이 있습니다. 하지만 미분 가능하고 다루기 쉬운 손실 함수(loss)가 필요합니다.
미분 가능하고 다루기 쉬운(tractable) 첫 번째 해결책은 플로우가 생성한 밀도와 우리에게 훈련 세트로 주어진 경험적 분포(empirical distribution) 사이를 비교하기 위해 표준 발산(standard Divergence)을 사용하는 것이었습니다. 이는 Neural ODE 연구(Chen et al.)에서 수행된 것으로, 플로우에 의해 생성된 밀도 (여기서는 \(P_1\) 이라 부름) 와 \(Q\) 사이의 KL 발산(KL Divergence)을 최소화하는 아이디어입니다. 그리고 이는 본질적으로 샘플의 우도(likelihood)를 최대화하는 것과 동등합니다.
그래서 첫 번째로 마주하는 난해한 질문은 주어진 속도장 \(V\) 로부터 특정 샘플에서의 로그 확률에 대한 기울기(gradients)를 어떻게 얻을 것인가 하는 점입니다. 샘플을 하나 뽑아서 그 확률을 계산해야 하는데, 저자들은(발표자가 아니라 Neural ODE 연구 저자들) 이를 위해 연속 방정식을 사용할 것을 제안했습니다. 연속 방정식은 편미분 방정식(PDE)이지만, 이를 특성 곡선(characteristic) 관점에서 풀면 기본적으로 \(V_t\) 에 의해 정의된 특정 경로를 따르는 상미분 방정식(ODE)으로 바뀝니다. 그리고 이 경로를 따라 로그 확률의 변화를 설명하는 ODE로 쓸 수 있습니다. 논문의 핵심 주제가 아니므로 너무 자세히 들어가지는 않겠습니다만, 중요한 점은 Neural ODE를 훈련하기 위해 훈련 샘플에서의 확률을 추정하려면 기본적으로 반복(iteration) 중에 ODE를 풀어야 한다는 것입니다. 즉, 시뮬레이션을 하거나 ODE 솔버를 사용해야 하고 그 과정을 통해 역전파(backprop)를 해야 합니다. 또한 고차원 벡터장의 발산(Divergence)을 계산해야 하는 추가적인 복잡성도 있습니다. 훈련 중에 이러한 시뮬레이션을 수행해야 한다는 필요성은 기본적으로 이 방법론을 대규모 데이터셋과 대형 모델로 확장하는 데 일종의 걸림돌이 되었습니다.
이제 Flow Matching 에서는 기본적으로 연속 방정식을 다시 살펴보고, 플로우를 훈련하기 위해 더 확장 가능한 손실 함수(loss)가 무엇일지 이해하고자 합니다. 우리도 역시 플로우를 훈련할 것이지만, 더 확장 가능한 다른 손실 함수를 사용할 것입니다. 그 아이디어는 이 그림에 시각화되어 있습니다. 여기 이 덩어리(blob)가 모든 확률 측도(probability measures)를 나타낸다고 생각해 보십시오. 특히 소스 분포(노이즈)와 타겟 분포를 포함하고 있습니다 . 우리가 하고 싶은 것은 기본적으로 이 두 지점을 확률 경로(path of probabilities)로 연결하는 것입니다. 연속 방정식이 말해주는 것은, 시간 의존적인 벡터장(속도장)이 있으면 이 곡선(경로)이 유일하게 결정된다는 것입니다. 즉, 속도를 설정하고 \(P_0 = P\) 에서 시작하면, 이 전체 경로가 연속 방정식에 의해 결정되며, 특히 타겟 분포 \(P_1\) 또한 결정됩니다.
그래서 훈련 중에 계산하기 어려운 \(P_1\) 에서의 확률을 최적화하려고 하는 대신, 연속 정규화 플로우(continuous normalizing flows)에서 사용하는 표현 그 자체인 속도(velocities)를 비교하면 어떨까 하는 아이디어를 얻게 됩니다. 이것이 Flow Matching의 핵심 아이디어입니다. 이제 저자는 이것을 실제로 구현하기 위해 무엇이 필요한지 하나씩 쪼개어 설명하겠지만, 기본적으로 확률 대신 속도를 비교하겠다는 것이 전체 아이디어의 전부입니다.
이를 위해서는 약간의 지도(supervision)를 추가해야 합니다. 세상에 공짜 밥은 없으니까요. 연구팀은 약간의 지도를 추가했는데, 구체적으로는 연속 방정식을 함께 만족하는 확률 경로와 속도장의 결합(coupled) 형태인 지도를 마련해야 합니다. 이런 것이 준비되면, 우리는 실제로 벡터장을 회귀(regress)하기만 하면 됩니다. \(v_t\) 라고 부르는 훈련 가능한 신경망이 있고 파라미터를 가지고 있는데, 우리가 실제로 하고 싶은 것은 우리가 관심을 가지는 확률 경로상에서 이 신경망과 어떤 지도(supervising) 속도장 간의 차이를 최소화하는 것입니다.
어떤 의미에서 이것은 \(p_1\) 과 \(q\) 사이의 확률 측도 간, 혹은 경로 간의 새로운 종류의 발산(Divergence)으로 볼 수도 있습니다. 실제로 이 분야의 최근 연구들은 이것이 측도 간의 바서슈타인 거리( \(W_2\) )와 같은 더 일반적인 발산이나 거리들을 경계(bound) 지을 수 있음을 보여줍니다. 하지만 여전히 이 손실 함수로 바로 작업을 시작할 수 있는지는 명확하지 않습니다. 왜냐하면 \(p_t\) 와 \(u_t\) 를 만들어내야 하고, 이 손실 함수를 다루기 쉬운(tractable) 형태로 만들어야 하기 때문입니다 . 우리가 모두 실행할 수 있는 간단한 알고리즘이 되기 위해 빠진 두 가지 구성 요소는, 지도 신호인 \(p_t\) 를 마련하는 것과, 훈련 중에 기울기(gradients)의 불편 추정량(unbiased estimates)을 계산할 수 있는 다루기 쉬운 손실 함수를 만드는 것입니다. 그리고 그것이 바로 지금 저자가 하려는 것입니다.
| 가장 중요한 첫 번째는 Flow Matching을 위한 지도를 만드는 것입니다. 즉, 소스 노이즈에서 시작해서 데이터로 끝나는 확률 경로와, 이를 달성하는 결합된 속도장을 만들어내야 합니다. 여기 2차원 예시가 있습니다. 우리가 이를 달성하는 방법은 이 문헌에서 꽤 인기 있는 주변화(marginal) 구성을 사용하는 것입니다. 기본적으로 훈련 세트 \(q\) (이산 데이터인 델타의 합이어도 괜찮습니다)에 대해 적분할 것입니다. 그리고 각 데이터 포인트에 대해 $$p_t(x | x_1)\(라고 부르는 조건부 확률 경로를 정의할 것입니다 . 여기서\)x_1\(은 데이터 포인트들입니다. 이 조건부 확률 경로(일종의 커널 같은)는 기본적으로\)p_t$$ 가 경계 조건들을 만족하도록 만들기 위해 우리가 사용할 자유도(degrees of freedom)가 됩니다. |
그럼 이 조건부 확률 경로를 살펴보고, 위에 보이는 주변 확률 경로가 경계 조건을 만족하기 위해 이 조건부 확률 경로가 갖춰야 할 충분 조건이 무엇인지 자문해 봅시다. 이렇게 놓고 보면 답은 꽤 간단한 해결책을 가집니다. 여기 작은 애니메이션으로도 시각화되어 있는데요(원본 영상 14:30초쯤 보시면 됩니다.), 우리가 확실히 해야 할 것은 시간 0에서는 아무것도 하지 않는다는 것입니다. 즉, 시간 0에서는 우리의 소스 분포, 노이즈 분포에서 시작합니다. 만약 그렇게 한다면, 이 적분식에 시간 0을 대입했을 때 \(x_1\) 과 무관한 항이 적분 밖으로 빠져나오고, \(q\) 의 적분값은 1이 되므로 결국 \(p\) 를 재생산하게 됩니다. 그리고 시간 1에서 \(q\) 에 도달하고 싶다면, 시간 1에서의 모든 확률, 모든 질량을 \(x_1\) 에 집중시키면 됩니다. 수학적으로 이는 시간 1에서 모든 확률 질량을 \(x_1\) 에 두는 델타 함수를 얻는다는 뜻입니다. 이를 식에 대입하면 시간 1에서 \(q\) 를 재생산하는 것을 볼 수 있습니다.
이것이 바로 여러분이 해야 할 일의 전부입니다. 소스 분포에서 시작해서 시간 1에 모든 질량이 \(x_1\) 에 집중되도록 해야 합니다. 어떻게 할 수 있을까요? 사실 그렇게 복잡하지 않습니다. 잠시 후에 보여드리겠지만, 시각적인 방법은 모든 지점에서의 속도가 \(x_1\) 을 향하도록 하는 것입니다. 이렇게 하고 적분하면 \(x_1\) 에 도달하게 될 것입니다. 유일한 질문은 얼마나 빨리, 시간이 얼마나 걸릴지입니다. 기본적으로 이 화살표들의 길이(스케일)를 조절해서 공간 어디서 시작하든 시간 1에 \(x_1\) 에 도달하도록 만들면 됩니다.
잠시 후에 실제 방정식을 보여드리겠지만 그전에 알아두셨으면 하는 점은, 일단 이 벡터장을 얻게 되면 약간의 마법 같은 일이 일어난다는 것입니다. 여러분은 원래 확률 경로와 결합된 복잡한 벡터장을 설명하기 위해 이 단순한 벡터장을 사용할 수 있습니다. 이를 달성하는 방법은 여기 보이는 주변화(marginalization)를 수행하는 것입니다. 여기 어떤 베이즈 확률 항 같은 것이 있지만, 어쨌든 이 식을 사용해서 조건부 확률 경로들을 결합하면 원래의 확률 경로를 생성하는 속도장을 얻게 됩니다. 그래서 기본적으로 이 이야기의 결론은, 지도를 생성하고 싶을 때 신경 써야 할 것은 오직 모든 확률을 시간 1에 단일 지점으로 밀어넣을 수 있는지 확인하는 것뿐이라는 겁니다. 이 문제를 해결할 수 있다면 기본적으로 전체 프로세스에 대한 지도를 확보한 셈입니다.
그렇다면 어떻게 실제로 그렇게 할 수 있을까요? \(x_1\) 에 조건부인 간단한 플로우를 도입함으로써 가능합니다. 이 플로우는 시간 0에서는 항등(identity)이어야 하고, 시간 1에서는 모든 점을 \(x_1\) 으로 매핑해야 합니다. 이를 달성하는 간단한 방법 중 하나는 두 함수를 사용한 선형 결합을 이용하는 것입니다. 이 함수들은 시간에만 의존하는데, \(\sigma_t\) (시그마 T)는 위의 간단한 그래프처럼 시간 0에서 1이고 시간 1에서 0이 되며, \(\alpha_t\) (알파 T)는 0에서 시작해 1로 끝납니다. 이 식을 확인해보면 시간 0에서는 \(x_0\) 에 대한 함수로서 항등이 되고, 시간 1에서는 공간상의 모든 점 \(x_0\) 를 \(x_1\) 으로 매핑하므로 이 조건을 만족합니다. 확률 밀도 측면에서 생각해보면, \(x_0\) 가 \(P\) 에 따라 분포할 때 \(x_t\) 는 \(\alpha_t x_1\) 으로 이동되고 \(\sigma_t\) 로 스케일된 \(P\) 에 비례하여 분포하게 됩니다. 즉 기본적으로 \(\sigma_t\) 가 0으로 가면 모든 질량을 \(\alpha_t x_1\) 주변으로 집중시키는 셈입니다. 이것은 매우 간단한 종류의 결합이며, 또한 이 \(\alpha_t\) 와 \(\sigma_t\) 는 잠시 후 몇 슬라이드 뒤에 언급하겠지만 확산(diffusion)과도 관련이 있습니다.
자, 지금까지 우리가 한 것은 \(P\) 에서 \(Q\) 로 우리를 데려다주는 확률 경로의 가족(family)과 그에 결합된 속도장을 공식화한 것입니다.
이제 이 \(p\) 와 \(u\) 를 여기에 대입하고 싶은데, 이게 그렇게 간단하지가 않습니다. 왜냐하면 \(u_t\) 는 주변(marginal) 항이라서 모든 데이터에 대해 적분을 해야 하기 때문에 여기에 바로 대입할 좋은 방법이 없습니다. 여기서 우리에게 도움이 되는 약간의 마법 같은 일이 실제로 일어나는데, 바로 Flow Matching 손실 함수가 한 번에 하나의 훈련 샘플로 나누어 계산하는 손실 함수와 동등하다는 것입니다. 즉, 주변 \(u_t\) 와 \(p_t\) 를 보는 대신 조건부 \(u_t\) 와 \(p_t\) 를 보고 모든 예시에 대해 적분하면 됩니다. 놀랍게도 이 손실 함수의 기울기는 원래 손실 함수의 기울기와 완전히 일치합니다. 따라서 우리는 샘플, 훈련 샘플, 그리고 조건부 확률 경로에서 한 점을 무작위로 선택함으로써 이 손실 함수의 기울기에 대한 편향 없는(unbiased) 추정치를 매우 쉽게 얻을 수 있습니다.
나중에 유용하게 쓰일 한 가지 더 단순화가 있습니다. ‘무의식적 통계학자의 법칙(Law of the Unconscious Statistician)’이라고 불리는 것을 사용하거나, 단순히 기댓값 적분에서 변수 변환을 할 수 있습니다. \(p_t\) 에서 샘플링하는 대신 \(x_0\) 에서 샘플링한 다음, 앞서 언급한 조건부 플로우를 통해 밀어낼 수 있습니다. 이렇게 하면 기본적으로 훈련 샘플들과 소스 포인트(노이즈 샘플)들에 대해 적분할 수 있게 됩니다. 그리고 \(p_t\) 에서 샘플링된 \(x\) 대신 여기에 \(x_t\) 를 넣고, \(x_t\) 에서의 \(u_t\) 는 ODE에 기반한 플로우의 속도와 정확히 같습니다.
이것이 단순화된 버전이며, 기본적으로 우리는 기본적인 Flow Matching 훈련 알고리즘에 도달했습니다. 이것이 전부입니다. 작동 방식은 훈련의 각 반복(iteration)마다 0과 1 사이의 시간을 샘플링하고, 데이터 포인트 \(x_1\) 을 샘플링하고, 소스 포인트(노이즈 포인트) \(x_0\) 를 샘플링합니다. 그리고 예를 들어 선형 결합을 사용하여 \(x_0\) 에서 \(x_1\) 으로 가는 조건부 플로우에 의해 \(x_t\) 를 계산합니다. 그런 다음 손실에 대한 기울기를 취하는데, 이는 기본적으로 \(x_t\) 에서 우리 네트워크를 샘플링하여 \(x_t\) 에서의 속도에 최대한 가깝게 만드는 것입니다. 이것이 기본 알고리즘입니다 .
저자는 또한 Flow Matching 접근 방식이 서로 다른 저자들에 의해 서로 다른 동기와 접근 방식으로 병렬적으로 발견되었다는 점도 언급합니다. 저자는 발표 내내 오른쪽 하단에 관련 인용 문헌들을 적어두었습니다(이전에 언급했는지 모르겠지만요).
흥미로운 점은 Flow Matching에서 지금까지 우리가 자유롭게 선택할 수 있는 두 가지 종류의 설계 선택권이 있다는 것입니다. 우리는 원하는 어떤 소스 확률 \(p\) 든 선택할 수 있습니다. 가우시안일 수도 있지만 다른 것일 수도 있죠. 그리고 노이즈에서 데이터로 흘러가는 임의의 방식을 선택할 수 있습니다. 유일한 요구 사항은 기억하시겠지만 시간 1에 모든 질량을 \(x_1\) 으로 가져가야 한다는 것뿐입니다.
Flow Matching을 훈련한 후 샘플링은 기본적으로 훈련된 속도장을 가지고 소스 샘플에서 시작하여 시간 1까지 수치적으로 ODE를 푸는 것입니다. 여러분이 선호하는 어떤 수치 해석기(numerical solver)든 사용할 수 있습니다.
여기서 Flow Matching과 확산(Diffusion) 사이의 관계를 강조하는 것이 좋을 것 같습니다. 이는 Flow Matching이 어떤 의미에서 확산의 일반화인지를 보여줄 것입니다. 여기 오른쪽에 확산을 위한 기본적인 의사 코드(pseudo code)를 두었습니다. 주목해야 할 중요한 점은 여기서도 \(x_0\) 가 노이즈이고 \(x_1\) 이 데이터라는 관례를 사용하고 있다는 것입니다. 대부분 확산 모델에 익숙한 분들은 보통 반대라는 것을 아시겠지만, 그것이 중요한 점은 아니라고 생각합니다.
여기서 중요한 점은 확산에서는 훈련 샘플을 기반으로 조건부 확률에서 샘플링해야 하는데, 이 조건부 확률이 임의적이지 않다는 것입니다. 이것은 전방 노이즈화 과정(forward noising process)에서 나옵니다. 이 전방 노이즈화 과정은 보통 연속적인 경우 drift와 확산(diffusion)이 있는 확률 미분 방정식(SDE, stochastic differential equation)입니다. 그리고 이 SDE를 푸는 확률 변수들의 확률에 대한 닫힌 형태(closed form)의 해를 구할 수 있어야 합니다. SDE의 경우 연속 방정식에 해당하는 것을 포커-플랑크 방정식(Fokker-Planck equation)이라고 부르지만, 여전히 모든 지점에서 확률, 즉 조건부 확률에 대한 닫힌 형태의 해를 내놓을 수 있어야 합니다. 해가 알려진 다양한 경우가 있는데, 예를 들어 Variance Exploding(분산 폭발)이나 Variance Preserving(분산 보존)이 그러한 두 가지 예입니다 .
하지만 이것들은 임의의 경로가 아닙니다. 주목해야 할 중요한 제약 중 하나는 그것들이 모두 가우시안이라는 점입니다. 즉 모두 가우시안의 평행 이동과 스케일 변환 형태입니다. 또한 평균과 분산에 곱해지는 파라미터들인 서로 다른 스케줄러들이 확산 과정에서 유래해야 합니다. 예를 들어 Variance Preserving의 경우 지수 함수 형태를 가지는데, 이는 확산 모델의 또 다른 문제를 보여줍니다. 유한한 시간 내에는 완벽한 노이즈, 완벽한 가우시안에 도달할 수 없다는 것입니다. 항상 그보다 조금 앞서 멈춰야 합니다.
우리가 피할 수 있는 두 가지, 즉 확산 모델에서 \(P\) 가 가우시안이어야 한다는 필요성과 유한한 시간 안에 노이즈에 도달할 수 없다는 사실은 일종의 제한 요소입니다. Flow Matching이 기본적으로 말하는 것은, 이것들이 이 프레임워크에서 실제로 중요한 부분이 아니라는 것입니다. 전방 확률 과정(forward stochastic process)에 얽매이지 않고 자유로워진다면, 처음부터 소스에서 타겟으로 데려다주는 과정을 설계하고 그것을 회귀(regress)하면 됩니다. 그것이 차이점입니다.
어떤 의미에서 Flow Matching은 확산의 본질은 유지하면서, 소스에서 타겟으로 가는 플로우를 생성하는 데 불필요한 다른 모든 제약들을 버린 것이라고 말하고 싶습니다.
오늘 포스팅은 여기까지 하겠습니다. 1시간 분량의 원본 영상 중 25분 정도 되는 분량인데, 이후의 내용은 너무 어렵기도 하고 양도 많아서 생략하겠습니다.
요약하자면 지금까지 Flow Matching을 살펴보았고, 확산 모델이 그 일종의 사례라는 것을 보았습니다. 그리고 Flow Matching이 확산처럼 가우시안뿐만 아니라 어떤 소스 확률이든 타겟 \(Q\) 로 전이시킬 수 있다는 것과, 더 일반적인 경로로 작업할 수 있다는 것을 보여줄 수 있었습니다.
이 내용이 가장 중요하고 핵심이라 생각하기 때문에 여기서 포스팅 마치겠습니다. 감사합니다.
Follow my github