1 정의
Neural operator 는 함수공간 사이의 사상(operator) \(\mathcal{G}: \mathcal{U} \to \mathcal{V}\) 를 신경망으로 근사하는 모형이다. 입력은 함수 \(u(\cdot) \in \mathcal{U}\), 출력은 또 다른 함수 \(v(\cdot) \in \mathcal{V}\) 이다.
대표적인 구조:
- DeepONet (Lu et al., 2021) — branch · trunk 두 신경망의 내적으로 사상을 표현
- Fourier Neural Operator (FNO) (Li et al., 2020) — 푸리에 영역에서 곱셈으로 적분 핵을 학습
이 정의는 고전 FDA 의 functional regression 과 동일한 문제를 푼다. 차이는 함수 형태에 대한 가정의 강도다.
| 모형 | 입력 | 출력 | 함수 형태 가정 |
|---|---|---|---|
| Scalar-on-function regression | 함수 \(X(s)\) | 스칼라 \(Y\) | 선형 \(Y = \int \beta(s) X(s) ds\) |
| Function-on-function regression | 함수 \(X(s)\) | 함수 \(Y(t)\) | 선형 \(Y(t) = \int \beta(s,t) X(s) ds\) |
| DeepONet / FNO | 함수 \(u(\cdot)\) | 함수 \(v(\cdot)\) | 비선형 \(\mathcal{G}_\theta\) (자유 형태) |
2 개념 및 원리
2.1 출발점: 고전 Functional Regression 의 두 가정
함수형 데이터에서 function-on-function regression 은 다음과 같다 (Kokoszka & Reimherr, 2017, Ch.5):
\[ Y_i(t) = \alpha(t) + \int_0^1 \beta(s, t) X_i(s) \, ds + \varepsilon_i(t) \]
여기서 두 가정이 결정적이다:
- 선형성: \(X_i\) 와 \(Y_i\) 사이가 적분 핵 \(\beta(s,t)\) 의 선형 작용이다
- 고정 격자: \(X_i\) 와 \(Y_i\) 가 동일한 도메인 \([0,1]\) 에서 관측된다고 가정한다
이 두 가정은 분석 가능성의 대가다. PDE 해를 학습하거나 비선형 동역학을 잡으려면 첫째 가정을 풀어야 한다. 다양한 해상도의 데이터를 동시에 다루려면 둘째 가정도 풀어야 한다.
2.2 DeepONet — Branch + Trunk 분해
DeepONet 의 핵심 아이디어는 다음 분해다:
\[ \mathcal{G}_\theta(u)(y) = \sum_{k=1}^p b_k(u_{\text{sensors}}) \cdot t_k(y) + b_0 \]
여기서:
- \(u_{\text{sensors}} = (u(x_1), \ldots, u(x_m))\) 는 입력 함수를 \(m\) 개 센서 위치에서 샘플링한 벡터
- Branch net \(b: \mathbb{R}^m \to \mathbb{R}^p\) — 입력 함수의 표현을 \(p\) 개 계수로 매핑
- Trunk net \(t: \mathbb{R}^d \to \mathbb{R}^p\) — 출력 위치 \(y\) 를 \(p\) 개 기저값으로 매핑
- 둘의 내적이 \(\mathcal{G}(u)(y)\) 의 근사
이 구조의 의미는 다음과 같다. \(b_k(u)\) 가 데이터 의존적 계수, \(t_k(y)\) 가 위치 의존적 기저로 행동한다. 즉 DeepONet 은 학습된 기저 전개 \(\sum_k c_k(u) \phi_k(y)\) 의 신경망 버전이다.
이는 FDA 의 Karhunen-Loève 전개 와 정확히 같은 구조다 (Kokoszka, 2017, Ch.3):
\[ X(t) = \mu(t) + \sum_j \xi_j v_j(t) \]
여기서 \(\xi_j = \int X(t) v_j(t) dt\) 는 데이터 의존 점수, \(v_j(t)\) 는 위치 의존 고유함수다. DeepONet 은 이 \(\xi_j\) 와 \(v_j\) 를 데이터로부터 비선형으로 학습한다.
2.3 Fourier Neural Operator — 적분 핵을 푸리에로 곱한다
FNO 는 다른 길을 택한다. 함수 \(v\) 에 적분 연산자 \(\mathcal{K}\) 를 작용시키는 일반 형태:
\[ (\mathcal{K} v)(x) = \int \kappa(x, y) v(y) \, dy \]
는 합성곱 정리(convolution theorem)에 의해 푸리에 영역에서 단순한 곱셈이 된다:
\[ \widehat{\mathcal{K} v}(\xi) = \widehat{\kappa}(\xi) \cdot \widehat{v}(\xi) \]
FNO 는 이 \(\widehat{\kappa}(\xi)\) — 즉 푸리에 계수(저주파 모드 \(k_{\max}\) 개)— 를 학습 가능 파라미터로 두고, FFT → 곱셈 → IFFT 의 한 사이클을 신경망 한 층으로 본다:
\[ v_{l+1}(x) = \sigma\left( W v_l(x) + \mathcal{F}^{-1}\left( R_\theta \cdot \mathcal{F}(v_l) \right)(x) \right) \]
여기서 \(R_\theta\) 가 학습 가능한 푸리에 계수 텐서다. 격자 해상도가 학습 시와 추론 시 달라도 작동하는 이유는 모드 \(k_{\max}\) 가 격자 크기와 무관하게 정의되기 때문이다 (mesh invariance).
이 구조는 FDA 의 Fourier basis 표현 의 자연스러운 확장이다. 고전 FDA 가 \(X(t) = \sum_k c_k e^{2\pi i k t}\) 로 표현하고 \(c_k\) 를 추정한다면, FNO 는 \(c_k\) 를 비선형 변환의 학습 가능 가중치로 둔다.
2.4 두 접근의 비교
| 측면 | DeepONet | FNO |
|---|---|---|
| 구조 모티브 | Karhunen-Loève | Fourier basis |
| 메쉬 의존성 | 입력은 고정 센서, 출력은 자유 | 학습·추론 격자 다를 수 있음 |
| 적합 도메인 | 일반 함수 매핑, 임의 위치 평가 | 정규 격자 PDE 해, 시공간 |
| 학습 비용 | 중간 | FFT 덕분에 효율적 |
| 해석성 | \(b_k \cdot t_k\) 로 분해 가능 | 푸리에 모드 시각화 |
3 왜 필요한가
3.1 문제 1: 비선형 동역학 — 선형 적분 핵으로 부족하다
PDE 해, 화학 반응 동역학, 신경 신호 동역학은 본질적으로 비선형이다. 고전 functional regression 의 \(\int \beta(s,t) X(s) ds\) 형태는 선형 작용소만 표현한다. 비선형 작용소를 잡으려면 \(\beta(s,t,X(\cdot))\) 처럼 \(X\) 자체에 의존하는 핵이 필요하다 — 이는 정확히 neural operator 가 학습하는 대상이다.
3.2 문제 2: 격자 가변성 — wearable 의 들쭉날쭉한 샘플링
연속 혈당 모니터(CGM)는 5분 간격, 가속도계는 30Hz, 심박은 1Hz 로 측정된다. 한 환자의 다중 센서 데이터를 같은 모형으로 다루려면 격자 가변성을 다뤄야 한다. FNO 의 mesh invariance 와 DeepONet 의 trunk net 을 통한 임의 위치 평가가 이 문제를 푼다.
3.3 문제 3: 작은 데이터에서의 일반화 — physics-informed 결합
전통 DL 은 대량의 표지 데이터를 요구하지만, 과학·헬스 도메인은 데이터가 비싸다. Neural operator 는 PDE residual 을 손실에 추가하는 PINN(Physics-Informed Neural Network)과 결합하기 쉽다. 적은 데이터로도 물리 제약을 만족하는 사상을 학습한다.
4 응용 분야
| 도메인 | 활용 | 입력 함수 | 출력 함수 |
|---|---|---|---|
| 기후·해양 | Navier-Stokes 빠른 시뮬레이터 | 초기 속도장 \(u_0(x,y)\) | 시점 \(t\) 의 속도장 \(u(x,y,t)\) |
| 분자진단 | RT-PCR 곡선 → Ct 분포 | 45-cycle RFU 곡선 | Ct posterior 함수 |
| 의료 영상 | DTI 트랙 형태 → 인지 함수 | 뇌량 fractional anisotropy 곡선 | 인지 점수 시간 곡선 |
| 웨어러블 | 24h 심박/활동 → 다음날 예측 | \([0,24]\) 의 심박 함수 | \([24,48]\) 의 심박 함수 |
| 음성 처리 | 음향 곡선 → spectrogram | 시간 영역 신호 | 시간-주파수 함수 |
| 재무 | IRS curve 진화 | 오늘의 yield curve | 30일 후 yield curve |
| 산업 IoT | 진동 신호 → RUL 함수 | 가속도계 시계열 | 잔여수명 분포 함수 |
특히 RT-PCR / qPCR / digital PCR 같은 분자진단 도메인에서는 45-cycle 형광 곡선이 자연스럽게 함수로 인식된다. FPCA 가 점수만 추출했다면, neural operator 는 곡선 자체를 다른 곡선(예: 정량 표준곡선) 으로 변환하는 사상을 학습할 수 있다.
5 예시 — DeepONet 의 작은 손계산
함수 \(u(s) = \sin(\omega s)\) 를 입력받아 적분 \(\int_0^x u(s) ds = (1-\cos(\omega x))/\omega\) 를 출력하는 사상 \(\mathcal{G}\) 를 생각하자.
DeepONet 은 다음과 같이 학습한다:
- Branch net: \(u_{\text{sensors}} = (u(s_1), \ldots, u(s_m))\) 을 입력 → \(\omega\) 정보를 \(p\) 차원 표현으로 인코딩
- Trunk net: 출력 위치 \(x\) 를 입력 → \((1, \cos x, \sin x, \cos 2x, \ldots)\) 와 유사한 기저 표현
- 둘의 내적이 \((1 - \cos(\omega x))/\omega\) 를 근사
학습이 잘 되면 trunk net 은 사실상 푸리에 기저를 자가 발견하고, branch net 은 \(\omega\) 에 따라 어떤 기저를 켤지 결정하는 게이트로 행동한다. 이는 FDA 의 기저 전개 + 데이터 의존 계수와 정확히 같은 구조다.
6 코드 예시
6.1 Step 1: PyTorch 로 미니 DeepONet 구현 (원리 이해)
import torch
import torch.nn as nn
class MiniDeepONet(nn.Module):
"""입력 함수 u(.)와 출력 위치 y 를 받아 G(u)(y) 를 근사한다."""
def __init__(self, m_sensors: int, p_basis: int, hidden: int = 64):
super().__init__()
# branch: 센서 값 m 개 → 기저 계수 p 개
self.branch = nn.Sequential(
nn.Linear(m_sensors, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, p_basis),
)
# trunk: 출력 위치 1차원 → 기저 함수 p 개
self.trunk = nn.Sequential(
nn.Linear(1, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, p_basis), nn.ReLU(),
)
self.bias = nn.Parameter(torch.zeros(1))
def forward(self, u_sensors: torch.Tensor, y: torch.Tensor) -> torch.Tensor:
b = self.branch(u_sensors) # (B, p)
t = self.trunk(y.unsqueeze(-1)) # (B, p)
return (b * t).sum(dim=-1) + self.bias
# 학습 데이터 — 적분 사상 u(s) = sin(omega s) -> (1 - cos(omega x))/omega
m, p = 50, 16
sensors = torch.linspace(0, 1, m)
def make_batch(n=128):
omega = torch.rand(n) * 5 + 1
u = torch.sin(omega.unsqueeze(-1) * sensors.unsqueeze(0))
y = torch.rand(n)
target = (1 - torch.cos(omega * y)) / omega
return u, y, target
model = MiniDeepONet(m, p)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
for step in range(2000):
u, y, target = make_batch()
pred = model(u, y)
loss = ((pred - target) ** 2).mean()
opt.zero_grad(); loss.backward(); opt.step()
if step % 200 == 0:
print(f"step {step:4d} MSE = {loss.item():.4e}")해석: branch 가 \(\omega\) 정보를 추출해 16개 계수를 만들고, trunk 가 출력 위치 \(y\) 에 대한 16개 기저를 만든다. 둘의 내적이 \((1-\cos(\omega y))/\omega\) 를 근사한다.
6.2 Step 2: neuraloperator 라이브러리로 FNO (실무)
import torch
from neuralop.models import FNO
# Burgers 방정식 데이터 가정 — 입력: 초기 조건 u0(x), 출력: T초 후 u(x,T)
# 데이터 형태: (B, C, H) — Batch, Channel, spatial grid
# x_train.shape = (1024, 1, 256)
# y_train.shape = (1024, 1, 256)
model = FNO(
n_modes=(16,), # 푸리에 모드 16개만 학습
in_channels=1,
out_channels=1,
hidden_channels=32,
n_layers=4,
)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = torch.nn.MSELoss()
for epoch in range(100):
for x, y in loader:
opt.zero_grad()
pred = model(x)
loss = loss_fn(pred, y)
loss.backward()
opt.step()
# Mesh invariance 확인 — 학습은 256 격자, 추론은 512 격자
x_high_res = torch.randn(1, 1, 512)
y_high_res = model(x_high_res) # 동일 모델로 작동해석: n_modes=16 이 학습 가능한 푸리에 모드 개수다. 격자 256 에서 학습한 가중치가 격자 512 에서도 작동하는 이유는 모드 정의가 격자 무관이기 때문이다.
7 고전 FDA 와 Neural Operator 의 대응
| 고전 FDA 개념 | Neural Operator 대응 | 관계 |
|---|---|---|
| Karhunen-Loève 전개 \(X(t) = \sum_j \xi_j v_j(t)\) | DeepONet branch · trunk 분해 | 점수 \(\xi_j\) 와 기저 \(v_j\) 의 비선형 일반화 |
| Fourier basis \(\{e^{2\pi i k t}\}\) | FNO 학습 가능 푸리에 계수 | 고정 기저 → 학습 기저 |
| 적분 핵 \(\beta(s,t)\) | FNO 의 \(R_\theta\) | 선형 핵 → 비선형 작용소 |
| \(\int \beta(s,t) X(s) ds\) | DeepONet \(\sum_k b_k(X) t_k(t)\) | 선형 사상 → 비선형 사상 |
| Roughness penalty | weight decay + spectral cutoff | 매끄러움 정규화 |
| FPCA 점수 회귀 | Branch net 출력 → downstream | 차원 축소 + 비선형 |
이 표가 시사하는 것은 명확하다 — neural operator 는 FDA 의 단절이 아니라 연속적 일반화다. FDA 를 충실히 공부한 사람이 neural operator 의 구조를 자연스럽게 이해할 수 있는 이유다.
8 한계와 함정
- 외삽(extrapolation) 위험 — 학습 분포 밖의 함수에서 성능이 급락한다. 고전 FDA 의 \(\beta(s,t)\) 가 형식적으로 보장하던 외삽 거동이 보장되지 않는다
- 해석성 손실 — branch · trunk 의 분해는 가능하지만, 학습된 trunk 기저가 항상 의미 있게 정렬되지는 않는다. FPCA 의 고유함수 해석성과 다르다
- 데이터 효율 — neural operator 는 수천 개의 입력-출력 함수 쌍을 요구한다. PCR 임상 코호트처럼 함수 표본이 100개 수준이면 고전 FDA + 약한 가정이 더 안전하다
- PDE residual 손실의 균형 — physics-informed 손실이 데이터 손실을 압도하면 underfit 된다
- 메쉬 invariance 의 함정 — FNO 는 정규 격자만 처리한다. 비정규 격자라면 Graph Neural Operator 같은 변형이 필요하다
9 관련 주제
선행 지식
후속 주제
- Physics-Informed Neural Networks (PINN) (placeholder)
- Graph Neural Operators — 비정규 격자 처리 (placeholder)
- Functional Time Series 와 Neural Operator 의 결합 (placeholder)
관련 개념
- Modern Survival Analysis — RSF/DeepSurv — 고전 통계의 ML 확장이라는 동일 패턴
- Karhunen-Loève 전개 — DeepONet branch·trunk 분해의 고전 대응
10 참고문헌
- Lu, L., Jin, P., Pang, G., Zhang, Z., & Karniadakis, G. E. (2021). Learning nonlinear operators via DeepONet based on the universal approximation theorem of operators. Nature Machine Intelligence, 3(3), 218–229.
- Li, Z., Kovachki, N., Azizzadenesheli, K., Liu, B., Bhattacharya, K., Stuart, A., & Anandkumar, A. (2020). Fourier Neural Operator for Parametric Partial Differential Equations. ICLR 2021.
- Kokoszka, P., & Reimherr, M. (2017). Introduction to Functional Data Analysis. CRC Press.
- Ramsay, J. O., & Silverman, B. W. (2005). Functional Data Analysis (2nd ed.). Springer.
- Kovachki, N., Li, Z., Liu, B., Azizzadenesheli, K., Bhattacharya, K., Stuart, A., & Anandkumar, A. (2023). Neural operator: Learning maps between function spaces. JMLR, 24(89), 1–97.