시뮬레이션 학습의 벤치마크와 평가

먼저 읽을 장 26.2 시뮬레이션 대리모델21.4 분포 이동과 OOD

학습된 시뮬레이터(learned simulator)를 소개하는 논문의 표는 대개 한 줄로 요약된다. "기존 방법보다 오차가 X% 작다." 그런데 그 오차가 한 step 예측의 오차인지 긴 rollout의 오차인지, 학습과 같은 조건인지 새 조건인지, 비교한 solver가 얼마나 공들인 것인지에 따라 같은 숫자가 전혀 다른 뜻이 된다. 유체 관련 PDE의 머신러닝 논문들을 조사한 연구는 많은 논문이 약한 수치 baseline과 비교하고 있으며, 결과 보고에 편향이 널리 퍼져 있다고 보고했다(McGreivy, Hakim, 2024).

이 장은 26.1–26.4장에서 장마다 따로 본 평가 도구를 하나의 평가 틀로 묶는다. 정확도, 장기 rollout의 안정성, 물리적 일관성, 일반화, 비용의 다섯 축이다. 분포 이동의 일반론은 21.4장에서 다뤘다. 여기서는 그것을 시뮬레이션 학습에 맞게 구체화하고, 두 학습 시뮬레이터를 다섯 축으로 평가해 한 축만으로는 어느 쪽이 나은지 말할 수 없다는 것을 직접 보인다.

학습 목표

  • 학습된 시뮬레이터를 정확도·장기 안정성·물리적 일관성·일반화·비용의 여러 축으로 평가한다
  • 데이터 분할, OOD 축, baseline, 비용 측정을 포함한 공정한 비교 조건을 설계한다

정확도 지표

왜 필요한가. 시뮬레이션의 출력은 장(field) 전체이지만, 연구자가 실제로 관심 있는 것은 장에서 계산한 몇 개의 양인 경우가 많다. 장 오차가 작아도 관심 출력량이 틀릴 수 있고, 반대도 가능하다. 무엇을 재느냐가 결론을 바꾼다.

세 종류의 지표.

  • 장 오차: 상대 L2L^2 오차 ∥u^−u∥/∥u∥\lVert\hat{u} - u\rVert / \lVert u\rVert가 가장 흔하다. 해의 크기가 시간에 따라 줄어드는 문제(감쇠 난류)에서는 같은 절대 오차도 상대 오차로는 커지므로, 어떤 정규화를 썼는지 밝힌다.
  • 적분량 오차: 항력·양력 계수, 유량, 열유속, 전체 에너지처럼 장을 적분한 양. 설계 판단에 직접 쓰이는 양이다. 장 오차가 국소적으로 크더라도(충격파 위치가 한 칸 어긋남) 적분량은 맞을 수 있고, 반대로 장 오차가 고르게 작아도 벽면 근처의 작은 오차가 벽면 마찰력을 크게 바꿀 수 있다.
  • 스펙트럼: 에너지가 파수별로 어떻게 분포하는지(연습문제 energy-spectrum). 학습된 모델은 흔히 고파수(작은 규모)를 뭉개거나, 반대로 비물리적 고파수 진동을 만든다. 장의 L2L^2 오차는 에너지가 큰 저파수 오차가 지배하므로 이런 실패를 잘 보여 주지 않는다.

실험 설정. 26.2장의 보존형 Burgers solver를 기준 시뮬레이터로 쓴다. 64칸 주기 격자, 무작위 평균 이동과 파수 1–3의 무작위 초기 장, 점성 ν∈{0.03,0.05,0.1}\nu \in \{0.03, 0.05, 0.1\}에서 시드 12개씩 궤적 36개를 만든다. 모델은 시간 간격 0.02로 다음 상태를 예측하고, 이를 50번 반복하면 t=1t = 1이다. 데이터 분할은 궤적 단위다. 시험 궤적(시드 100–105)은 학습에 쓰인 어떤 궤적과도 초기조건이 다르다.

import numpy as np

N, L, DT, T = 64, 2 * np.pi, 0.02, 50              # 격자, 영역, 모델 시간 간격, rollout 길이(t = 1)
dx = L / N

def ic(seed, amp=1.0):                             # 평균 이동 + 파수 1–3의 무작위 장
    rng, x = np.random.default_rng(seed), np.arange(N) * dx
    return rng.uniform(-0.3, 0.3) + amp * sum(rng.normal() / k * np.sin(k * x + rng.uniform(0, 2 * np.pi)) for k in (1, 2, 3))

def step_ref(u, nu, sub=4):                        # 보존형 유한체적(26.1장), 모델 1 step = solver 4 step
    for _ in range(sub):
        ur = np.roll(u, -1)
        F = 0.25 * (u**2 + ur**2) - 0.5 * np.maximum(abs(u), abs(ur)) * (ur - u) - nu * (ur - u) / dx
        u = u - DT / sub / dx * (F - np.roll(F, 1))
    return u

def traj(seed, nu, amp=1.0):                       # (T+1, N) 궤적
    out = [ic(seed, amp)]
    for _ in range(T):
        out.append(step_ref(out[-1], nu))
    return np.array(out)

train = {(s, nu): traj(s, nu) for s in range(12) for nu in (0.03, 0.05, 0.1)}   # 시드 0–11 학습
X = np.concatenate([t[:-1] for t in train.values()])                         # (1800, 64) 현재 상태
Y = np.concatenate([t[1:] for t in train.values()])                          # (1800, 64) 다음 상태
NU = np.repeat([k[1] for k in train], T)[:, None]                            # (1800, 1)
print("학습 궤적", len(train), "개, 상태 쌍", X.shape, "/ 시험은 시드 100–105의 새 궤적")
학습 궤적 36 개, 상태 쌍 (1800, 64) / 시험은 시드 100–105의 새 궤적

학습된 시뮬레이터 두 개를 같은 데이터로 최소제곱 학습한다. 두 모델 모두 신경망 대신 특징의 선형 결합이라 몇 초 안에 학습되지만, 평가의 논리는 신경망과 똑같다.

  • A 직접 갱신: 5점 스텐실 값의 1·2차 항 20개와 ν×\nu \times(2계 차분) 하나, 모두 21개 특징으로 ujn+1−ujnu_j^{n+1} - u_j^n을 직접 예측한다. 유연하지만 물리 구조가 없다.
  • B 보존형 유속: 셀 경계의 유속을 세 특징(중심 이류 유속, ν\nu에 비례하는 확산, 수치 점성 꼴의 항)의 선형 결합으로 예측하고, 유속의 차로 셀 값을 갱신한다. 26.1장의 유한체적 구조를 그대로 가져온 모델이다.
def feat_A(u, nu):                                 # 5점 스텐실의 1·2차 항 + nu × 2계 차분
    S = np.stack([np.roll(u, k, -1) for k in (2, 1, 0, -1, -2)], -1)
    quad = [S[..., i] * S[..., j] for i in range(5) for j in range(i, 5)]
    lap = np.roll(u, -1, -1) - 2 * u + np.roll(u, 1, -1)
    return np.concatenate([S, np.stack(quad, -1), (nu * lap)[..., None]], -1)   # (..., N, 21)

def flux_B(u, nu):                                 # 면 유속 = 이류 + nu 확산 + 수치 점성 꼴의 세 특징
    ur = np.roll(u, -1, -1)
    return np.stack([(u**2 + u * ur + ur**2) / 6, -nu * (ur - u), -abs(u + ur) * (ur - u)], -1)

w_A = np.linalg.lstsq(feat_A(X, NU).reshape(-1, 21), (Y - X).ravel(), rcond=None)[0]
dF = flux_B(X, NU) - np.roll(flux_B(X, NU), 1, -2)   # (1800, 64, 3) 면 유속의 차 F_{j+1/2} − F_{j−1/2}
w_B = np.linalg.lstsq(dF.reshape(-1, 3), (X - Y).ravel(), rcond=None)[0]

def step_B(u, nu):
    F = flux_B(u, nu) @ w_B                        # (N,) 면 유속: 한 셀이 잃은 양을 이웃이 얻는다
    return u - (F - np.roll(F, 1))

models = {"A 직접 갱신(21)": lambda u, nu: u + feat_A(u, nu) @ w_A, "B 보존형 유속(3)": step_B}
rel = lambda a, b: np.linalg.norm(a - b) / np.linalg.norm(b)
ref = traj(100, 0.07)                              # 학습하지 않은 궤적, 학습 범위 안의 nu
for name, f in models.items():
    e1 = np.mean([rel(f(ref[i], 0.07), ref[i + 1]) for i in range(T)])
    print(f"{name}  한 step 상대 오차 {e1:.4f}")
A 직접 갱신(21)  한 step 상대 오차 0.0022
B 보존형 유속(3)  한 step 상대 오차 0.0052

학습하지 않은 궤적 하나에서 한 step 오차는 A가 B의 절반 이하다. 파라미터가 많은 A가 다음 상태를 더 정확히 맞춘다. 이 숫자 하나로 A를 고르면 다음 절에서 틀린다.

장기 rollout

왜 필요한가. 학습된 시뮬레이터는 한 step으로 학습하지만 수백–수천 step을 반복해 쓴다. 각 step의 작은 오차가 다음 step의 입력을 학습 분포 밖으로 밀어내고, 모델은 본 적 없는 입력에서 더 큰 오차를 낸다. 이 되먹임 때문에 한 step 오차와 rollout 오차의 관계는 단조롭지 않다. 24.4장의 autoregressive rollout 논의를 평가 관점에서 다시 본다.

평가할 것.

  • 오차 누적: 여러 시각에서의 장 오차, 또는 오차가 정해진 문턱을 처음 넘는 시각(유효 예측 시간).
  • 안정성: rollout이 발산하는 비율. 발산한 궤적을 평균에서 조용히 빼면 남은 궤적의 오차가 실제보다 좋아 보인다. 발산 비율을 오차와 따로 보고한다.
  • 통계적 정상 상태: 난류나 기후처럼 혼돈계에서는 긴 시간 뒤 개별 궤적을 맞추는 것이 원리적으로 불가능하다. 이때는 장 오차 대신 시간 평균, 분산, 스펙트럼 같은 통계량이 기준 시뮬레이터와 같은지 본다.

같은 시험 궤적 6개에서 t=1t = 1까지 rollout한다. 발산하지 않은 궤적에서 장 오차, 질량 변화, 고파수(파수 8 이상) 에너지 비율의 모델/기준 비를 함께 잰다.

def hi_k(u):                                       # 파수 8 이상이 담은 에너지 비율
    E = np.abs(np.fft.rfft(u)) ** 2
    return E[8:].sum() / E[1:].sum()

def evaluate(nu, amp=1.0, seeds=range(100, 106)):
    for name, f in models.items():
        e1, eT, mass, hk, blown = [], [], [], [], 0
        for s in seeds:
            ref = traj(s, nu, amp)
            e1.append(np.mean([rel(f(ref[i], nu), ref[i + 1]) for i in range(T)]))
            u = ref[0]
            for _ in range(T):
                u = f(u, nu)
                if not np.all(np.isfinite(u)) or abs(u).max() > 1e3:
                    blown += 1
                    break
            else:
                eT.append(rel(u, ref[-1]))
                mass.append(abs(u.sum() - ref[0].sum()) * dx)
                hk.append(hi_k(u) / hi_k(ref[-1]))
        m = "< 1e-12" if max(mass, default=0) < 1e-12 else f"{max(mass):7.1e}"
        tail = (f"rollout {np.mean(eT):6.3f}  질량 변화 최대 {m}  고파수 에너지 비 {np.mean(hk):5.2f}"
                if eT else "rollout     -")
        print(f"  {name}  한 step {np.mean(e1):.4f}  발산 {blown}/{len(seeds)}  {tail}")

print("학습 범위 안 (nu = 0.07)")
evaluate(0.07)
학습 범위 안 (nu = 0.07)
  A 직접 갱신(21)  한 step 0.0028  발산 2/6  rollout  0.116  질량 변화 최대 2.9e-01  고파수 에너지 비 22.22
  B 보존형 유속(3)  한 step 0.0029  발산 0/6  rollout  0.068  질량 변화 최대 < 1e-12  고파수 에너지 비  0.43

시험 궤적 6개의 평균으로 보면 한 step 오차는 두 모델이 거의 같다(0.0028 대 0.0029). 그러나 rollout은 전혀 다르다. A는 6개 중 2개가 t=1t = 1 전에 발산했고, 남은 4개의 장 오차도 B보다 크다. B는 하나도 발산하지 않았다.

물리적 일관성

왜 필요한가. 학습된 시뮬레이터의 출력이 물리 법칙을 어기면, 그 출력에 기반한 하류 계산(에너지 수지, 설계 판단, 다른 모델과의 결합)이 모두 의심스러워진다. 물리 검사는 정답 없이도 계산할 수 있어서, 기준 시뮬레이터를 돌릴 수 없는 조건에서도 쓸 수 있다(26.2–26.3장).

검사 항목.

  • 보존량: 질량·운동량·에너지 같은 양이 경계 유속과 생성항이 허용하는 만큼만 변하는가.
  • 경계조건 만족: 벽면의 no-slip 조건, 고정 온도, 대칭 조건이 지켜지는가.
  • 양수성·범위: 밀도, 농도, 온도(절대 온도), 난류 운동에너지처럼 음수가 될 수 없는 양이 음수가 되지 않는가. 최대 원리가 성립하는 문제에서 새 극값이 생기지 않는가.
  • 스펙트럼: 에너지가 생겨날 수 없는 고파수에 쌓이지 않는가.

셀 3의 결과로 보면, B는 보존형 구조 덕분에 질량이 반올림 오차 수준(<10−12< 10^{-12})으로 보존된다. A는 0.29만큼 질량이 바뀌었다. 초기 질량이 학습 분포의 평균 이동(최대 ±0.3)으로 정해지는 문제라 이 정도면 큰 변화다. 고파수 에너지 비는 A가 22배로, 기준 시뮬레이터에 없는 작은 규모의 진동을 만들었다. 발산의 전조다. B는 0.43으로 고파수를 기준보다 덜 가진다. 작은 규모를 약간 뭉갠다는 뜻이고, 이것이 B의 약점이다.

일반화

왜 필요한가. 학습된 시뮬레이터를 쓰는 이유는 기준 시뮬레이터를 돌리지 않은 조건에서 답을 얻기 위해서다. 학습 분포 안에서만 평가하면 그 목적을 확인하지 못한다. 21.4장의 분포 이동을 시뮬레이션의 언어로 옮기면, 일반화는 어느 축을 따라 얼마나 벗어났는지로 기술해야 한다.

OOD 축.

  • 물리 파라미터: Re, ν\nu, 열원 세기 등. 무차원수 공간에서 학습 범위를 기술하고 그 밖의 점을 시험한다(26.1장).
  • 초기·경계조건: 진폭, 스펙트럼, 평균 흐름이 다른 초기조건. 새로운 유입 조건.
  • 형상: 학습에 없던 형상, 다른 위상(구멍의 개수)의 형상.
  • 해상도: 다른 격자 간격이나 메시. 해상도 불변을 주장하는 모델은 반드시 다른 해상도에서 평가한다(24.4장).
  • 시간 지평: 학습 rollout보다 긴 시간.

데이터 분할. 같은 궤적의 연속된 상태는 서로 매우 비슷하다. 상태 쌍을 무작위로 나누면 시험 쌍의 바로 앞뒤 상태가 학습 데이터에 들어가므로 시험 오차가 낙관적이 된다. 분할은 최소한 궤적 단위로, 일반화를 주장하려면 OOD 축 단위로 한다(15.4장의 누수 논의와 같다).

세 OOD 조건에서 같은 평가를 반복한다. 학습 범위 아래의 점성(ν=0.015\nu = 0.015, 더 가파른 충격파), 위의 점성(ν=0.3\nu = 0.3), 두 배 진폭의 초기조건이다.

for label, nu, amp in [("nu = 0.015 (학습 범위 아래)", 0.015, 1.0), ("nu = 0.3 (학습 범위 위)", 0.3, 1.0),
                       ("진폭 2배 (nu = 0.07)", 0.07, 2.0)]:
    print(label)
    evaluate(nu, amp)
print(f"파라미터 수: A {w_A.size}, B {w_B.size}.  B의 확산 계수 × nu = {w_B[1] * 0.3:.2f} (nu = 0.3, explicit 안정 한계 0.5)")
nu = 0.015 (학습 범위 아래)
  A 직접 갱신(21)  한 step 0.0042  발산 4/6  rollout 29.798  질량 변화 최대 5.0e+01  고파수 에너지 비 40.58
  B 보존형 유속(3)  한 step 0.0060  발산 0/6  rollout  0.097  질량 변화 최대 < 1e-12  고파수 에너지 비  1.48
nu = 0.3 (학습 범위 위)
  A 직접 갱신(21)  한 step 0.0038  발산 0/6  rollout  0.089  질량 변화 최대 5.0e-02  고파수 에너지 비  3.52
  B 보존형 유속(3)  한 step 0.0084  발산 6/6  rollout     -
진폭 2배 (nu = 0.07)
  A 직접 갱신(21)  한 step 0.0061  발산 4/6  rollout  0.899  질량 변화 최대 1.1e+00  고파수 에너지 비 23.17
  B 보존형 유속(3)  한 step 0.0076  발산 0/6  rollout  0.063  질량 변화 최대 < 1e-12  고파수 에너지 비  0.89
파라미터 수: A 21, B 3.  B의 확산 계수 × nu = 1.01 (nu = 0.3, explicit 안정 한계 0.5)

두 모델의 약점이 다른 축에서 드러난다.

  • A는 점성이 작거나 진폭이 큰, 즉 해가 더 가파른 쪽으로 약하다. 발산 비율이 4/6으로 커지고, 살아남은 궤적의 질량과 고파수 에너지도 크게 틀린다. 학습 데이터에 없던 큰 기울기의 입력에서 2차 항들이 서로 상쇄되지 못하기 때문이다. 반면 점성이 큰 쪽(ν=0.3\nu = 0.3)에서는 해가 매끄러워져 안정하다.
  • B는 점성이 큰 쪽에서 모두 발산한다. B가 학습한 확산 계수에 ν=0.3\nu = 0.3을 곱하면 1.01로, 9.7장에서 본 explicit 확산의 안정 한계 0.5를 넘는다. 학습 범위(ν≤0.1\nu \le 0.1)에서는 이 값이 0.34로 한계 안에 있었다. 해가 더 가파른 쪽에서는 보존형 구조 덕분에 견고하다.
  • 한 step 오차는 일반화 성능을 예측하지 못한다. ν=0.3\nu = 0.3에서 B의 한 step 오차(0.0084)는 1% 미만인데 rollout은 모두 발산했다.

비용

왜 필요한가. 학습된 시뮬레이터의 존재 이유는 대개 속도다. 그 이득은 26.2장의 원칙대로 같은 정확도, 같은 하드웨어, 학습 비용 포함의 조건에서 재야 한다. 벤치마크에서는 여기에 하나를 더한다. 강한 수치 baseline이다.

강한 baseline. 학습된 시뮬레이터를 고해상도 solver와만 비교하면, 같은 계산 예산을 쓰는 더 거친 solver나 더 좋은 수치 기법이 학습 모델만큼 좋을 가능성을 놓친다. 비교 대상에는 최소한 (1) 같은 계산 시간이 드는 가장 좋은 수치 solver 설정, (2) 고차 기법이나 적응 격자처럼 그 분야의 표준 가속 기법을 포함한다. 위의 McGreivy와 Hakim(2024)의 조사가 지적한 핵심이 이 부분이다.

보고할 비용. 학습 데이터 생성(시뮬레이션 횟수 × 1회 비용), 학습 시간과 하드웨어, 추론 시간(배치 크기와 함께), 그리고 위의 손익분기 질의 수. 셀 4의 마지막 줄처럼 모델 크기(파라미터 수)도 함께 적는다. 이 예에서 B는 파라미터 3개로 21개인 A보다 거의 모든 축에서 나았다. 크기가 성능을 말해 주지 않는다는 또 하나의 예다.

공개 벤치마크. 여러 PDE의 시뮬레이션 데이터셋과 baseline 모델(FNO, U-Net, PINN 등)의 결과, 장 오차 이외의 지표를 함께 제공하는 공개 벤치마크가 있다(예: PDEBench, Takamoto 외, 2022; 집필 시점 예시). 공개 벤치마크는 같은 데이터·같은 분할로 비교할 수 있게 해 주지만, 거기에 포함된 지표와 OOD 축이 자신의 연구 질문에 맞는지는 따로 판단해야 한다. 벤치마크가 한 step 또는 짧은 rollout의 장 오차만 순위로 매긴다면, 이 장의 나머지 축은 직접 추가한다. 데이터셋의 버전, 분할, 지표 정의는 계속 바뀌므로 사용할 때 해당 저장소의 문서에서 확인한다.

실습

학습된 시뮬레이터를 정확도·장기 안정성·보존량·일반화·비용의 다섯 축으로 평가한 표를 만든다. 코드는 labs/physics-and-engineering/physics-benchmarks/benchmark_table.py다. 본문의 두 학습 시뮬레이터(A, B)에 수치 baseline 하나를 더한다. 기준 solver를 절반 해상도(N=32N = 32)에서 돌리고 결과를 64칸으로 늘린 것이다. 시험 궤적을 10개로 늘리고, t=4t = 4까지의 장기 안정성, 운동에너지(적분량) 오차, 최대 원리(초기 범위를 넘는 값) 검사, 해상도 N=128N = 128에서의 일반화, 한 step 계산 시간을 더했다. 집필 시점의 실행 결과는 다음과 같다(시간은 기계마다 다르다).

[1·2·3] 학습 범위 안 nu = 0.07, 시험 궤적 10개
모델               한 step    장 오차 t=1     에너지 오차   발산 t=1   발산 t=4     질량 변화    범위 초과     파라미터    시간/step
A 직접 갱신          0.0031       0.132      0.068     4/10     9/10   2.9e-01     2/6       21    65.7 µs
B 보존형 유속         0.0035       0.071      0.063     0/10     0/10   < 1e-12     0/10        3    22.8 µs
solver N=32      0.0847       0.114      0.069     0/10     0/10   < 1e-12     0/10        0    45.1 µs
참고: 기준 solver(N = 64, 하위 step 4회) 한 step 78.4 µs
[4] 일반화: 발산 비율, (발산하지 않은 궤적의) t = 1 장 오차
모델                     nu = 0.015           nu = 0.3              진폭 2배          해상도 N=128
A 직접 갱신            8/10    29.798     0/10     0.111     8/10     0.899     0/10     0.547
B 보존형 유속           0/10     0.109    10/10         -     0/10     0.062     0/10     0.475
solver N=32        0/10     0.142     0/10     0.068     0/10     0.136     0/10     0.155

결과를 읽는 법은 다음과 같다.

  • 한 step 오차로 고르면 최악을 고른다. 수치 baseline의 한 step 오차(0.085)는 학습 모델들보다 20배 이상 크다. 32칸 결과를 64칸으로 늘리면서 생기는 표현 오차 때문이다. 그런데 t=1t = 1의 장 오차는 A보다 작고, 어떤 조건에서도 발산하지 않는다. 한 step 오차는 이 baseline을 가장 나쁜 모델로, A를 가장 좋은 모델로 줄 세운다. 둘 다 틀린 순위다.
  • 학습 범위 안에서는 B가 가장 좋다. 장 오차 0.071로 가장 작고, 질량 보존과 최대 원리 검사를 통과하며, 한 step이 가장 싸다.
  • 각 방법의 약점이 다른 축에 있다. A는 해가 가파른 쪽(작은 ν\nu, 큰 진폭)에서 발산하고 t=4t = 4까지는 10개 중 9개가 발산한다. B는 큰 ν\nu에서 모두 발산하고, 다른 해상도(N=128N = 128)에서는 학습한 계수가 격자 간격에 묶여 있어 오차가 0.475로 커진다. 수치 baseline은 정확도는 중간이지만 모든 OOD 조건에서 오차가 0.07–0.16으로 안정적이다. 어느 하나가 모든 축에서 이기지 않는다. 그래서 평가표 전체를 보고하고, 응용이 요구하는 축에 따라 고른다.

스크립트를 고쳐 다음을 확인한다. (1) 상태 쌍을 무작위로 나누어 시험 집합을 만들면(궤적 단위 분할 대신) 한 step 오차가 얼마나 낙관적이 되는가. (2) B의 확산 특징 계수를 [0,0.5/νmax][0, 0.5/\nu_\text{max}] 범위로 제한해 학습하면(제약 최소제곱) ν=0.3\nu = 0.3의 발산이 사라지는가, 그 대가는 무엇인가. (3) 유효 예측 시간(장 오차가 0.1을 처음 넘는 시각)을 지표로 추가한다.

이어서 스펙트럼 지표를 직접 구현하는 연습문제를 푼다.

실패 사례

  • 한 step 오차만으로 시뮬레이터를 평가하는 것. 본문에서 한 step 오차가 비슷하거나 더 좋은 모델이 rollout에서 발산했고, 한 step 오차가 20배 큰 수치 baseline이 rollout에서는 더 정확했다. rollout 오차, 발산 비율, 물리 검사를 함께 보고한다.
  • 발산한 궤적을 평균에서 조용히 빼는 것. 살아남은 궤적만의 오차는 실제보다 좋아 보인다. 발산 비율을 별도 열로 보고하고, 평균에 어떤 궤적이 포함되었는지 밝힌다.
  • 상태 쌍을 무작위로 나누는 것. 같은 궤적의 인접 상태가 학습과 시험에 나뉘어 들어가 시험 오차가 낙관적이 된다. 궤적 단위, 나아가 OOD 축 단위로 나눈다.
  • 약한 baseline과 비교하는 것. 같은 계산 예산의 가장 좋은 수치 설정과 비교하지 않으면 속도·정확도 이득이 부풀려진다.
  • 학습 해상도에서만 평가하고 해상도 일반화를 주장하는 것. 학습된 계수가 격자 간격에 묶인 모델은 다른 해상도에서 크게 틀린다.

통과 기준

  • 다섯 축(정확도·장기 안정성·물리적 일관성·일반화·비용) 평가표로 두 방법 이상을 비교하고, 각 방법의 약점을 한 문장씩 말한다.
  • 데이터 분할 단위와 OOD 축(파라미터·초기조건·해상도·시간 지평 중 둘 이상)을 명시하고, 발산 비율을 오차와 따로 보고한다.
  • 강한 수치 baseline(같은 계산 예산의 solver 설정) 하나 이상을 비교에 포함한다.
  • 연습문제 energy-spectrum의 테스트를 통과한다.

참고 문헌

  • McGreivy, N., Hakim, A. (2024). Weak baselines and reporting biases lead to overoptimism in machine learning for fluid-related partial differential equations. Nature Machine Intelligence, 6(10), 1256–1269. arXiv:2407.07218 — 유체 PDE 머신러닝 연구의 약한 baseline과 보고 편향
  • Takamoto, M., Praditia, T., Leiteritz, R., MacKinlay, D., Alesiani, F., Pflüger, D., Niepert, M. (2022). PDEBench: An extensive benchmark for scientific machine learning. NeurIPS 2022 Datasets and Benchmarks Track. arXiv:2210.07182 — 여러 PDE의 시뮬레이션 데이터셋과 baseline, 장 오차 이외의 평가 지표