
자신의 평가(eval)에 과적합될 수 없는 ML 탐색 루프 — 게이트는 프롬프트가 아닌 코드에 있습니다
요약
평가 지표 조작(metric gaming)을 방지하기 위해 프롬프트가 아닌 실행 가능한 코드로 규율을 강제하는 ML 탐색 루프 'heldout'을 소개합니다. 이 시스템은 외부 채점기를 통해 실제 측정된 점수만을 반영하며, 개발 데이터와 홀드아웃 데이터 간의 엄격한 분리를 통해 과적합을 원천 차단합니다.
핵심 포인트
- 프롬프트가 아닌 실행 가능한 코드로 과적합 방지 규칙 강제
- LLM이 스스로 점수를 매기지 못하도록 외부 채점기 사용
- 개발 슬라이스와 홀드아웃 슬라이스의 엄격한 분리 및 검증
- 탐색 정책과 ML 연산자를 분리하여 도메인 독립성 확보
- 실패한 브랜치에서 교훈을 추출하여 향후 프롬프트에 반영
저는 에이전트(agent)와 평가(eval) 데모에서 정직함(honesty) — 즉, 홀드아웃(held-out) 규율이나 "지표 조작 방지(no metric gaming)" — 이 프롬프트에 있거나 논문의 방법론 섹션에 기술되어 있는 것을 계속 보았습니다. 그래서 저는 그 반대의 것을 구축하려고 시도했습니다. 과적합 방지 규칙이 **실행 가능한 코드(executable code)**로 강제되는 탐색 루프(search loop)를 만들었고, 그 규율이 실제로 비용을 발생시키는지 확인하기 위해 실제 외부 채점기(MLE-bench)를 대상으로 실행해 보았습니다.
그 결과물은 heldout입니다 — MIT 라이선스, 런타임 의존성 제로, Claude Code 스킬로 작동합니다: https://github.com/jeet-dhandha/heldout
엔진이 강제하는 것 — 프롬프트가 아닌 코드에서
- 모든 노드는 **실제로 측정된 점수(real measured score)**에 결합됩니다 —
SCORE=<n>을 출력해야 하는 셸 명령(shell command)이며, 실행할 수 없는 지표는 결합을 거부합니다. - 개발 슬라이스(dev-slice)에서의 승리는 건드리지 않은 홀드아웃(held-out) 슬라이스가 미리 설정된 마진으로 이를 확인하지 않는 한 유지될 수 없습니다 — dev-up / held-out-flat은 엄격하게 차단됩니다.
- 베이스라인(baseline)은 새로운 재측정 시에만 **단계적으로 상승(ratchets up)**합니다 — 느낌(vibes)에 의존하여 유지하지 않습니다.
- 중단된 모든 브랜치(branch)는 반드시 **교훈(lesson)**을 남겨야 하며, 이는 향후 코드 생성(code-gen) 프롬프트에 주입되어 루프가 죽은 방향을 다시 제안하지 않도록 합니다.
- 어떠한 LLM도 자신의 작업에 스스로 점수를 매기지 않습니다 — 점수는 생성된 코드가 읽거나 영향을 미칠 수 없는 채점기(grader)로부터 옵니다.
- 달러 예산은 가이드라인이 아니라 **도구 내부의 벽(wall)**입니다.
Kaggle 에이전트가 아닌 하네스(Harness)
AIDE / AutoKaggle / AIRA는 탐색 정책(search policy)(다음에 무엇을 시도할 것인가)과 ML 연산자(ML operator)(코드 작성 + 실행)를 하나의 시스템으로 묶고, 관례에 의해 평가의 정직성을 강제합니다. heldout은 이들을 분리합니다. 엔진은 도메인에 구애받지 않고 탐색 정책과 그 불변량(invariants)만을 소유하며, 연산자(LLM 초안 → 샌드박스 실행 → 점수 파싱)는 교체 가능한 모듈입니다. MLE-bench는 제품이 아니라 증명 표면(proof surface)입니다.
정직한 결과 — 승리하지 못한 지점까지 포함하여
모든 수치는 nomad2018-predict-transparent-conductors(비공개 테스트, n=240)에 대한 MLE-bench 공식 채점기(grader)로부터 도출되었습니다. 결코 자기 보고(self-reported)된 수치가 아닙니다.
- Phase 1: 홀드아웃 (held-out) RMSLE 0.06117 → 은메달, 비용 $3.13 (9회의 LLM 호출, 각 호출은 네트워크가 없는 컨테이너 내에서 수행).
- Phase 2 + 2b: 탐색 정책(search policy) 자체가 비용만큼의 가치를 창출하는지 격리하여 확인하기 위해, 동일한 모델과 동일한 예산을 사용하는 _단순 선형 재시도 루프 (dumb linear-retry loop)_를 대상으로 동일 금액의 사전 등록된 A/B 테스트를 수행했습니다. 두 번 모두 귀무 가설(nulls)이 채택되었습니다 — 홀드아웃 격차(held-out gap)가 사전에 설정한 0.005 결정 기준선 아래로 두 번 모두 유지되었습니다 (0.00479, 그리고 0.00216). 따라서 "탐색이 재시도를 이긴다"는 사실은 입증되지 않았으며, 저는 이를 그대로 보고합니다. 왜냐하면 이 시스템의 핵심 목적은 작동하지 않았을 때를 알려줄 수 있는 하네스(harness)이기 때문입니다.
가장 날카로웠던 순간
Phase 2b에서, 하나의 Random Forest 노드가 홀드아웃 데이터에서 0.06227을 기록했습니다. 이는 은메달 급이며, 재시도 루프가 내놓은 결과보다 더 좋았습니다. 하지만 게이트(gate)가 이를 차단했습니다: 베이스라인(baseline) 대비 우위가 0.00288로, 노이즈를 보정한 마진(noise-calibrated margin)인 0.0036 미만이었으며, 개발 데이터와 홀드아웃 데이터 간의 격차(dev→held-out gap, 0.0055)가 과적합(overfit)을 나타냈기 때문입니다. 만약 "모든 노드 중 홀드아웃 점수가 가장 높은 것을 배포한다"는 단순한 규칙을 적용했다면, 기준선을 0.00004 차이로 넘어서며 승리로 선언되었을 것입니다. 하지만 정직한 '최종 유지 규칙(last-kept rule)'은 이를 거부했습니다 → 귀무 가설 채택.
그 거부 행위 자체가 바로 이 제품의 본질입니다.
정직한 한계점
각 실험군(arm)당 n=1회 실행, 단일 작업 — 이는 통계적 주장이라기보다 통제된 A/B 테스트입니다. Phase 2b의 방향 전환은 단일 추출 노이즈(single-draw noise) 범위 내에 있습니다 (재시도 실험군이 약하게 추출되었으며, 10회 시도 중 6회가 빈 초안(empty-drafted)을 작성함). 이것은 SOTA(최첨단) 결과가 아니라, 하네스(harness)이자 방법론입니다.
리포지토리(Repo), 사전 등록 내역, 전체 트리, 채점기 원장: https://github.com/jeet-dhandha/heldout
이 비교가 여전히 탐색 실험군(search arm)에 너무 관대하다거나, 강제 집행(enforcement) 과정에 허점이 있는 곳이 있다면 기꺼이 듣고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기