2026-07-02 기준레벨 4

솔버 교차검증

솔버 교차검증은 수치 시뮬레이터를 방법과 코드베이스가 모두 다른 독립 구현들과 대조하는 것입니다 — 구현 오류는 자기 일관적이어서 단일 코드베이스 내부에서는 보이지 않기 때문입니다.

무슨 뜻인가요

시뮬레이터는 항상 자기 자신과는 일치합니다.뒤집힌 부호, 인자 2, 정규화 실수, 기저 순서 착오는 수학적으로 유효한 — 다만 다른 물리의 — 발전을 만들어내므로, 같은 코드베이스 안에서 작성된 어떤 테스트도 이를 잡아낸다는 보장이 없습니다: 실수하는 머리와 검사하는 머리가 같은 머리이기 때문입니다.구조적 해법은 두 축에서 동시에 독립적인 재구현입니다: 다른 수치 방법과 다른 코드베이스.GradPulse 사례 연구는 세 개의 솔버를 사용합니다: 트로터 분할을 쓰는 미분 가능한 PyTorch 전파기(검증 대상), 전체 리우빌리안의 정확한 행렬 지수를 취하는 순수 NumPy 솔버(시간을 전혀 썰지 않는 유일한 솔버), 그리고 커뮤니티가 검증한 QuTiP의 적응형 ODE 적분기.~10⁻¹⁴ 수준의 일치는 전사(transcription) 버그의 부재를 보증하고, 세 잔차는 1차 트로터 오차 크기 ~2×10⁻⁷에서 만나며 dt → 0 외삽 시 ~10⁻¹³으로 수렴합니다 — 근사 오차가 예측대로 행동하는 것입니다(2026년 기준).CI 게이트가 설계를 완성합니다: 어느 두 솔버라도 운영점에서 어긋나면 빌드가 자동으로 실패합니다 — 검증이 일회성 이벤트가 아니라 모든 커밋에 걸린 불변식이 됩니다.

일상 비유

'7×8=54'라고 잘못 외운 아이가 자기 시험지를 자기가 채점하면 맞다고 표시합니다 — 실수하는 머리와 검사하는 머리가 같은 머리라서 그 오류는 절대 잡히지 않아요. 거울은 얼굴의 얼룩은 비춰주지만 거울 자신에 묻은 얼룩은 절대 보여주지 못합니다. 해법: 서로 답안지를 절대 보여주지 않는 세 명의 선생님 — 한 명은 암산으로 채점하고(PyTorch, 트로터 분할, 미분 가능), 한 명은 지름길 없이 계산기로만 엄격하게 채점하고(순수 NumPy 정확 행렬 지수 — 시간을 썰지 않는 유일한 방법), 한 명은 다른 학교에서 온 베테랑입니다(QuTiP, 커뮤니티 검증 적응형 ODE). 셋이 소수점 14자리까지 일치하면 그건 운도 베끼기도 아닙니다. 그리고 빨간불 규칙: 어느 둘이라도 운영점에서 어긋나면 공장이 자동으로 멈춥니다(CI 빌드 실패) — 의지가 아니라 인프라로서의 정직함입니다.
어원 이야기: audit(감사)는 라틴어 audire, '듣다'에서 왔어요 — 중세엔 글을 못 읽는 영주 앞에서 회계 장부를 소리 내어 읽었고, 감사관은 문자 그대로 '듣는 사람'이었습니다. verify(검증하다)는 라틴어 verus '참된'에서 왔고, 놀랍게도 very(매우)와 형제 단어입니다. 한자어로는 검증(檢證) — 檢은 원래 문서를 봉인하던 나무 널빤지, 證은 증거 — 과 감사(監査) — 볼 감(監) + 조사할 사(査) — 입니다.

흔한 오해

  • 두 구현이 코드를 공유하거나 같은 근사 계열을 쓴다면 그 일치는 아무것도 증명하지 못합니다 — 공유된 가정은 메아리칠 뿐, 검증하지 않습니다. 독립성은 설계되어야 합니다: 다른 방법 축과 다른 코드베이스 축.
  • 단위 테스트는 작성자가 상상한 실수만 잡습니다 — 작성자의 머릿속 물리가 틀렸다면 테스트의 기대값도 똑같이 틀립니다. 상상하지 못한 오류를 잡으려면 독립적인 재구현이 필요합니다.
  • 일회성 검증은 이후의 모든 커밋을 미검증 상태로 남깁니다 — CI 게이트는 검증을 이벤트에서 모든 커밋에 강제되는 불변식으로 바꿉니다.

핵심 정리

  • 구현 오류(부호 실수, 인자 2, 정규화, 기저 순서)는 자기 일관적이어서 하나의 코드베이스 내부에서는 검출할 수 없습니다.
  • 3중 분할: 트로터 전파 vs 정확한 행렬 지수 vs 적응형 ODE — 각각이 다른 둘이 볼 수 없는 오류를 잡습니다.
  • ~10⁻¹⁴ 수준의 일치(전사 버그 없음)와 1차 트로터 오차 ~2×10⁻⁷에서 만나 dt → 0 외삽 시 ~10⁻¹³으로 수렴하는 잔차는 오차가 예측대로 행동함을 보여줍니다(GradPulse 사례 연구, 2026년 기준); CI 게이트는 솔버 어긋남을 곧 빌드 실패로 만듭니다.

이해했는지 확인해 보세요

단일 코드베이스 안의 단위 테스트가 린드블라드 생성자의 부호 실수를 검출하지 못할 수 있는 이유는 무엇입니까?

  1. A.부호 실수는 계산된 동역학에 아무 영향도 주지 않기 때문
  2. B.잘못된 생성자도 자기 일관적이고 수학적으로 유효한 발전을 만들며, 테스트의 기대값도 같은 (틀렸을 수 있는) 머릿속 모델에서 나오기 때문
  3. C.부동소수점 연산이 모든 부호 오류를 기계 정밀도 아래로 숨기기 때문
  4. D.린드블라드 생성자는 애초에 수치적으로 테스트할 수 없기 때문
정답 보기

정답: B. 잘못된 생성자도 자기 일관적이고 수학적으로 유효한 발전을 만들며, 테스트의 기대값도 같은 (틀렸을 수 있는) 머릿속 모델에서 나오기 때문

이유: 잘못 전사된 생성자는 완벽한 내부 일관성으로 틀린 물리를 발전시키고, 테스트 작성자의 기대값은 그 오류를 만든 것과 같은 머리에서 나옵니다 — 실수하는 머리와 검사하는 머리가 같은 머리입니다.

3중 솔버 교차검증에서 적어도 하나의 솔버가 시간 분할 대신 정확한 행렬 지수를 사용해야 하는 이유는 무엇입니까?

  1. A.정확한 행렬 지수가 트로터 스텝보다 항상 빠르기 때문
  2. B.적응형 ODE 적분기는 린드블라드 방정식을 다룰 수 없기 때문
  3. C.같은 시간 이산화 계열을 공유하는 솔버들은 공통 모드의 트로터 계열 오차를 검출할 수 없기 때문 — 시간을 전혀 썰지 않는 방법만이 그것을 드러낼 수 있습니다
  4. D.CI 시스템이 최소 하나의 닫힌 형식 계산을 요구하기 때문
정답 보기

정답: C. 같은 시간 이산화 계열을 공유하는 솔버들은 공통 모드의 트로터 계열 오차를 검출할 수 없기 때문 — 시간을 전혀 썰지 않는 방법만이 그것을 드러낼 수 있습니다

이유: 트로터 계열 솔버 둘은 같은 이산화 오차를 공유해 서로에게서 그것을 볼 수 없습니다(공통 모드 오차). 정확한 행렬 지수는 시간을 썰지 않으므로 공유된 근사 오차가 그것과의 잔차로 드러납니다 — 실제로 예측된 1차 트로터 크기에서 만납니다.

먼저 알아야 할 개념

Independent-reimplementation methodology is sound practice, but the concrete figures (1e-14 agreement, 2e-7 Trotter residual) are from the 2026 GradPulse case study (repo verified 2026-07-03).

직접 실습으로 배우기

이 개념은 46레벨 커리큘럼의 일부입니다. 인터랙티브 시뮬레이터, 그리고 답변을 표시 전에 검증하는 튜터 Lumen과 함께 배웁니다. 레벨 1–5는 무료입니다.