에이전트 기반 능동 계측
NANO는 모델이 아니라 루프다. 모델은 맵을 만들고, 루프는 예산을 쓴다. 이 페이지는 각 단계의 계약 — 입력, 출력, 그리고 불확실성을 결정으로 바꾸는 규칙 — 을 명시한다.
구현 상태
여기서 설명하는 루프는 nano/에 구현되어 있고, 아래의 계약은 테스트 스위트가 강제한다. 추정기는 nano/model.py, 획득 규칙은 nano/policy.py, 루프는 nano/agent.py다. 코드와 이 페이지가 어긋난다면 둘 중 하나가 버그다 — 파일 단위 대응표는 시스템 설계를 참고하세요.
이 사이트의 어떤 페이지도 생성되지 않은 벤치마크 숫자를 출력하지 않는다. 그 숫자를 채우는 것은 WM-811K에 대해 벤치마크를 실행하는 일이다 — 재현을 참고하세요.
루프
- 01
관측 (Observe)
지금까지 확보한 소수의 실측값과, 모든 다이에 대한 시뮬레이션 prior를 함께 읽는다.
- 02
추정 (Estimate)
실제에 대한 공간 모델을 적합해 예측, 불확실성, prior와 실제의 격차 세 가지 맵을 만든다.
- 03
선택 (Select)
측정되지 않은 모든 다이를 획득 함수로 채점하고, 최대값을 다음 측정 지점으로 고른다.
- 04
측정 (Measure)
해당 다이의 숨겨진 실제 값을 확인해 관측 집합에 추가하고, 예산 1단위를 소모한다.
측정 예산이 소진될 때까지 반복한다. 매 반복이 기록되므로 의사결정 경로를 추적할 수 있다.
인터페이스 계약
입력, 반복 회차마다
| 필드 | 형상 | 의미 |
|---|---|---|
coords | (N, 2) | 웨이퍼 상의 다이 그리드 좌표 |
prior | (N,) | 모든 다이에 대한 시뮬레이션 예측, 어디서나 사용 가능 |
observed_mask | (N,) bool | 지금까지 측정된 다이가 어느 것인지 |
observed_values | (M,) | 해당 다이들의 측정값, M = observed_mask.sum() |
budget_remaining | int | 실행이 멈추기 전까지 남은 측정 횟수 |
출력, 반복 회차마다
| 필드 | 형상 | 의미 |
|---|---|---|
prediction | (N,) | 모든 다이에서의 현재 최선의 실제 추정값 |
uncertainty | (N,) | 모든 다이에서의 모델 불확실성, 측정된 다이에서는 0 |
reality_gap | (N,) | 부호가 있는 불일치, prediction − prior |
next_index | int | 다음 측정을 위해 선택된 다이 |
next_score | float | 결정 추적을 위한 해당 다이의 획득 점수 |
이 세 개의 맵이 에이전트를 감사 가능하게 만드는 이유다. 예측만으로는 논박할 수 없지만, 예측에 불확실성 맵과 gap 맵이 더해지면 장비 일정을 잡기 전에 검토할 수 있다.
실제 추정하기
추정기의 임무는 하나다. 조밀하지만 편향된 prior(사전 정보)를 희소하지만 신뢰할 수 있는 측정 집합과 조화시키고, 그 조화가 어디까지 미치는지에 대해 정직함을 유지하는 것이다.
- prior에서 시작한다. 측정이 하나도 없을 때 추정값은 시뮬레이션 prior 그 자체이며, 불확실성은 어디서나
1.0이다. - 국소적으로 보정한다. 각 측정은 잔차
측정값 − prior를 만들고, 이 잔차는 다이 간 거리에 대한 가우시안 커널로 퍼진다. 잔차의 가중 평균을 prior에 더한 뒤[0, 1]로 클리핑하며, 측정된 다이에서는 예측이 곧 측정값이다. - 측정하지 않은 곳에서는 prior로 돌아간다. 가중 평균은
prior_weight만큼 축소된다. 이는 prior를 "여기에는 보정이 필요 없다"고 말하는 그만큼의 측정치로 취급하는 것이다. 이것이 없으면 추정기는 아무것도 측정하지 않은 영역까지 전역 오프셋을 외삽하게 된다. - 도달 범위를 보고한다. 불확실성은
1 / (1 + 커널 가중치 합)이며, 그 다이에 도달한 측정들 사이의 불일치가 값을 다시1쪽으로 밀어 올린다. 척도는 절대적이다 —1.0은 "측정의 영향이 전혀 닿지 않음",0.0은 "측정됨" — 따라서 한 에피소드의 두 맵은 서로 비교 가능하며, "불확실성이 줄었다"는 재정규화의 부산물이 아니라 반증 가능한 주장이 된다.
두 개의 하이퍼파라미터(웨이퍼 폭의 1/12을 기본값으로 하는 length_scale, 그리고 prior_weight)는 비교 전에 고정되고, 모든 조건에서 동일하며, results/benchmark_summary.json의 experiment.model에 기록된다.
측정되지 않은 다이의 ground truth는 추정기가 절대 읽지 않는다. 그것은 평가 하네스 안에만 존재한다. 에이전트에게 비공개
다음 측정 지점 선택하기
의도된 획득 점수는 세 개의 항을 결합한다.
acquisition(i) = uncertainty(i) × simulation_disagreement(i) × spatial_novelty(i)| 항 | 읽는 방법 | 왜 필요한가 |
|---|---|---|
uncertainty(i) | "이 다이를 나는 모른다." | 추정값이 이미 확고한 곳에 예산을 쓰는 것은 아무것도 얻지 못한다. |
simulation_disagreement(i) | "여기서는 prior가 틀렸을 것으로 예상된다." | Sim2Real 격차가 실제로 존재하는 곳이 바로 여기다. 불확실성만으로는 아무 의미 없이 일치하는 지점을 태연히 샘플링하게 된다. |
spatial_novelty(i) | "이 영역은 아직 보지 않았다." | 루프가 흥미로운 한 지점 주변에 측정을 몰아 넣는 것을 막는다. |
각 항은 웨이퍼 전체에 대해 min-max로 [0, 1]에 정규화된 뒤 eps = 1e-3으로 하한이 걸린다. 곱은 인자 하나가 0이면 0이 되는데, 세 항 모두 어느 웨이퍼에서든 어딘가에서는 정당하게 0이 되기 때문이다. 하한은 그 항에서 후보를 꼴찌로 두되, 후보 자체를 거부하지는 않는다.
불일치 항은 |prediction − prior|가 아니다. 그 맵은 측정의 영향이 닿는 범위를 벗어나면 필연적으로 0으로 사그라들기 때문에, 그 위에 세운 규칙은 아직 탐색하지 않은 모든 영역을 이미 정리된 곳으로 판단하고 결코 그쪽을 보지 않는다. 모델은 두 번째 맵 expected_disagreement를 내보낸다. 잔차의 크기를 국소 가중 평균한 값이며, 국소 증거가 희박한 곳에서는 웨이퍼 전체의 평균 잔차 크기 쪽으로 축소된다. 읽는 방법은 "여기서 prior는 대략 이만큼 어긋나 있고, 그에 반하는 증거가 나에게는 없다"이다. reality_gap은 그대로 출력으로 남는다. 실제로 적용된 보정이 무엇인지는 검토자가 반드시 봐야 하는 것이기 때문이다.
다음 측정 지점은 측정되지 않은 다이들에 대한 argmax다.
next_index = argmax { acquisition(i) : observed_mask[i] == False }수식과 코드를 일치시킬 것
구현이 단순한 argmax(uncertainty)로 축소되었다면, 이 절은 반드시 argmax(uncertainty)라고 적어야 했을 것이다. 문서에는 세 항의 곱이 있고 코드에는 한 항짜리 규칙이 있는 것 — 이것이 바로 이 프로젝트가 반대하기 위해 존재하는 실패 양상이다. 그래서 실제로 실행된 규칙은 모든 결과 파일에 experiment.acquisition_rule로 기록되고, nano/policy.py는 모든 결정과 함께 항별 분해를 반환하며, tests/test_policy.py는 선택된 다이의 점수가 그 결정 추적에 담긴 세 항의 곱과 같음을 검증한다.
규칙을 명시하는 것과 그 규칙이 도움이 된다는 것을 보이는 것은 다르다. python -m nano.benchmark --ablation은 항을 빼고 루프를 다시 실행하며, 벤치마크 페이지는 각 항이 얼마나 값을 하는지 — 축약된 규칙이 이 규칙을 이기는 경우까지 포함해 — 게시한다. 게시된 WM-811K 실행에서 실제로 그 일이 일어났다. uncertainty 단독이 위에 문서화한 곱보다 좋은 점수를 냈다. 그럼에도 웨이퍼 12장을 근거로 여기의 규칙을 바꾸지는 않았다. 그 이유와, 무엇이 있어야 바꿀 수 있는지는 정직한 범위에 적혀 있다.
중단과 결정론
중단. budget_remaining이 0에 도달하면 실행이 끝난다. 수렴 기준에 따른 조기 중단은 없다. 팹에서 실제로 구속력을 갖는 제약은 예산이기 때문이다. 장비 시간은 발견되는 것이 아니라 할당되는 것이다.
결정론. 모든 확률적 선택은 명시적인 시드로 구동된다. 시드는 웨이퍼 id와 전략 이름의 안정적인 해시와 결합되므로, 인터프리터 세션이 달라져도 실행이 재현된다.
- 어떤 웨이퍼가 평가 집합에 들어가는지,
- 초기 희소 관측 마스크를 어떻게 뽑는지,
- Random 베이스라인의 선택,
argmax내부의 동점 처리.
같은 시드, 같은 웨이퍼, 같은 예산이 주어지면 실행은 정확히 재현된다. 베이스라인은 NANO와 동일한 초기 관측과 동일한 예산을 받으므로, 각 조건 사이에서 달라지는 것은 선택 규칙뿐이다.
이것이 아닌 것
- 단계만 더 붙인 웨이퍼 맵 보간이 아니다. 보간은 "여기 값이 얼마인가?"에 답한다. NANO는 "다음 측정을 어디로 보내야 하는가?"에 답한다.
- 물리 시뮬레이션의 대체물이 아니다. prior는 보정되어야 할 입력이지, 대체되어야 할 출력이 아니다.
- 캘리브레이션에 대한 주장이 아니다. NANO는 불확실성을 보고하고 그것으로 위치의 순위를 매긴다. 그 불확실성이 캘리브레이션되어 있다는 것은 별개의 주장이며, 이 프로젝트는 그런 주장을 하지 않는다. 정직한 범위를 참고하세요.
다음: 데이터와 실험 설계 →