기계공학의 잡다구리 생활

[PIDoN] Physics-Informed DeepONet에 대하여 본문

인공지능/Deep Learning

[PIDoN] Physics-Informed DeepONet에 대하여

타구스 2024. 2. 11. 20:45

 최근 PINN과 같이 Single Instance 특성을 가진, 즉 같은 문제 상황이더라도 Input 데이터 등의 조건이 바뀌면 재훈련해야 된다는 문제로 인해 Operator Learning과 같은 Multi Instance의 특성을 가진 알고리즘들이 떠오르고 있다. 그중 필자의 생각으로 가장 많은 연구가 진행된 것은 Physics Informed Neural Operator (PINO)와 Physics Informed DeepONet (PIDoN)이 아닐까 생각한다. 실제로 PINO 경우는 엔비디아에서 쓰고 있으니까. PINO에 대한 포스팅은 일전에 남겼기 때문에 이번에는 PIDoN에 대해 적어보고자 한다. 

 

DeepONet이란?

 PINN이 기본적인 CNN에 물리적 정보를 끼얹은 것처럼 PIDoN 또한 DeepONet에 물리적 정보를 끼얹은 프레임워크다. 이 말인즉슨 PIDoN을 이해하기 위해서는 기본적인 DeepONet에 대해 알아야 된다. 그렇다면 DeepONet이란 무엇일까? DeepONet은 Deep Operator Network의 약자로 말 그대로 앞서 언급하였던 Operator의 Learning을 뜻하는 말이다. 이를 수식적으로 접근하면 (내가) 어렵기 때문에 간단하게 핵심 아이디어 정도만 살펴볼 예정이다. 필요할 경우 논문을 참고하도록 하자

DeepONet
Lu, Lu, Pengzhan Jin, and George Em Karniadakis. "Deeponet: Learning nonlinear operators for identifying differential equations based on the universal approximation theorem of operators."  arXiv preprint arXiv:1910.03193  (2019).

 

 이 두 그림을 통해 DeepONet의 핵심 아이디어를 설명할 수 있다. 왼쪽 그림을 먼저 보면, Training Data는 고정된 센서인 ${x_1,x_2,...,x_m}$의 위치에 해당하는 값 $u$이다. 이때의 미지의 연산자 $G$를 거치게 되면 출력 함숫값이 나오게 된다. 즉, $G$는 입력과 출력 사이의 관계를 나타내는 연산자로 바로 이 연산자를 DeepONet은 학습하는 것이다. 또한 출력 함수의 random location인 $y$는  구성이 되어있는데, $y$에서의 $G(u)$값은 항상 실수값을 가져야 한다. 이 문단의 글이 조금 깔끔하지 못한 감이 있는데, 사실 중요한 내용이 아니기 때문에 일단 넘어가도록 하자.

 

 DeepONet의 핵심 개념은 우측 그림에 나와있다. DeepONet은 Branch Network와 Trunk Network라는 두 개의 네트워크로 구성이 되어있으며, 이 두 네트워크의 값을 내적을 통해 결합하면 출력값을 획득할 수 있다. 이때 각각의 네트워크의 의미를 기술하자면, Branch Network는 Input function $u$를 입력으로 받는다. 그럼으로써 Branch Network는 입력 함수에 대한 잠재 표현에 대한 정보를 내재하고 있다. 즉, Input function에서 얻을 수 있는 특성이 반영되게 된다. 반면 Trunk Network는 Output이 평가되는 좌표에 대한 잠재 표현 특성을 내포한다. 두 하위네트워크를 결합해 얻은 출력은 다음과 같이 정의할 수 있다. 아래 수식에서 $b_k(u)$는 Branch Network의 출력값이고, $t_k(y)$는 Trunk Network의 출력값이다. 각각 출력값이 일종의 Coefficient와 Basis function의 역할을 하여 Basis function theory를 기반으로 $G(u)(y)$로 근사화될 수 있다.

 

$$G(u)(y)\approx  \sum_{k=1}^{P}b_k(u)t_k(y)$$

 

 이를 정리하자면 DeepONet은 두 개의 하위 네트워크를 통해 각각의 입력 데이터를 통해 얻을 수 있는 출력 데이터에 관한 정보들을 추출하여 결합해 출력값을 얻어내는 것이다. 즉, 입력 값과 출력 값 사이의 관계를 나타내는 연산자를 학습한다. 하지만 DeepONet의 경우 $u$와 $y$을 필요로 하기 때문에 학습을 위해서는 입력-출력 쌍의 대규모 데이터 셋이 필요하다. 일종의 머신러닝이라고도 볼 수 있는데, 데이터셋 생성에 대한 비용을 감소시키기 위해 딥러닝으로 대체하려는 시도로 인해 DeepONet 또한, 물리적 정보를 통해 데이터셋의 필요성을 제거하고자 하였다.

 

Physics Informed DeepONet(PIDoN)

 위의 DeepONet의 원리에 대해 어렴풋이 감을 잡았다면, PIDoN에 대한 개념은 어렵지 않다. 기존에 PINN에 대해 알고 있는 사람이라면 어떻게 물리적 정보를 적용하는지 사실 아래 내용을 안 봐도 감이 올 것이다. PIDoN에 대한 개략도는 아래와 같다.

 

PIDoN_framework
Wang, Sifan, Hanwen Wang, and Paris Perdikaris. "Learning the solution operator of parametric partial differential equations with physics-informed DeepONets."  Science advances  7.40 (2021): eabi8605.

 

 이것이 전부이다. 경계 조건, 초기 조건에 대한 손실 함수를 적용하고, Automatic Differential을 통해 미분항들을 추출하여 편미분 방정식의 Redisual에 대한 손실을 적용시키면 끝이다. 손실함수에 대한 식을 나타내면 다음과 같다.

 

$$ L = L_{data} + L_{PI} = L_{data}+L_{IC}+L_{BC}+L_{physics} $$

 

 일단 data에 관한 Loss도 적어두긴 했지만, 사실 data 없이 비지도 학습으로 물리적 정보만을 이용하여 풀 수 있긴 하다. 백문이 불여일견이라고 개인적으로 이런 내용은 직접 코드를 봐야 어떻게 손실함수가 적용되는지 이해가 쉽다고 생각하기 때문에 손실 함수에 대한 자세한 부분은 추후 포스팅할 Burger's Equation에 대한 PIDoN 예제 코드 포스팅에서 다룰 예정이다.

 

글을 마치며

 PIDoN에 대해 공부를 한지 시간이 꽤 지나 이번 포스팅을 쓰기 위해 논문 몇 개를 다시 읽어보았다. 진작 좀 포스팅했어야 됐는데, 개인적인 생각이지만 뭔가 PINO보다는 PIDoN의 핵심 개념이 조금 더 와닿는 것 같다. 하지만 문제는 논문에서 제공한 PIDoN 예제 코드가 jax 기반 코드라는 것..? 회사의 입장에서는 이걸 실제로 실무에 적용시키기 위해서는 최대한 많은 사람이 아는 언어를 쓸 텐데 현재 jax를 다룰 수 있는 사람이 얼마나 될까 하는 궁금증이 든다. 그렇다고 jax를 안 쓰고 PIDoN을 구현하려면 Computation Cost가 증가할 텐데 얼마나 증가하려나 싶은..?