Intro
AI는 많은 데이터와 큰 모델을 사용하며 발전을 이루어왔습니다. 하지만 항상 black-box라는 한계로 신뢰하지 못한다는 치명적 단점을 가지고 있습니다. 최근에는 많은 데이터를 학습한 덕분에 좋은 성능을 내는 Large language model(LLM)이 많이 공개되고 있지만 여전히 엉뚱한 답변을 내놓는 hallucination이 나타나는 경우가 많이 있습니다. 이런 문제를 해결하기 위해 interpretable AI에 대한 연구가 많이 이루어지고 있습니다. 이번 글에서는 그중 한 갈래인 symbolic regression에 대해 소개하려고 합니다.
Symbolic Regression 이란?
Symbolic regression은 input x, output y에 대한 set이 있을 때 이 x, y의 관계를 설명해 주는 수식을 만들어내는 것을 말합니다.
예를 들어 위와 같은 (x,y) set이 주어질 때 이 함수가 $y=x^{3}+x-3$ 함수라는 것을 밝히는 것이 symbolic regression 인 것입니다! 이러한 강력한 장점 덕분에 심볼릭 회귀는 다양한 분야에서 사용됩니다. 과학과 공학에서는 물리학, 화학, 생물학 등의 복잡한 시스템을 모델링하는 데 사용되며(예를 들어 데이터는 있지만 밝혀지지 않은 수학적 관계를 밝히기 위해 연구함), 금융에서는 시장 동향을 예측하는 데 사용됩니다. 또한, 기계 학습과 데이터 분석에서도 심볼릭 회귀는 복잡한 패턴을 찾는 데 있어 중요한 도구입니다.
심볼릭 회귀에 대한 주요 포인트
심볼릭 회귀는 위에서 볼 수 있듯 데이터 중심 방법입니다. 이는 변수들 사이의 기본적인 관계를 가장 잘 설명하는 수학적 방정식을 찾기 위해 데이터를 탐색합니다. 심볼릭 회귀는 Deep Neural Network와 같은 복잡한 기계 학습 모델보다 더 해석 가능한 모델을 생성한다는 점에서 강력한 장점이 있습니다. 이러한 심볼릭 방정식은 변수들 사이의 관계에 대한 통찰력을 제공합니다. 이러한 장점 때문에 간결하고 해석 가능한 모델을 찾는 것이 중요한 물리학, 생물학, 금융, 공학 등 여러 분야에서 응용되고 있습니다.
알고리즘은 유전 프로그래밍이 대표적이며, SymPy와 같은 심볼릭 회귀 소프트웨어 패키지, 그리고 Eureqa와 같은 상업용 도구를 포함한 다양한 알고리즘을 사용하여 수행될 수 있습니다. 최근에는 Neural Network를 사용한 모델이 많이 나오고 있습니다. 대표적으로 Large Transformer 모델을 사용하여 supervised learning 한 모델을 개발하고 있습니다([1]). 또한 하이브리드 모델로 eureqa와 GNN을 함께 사용하여 dark matter를 모델링한 논문([2])도 있습니다.
하지만, 심볼릭 회귀는 계산적으로 많은 자원을 요구할 수 있으며, 최적의 심볼릭 표현을 찾기 위한 탐색은 많은 수의 수학적 연산을 필요로 할 수 있습니다. 고차원 또는 잡음이 많은 데이터셋에서는 잘 안 되는 경우가 굉장히 많아 보통 간단한 경우에서 많이 사용되고 있습니다. (이를 해결하기 위해 AI를 적극 사용하고 연구 중이긴 합니다.)
위에서 말했듯, 심볼릭 회귀의 주요 방법론 중 하나는 유전 프로그래밍입니다. 유전 프로그래밍은 랜덤 하게 생성된 함수 세트에서 시작하여, 선택, 교차, 변이 등의 연산을 통해 최적의 함수를 찾는 알고리즘입니다. 강화학습 혹은 Neural Network를 사용한 방법도 꾸준히 나오고는 있지만 여전히 baseline은 유전 프로그래밍 base 방법이 많이 사용되고 있고, 유전 프로그래밍과 AI 기반 방법을 함께 쓰는 hybrid 모델도 많이 나오는 추세입니다.
다음은 간단한 심볼릭 회귀를 구현하는 파이썬 코드 예제입니다.
from gplearn.genetic import SymbolicRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.utils.random import check_random_state
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import graphviz
# Ground truth
x0 = np.arange(-1, 1, .1)
x1 = np.arange(-1, 1, .1)
x0, x1 = np.meshgrid(x0, x1)
y_truth = x0**2 - x1**2 + x1 - 1
ax = plt.figure().gca(projection='3d')
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_xticks(np.arange(-1, 1.01, .5))
ax.set_yticks(np.arange(-1, 1.01, .5))
surf = ax.plot_surface(x0, x1, y_truth, rstride=1, cstride=1, color='green', alpha=0.5)
plt.show()
rng = check_random_state(0)
# Training samples
X_train = rng.uniform(-1, 1, 100).reshape(50, 2)
y_train = X_train[:, 0]**2 - X_train[:, 1]**2 + X_train[:, 1] - 1
# Testing samples
X_test = rng.uniform(-1, 1, 100).reshape(50, 2)
y_test = X_test[:, 0]**2 - X_test[:, 1]**2 + X_test[:, 1] - 1
est_gp = SymbolicRegressor(population_size=5000, generations=20, stopping_criteria=0.01,
p_crossover=0.7, p_subtree_mutation=0.1,
p_hoist_mutation=0.05, p_point_mutation=0.1,
max_samples=0.9, verbose=1,
parsimony_coefficient=0.01, random_state=0)
est_gp.fit(X_train, y_train)
print(est_gp._program)
Reference
[1] https://arxiv.org/abs/2204.10532
[2] https://arxiv.org/abs/2006.11287
'머신러닝&딥러닝 > 기초정리' 카테고리의 다른 글
해석 가능한 신경망 (Interpretable Neural Network) (1) | 2023.10.27 |
---|---|
다양한 Hyperparameter Optimization 방법 리뷰 (1) | 2022.03.12 |
Graph Neural Network 설명 - Introduction to GNN (0) | 2022.02.25 |
Neural Network Pruning - 모델 경량화 (2) | 2022.02.24 |
Multi-task learning & Meta-learning (0) | 2021.09.23 |