잡다구리 너구리

[PINN] Burgers Equation 예제 코드 분석 본문

인공지능/Deep Learning

[PINN] Burgers Equation 예제 코드 분석

너굴뽀이 2023. 9. 8. 18:24

 

 

 본 글에서는 Physics-Informed Neural Network(PINN)을 통해 PINN이 어떻게 물리적 정보를 기반으로 Partial Differential Equation(PDE)를 푸는지 분석할 예정이다. PINN에 대한 간략한 설명은 이전 글에 있으니 참조하면 된다. 필자가 PINN을 처음 접한 것은 Matlab에서 구동하는 코드이기 때문에 Matlab 코드를 기반으로 작성할 예정이다. 왜 흔히 사용하는 Python이 아닌 Matlab 기반으로 코드를 공부했냐 하면, 기계공학과에서는 일반적으로 Python보다는 Matlab을 기존에 많이 사용했던 추세이기 때문에 Matlab 코드를 기반으로 시작하게 되었다.

 

2023.08.15 - [인공지능/Deep Learning] - [PINN] Physics-Informed Neural Network란??

 

[PINN] Physics-Informed Neural Network란??

현재 인공지능이 화두가 되며, 기계공학과에서도 한창 기존의 산업에 이를 적용시키려는 연구가 진행 중이다. 그중 가장 뜨거운 주제는 Physics-Informed Neural Network, 일명 PINN이다. PINN에 관한 연구

sarasara.tistory.com

 

 원래는 전반적인 코드를 살펴볼 예정이었으나, Mathworks에 있던 처음에 공부했던 코드가 다른 코드로 업데이트되어 구성이 바뀌어 PINN의 핵심 아이디어에 대한 부분 위주로만 확인할 예정이다. 작년 이맘때쯤 해당 코드를 봤던 것 같은데 이번 포스트 작성을 위해 다시 찾아보니 원형 도메인에서의 Poisson Equation을 푸는 PINN 코드도 생기고 Burgers Equation 코드 또한 업데이트되었다. 원형 도메인 코드는 추후 보게 될 수도 있을 거라는 생각이 들었다. 먼저 해당 글에 참고한 코드는 아래 링크를 통해 확인할 수 있으니 전반적인 코드는 링크를 통해 확인할 수 있다. 코드마다 중간중간 설명도 잘 나와있으니 참고하면 유용할 것이다.

 

https://kr.mathworks.com/help/deeplearning/ug/solve-partial-differential-equations-using-deep-learning.html?searchHighlight=physics%20informed&s_tid=srchtitle_support_results_5_physics%20informed 

 

Solve Partial Differential Equations Using Deep Learning - MATLAB & Simulink - MathWorks 한국

이 예제의 수정된 버전이 있습니다. 사용자가 편집한 내용을 반영하여 이 예제를 여시겠습니까?

kr.mathworks.com

 

Burgers Equation이란?

 먼저 코드를 다루기 전에 간단하게 Burger's Equation이 무슨 식인지 알아보자. 해당 방정식은 유체역학, 비선형 음향학, 기체 동역학 등 다양한 분야에서 사용되는 편미분 방정식으로 본 코드는 1차원 Burger's Equation을 해석한다. 식은 아래와 같다.

 

$$\frac{\partial u}{\partial t}+u\frac {\partial u}{\partial x}-\frac {0.01}{\pi}\frac {\partial^2 u}{\partial x^2}=0$$

 

 초기조건은 $u(x, t=0)=-sin(\pi x)$이며, 경계조건은 $u(x=-1, t)=0, u(x=1, t)=0$의 디리클레 경계조건을 가진다. 입력 조건으로는 $x, t$가 들어가 출력으로 $u(x, t)$가 나온다.

 

 코드를 보기에 앞서 간단하게 설명하자면, 위의 방정식에 $x, t, u$가 각각 올바른 값이 들어갈 경우 식의 우항은 당연히 0이 나올 것이다. 하지만 만약 $(x, t)$에 대응하는 $u$가 들어가지 않을 경우 우항은 0이 나오지 않게 된다. 이것이 PINN의 개념이며, $(x, t)$를 통해 예측한 $u(x, t)$로 얻은 방정식의 우항(일반적으로 PDE의 Residual, 잔차라고 한다.)을 점차적으로 줄여나가게 Weight와 bias를 조정하는 것이 바로 PINN이다. 여기에 추가적으로 초기 조건과 경계 조건에 대한 손실 함수도 주어 PINN을 강화한다.

 

Code 확인

 Python으로 구현하는지, Matlab으로 구현하는지 등에 따라 세부적인 코드 구현은 달라지겠지만 PDE의 물리적 정보를 손실 함수로써 사용한다는 PINN의 개념은 동일하기 때문에 위에 언급한 부분에 대한 핵심적인 부분에 대한 코드만 확인해 보도록 한다.

 

 Loss function은 $MSE_f$와 $MSE_u$의 합으로 구성된다. 여기서 $MSE_f$가 PDE의 Residual을 이용한 Loss이며, $MSE_u$가 초기 조건과 경계 조건을 이용해 얻은 Loss이다. 세부적인 식은 Mathworks 페이지(위의 링크)를 통해 확인하도록 하자. 지금부터 다룰 코드는 Mathworks 페이지에서 Model Loss Function에 관한 부분이다. 

 

function [loss,gradients] = modelLoss(parameters,X,T,X0,T0,U0)

# Make predictions with the initial conditions.
U = model(parameters,X,T);

# Calculate derivatives with respect to X and T.
gradientsU = dlgradient(sum(U,"all"),{X,T},EnableHigherDerivatives=true);
Ux = gradientsU{1};
Ut = gradientsU{2};

# Calculate second-order derivatives with respect to X.
Uxx = dlgradient(sum(Ux,"all"),X,EnableHigherDerivatives=true);

# Calculate lossF. Enforce Burger's equation.
f = Ut + U.*Ux - (0.01./pi).*Uxx;
zeroTarget = zeros(size(f), "like", f);
lossF = mse(f, zeroTarget);

 

 위의 코드가 $MSE_f$를 구하는 코드이다. $x, t$를 Input으로 주어 Neural Network를 통해 얻은 U를 사용하여 x에 대한 미분 값, t에 대한 미분 값 등 방정식에 필요한 값들을 구해준 뒤 PDE의 Residual(f)를 구해주는 것을 확인할 수 있다. 예측이 올바르게 되었다면 f는 0이 되기 때문에 0의 행렬과의 Mean Squared Error를 통해 $MSE_f$를 구한다.

 

# Calculate lossU. Enforce initial and boundary conditions.
U0Pred = model(parameters,X0,T0);
lossU = mse(U0Pred, U0);

# Combine losses.
loss = lossF + lossU;

# Calculate gradients with respect to the learnable parameters.
gradients = dlgradient(loss,parameters);

end

 

 다음 코드는 $MSE_u$, 즉 초기 조건과 경계 조건에 대한 Loss를 구하는 코드이다. 그렇게 얻은 lossF와 lossU를 더해주어 총 손실 함수를 계산하여 이를 바탕으로 Optimizing을 진행한다. 그렇다면 여기서 의문을 가질 포인트가 있다. 왜 초기 조건과 경계 조건을 통해 손실 함수를 얻는다고 해놓고 왜 LossU는 X0와 T0에 대한 예측값만을 반환하는가? 이에 대한 해답은 X0와 T0의 데이터를 통해 확인할 수 있다.

 

X0 = [x0IC x0BC1 x0BC2];
T0 = [t0IC t0BC1 t0BC2];
U0 = [u0IC u0BC1 u0BC2];

 

 위의 코드는 Generate Training Data의 일부분 코드로 X0와 T0 안에 초기 조건과 경계 조건에 대한 데이터가 같이 들어가 있음을 확인할 수 있다.(안의 세부적인 데이터가 각각 의미하는 바는 페이지를 통해 확인하자. 보면 손쉽게 이해할 수 있다.) 각각 초기조건과 경계조건에 대한 U0와 이들의 $x, t$를 이용해 얻은 예측값으로 MSE를 구해 손실 함수를 이용한다. 이것이 PINN의 핵심 아이디어이다.

 

글을 마치며

 본문에서는 PINN을 통해 Burger's Equation을 푸는 코드로 PINN의 핵심적인 아이디어에 대해 다뤘다. Matlab 코드를 통해 다뤘지만, Python 코드 또한 동일한 메커니즘으로 구동된다. 그렇다면 Matlab으로 PINN을 구현했을 때의 장점은 뭐냐? 이에 대한 필자의 답변은 없다이다. 물론 내가 모르는 장점이 있을 수도 있다. 처음 알고리즘을 공부한 것이 PINN이었기 때문에 상대적으로 익숙한 Matlab 코드를 통해 공부하였다. 아마 대부분의 기계공학과는 Python보다 Matlab에 더 익숙할 것이라 생각한다. 추후 Matlab을 통해 PINN으로 Wave Equation을 구현하고 나서 느낀 바지만, Matlab은 Python에 비해 훈련에 필요한 시간이 오래 걸린다. 이는 Matlab은 행렬 연산에만 최적화되어 있기 때문이라고 생각한다. 그냥 남들이 많이 쓰는 데는 다 이유가 있다.