시뮬레이션 대리모델
설계 최적화, 불확실성 정량화, 실시간 제어는 같은 시뮬레이션을 수백에서 수백만 번 반복해야 한다. 한 번에 몇 시간 걸리는 시뮬레이션으로는 불가능한 일이다. 대리모델(surrogate model)은 시뮬레이터의 입력–출력 관계를 데이터로 근사해, 같은 질문에 훨씬 빨리 답하는 모델이다. 대리모델의 방법론(GP, 축소 모델, 신경 연산자)은 13.7장과 24.4–24.5장에서 다룬다. 이 장은 물리·공학 문제에서 대리모델을 언제, 어떤 구조로 만들고, 그 이득과 한계를 어떻게 정직하게 보고하는가를 다룬다.
대리모델 논문의 가장 흔한 문제는 두 가지다. 하나는 학습 범위 밖의 조건에서 조용히 틀리는 것이고, 다른 하나는 속도 이득을 불공정한 비교로 부풀리는 것이다. 이 장의 계산은 둘을 모두 직접 보인다.
학습 목표
- 문제에 맞는 대리모델 구조를 선택한다
- 대리모델의 정확도와 속도 이득을 공정하게 측정한다
- 물리 검사로 대리모델의 외삽 실패를 점검하고 그 한계를 안다
대리모델의 종류
왜 필요한가. "시뮬레이션을 대신한다"는 말은 출력이 무엇이냐에 따라 전혀 다른 문제가 된다. 출력의 종류가 데이터의 양, 모델 구조, 평가 방법을 모두 정한다.
세 가지 종류.
| 종류 | 입력 → 출력 | 예 | 주된 어려움 |
|---|---|---|---|
| 스칼라 출력 회귀 | 설계·운전 파라미터 → 관심 출력량 | 형상 파라미터 → 항력 계수, 운전 조건 → 최고 온도 | 데이터가 적다(시뮬레이션 수 = 표본 수) |
| 장(field) 예측 | 또는 입력 장 → 출력 장 | 유입 조건 → 속도장, 하중 → 응력 분포 | 출력 차원이 크다(격자점 수) |
| 시간 전개(rollout) | 현재 상태 → 다음 상태 | 한 step 예측을 반복해 궤적 생성 | 오차가 누적된다(26.5장) |
스칼라 회귀는 출력이 하나라 단순해 보이지만 시뮬레이션 한 번이 표본 하나라서 데이터가 수십–수백 개뿐인 경우가 많다. 그래서 GP(Gaussian process)처럼 적은 데이터에서 불확실성까지 주는 모델이 흔히 쓰인다(13.7장; Rasmussen, Williams, 2006). 장 예측은 시뮬레이션 한 번이 수만 개의 값을 주지만, 그 값들은 서로 강하게 상관되어 있어 실제 자유도는 훨씬 작다. 이 구조를 이용하는 것이 다음 절의 축소 모델이다. 시간 전개는 학습은 한 step으로 하지만 사용은 수천 step으로 하므로, 학습 손실과 실제 성능 사이의 간극이 가장 크다.
구조 선택
왜 필요한가. 같은 장 예측이라도 격자가 균일한 사각형인지, 형상이 바뀌는 비구조 메시인지, 해상도를 바꿔 써야 하는지에 따라 쓸 수 있는 구조가 다르다. 구조가 데이터의 기하에 맞지 않으면 보간·재샘플링에서 오차가 생기고, 맞으면 적은 데이터로도 일반화가 좋아진다.
선택 기준.
- 균일 격자의 장 → CNN·U-Net. 격자를 영상처럼 다룬다. 평행이동 등변성이 지역적 물리 법칙과 잘 맞는다. 형상이 바뀌면 격자로 재샘플링해야 한다.
- 비구조 메시 → 그래프 신경망. 메시의 노드를 그래프 노드, 셀 연결을 간선으로 두고 메시지 전달로 이웃 상호작용을 학습한다. 형상마다 메시가 달라도 같은 모델을 쓸 수 있다(Pfaff 외, 2021).
- 함수 → 함수, 해상도 변화 → 신경 연산자. 입력 함수에서 출력 함수로의 사상을 이산화와 분리해 학습한다. FNO·DeepONet 등은 24.4장에서 다룬다.
- 적은 데이터, 매끄러운 파라미터 의존성 → 축소 모델(POD) + 회귀. 스냅샷 행렬을 특이값 분해해 소수의 공간 모드를 찾고(proper orthogonal decomposition, POD), 모드 계수만 파라미터의 함수로 회귀한다(Berkooz, Holmes, Lumley, 1993). 선형대수만으로 만들 수 있어 다른 구조의 baseline으로도 반드시 비교해야 한다.
POD + 회귀의 수식. 학습 파라미터 에서 얻은 해를 행으로 쌓은 스냅샷 행렬 에서 평균 를 빼고 특이값 분해하면, 앞의 개 오른쪽 특이벡터 이 POD 모드다. 대리모델은
이고, 계수 함수 를 학습 데이터의 투영 계수 로부터 회귀한다. 오차는 두 부분으로 나뉜다. 모드 개로 표현할 수 없는 부분(기저 오차)과 계수를 잘못 예측한 부분(회귀 오차)이다. 모드 의 특이값 에 대해 의 누적 비율을 "에너지"라 부르고, 학습 데이터의 기저 오차는 버린 에너지와 같다.
점성 Burgers 방정식 (주기 경계, 초기조건 )의 시각 해를 대리모델로 만든다. 파라미터는 점성 이고, 학습 범위는 에서 로그 간격 16개다. 26.1장의 보존형 유한체적 solver를 고충실도 모델로 쓴다.
import numpy as np
def solve(nu, N=128, T=1.5):
"""u_t + (u²/2)_x = nu u_xx, 주기 경계 [0, 2π), u0 = 0.5 + sin x. 유한체적 + Heun."""
dx = 2 * np.pi / N
u = 0.5 + np.sin(np.arange(N) * dx) # (N,)
n = int(np.ceil(T / (0.4 * min(dx / 1.5, dx**2 / (2 * nu)))))
def rhs(u):
ur = np.roll(u, -1) # (N,) 오른쪽 이웃
a = np.maximum(np.abs(u), np.abs(ur))
F = 0.25 * (u**2 + ur**2) - 0.5 * a * (ur - u) - nu * (ur - u) / dx # (N,) 면 유속
return -(F - np.roll(F, 1)) / dx
for _ in range(n):
u1 = u + T / n * rhs(u)
u = 0.5 * (u + u1 + T / n * rhs(u1))
return u, n
nu_train = np.geomspace(0.05, 0.2, 16) # (16,) 학습 범위 [0.05, 0.2]
X = np.array([solve(nu)[0] for nu in nu_train]) # (16, 128) 스냅샷 행렬
print("스냅샷 행렬", X.shape, " 질량 ∫u dx 범위",
np.round([X.sum(1).min() * 2 * np.pi / 128, X.sum(1).max() * 2 * np.pi / 128], 6))스냅샷 행렬 (16, 128) 질량 ∫u dx 범위 [3.141593 3.141593]
모든 스냅샷의 질량 가 초기값 와 같다. 보존형 이산화와 주기 경계 덕분이다. 이제 POD 기저를 만들고, 모드 계수를 의 3차 다항식으로 회귀한다. 학습 범위 안(내삽)과 밖(외삽)의 에서 고충실도 해와 비교한다.
mean = X.mean(0) # (128,)
_, s, Vt = np.linalg.svd(X - mean, full_matrices=False) # Vt: (16, 128) POD 모드
print("누적 에너지 비율:", np.round(np.cumsum(s**2)[:4] / np.sum(s**2), 5))
r = 4
A = (X - mean) @ Vt[:r].T # (16, r) 학습 계수
coef = [np.polyfit(np.log(nu_train), A[:, k], 3) for k in range(r)]
def surrogate(nu):
a = np.array([np.polyval(c, np.log(nu)) for c in coef]) # (r,)
return mean + a @ Vt[:r] # (128,)
rel = lambda a, b: np.linalg.norm(a - b) / np.linalg.norm(b)
for nu in [0.07, 0.13, 0.03, 0.02, 0.4]:
u_ref = solve(nu)[0]
proj = mean + (u_ref - mean) @ Vt[:r].T @ Vt[:r] # 기저로 표현할 수 있는 최선
tag = "내삽" if 0.05 <= nu <= 0.2 else "외삽"
print(f"nu={nu:4.2f} ({tag}) 대리모델 오차 {rel(surrogate(nu), u_ref):6.2%} 기저 투영 오차 {rel(proj, u_ref):6.2%}")누적 에너지 비율: [0.98362 0.99957 0.99999 1. ] nu=0.07 (내삽) 대리모델 오차 0.03% 기저 투영 오차 0.00% nu=0.13 (내삽) 대리모델 오차 0.01% 기저 투영 오차 0.01% nu=0.03 (외삽) 대리모델 오차 1.98% 기저 투영 오차 0.26% nu=0.02 (외삽) 대리모델 오차 6.58% 기저 투영 오차 0.68% nu=0.40 (외삽) 대리모델 오차 5.53% 기저 투영 오차 2.06%
모드 4개가 에너지의 99.999% 이상을 담는다. 내삽에서는 오차가 0.03% 이하다. 그러나 범위를 조금만 벗어나도 오차가 수십–수백 배 커진다. 오차 분해가 원인을 알려 준다. 에서 기저 투영 오차는 0.68%인데 대리모델 오차는 6.58%다. 해 자체는 기저로 꽤 잘 표현되는데, 계수 회귀가 외삽하면서 대부분의 오차가 생겼다. 이 경우 모드를 늘려도 나아지지 않는다. 다항식 회귀가 학습 범위 밖에서 빠르게 발산하는 것은 회귀 모델 일반의 성질이다(16.2장). 반대로 에서는 기저 오차도 2%로 커졌다. 점성이 크면 해가 학습 데이터에 없던 모양(더 매끄러운 파형)이 되기 때문이다.
정답 없이 외삽을 알아챌 수 있는가. 실제 사용에서는 새 조건의 고충실도 해가 없다. 그래도 물리 법칙에서 나오는 성질은 정답 없이 검사할 수 있다. 이 방정식의 해는 세 가지를 만족해야 한다. 질량 가 보존된다. 점성 Burgers 방정식은 새 극값을 만들지 않으므로 해는 초기값의 범위 안에 있다(최대·최소 원리). 같은 이유로 주기 영역의 총변동(total variation) 은 초기값 4를 넘지 않는다.
mass0 = np.pi # ∫(0.5 + sin x) dx over [0, 2π)
for nu in [0.07, 0.03, 0.02, 0.4]:
u = surrogate(nu)
mass_err = abs(u.sum() * 2 * np.pi / 128 - mass0)
tv = np.abs(np.diff(np.append(u, u[0]))).sum() # 주기 총변동, 초기값 4
bounds_ok = (u.max() <= 1.5 + 1e-9) and (u.min() >= -0.5 - 1e-9)
print(f"nu={nu:4.2f} 질량 보존 {mass_err < 1e-10} 최대·최소 원리 {bounds_ok} "
f"총변동 {tv:.3f} ≤ 4 {tv <= 4}")nu=0.07 질량 보존 True 최대·최소 원리 True 총변동 3.430 ≤ 4 True nu=0.03 질량 보존 True 최대·최소 원리 True 총변동 3.610 ≤ 4 True nu=0.02 질량 보존 True 최대·최소 원리 False 총변동 4.409 ≤ 4 False nu=0.40 질량 보존 True 최대·최소 원리 True 총변동 2.229 ≤ 4 True
결과는 세 가지를 말한다. 첫째, 질량은 모든 예측에서 보존된다. 학습 스냅샷이 모두 같은 질량을 가지므로 평균은 같은 질량을, 모드는 질량 0을 가진다. 따라서 평균 + 모드의 어떤 선형 결합도 질량을 보존한다. 선형 축소 모델은 모든 학습 스냅샷이 만족하는 선형 제약을 구조적으로 물려받는다(연습문제 pod-basis). 이 검사는 그래서 외삽을 감지하지 못한다. 둘째, 의 예측은 최대·최소 원리와 총변동 조건을 모두 어긴다. 학습 범위보다 가파른 충격파를 다항식 계수로 흉내 내다 진동이 생긴 것이다. 정답 없이 실패를 잡아냈다. 셋째, 의 예측은 모든 검사를 통과하지만 앞 셀에서 5.5% 틀렸다. 물리 검사는 실패를 찾는 도구이지 정확도의 증명이 아니다. 도 통과했지만 2% 틀렸다.
연구에서의 의미. 구조 선택의 첫 질문은 "가장 단순한 baseline이 얼마나 하는가"다. 이 예처럼 파라미터 하나에 대해 매끄럽게 변하는 문제라면 POD + 다항식이 내삽에서 이미 고충실도 solver의 이산화 오차보다 작은 오차를 낸다. 신경망 대리모델은 이 baseline을 같은 데이터·같은 평가 조건에서 이겨야 의미가 있다. 그리고 baseline의 오차 분해(기저 대 회귀)는 신경망이 어느 쪽을 개선해야 하는지 알려 준다.
다중 충실도
왜 필요한가. 고충실도 시뮬레이션은 비싸서 적게 돌릴 수밖에 없고, 저충실도 시뮬레이션(거친 격자, 단순한 물리 모델, 느슨한 tolerance)은 싸지만 체계적으로 틀린다. 둘을 결합하면 같은 예산으로 더 정확한 대리모델을 얻을 수 있다.
정의. 가장 널리 쓰이는 형태는 고충실도 출력을 저충실도 출력의 함수와 보정항의 합으로 두는 것이다.
은 많은 저충실도 실행으로 정확히 학습하고, 상대적으로 매끄럽고 작은 보정 는 적은 고충실도 실행으로 학습한다. 과 를 독립인 GP로 두는 방법이 Kennedy와 O'Hagan(2000)의 자기회귀 모델이다. 신경망에서는 저충실도 해를 입력 채널로 함께 넣거나, 저해상도 데이터로 사전 학습한 뒤 고해상도 데이터로 미세 조정하는 방식이 쓰인다.
직관. 26.1장의 실습 표에서 Re = 400의 해는 소산율을 44% 과대 추정했다. 이 오차는 크지만 체계적이어서, 파라미터에 따라 매끄럽게 변한다면 소수의 고해상도 실행으로 보정할 수 있다. 반대로 저충실도 모델이 어떤 영역에서 물리적으로 다른 행동을 보이면(예: 거친 격자에서 비물리적 진동이 생기는 영역) 보정 가 매끄럽지 않아 이 전략이 실패한다. 다중 충실도는 두 모델이 상관되어 있을 때만 이득이 있다.
속도 이득의 측정
왜 필요한가. 대리모델 논문은 흔히 "solver보다 배 빠르다"를 보고한다. 그런데 그 숫자는 비교 조건에 따라 몇 자릿수씩 바뀐다. 공정하지 않은 비교로 얻은 속도 이득은 대리모델이 필요한지 판단하는 데 쓸 수 없다.
공정한 비교의 조건.
- 같은 정확도에서 비교한다. 대리모델 오차가 1%라면, solver도 1% 오차를 내는 가장 싼 설정(더 거친 격자, 더 느슨한 tolerance, 더 낮은 차수)과 비교해야 한다. 고충실도 설정의 solver와 비교하면 solver가 쓸데없이 정확한 답을 내는 비용까지 대리모델의 이득으로 계산된다.
- 같은 하드웨어와 같은 최적화 수준. GPU 위의 대리모델과 CPU 한 코어의 solver를 비교하면 하드웨어 차이가 이득에 섞인다.
- 학습 비용을 포함한다. 학습 데이터 생성(시뮬레이션 회)과 학습 시간을 더한 총비용이 solver를 직접 돌리는 비용보다 작아지려면 질의가 몇 번 필요한지(손익분기점)를 보고한다.
- 배치 효과를 분리한다. 대리모델은 수천 개 질의를 한 번에 처리할 때 빠르다. 질의가 하나씩 순차적으로 오는 응용(제어, 대화형 설계)이라면 단일 질의 지연을 보고한다.
시간은 기계와 구현에 따라 달라지므로 여기서는 연산량 대리 지표(step 수)로 비교한다. 같은 에서 solver 격자를 줄였을 때의 정확도와 비교한다. 거친 격자의 결과는 기준 해를 같은 셀 크기로 평균한 값과 비교한다.
u_ref = solve(0.07)[0] # (128,) 기준 해
for N in [32, 64, 128]:
u, n = solve(0.07, N=N)
u_up = np.repeat(u, 128 // N) # (128,) 셀 평균을 기준 격자로
ref_avg = np.repeat(u_ref.reshape(N, -1).mean(1), 128 // N)
print(f"solver N={N:3d} step {n:4d} 비용 N×step {N * n:7d} 기준 대비 오차 {rel(u_up, ref_avg):6.2%}")
print(f"대리모델 추론 비용 약 r×N = {r * 128} 기준 대비 오차 {rel(surrogate(0.07), u_ref):6.2%} (학습 데이터 생성: solver 16회)")solver N= 32 step 29 비용 N×step 928 기준 대비 오차 12.61% solver N= 64 step 58 비용 N×step 3712 기준 대비 오차 4.81% solver N=128 step 218 비용 N×step 27904 기준 대비 오차 0.00% 대리모델 추론 비용 약 r×N = 512 기준 대비 오차 0.03% (학습 데이터 생성: solver 16회)
이 문제에서는 거친 격자의 solver가 수치 확산 때문에 크게 부정확하다(에서 4.8%). 그래서 내삽 조건의 대리모델(0.03%)은 같은 정확도의 solver보다 실제로 훨씬 싸다. 그러나 대리모델을 만드는 데 고충실도 solver를 16번 돌렸으므로, 대리모델은 질의가 16번을 훨씬 넘을 때만 이득이다. 그리고 그 이득은 학습 범위 안에서만 성립한다. 범위 밖에서는 정확도가 무너지므로 "같은 정확도"라는 비교 조건 자체가 깨진다.
실습
POD 대리모델과 신경망 대리모델을 같은 데이터셋에서 비교하고, 정확도·추론 비용·학습 비용을 함께 보고한다. 코드는 labs/physics-and-engineering/surrogate-modeling/surrogate_compare.py다. 본문의 Burgers 데이터셋(학습 16개)으로 세 모델을 만든다. (1) POD + 3차 다항식, (2) POD + GP 회귀, (3) 를 입력으로 128개 격자값을 직접 출력하는 작은 MLP(scikit-learn). 내삽 시험 8개와 외삽 시험 4개에서 상대 오차와 물리 검사(최대·최소 원리, 총변동)를 표로 만든다. 집필 시점의 실행 결과는 다음과 같다.
데이터 생성: solver 16회 0.25 s, solver 1회 평균 19.4 ms 모델 학습 s 추론 ms 내삽 평균 내삽 최대 외삽 nu=0.02 / 0.03 / 0.3 / 0.4 물리 검사 위반(외삽) POD + 다항식 0.00 0.022 0.03% 0.05% 6.58% / 1.98% / 1.81% / 5.53% 0.02 POD + GP 0.03 0.086 0.01% 0.01% 14.78% / 6.15% / 7.86% / 27.55% 없음 MLP (직접) 0.21 0.081 0.99% 1.49% 6.74% / 4.43% / 6.97% / 12.75% 0.02, 0.03, 0.4 GP 예측 표준편차(모드 1 계수): nu=0.1: 0.004, nu=0.03: 1.668, nu=0.4: 2.376
결과를 읽는 법은 다음과 같다.
- 내삽에서는 POD 기반 모델이 MLP보다 수십 배 정확하다. 표본 16개로 128개 출력을 직접 맞추는 MLP는 데이터에 비해 자유도가 너무 많다. POD는 출력의 구조(소수의 모드)를 먼저 찾아 회귀 문제를 4차원으로 줄였다. 구조는 데이터의 양에 맞아야 한다.
- 외삽의 순위는 내삽의 순위와 다르다. 내삽에서 가장 정확한 POD + GP가 외삽에서는 가장 나쁘다(최대 27.55%). RBF 커널 GP는 데이터에서 멀어지면 사전 평균 쪽으로 돌아가므로, 외삽 예측이 학습 해들의 평균 모양에 가까워진다. 내삽 시험만으로 모델을 고르면 이 사실을 알 수 없다.
- GP는 자기가 외삽하고 있다는 것을 알린다. 모드 1 계수의 예측 표준편차가 에서 0.004인데 , 에서 1.7, 2.4로 수백 배 커졌다. 반면 GP의 외삽 실패는 물리 검사로는 하나도 잡히지 않았다. 평균 쪽으로 돌아간 예측은 매끄러워서 최대·최소 원리와 총변동 조건을 모두 만족하기 때문이다. MLP의 외삽 실패는 반대로 물리 검사가 세 개를 잡았다. 불확실성 추정과 물리 검사는 서로 다른 실패를 잡는다. 둘 다 쓴다.
- 추론 비용은 모두 solver 1회보다 두 자릿수 이상 작다. 다만 이 시간은 이 기계에서 한 번 잰 값이고, solver를 더 거친 설정으로 돌리는 비교와 데이터 생성 비용은 본문 셀 4처럼 따로 따져야 한다.
스크립트를 고쳐 다음을 확인한다. (1) 학습 표본을 8개, 32개로 바꾸면 세 모델의 내삽·외삽 오차가 어떻게 바뀌는가. (2) 학습 범위를 로 넓히면 외삽 실패가 사라지는가, 그리고 내삽 정확도는 어떻게 되는가. (3) GP의 예측 표준편차로 "이 질의는 solver로 넘긴다"는 규칙을 만들고, 그 규칙이 외삽 시험 4개 중 몇 개를 걸러 내는지 센다.
이어서 POD 기저를 에너지 기준으로 고르는 연습문제를 푼다.
실패 사례
- solver의 정확도 설정을 낮춘 비교 없이 속도 이득을 주장하는 것. 대리모델 오차가 1%인데 solver를 0.01% 정확도 설정으로 돌려 비교하면 속도 이득이 몇 자릿수 부풀려진다. 같은 정확도의 가장 싼 solver 설정과 비교하고, 데이터 생성·학습 비용과 손익분기점을 함께 보고한다.
- 내삽 시험만으로 대리모델을 평가하는 것. 무작위로 나눈 시험 데이터는 대부분 학습 표본 사이에 있다. 설계 최적화나 새 운전 조건처럼 실제 용도가 외삽을 포함한다면, 파라미터 범위 밖의 시험 집합을 따로 만든다(26.5장).
- 물리 검사 통과를 정확도의 증거로 쓰는 것. 보존량·최대 원리·총변동 검사는 위반을 찾을 때 강력하지만, 통과했다고 정확한 것은 아니다. 본문의 예측은 모든 검사를 통과하면서 5.5% 틀렸다.
- 모드 수를 늘려 외삽 오차를 고치려는 것. 외삽 오차가 계수 회귀에서 오면 모드를 늘려도 줄지 않는다. 오차를 기저 오차와 회귀 오차로 나누어 본 뒤 대책을 정한다.
통과 기준
- 대리모델의 정확도–속도 trade-off를 solver와 같은 조건(같은 정확도, 같은 하드웨어, 학습 비용 포함)에서 보고하고, 손익분기 질의 수를 계산한다.
- 내삽 시험과 외삽 시험을 나누어 오차를 보고하고, 외삽 오차를 기저 오차와 회귀 오차로 분해한다.
- 정답 없이 계산할 수 있는 물리 검사 두 가지 이상을 대리모델 예측에 적용하고, 검사가 잡은 실패와 놓친 실패를 함께 적는다.
- 연습문제
pod-basis의 테스트를 통과한다.
참고 문헌
- Berkooz, G., Holmes, P., Lumley, J. L. (1993). The proper orthogonal decomposition in the analysis of turbulent flows. Annual Review of Fluid Mechanics, 25, 539–575. doi:10.1146/annurev.fl.25.010193.002543 — 유동 해석에서의 POD
- Benner, P., Gugercin, S., Willcox, K. (2015). A survey of projection-based model reduction methods for parametric dynamical systems. SIAM Review, 57(4), 483–531. doi:10.1137/130932715 — 파라미터 축소 모델의 개관
- Kennedy, M. C., O'Hagan, A. (2000). Predicting the output from a complex computer code when fast approximations are available. Biometrika, 87(1), 1–13. doi:10.1093/biomet/87.1.1 — GP 기반 다중 충실도 모델
- Pfaff, T., Fortunato, M., Sanchez-Gonzalez, A., Battaglia, P. W. (2021). Learning mesh-based simulation with graph networks. ICLR 2021. arXiv:2010.03409 — 비구조 메시 위의 그래프 신경망 시뮬레이터
- Rasmussen, C. E., Williams, C. K. I. (2006). Gaussian Processes for Machine Learning. MIT Press. — 적은 데이터의 회귀와 불확실성