당신이 Neural ODE가 어려운 이유는 수학 때문이 아닐 수도 있다.
연구노트 긁어오기 3
1. 미분 방정식이 처음이라서
Neural ODE에서 다루는 미분 방정식은 크게 어렵지 않다.
미분 방정식이 무엇인지? 방정식인데, 그 해가 함수이거나 함수 집합이다.
수치적으로 푸는 방법 = Euler’s method (단순한 ODE Solver)
이것만 알아도 크게 어려움이 없다. 그리고, 위 두 개념은 크게 어렵지 않다.
또한, Runge-Kunta까지 안다면 더더욱 어려움이 없을 것이다.
2. 2번 Section의 설명이 조금 난해해서
리뷰를 해본 자의 입장으로서, 2번 Section이 Neural ODE의 핵심으로 보인다. (Sensitivity Adjoint Method를 제안)
하지만, 이에 대한 수식 전개가 없고 뜬금 없이 등장한 거 같아 매우 혼란을 겪는다. 필자 또한 이를 파훼할 방법을 찾느라 3일이 걸렸다.
그런데, 2번 Section 마지막에 짤막하게 Appendix B에 Sensitivity Adjoint Method에 대한 수식 전개가 있음을 발견하게 된다. (Augmented state를 사용하여 Adjoint state를 ODE Solver를 통해 풀었을 때 Solution이 왜 그렇게 나오는지 설명)
그러니 수식에 당황하고 있다면, Appendix B를 살펴봐라. (찾기 어려웠던 이유는 Appendix A가 3번 Section의 Normalizing Flow에 관한 내용이라 당연히 없는 줄 알았다.)
3. 파라미터의 단일화, time-conditioned dynamics (Non-autonomous dynamics)
아무래도 Residual Networks, Normalizing Flows, RNN Decoders를 먼저 접해본 사람이라면, Neural ODE에서 말하는 모델링 방법은 무한의 파라미터를 요구하는 것처럼 보인다.
하지만, 실제 구현과 논문의 Section을 보면, 하나의 Layer(파라미터)를 가지고, 모델링을 하는 것에 있어서 혼란을 겪게 된다.
DDPM을 생각해보라. 각 step마다 하나의 모델(U-Net)을 사용했는지 말이다.
아니다. time을 나타내는 \(t\)를 입력으로 사용하여 어떻게 보면 \(t\)를 Hypernetwork의 역할을 하도록 했다.
이를 time-conditioned dynamics(수학에서는 non-autonomous dynamics라 한다.)라 한다더라.
즉, \(t\)가 들어감으로써 하나의 파라미터로 서로 다른 layer 효과를 낸다는 것이다. (핵심)
Neural ODE에서도 암묵적으로 이 방법을 사용하고 있고, 그게 직접 명시되지 않았기에 직관에 어려움을 겪게 되는 것이다.
이렇게 핵심인 내용인데, 논문에서는 왜 언급되지 않았나? 아예 언급이 안 된 것은 아니다. 우리가 아직 time-conditioned dynamics에 익숙하지 않아서 수식으로 간단하게 표현한 것들을 놓친 것이다.
Introduction에서 Residual Networks를 아래와 같이 정의한다. 이 때는 각 layer에 따라 파라미터가 다름을 알 수 있다. \(\theta_t\)
$$ \mathbf{h}_{t+1}=\mathbf{h}_t+f(\mathbf{h}_t,\theta_t) $$
하지만, 극한으로 보내서 ODE로 정의하면서 수식이 조금 바뀌게 된다. 지금은 time \(t\)와 \(\theta\)가 따로 분리되어 들어가는 것을 알 수 있다. 즉, 저자들이 명시적으로 글에서 나타내지는 않았지만, 각 time에 따른 변환을 \(t\)로 구분하고 paramter sharing하겠다 그 얘기다.
$$ \frac{d\mathbf{h}(t)}{dt}=f(\mathbf{h}(t),t,\theta) $$
그러면, 모든 \(t\)에 대한 gradient는 \(\theta\)가 받나? 그렇다.
4. 구현의 어려움 (=Autograd)
어찌 논문을 다 리뷰하고, 구현을 해볼까 하면 Backpropagation을 직접 구현해야 하는 것에 있어 난항을 겪게 된다.
이 부분은 우리가 Autograd에 대한 핸들링을 해볼 일이 거의 없었기 때문에 그렇다. torchdiffeq 구현을 보지말고, 다른 사람들이 간단하게 구현해둔 것을 찾아봐라. 난 아래 repository가 도움이 되는 거 같다.
https://github.com/msurtsukov/neural-ode/tree/master
GitHub - msurtsukov/neural-ode: Jupyter notebook with Pytorch implementation of Neural Ordinary Differential Equations
Jupyter notebook with Pytorch implementation of Neural Ordinary Differential Equations - msurtsukov/neural-ode
github.com
이 부분에 대해서도 조금만 공부를 해보면 되니 크게 어려울 바 없다. (사실 아직 내가 해본 것은 아니다. 하지만, 간단하게 구현한 버전을 보니, Autograd에 대해 그렇게 많이 다루지는 않는다.)
그래서, 오픈 소스를 보거나 방금 말한 내용을 먼저 공부해보면 알게 될 것이다.
저자들은 구현을 중심으로 이 논문을 작성했단 걸.. (특히, Pseudo code 진짜..)
논문을 한 번 brief하게 리뷰하고 간단하게 구현된 오픈 소스들을 한 번 찾아보는 걸 추천한다.
5. 정리하자면
정리하자면, Neural ODE가 어려운 이유는 수학 때문이 아닐 수도 있다. “중요한 수식의 유도 생략 + 단일 파라미터에 대한 혼란 + autograd 조작”같은 점 때문에 우리들은 어려워했을 수도 있다.