나는 지난 8~9월을 소위 "물리학정보 인공지능망 (Physics Informed Neural Networks, PINN)"을 공부했다. PINN이라는 이름에 물리학 정보라는 이름이 들어가 있듯이, 내가 연구하는 기본 이론이 가령 만류인력의 법칙 등 물리학이론(또는 가령 경제학 이론 등)등을 가지고 있다면, 연구데이터를 단순한 인공신경망 (Neural Networks, NN)을 이용해서 분석하는 것보다, NN+PINN을 이용해서 분석을 하면 더 정확하고 빠른 결과를 얻을 수 있다. 특히 data set이 적은 경우라도 모델을 정확히 분석해낸다는 장점이 있다. 다음은 PINN을 가장 잘 설명한 site로 불리우는 Ben Moseley교수의 블로그에서 인용한 자료이다.
https://benmoseley.blog/my-research/so-what-is-a-physics-informed-neural-network/
https://benmoseley.blog/
위의 그림은 좌측에 전체의 곤선을 회귀식으로 만들려는 경우, 실제 작은원으로 표시된 최측의 10개의 데이터만을 가지고는 파랑색회귀선이 Exact Sulution을 그리다가 실패를 하지만 PINN 모델을 이용한 인공지능망은 학습(Trainming step의 증가)을 통해 마지막 선끝까지 모두 정확히 그려낸다.
동영상도 이미 있다.
https://www.youtube.com/watch?v=vFghJ0r39K4&list=PL8VpspSED2HynhsEbbHmFnsYd_BBUYDff
다행히도 최초의 논문을 한글로 수준 높게 번역한 논문이 있어 여러분에게 소개하고자 한다.
https://freshrimpsushi.github.io/ko/posts/3313/
세상에 chatGPT가 없었다면 이러한 연구는 1년정도 공부하다가 포기했을 정도로 어렵고 적용범위도 무한하다. 이 주제는 그만큼 사회과학(경제학, 주가전망)에서도 Hot하다.
참고로 다음은 제가 chatGPT를 통해 구한, 만류인력의 법칙을 이용한 Python code이다.
Physics-Informed Neural Networks (PINN)은 물리적 정보를 활용하여 편미분 방정식(PDE)의 해를 근사하는 방법입니다. 만유인력의 법칙을 PINN에 적용하는 것은 중력 문제를 해결하는 데 유용할 수 있습니다. 아래는 만유인력의 법칙을 기반으로 한 PINN의 간단한 코드 예제와 설명입니다.
import numpy as np
import tensorflow as tf
from tensorflow import keras
# 만유인력 상수
G = 6.67430e-11 # m^3 kg^-1 s^-2
# PINN 모델 정의
class PINN(keras.Model):
def __init__(self):
super(PINN, self).__init__()
self.hidden1 = keras.layers.Dense(50, activation='tanh')
self.hidden2 = keras.layers.Dense(50, activation='tanh')
self.output_layer = keras.layers.Dense(1)
def call(self, x):
x = self.hidden1(x)
x = self.hidden2(x)
return self.output_layer(x)
# 물리적 손실 함수 정의
def physics_loss(y_true, y_pred):
# y_true는 실제 중력 가속도, y_pred는 모델 예측값
return tf.reduce_mean(tf.square(y_true - y_pred))
# 데이터 생성 (예: 두 물체의 거리와 질량)
def generate_data():
m1 = 5.972e24 # 지구 질량 (kg)
m2 = 7.348e22 # 달 질량 (kg)
r = np.linspace(1e7, 4e7, 100) # 거리 (m)
g = G * m1 * m2 / r**2 # 만유인력 법칙에 따른 중력 가속도
return r, g
# 모델 훈련
def train_model():
r, g = generate_data()
model = PINN()
model.compile(optimizer='adam', loss=physics_loss)
model.fit(r, g, epochs=1000)
# 모델 훈련 실행
train_model()
## 코드 설명
1. **만유인력 상수**: `G`는 만유인력 상수로, 물체 간의 중력 상호작용을 정의합니다.
2. **PINN 모델 정의**: `PINN` 클래스는 두 개의 은닉층과 하나의 출력층으로 구성된 신경망을 정의합니다. 각 은닉층은 50개의 뉴런을 가지고 있으며, `tanh` 활성화 함수를 사용합니다.
3. **물리적 손실 함수**: `physics_loss` 함수는 실제 중력 가속도와 모델의 예측값 간의 차이를 최소화하는 손실 함수를 정의합니다. 이는 PINN이 물리적 법칙을 따르도록 학습하는 데 도움을 줍니다.
4. **데이터 생성**: `generate_data` 함수는 두 물체의 질량과 거리 정보를 기반으로 중력 가속도를 계산하여 훈련 데이터를 생성합니다.
5. **모델 훈련**: `train_model` 함수는 PINN 모델을 훈련시키는 과정을 포함합니다. 생성된 데이터를 사용하여 모델을 훈련시키고, 손실 함수를 최소화합니다.
이 코드는 만유인력의 법칙을 기반으로 한 PINN의 기본적인 구조를 보여줍니다. PINN은 물리적 정보를 활용하여 모델의 예측을 개선할 수 있는 강력한 도구입니다. PINN의 구조와 작동 원리에 대한 더 깊은 이해는 관련 문헌을 통해 얻을 수 있습니다