소프트웨어 수치해석 최적설계 마지막 수정: 2026-09-14 04:31:08

1. 개요[편집]

PEST
Parameter ESTimation
개발존 도허티(John Doherty), Watermark Numerical Computing
성격모델 독립적 매개변수 추정·불확실성 정량화 도구
알고리즘가우스-마쿼트-레벤버그(GML)
인터페이스템플릿(.tpl) · 지시(.ins) · 제어(.pst) 파일
자코비안유한차분 — 모델을 매개변수 수만큼 다시 돌린다
정칙화티코노프 · 파일럿 포인트 · SVD-Assist · LSQR
후예PEST++ (PESTPP-GLM · IES · SEN · OPT · DA) · pyEMU
주 전장지하수 모델링 — 다만 원리는 분야 무관

모델이 관측과 안 맞는다. 매개변수를 손으로 바꿔 가며 다시 돌린다. 이 짓을 3주째 하고 있다면, 그 3주가 바로 PEST가 태어난 이유다.

PEST모델의 내부를 전혀 모른 채 입력 파일을 고쳐 쓰고 출력 파일을 읽는 것만으로 매개변수를 추정하는, 모델 독립적(model-independent) 비선형 최소자승 최적화·불확실성 분석 도구다. 1990년대 초 존 도허티가 만들었고, MODFLOW 생태계에서는 “보정한다”는 말이 사실상 “PEST를 돌린다”와 동의어가 됐다.

이름이 지하수에 묶여 있지만 PEST 자체는 지하수를 전혀 모른다. 아는 것은 텍스트 파일 읽기·쓰기와 실행 파일 호출뿐이다. 그래서 하천 수질 모델, 지표수-지하수 결합 모델, 심지어 스프레드시트를 호출하는 배치 파일까지 같은 절차로 보정된다. 이 “아무것도 모른다”는 설계가 강점이자 동시에 이 도구의 모든 비용 구조를 결정한다 — 모델 내부를 모르니 미분도 못 구하고, 미분을 못 구하니 유한차분으로 때려야 하고, 그래서 모델을 수백 번 다시 돌려야 한다.

2. 모델 독립성 — 세 개의 파일[편집]

PEST가 모델과 대화하는 방법은 놀랄 만큼 원시적이다.

  • 템플릿 파일(.tpl) — 모델 입력 파일의 사본에서 매개변수 자리를 $k_layer1$ 같은 표시로 바꿔 둔 것. PEST가 그 자리에 현재 값을 찍어 실제 입력 파일을 생성한다.
  • 지시 파일(.ins) — 모델 출력 파일에서 관측에 대응하는 숫자를 어떻게 찾을지 적은 것. “3줄 내려가서 두 번째 공백 구분 항목을 읽어라” 식의 커서 이동 명령어다.
  • 제어 파일(.pst) — 매개변수(초기값·상하한·변환·미분 증분), 관측(값·가중치·그룹), 알고리즘 설정, 모델 실행 명령. PEST 실행의 전부가 여기 들어 있다.

한 번의 모델 평가는 템플릿으로 입력 쓰기 → 모델 실행 → 지시로 출력 읽기의 3단계다. 이 루프가 이 문서에 나오는 모든 비용의 단위다.

3. 가우스-마쿼트-레벤버그[편집]

목적함수는 가중 제곱합이다. 관측 d\mathbf{d}, 모사 f(p)\mathbf{f}(\mathbf{p}), 가중치 대각행렬 Q\mathbf{Q} 에 대해

Φ(p)=[df(p)]TQ[df(p)]\Phi(\mathbf{p})=\left[\mathbf{d}-\mathbf{f}(\mathbf{p})\right]^{T}\mathbf{Q}\left[\mathbf{d}-\mathbf{f}(\mathbf{p})\right]

f\mathbf{f} 를 현재 점에서 선형화하면 가우스-뉴턴법의 정규방정식이 나오고, 여기에 마쿼트 감쇠를 더한 것이 PEST의 갱신식이다.

(JTQJ+λD)Δp=JTQ[df(p)]\left(\mathbf{J}^{T}\mathbf{Q}\mathbf{J}+\lambda\,\mathbf{D}\right)\Delta\mathbf{p} =\mathbf{J}^{T}\mathbf{Q}\left[\mathbf{d}-\mathbf{f}(\mathbf{p})\right]

J=f/p\mathbf{J}=\partial\mathbf{f}/\partial\mathbf{p} 가 자코비안(PEST 용어로 민감도 행렬)이고, D\mathbf{D} 는 마쿼트가 제안한 형태대로 JTQJ\mathbf{J}^T\mathbf{Q}\mathbf{J}대각성분을 쓴다. 단위행렬이 아니라 대각성분을 쓰는 이유는 매개변수마다 스케일이 천차만별이기 때문 — 자세한 것은 레벤버그-마쿼트 방법 문서에 있다.

λ\lambda 의 역할은 익숙하다. 크면 최급강하(안전하지만 느리고), 작으면 가우스-뉴턴(빠르지만 위험하다). PEST가 조금 독특한 것은 매 반복마다 여러 개의 λ\lambda 를 실제로 시험해 본다는 점이다. 자코비안을 한 번 만든 뒤 λ\lambda 를 바꿔 가며 갱신 벡터를 여러 개 만들고, 각각에 대해 모델을 돌려 Φ\Phi 가 가장 작아지는 것을 채택한다. 자코비안 계산에 비해 λ\lambda 시험은 몇 번의 실행으로 끝나므로 값싼 보험이다.

여기에 매개변수 변환이 결정적으로 중요하다. 수리전도도처럼 대여섯 자릿수를 오가는 양은 반드시 로그 변환해서 추정한다. 그러지 않으면 JTQJ\mathbf{J}^T\mathbf{Q}\mathbf{J}조건수가 천정부지로 뛰고, 갱신 한 번에 KK 가 음수로 내려가는 사고가 난다.

4. 자코비안이 곧 비용[편집]

PEST의 모든 실무적 성질이 이 한 줄에서 나온다. 모델이 미분을 제공하지 않으므로 J\mathbf{J} 의 각 열을 유한차분으로 채운다.

fipjfi(p+hjej)fi(p)hj\frac{\partial f_i}{\partial p_j}\approx\frac{f_i(\mathbf{p}+h_j\mathbf{e}_j)-f_i(\mathbf{p})}{h_j}

반복 한 번당 모델 실행 = 매개변수 개수(전진차분) 또는 그 2~3배(중앙차분·고차 공식). 매개변수 500개짜리 지하수 모형에 실행시간 10분짜리 MODFLOW가 붙으면 반복 한 번에 83시간이다. 여기서 세 가지가 따라 나온다.

첫째, 병렬화가 선택이 아니다. 자코비안의 각 열은 서로 완전히 독립이므로 당황스러울 만큼 병렬적(embarrassingly parallel)이다. Parallel PEST와 BEOPEST(TCP/IP 기반)가 이 일만 하고, PEST++는 PANTHER라는 실행 관리자를 쓴다. 클러스터 코어 수만큼 반복 시간이 줄어드는, 보기 드물게 정직한 스케일링.

둘째, 미분 증분 설정이 결과를 좌우한다. 너무 작으면 모델 출력의 잡음에 묻히고, 너무 크면 비선형성이 섞여 들어온다. 그리고 이 분야 최악의 함정 — 모델이 출력을 유효숫자 몇 자리로만 찍으면 미분이 통째로 0이나 계단 함수가 된다. 수두를 소수 셋째 자리까지 출력하는 모델에 증분을 1% 걸었더니 수두 변화가 반올림에 먹혀 사라지고, PEST가 “이 매개변수는 민감도가 0”이라고 판단해 고정시켜 버리는 사고는 지금도 정기적으로 재현된다. 처방은 하나 — 출력 자릿수를 늘려라. 알고리즘을 손보기 전에 이걸 먼저 확인한다.1

셋째, 이 비용 구조가 수반법이 존재하는 이유와 정확히 대비된다. 수반법은 모델 내부에 손을 넣어 전치 연산자를 푸는 대신 매개변수 개수와 무관한 비용으로 기울기를 얻는다. 완전파형역산이 미지수 1억 개를 다룰 수 있는 것이 그 덕이다. PEST는 정반대의 거래를 했다 — 모델을 건드리지 않는 대가로 매개변수 수에 비례하는 비용을 지불한다. 어느 쪽이 옳은가는 코드에 손댈 수 있는가로 결정되고, 인허가 문서에 제출된 퍼블릭 도메인 실행 파일을 고칠 수 없는 지하수 실무에서는 PEST 쪽이 유일한 선택지였다.

5. 과적합과 영공간[편집]

PEST의 역사에서 가장 중요한 전환은 알고리즘이 아니라 철학이었다. 1990년대의 관행은 “매개변수를 적게 잡아라”였다. 대수층을 몇 개 구역으로 나누고 구역마다 KK 하나를 준다. 미지수가 적으니 역문제가 잘 풀리고 자코비안도 싸다.

문제는 그 구역 경계가 자료가 아니라 모델러의 손끝에서 나왔다는 것이다. 진짜 비균질성은 구역 안에도 있는데, 그것을 표현할 자유도가 없으니 모델은 그 오차를 남은 매개변수를 비틀어 흡수한다. 그 결과가 관측에는 기막히게 맞으면서 예측은 엉뚱한 모델이다. 도허티가 반복해서 말한 문장이 이것이다 — 가장 잘 맞는 모델이 가장 잘 예측하는 모델은 아니다.

정반대의 극단도 실패한다. 격자점마다 KK 를 주면 미지수가 수십만 개이고, 관측은 수백 개다. 이 역문제는 대놓고 불량조건이며, 매개변수 공간이 두 개로 갈라진다.

  • 해공간(solution space) — 관측이 실제로 제약하는 매개변수 조합. 자코비안의 큰 특이값에 대응하는 방향이다.
  • 영공간(null space) — 아무리 흔들어도 모사 출력이 거의 안 변하는 조합. 자코비안의 작은 특이값(또는 0)에 대응한다.

정칙화 없이 풀면 최적화기는 영공간 방향으로 매개변수를 마음대로 밀어붙여 관측 잡음까지 완벽히 재현한다. 이것이 과적합이고, 이때 KK 장에는 물리적으로 말이 안 되는 극단값 얼룩이 생긴다. 티호노프 정규화특이값 분해 문서의 논의가 여기에 그대로 적용된다.

핵심은 영공간이 사라지지 않는다는 것이다. 정칙화는 영공간 성분을 “자료가 정하지 못하니 사전정보로 채우겠다”는 선언일 뿐이고, 그 선택은 예측에 그대로 전이된다. 그래서 예측이 영공간에 얼마나 의존하는가가 그 예측을 얼마나 믿을 수 있는가와 같은 질문이 된다.

6. 정칙화 세 갈래[편집]

티코노프 정칙화. PEST의 정칙화 모드는 목적함수를 두 개로 쪼갠다 — 관측 목적함수 Φm\Phi_m 과 정칙화 목적함수 Φr\Phi_r. 그리고 다음 제약 최적화를 푼다.

min Φrs.t.ΦmΦmlim\min\ \Phi_r\quad\text{s.t.}\quad\Phi_m\le\Phi_m^{\text{lim}}

가중치 μ\mu 를 반복마다 자동 조절해 이 제약을 맞춘다. 여기서 Φmlim\Phi_m^{\text{lim}}(PEST 입력의 PHIMLIM)를 어떻게 잡느냐가 이 모드의 전부다. 이 값은 “관측 잡음 수준까지만 맞추고 그 이하로는 내려가지 마라”는 선언이므로, 원리적으로 잡음 분산의 총합 근처여야 한다. 0에 가깝게 잡으면 정칙화를 켜 놓고도 과적합이 되돌아온다. 정칙화의 형태는 선호값(사전 추정치에서 멀어지지 마라)이거나 선호차분(이웃한 매개변수끼리 비슷하게 — 즉 매끄럽게)이며, 후자가 공간 분포 물성에 흔히 쓰인다.

파일럿 포인트. 격자점마다 매개변수를 주는 대신, 도메인에 흩어 놓은 수십~수백 개의 점에만 값을 주고 그 사이는 크리깅으로 보간해 격자를 채운다. 자유도를 구역 분할보다 훨씬 많이 주면서도 매개변수 수를 관리 가능한 범위에 묶는 타협이다. 점을 너무 적게 깔면 구역 분할과 같은 병(구조적 오차)에 걸리고, 너무 많이 깔면 정칙화 없이는 못 푼다 — 파일럿 포인트는 정칙화와 짝으로만 의미가 있다.

SVD-Assist. 비용 문제를 정면으로 공략한다. 기본 매개변수에 대한 자코비안을 한 번 계산하고, Q1/2J\mathbf{Q}^{1/2}\mathbf{J}특이값 분해해 앞쪽 우특이벡터 NN 개만 남긴다. 이 NN 개 방향의 좌표를 초매개변수(super parameter)라 부르고, 이후의 추정은 초매개변수 공간에서 진행한다. 그러면

반복당 실행 수  N  Npar\text{반복당 실행 수}\ \approx\ N\ \ll\ N_{\text{par}}

가 되고, 동시에 작은 특이값(= 영공간)이 처음부터 제외되므로 절단 SVD 정칙화가 공짜로 딸려 온다. 매개변수 3000개를 초매개변수 40개로 줄이면 반복 비용이 75분의 1이 된다. 지금의 고도매개변수 보정 워크플로는 사실상 “파일럿 포인트 + 티코노프 + SVD-Assist”의 삼종 세트다.

7. 불확실성 — 보정이 끝이 아니다[편집]

최적 매개변수 하나를 뽑는 것으로 끝나면 그것은 절반짜리 작업이다. PEST 계열이 제공하는 접근은 대략 셋이다.

  • 선형(1차2모멘트) 분석. 사후 공분산을 C(JTQJ+Cpp1)1\mathbf{C}\approx(\mathbf{J}^T\mathbf{Q}\mathbf{J}+\mathbf{C}_{pp}^{-1})^{-1} 로 근사하고, 예측 민감도 벡터로 전파한다. 슈어 보수 형태로 “관측 하나를 더 얻으면 예측 분산이 얼마나 줄어드는가”를 계산할 수 있어 모니터링 망 설계에 직접 쓰인다. 값싸지만 모델이 국소적으로 선형이라는 가정이 깔려 있다.
  • 영공간 몬테카를로. 사전 분포에서 매개변수 실현을 뽑은 뒤, 그 실현을 해공간 성분만 보정해 관측에 맞추고 영공간 성분은 그대로 둔다. 이러면 전부 관측에 맞으면서 서로 다른 매개변수 장 수백 개가 생기고, 그 예측의 퍼짐이 곧 불확실성 구간이다. 실현 하나당 전체 보정을 다시 하지 않아도 된다는 것이 요령.
  • 앙상블 기법. PESTPP-IES는 반복형 앙상블 스무더로, 명시적 자코비안을 아예 만들지 않고 앙상블의 경험적 공분산으로 갱신 방향을 근사한다. 실행 수가 매개변수 수가 아니라 앙상블 크기(보통 수백)에 비례하므로, 매개변수가 수만 개여도 비용이 늘지 않는다. 앙상블 칼만 필터의 평활화 버전이며, 지금 고도매개변수 지하수 작업의 주류가 이쪽으로 넘어가고 있다.

8. PEST++ 와 생태계[편집]

PEST++는 원래 PEST를 C++로 재작성하며 갈라져 나온 계열이고, 지금은 각 기능이 독립 실행 파일로 나뉘어 있다.

실행 파일하는 일
PESTPP-GLM고전적 가우스-마쿼트-레벤버그 + 선형 불확실성 분석
PESTPP-IES반복형 앙상블 스무더
PESTPP-SEN전역 민감도(모리스·소볼)
PESTPP-OPT확률 제약 하의 관리 최적화(선형계획)
PESTPP-DA순차 자료동화

여기에 파이썬 패키지 pyEMU가 제어 파일 생성·자코비안 조작·선형 불확실성 분석을 담당하고, FloPy와 짝을 이뤄 “모델 조립부터 보정·불확실성까지 스크립트 하나”라는 지금의 작업 흐름을 만들었다. GUI로 파일럿 포인트를 클릭해 찍던 시대는 재현성 요구 앞에서 조용히 저물었다.

9. 현업에서의 현실[편집]

  • 가중치가 절반이다. 수두 관측 수천 개와 하천 유량 관측 열 개를 같은 가중치로 넣으면 유량은 목적함수에 아예 안 보인다. 관측 그룹별로 기여도가 비슷해지도록 가중치를 맞추는 것이 사실상 필수 전처리이고, 이 조정이 결과에 미치는 영향은 알고리즘 선택보다 크다.
  • PEST가 수렴했다고 모델이 맞는 것은 아니다. Φ\Phi 가 내려갔을 뿐이다. 잔차를 공간·시간에 대해 그려 보면 계통적 편향이 그대로 남아 있는 경우가 흔하고, 그것은 매개변수가 아니라 구조(층 구분, 경계조건, 개념모형)가 틀렸다는 신호다. 매개변수 추정은 구조 오차를 고쳐 주지 않는다.
  • 최적값이 상하한에 붙으면 경고등이다. 그 매개변수는 자료가 제약하지 못했고, 최적화기가 갈 데까지 밀어붙인 것이다. 값 자체를 보고하는 것보다 “상한에 붙었다”는 사실을 보고하는 것이 정직하다.
  • 실행 실패 처리가 의외로 큰 일이다. 매개변수가 극단으로 가면 모델이 수렴 실패로 죽거나 쓰레기를 출력하는데, 그 실행 하나가 자코비안 한 열을 통째로 오염시킨다. MODFLOW의 마른 셀 문제가 여기서 다시 나타난다.
  • 그리고 이 바닥의 오랜 농담. PEST를 돌려 놓고 퇴근하는 것이 이 직업의 유일한 워라밸이다. 물론 아침에 와서 보면 열두 번째 반복에서 람다가 발산해 있다.23

10. 관련 문서[편집]

11. Footnotes[편집]

  1. 이 함정이 특히 잔인한 이유는 아무 에러도 안 나기 때문이다. PEST는 정상적으로 실행되고, 반복도 돌고, 보고서에는 “민감도가 낮아 고정함”이라고 점잖게 적힌다. 며칠 뒤 누군가 “이 매개변수 진짜 민감도가 0인가요?”라고 물어야 비로소 발견된다. 새 모델에 PEST를 붙일 때 제일 먼저 할 일은 매개변수 하나를 손으로 흔들어 출력이 실제로 움직이는지 보는 것이다. 5분이면 된다.

  2. 람다 발산 자체가 알고리즘의 실패는 아니다. 마쿼트 감쇠는 원래 “갱신이 실패하면 람다를 키워 최급강하 쪽으로 후퇴하라”는 규칙이고, 람다가 계속 커진다는 것은 선형화가 통하지 않는 지점에 와 있다는 신호다. 대개 원인은 매개변수가 상하한에 몰려 있거나, 모델 실행 일부가 실패했거나, 미분 증분이 잘못됐거나 셋 중 하나다.

  3. PEST의 약어가 “해충”과 같은 단어라는 것은 물론 우연이다. 다만 이 도구를 처음 붙이는 주에는 그 우연이 상당히 설득력 있게 느껴진다. 템플릿 파일의 표시 문자 폭이 숫자 자릿수보다 좁아서 값이 잘리거나, 지시 파일의 커서가 한 줄 어긋나서 엉뚱한 숫자를 관측으로 읽어 들이거나 하는 일이 첫날에 반드시 한 번은 일어난다.