BUILD LOG · 결정 구조 생성 전체 재검토

결정 구조 생성에서 사전등록 판정을 받은 학습 성분은 지금까지 4건 중 0건이 살아남았다 — 그리고 선행연구와 비교될 뻔했던 우리 숫자 하나는, 코드를 열어보니 안정성을 전혀 재지 않는 장치였다.

이 페이지는 새 실험이 아니라 이미 돌린 결정 구조 실험 전체를 처음부터 다시 설명하고, 스스로 반박하는 문서다. 결정 구조 생성이 무엇인지 모르는 사람을 기준으로 썼다. 모든 수치에는 표본 크기·신뢰구간·측정 백엔드·사전등록 여부를 붙였고, 파일과 줄 번호로 근거를 댈 수 없는 숫자는 "미확인"으로 남겼다.

이 페이지를 읽는 데 필요한 경고 두 개를 먼저 말한다. (1) 우리가 보고했던 SUN 0.442는 CHGNet 같은 기계학습 원자간 퍼텐셜이 아니라 부피/원자 수가 5~40 ų 구간에 있는지를 보는 산술식으로 "안정"을 판정했다 — 에너지를 한 번도 계산하지 않는다(crystal_sample.py:469-484). 선행연구 수치와 같은 축에 놓을 수 없다. → §3 (2) 2026-07-19에 "스도쿠의 확신도 병리가 결정 구조에서도 재현됐다(AUC 0.315)"고 보고했으나 원자료를 다시 계산하면 0.597이고 역상관이 아니다. 그 주장은 철회됐고, 오늘 원자료에서 다시 한 번 직접 재현했다. → §6
우리 생성기의 조건 명중률 · 후보 1,280개 · 사전등록 X 팔 A
4.77%
구조가 물리적으로 성립하고(원자 간 최소 거리 ≥ 0.5 Å) 동시에 밴드갭 예측이 목표에서 ±0.3 eV 안에 든 후보의 비율. 61/1280(prX_labA.log) → §8
사전등록 판정 4건 중 학습 성분이 살아남은 횟수
0 / 4
확신도 선택(미확증) · 귀속 절단(사멸) · 잠재-MDL(사멸) · 손상복구(사멸). 각 판정의 추정량과 신뢰구간 하한은 §5~§8에 그대로 옮겼다
SMACT 전하중성을 통과한 생성 구조 · 후보 1,134개 중
7개 (0.6%)
선행연구가 같은 이름의 지표로 99% 안팎을 보고하는 자리다(crystal_sun.log valid_comp=0.00617). 우리가 이 항목을 주 판정에서 뺀 이유는 §2에 있다
§1

이게 무슨 문제인가 — 결정 구조 생성

처음 보는 사람을 위한 정의

결정(crystal)은 원자들이 같은 배치를 규칙적으로 무한히 반복하는 물질이다. 반복되는 최소 단위를 단위 격자(unit cell)라 하고, 결정 하나를 완전히 적으려면 두 가지만 있으면 된다. 첫째 격자의 모양 — 세 변의 길이 a, b, c와 세 각도 α, β, γ, 합쳐서 여섯 개의 실수다. 둘째 그 상자 안에 어떤 원소가 어디에 있는지 — 원자마다 (원소 번호, 상자 안 상대 좌표 세 개)다.

결정 구조 생성(역방향 재료 설계, inverse materials design)은 이 방향을 거꾸로 가는 문제다. 보통의 재료 계산은 "이 구조를 주면 성질이 얼마인가"를 묻는다. 역방향 설계는 "이 성질을 원한다. 그런 구조를 하나 만들어 내라"를 묻는다. 즉 입력은 원하는 성질값 하나이고, 출력은 격자 여섯 개와 원자 목록으로 이루어진 구조 하나다.

밴드갭(band gap) — 전자가 물질 안에서 자유롭게 움직이려면 넘어야 하는 에너지 문턱이다. 단위는 전자볼트(eV). 0 eV면 전자가 언제나 자유로워 금속처럼 전기가 통하고, 값이 클수록 절연체에 가깝다. 태양전지·발광소자·반도체 설계는 사실상 "밴드갭이 이 값인 물질을 찾아라"라는 문제다. 그래서 밴드갭 조건부 생성이란 "밴드갭 2 eV짜리 결정을 만들어 내라"처럼 성질값을 조건으로 주고 구조를 생성하게 하는 과제다.

그러면 언제 "성공"인가. 정답이 하나로 정해진 문제가 아니다. 같은 밴드갭을 갖는 물질은 여러 개일 수 있고, 애초에 세상에 아직 없는 물질을 만들어 내는 것이 목적이다. 그래서 이 분야는 정답 대조가 아니라 여러 개의 통과 조건으로 성공을 정의한다 — 구조가 물리적으로 말이 되는가, 조성이 화학적으로 말이 되는가, 요구한 성질을 실제로 갖는가, 에너지적으로 안정한가, 이미 알려진 물질의 복사가 아닌가. 그 조건들이 §2의 지표다.

왜 이 프로젝트가 결정 구조를 표적으로 삼았나 — 스도쿠와의 대비

이 프로젝트의 헌법 §1(docs/CONSTITUTION.md:80-82)은 이렇게 적는다: "스도쿠는 손 자가 있어 학습된 자를 검증할 수 있는 시험대이고, 진짜 표적은 손 자가 없는 크리스탈·ARC다." 여기서 자(ruler)는 "지금 상태가 정답에서 얼마나 떨어졌는지를 재는 장치"를 뜻한다.

스도쿠에는 완벽한 고전 풀이기가 있다. 그래서 학습된 자가 제대로 재는지 검증할 수는 있지만, 학습이 실제로 무언가를 보태는지는 알 수 없다 — 고전 백트래킹 탐색이 held-out 2000판을 1.000으로 풀어버리기 때문이다(2026-07-26 페이지 §1). 결정 구조에는 그런 풀이기가 없다. 어떤 구조가 좋은지 확인하려면 실제로는 밀도범함수이론(DFT) 계산을 돌려야 하고, 그건 후보 하나에 수 시간이 든다.

그런데 바로 그 점이 이 도메인의 함정이기도 하다. 손 자가 없으므로 우리는 대리 판정자를 쓴다 — 신경망 밴드갭 예측기와 기하 검사기다. 그러면 "생성기가 좋아졌다"와 "생성기가 대리 판정자를 만족시키는 법을 배웠다"가 구분되지 않는다. 이 페이지의 모든 수용률 숫자는 이 한계를 안고 있다.

§2

지표가 정확히 무엇을 세는가

우리 코드 기준

아래는 우리 저장소의 구현 기준이다. 같은 이름의 지표가 논문마다 다르게 계산되므로, 이름이 아니라 계산식을 봐야 한다 — §3이 그 차이가 얼마나 큰지 보여준다.

지표정확히 무엇을 세는가우리 구현
구조 유효성
structural validity
단위 격자 안에서 어떤 두 원자도 0.5 Å보다 가깝지 않은 구조의 비율. 원자 두 개가 겹쳐 있으면 물리적으로 존재할 수 없으므로 최소한의 기하 검사다. 이 분야의 공통 관례이며, 문턱 0.5 Å도 공통이다. accept_label.py:4-5
→ baseline_validity
조성 유효성
compositional validity
구조의 원소 구성이 전하 중성을 만족하는지를 SMACT라는 규칙 기반 도구로 판정한 비율. 원소마다 가능한 산화수 표를 뒤져 총 전하가 0이 되는 조합이 있는지를 본다. accept_label.py:4-5, :57-58
수용
acceptance (우리 1차 지표)
구조 유효성 통과 그리고 |CGCNN 밴드갭 예측 − 목표| ≤ 0.3 eV. "말이 되는 구조이면서 요구한 성질을 갖는가"를 한 번에 묻는다. 조성 유효성은 빼고 별도 보고한다. accept_label.py:31 · :62-64 · :71
TOL_EV = 0.3
SUN
Stable · Unique · Novel
세 조건을 동시에 만족하는 생성 구조의 비율. Stable=에너지적으로 안정, Unique=같은 배치에서 중복이 아님, Novel=참조 데이터베이스에 없음. 세 다리 각각을 무엇으로 재느냐가 이 지표의 전부다 → §3 crystal_sample.py:495-572

왜 조성 유효성을 주 판정에서 뺐나 — 데이터가 먼저 통과를 못 했다

2026-07-18에 라벨러를 만들고 실제 mp_20 데이터베이스의 진짜 구조 64개로 자기 검사를 돌렸다. 구조 유효성은 1.00으로 정상이었고 CGCNN 밴드갭 오차도 0.065 eV로 정상이었다. 그런데 SMACT 전하중성은 실측 구조의 45%만 통과했다(INSIGHTS.md:656-657). 즉 이 조건을 수용 라벨에 넣으면 정답 데이터조차 45%가 상한이 되고, 라벨이 생성 품질이 아니라 SMACT의 보수성을 재게 된다.

부수적으로 발견한 것: 라벨러 파일의 문서 문자열(accept_label.py:6)은 아직도 accept = struct_ok AND comp_ok AND |bg − target| ≤ 0.3이라고 적혀 있다. 실제 코드는 :62-64:71에서 조성 조건 없이 계산한다(코드 주석 :64가 "corrected rule: primary = struct AND bg"로 수정 사실을 적어 두었다). 결과는 코드가 맞고 판정도 코드 기준이지만, 문서 문자열은 갱신되지 않았다.

스스로 반박한다. 이 결정은 근거가 있지만 대가가 있다. 선행연구가 보고하는 "조성 유효성 99%"와 우리 0.6%(1,134개 중 7개)는 이제 같은 이름의 다른 지표가 아니라, 우리가 이 항목에서 매우 나쁘다는 사실을 주 판정에서 안 보이게 만든 결과이기도 하다. 이 페이지에서는 그래서 숨기지 않고 히어로 카드에 올렸다.

같은 저장소 안에 "기하 정상"이 두 개 있다 — 감사에서 잡힌 것

후보를 걸러내는 기하 검사가 두 곳에 서로 다르게 구현돼 있다. 라벨링 경로(prX_label.py:20-24, accept_label.py:53-55)는 부피 > 10 ų이고 밀도가 0.1~30이면 통과시킨다. SUN 평가 경로(crystal_sample.py:398-419)는 격자 세 변이 1~50 Å, 부피/원자 1~500 ų, 그리고 원자 간 최소 거리 ≥ 0.5 Å을 요구한다 — 즉 후자는 구조 유효성 검사를 포함한다.

그래서 SUN 로그의 "geom-sane 1,134개"와 그 안의 "sane 534개"는 같은 단어가 두 개의 다른 문턱을 가리킨 것이다. 결과 해석에 오류는 없지만(§3의 분해가 이를 그대로 반영한다), 표기가 독자를 오도하기 쉽다.

§3

선행연구는 얼마를 보고하나 — 그리고 우리 SUN 0.442가 왜 그 옆에 놓일 수 없나

트랙 B

먼저 선행연구의 좌표다. 아래는 모두 MP-20(Materials Project에서 원자 20개 이하 결정만 추린 표준 벤치마크, CDVAE 논문이 도입)에서 보고된 수치다. 우리가 쓰는 학습 분할은 27,136개다.

모델구조 유효성조성 유효성SUN출처·조건
CDVAE99.15%99.49%FlowLLM 논문 표 1 재보고
DiffCSP99.71%99.76%같은 표
FlowMM99.49%99.58%같은 표
FlowLLM99.06%99.82%4.92%MP-20 무조건 생성. 안정 17.82% 중 약 48%가 신규, 그중 58%가 중복 아님
MatterGen38.57%샘플 1,024개. 안정 = 볼록 껍질 위 0.1 eV/원자 미만, 참조 = Materials Project + Alexandria. 신규 = 무질서 구조 매처, 평가에 DFT 이완 사용
Con-CDVAE
우리 주 비교선
확인 못 함확인 못 함밴드갭 조건부 생성의 허용오차 명중률을 보고하지 않는다 — 목표 0/3/6 eV에서 생성물의 예측 밴드갭 분포 그림만 제시. 검증기 CGCNN의 test MAE 0.362 eV
우리 (2026-07-19)47.1%
534/1,134
0.6%
7/1,134
44.2%
501/1,134
대리 백엔드. 분모 1,134는 생성 1,280개 중 느슨한 기하 필터를 통과한 것 — 생성 전체를 분모로 하면 각각 41.7% / 0.5% / 39.1%다. 아래 분해 참조

출처. 구조·조성 유효성 네 줄과 FlowLLM SUN 4.92%는 FlowLLM (arXiv:2410.23405) 표 1. MatterGen 38.57%와 SUN 정의는 MatterGen 모델 카드(논문 Nature 2025, DOI 10.1038/s41586-025-08628-5). Con-CDVAE는 arXiv:2403.12478 — 밴드갭 조건부 생성의 허용오차 명중률을 보고하지 않고, 0.362 eV는 검증기 CGCNN 자신의 test MAE다(표 1). 주의: CDVAE의 조성 유효성은 다른 출처에서 86.7%로 인용되기도 한다(우리 저장소 설계 문서 docs/superpowers/specs/2026-06-23-v16-energy-first-mdl-gram.md:78). 어느 쪽이 원 논문 값인지는 확인하지 못했다 — 위 표는 FlowLLM 표 1의 재보고 값이다.

표를 읽는 첫 번째 교훈: 같은 "SUN"이 4.92%와 38.57%로 8배 차이가 난다. 두 값 모두 정직하게 보고된 것이고, 차이는 성능이 아니라 프로토콜에서 온다 — 참조 데이터베이스가 무엇인지, 구조를 이완시킨 뒤 재는지, 안정성을 DFT로 재는지 기계학습 퍼텐셜로 재는지. SUN은 하나의 숫자가 아니라 레시피에 딸린 숫자다.

우리 SUN 0.442의 해부 — 세 다리 중 두 다리가 아무것도 자르지 않았다

실측 로그(crystal_sun.log)는 이렇게 적혀 있다: n=1134 · sane=534 · stable=501 · unique=534 · novel=534 · sun=501 · sun_rate=0.4418 · stability_backend=surrogate_e_above_hull. 이 숫자들을 곱으로 풀면 다음이 된다.

다리통과무엇으로 판정했나실제로 걸러냈나
기하·구조 유효534 / 1,134 = 47.1%격자 1~50 Å, 부피/원자 1~500 ų, 원자 간 최소 거리 ≥ 0.5 Å걸러냄 (53%를 탈락)
Stable501 / 534 = 93.8%부피/원자가 5~40 ų 구간에 있으면 0, 벗어나면 벗어난 만큼. 문턱 0.1과 비교. 에너지를 계산하지 않는다 (crystal_sample.py:469-484)사실상 안 걸러냄
Unique534 / 534 = 100%pymatgen StructureMatcher로 배치 내 중복 제거한 개도 안 걸러냄
Novel534 / 534 = 100%조성이 참조 집합에 없으면 신규. 참조 집합이 비어 있으면 전부 신규로 센다(crystal_sample.py:506-508)한 개도 안 걸러냄

따라서 SUN 0.442는 사실상 "기하 검사 통과율 47.1% × 부피/원자 밴드 통과율 93.8%"다. 안정성·신규성·중복성 어느 것도 실질적으로 판정되지 않았다. MatterGen의 38.57%는 볼록 껍질 위 에너지를 실제로 계산해 얻은 값이므로, 두 숫자를 나란히 놓는 것 자체가 잘못이다. "직접 비교 불가"라는 기존 표현도 사실 약하다 — 우리 쪽 축에는 에너지가 없다.

확인 못 한 것: crystal_sun.log를 만든 실행 스크립트가 저장소에 남아 있지 않아, 참조 조성 집합이 실제로 비어 있었는지 아니면 mp_20에서 채워졌는데 마침 534개가 전부 신규였는지는 확정할 수 없다. 신규 통과율이 정확히 100.0%라는 사실은 전자를 강하게 시사하지만, 증거로 삼지 않는다.

밴드갭 조건 명중률은 비교할 상대가 아예 없다

우리 1차 지표는 "밴드갭 예측이 목표에서 ±0.3 eV 안"이다. 이 관례가 어디서 왔는지 확인하려 했는데, 주 비교선으로 잡았던 Con-CDVAE가 밴드갭 조건부 생성의 허용오차 명중률을 숫자로 보고하지 않는다. 목표 0 eV / 3 eV / 6 eV에서 생성물의 예측 밴드갭 분포를 그림으로만 제시한다. 즉 우리 4.4~4.8%를 놓을 좌표축이 문헌에 없다.

±0.3 eV라는 문턱의 출처도 우리 저장소 안에서만 확인된다(accept_label.py:31 TOL_EV = 0.3, 사전등록 STRATEGY.md:269). 검증기 CGCNN 자신의 test MAE가 0.362 eV이므로 문턱이 예측기 오차보다 작다 — 이 조합이 무엇을 의미하는지는 정직하게 말해야 한다. 예측기가 평균적으로 0.362 eV 틀리는데 0.3 eV 안에 들어야 통과라면, 통과 라벨은 상당 부분 예측기 잡음이 유리하게 떨어진 사건이다. 우리 수용률의 절대값은 이 잡음과 분리돼 있지 않다.

같은 로그가 밴드갭 MAE 6.234 eV도 적는다(기하 정상 셀 기준). 목표값이 0~4 eV 범위인 과제에서 평균 오차가 6.2 eV라는 것은, 대다수 생성물이 조건을 지키지 못하고 극단적으로 빗나간다는 뜻이다 — 수용률 4~5%와 정합한다. 이것이 이 도메인에서 우리 생성기의 실제 위치다.

§4

우리 장치 — 결정을 86개의 정수로 적는다

의도와 구현

의도. 이 프로젝트는 스도쿠·ARC·결정 구조를 하나의 레시피로 다루려 한다 — 같은 재귀 생성기, 같은 손실(교차엔트로피 + 잠재 잡음 KL), 같은 이산 캔버스. 그러려면 연속량인 결정 구조를 정수 토큰의 고정 길이 캔버스로 바꿔야 했다.

방법. 2026-07-18에 확정된 인코딩(experiments/crystal/crystal_tokens_v2.py:29-35)은 결정 하나를 정확히 86개의 정수로 적는다.

FIG A · 86토큰 캔버스의 배치

변 길이 a b c 3토큰 · 128구간 · 1~40 Å 각도 α β γ 3토큰 · 128구간 · 10~170° 원자 슬롯 20개 × 4토큰 = 80토큰 원소0~100 x64 y64 z64 ← 슬롯 1 슬롯 2 · 3 · … · 20 (같은 4토큰 묶음, 원소=0이면 빈 슬롯) 합계 6 + 20×4 = 86 토큰 · 위치마다 허용 어휘가 다르고, 손실은 그 위치의 어휘만 대상으로 계산한다 근거: crystal_tokens_v2.py:29-35 (A_MAX=20 / SEQ = 6 + A_MAX*4 = 86 / MAX_VOCAB=129), :47-53 vocab_sizes() 한계: 원자 21개 이상인 결정은 이 캔버스에 들어가지 않는다 — 학습 집합도 20개 이하로 잘려 27,136개다

이 표현이 정보를 잃지 않는지 먼저 확인했다. 사전등록한 왕복 게이트 — 실제 mp_20 구조 64개를 인코딩했다 다시 디코딩해 구조 유효성 보존이 0.95 이상이어야 통과 — 에서 64개 전부 복원되고 보존율 1.000으로 통과했다(INSIGHTS.md:686-687, 구현 crystal_tokens_v2.py:98-127). 즉 이후 실패는 표현 탓이 아니다.

구성근거
학습 데이터mp_20 학습 분할 27,136개 (원자 20개 이하)prX_run.log
모델재귀 생성기 GramDriftGenerator, 파라미터 7.8M, 재귀 횟수 K=6, 폭 512prX_run.log · crystal_s0_train.py:156-159
손실위치별 어휘 마스킹 교차엔트로피 + 0.01 × (잠재 KL / K)crystal_s0_train.py:216-217
조건 주입목표 밴드갭 → 작은 다층 퍼셉트론 임베딩 → 86개 위치 전부에 더함crystal_s0_train.py:53-60
학습40에폭 · 배치 128 · 학습률 2e-4 (헌법 상한 3e-4)crystal_s0_full.json args
생성목표 5개 {0,1,2,3,4} eV × 각 256개 = 셀당 1,280 후보, 확률 샘플링prX_run.log
디코드 성공률1,280 / 1,280 = 100% (네 팔 전부)prX_run.log decodable=256/256

"디코드 100%"는 토큰 배열이 pymatgen 구조 객체로 변환된다는 뜻일 뿐, 그 구조가 물리적으로 말이 된다는 뜻이 아니다. 말이 되는지는 다음 단계인 구조 유효성이 판정하고, 거기서 절반 이상이 탈락한다.

§5

실험 1 — 학생이 스스로 좋은 후보를 고를 수 있는가

사전등록 R-0 · 2026-07-18

의도. 생성기가 후보를 여러 개 뽑는다면, 그중 어느 것이 통과할지를 생성기 자신이 알 수 있는가? 알 수 있다면 대리 판정자를 부르기 전에 걸러낼 수 있고, 그것이 이 프로젝트가 노리는 "자(ruler)"의 가장 값싼 형태다.

가설. 학생의 자기 확신도 — 생성한 토큰들의 로그 확률 평균, c(x) = exp(mean log p) — 가 수용 여부와 양의 상관을 가지며, 상위 10%를 고르면 수용률이 유의하게 오른다.

방법. 발견 단계(시드 0·1)와 확증 단계(시드 2)를 표본을 분리해 사전등록했다. 1차 추정량은 상위 10% 선택의 수용률 상승분이고, 성공 기준은 목표별 군집 부트스트랩 신뢰구간의 한쪽 하한이 0보다 큰 것이다.

단계표본확신도-수용 AUC상위 10% 상승분95% 신뢰구간판정
발견 (시드 0·1)후보 400 · 양성 180.582+0.080 (4.5%→12.5%)[−0.015, +0.100]시사적, 미확증
확증 (시드 2)후보 1,280 · 양성 560.527+0.019[−0.051, +0.038]기준 미달

근거 INSIGHTS.md:758-768. 확증 표본의 기저 수용률은 목표별 평균 4.4%다(crystal_judge_b256.json의 목표별 accept_all = 6.6 / 7.8 / 4.7 / 1.2 / 1.6%, 총 56/1,280) — 목표가 어려워질수록(3·4 eV) 수용이 거의 사라진다. 신뢰구간은 밴드갭 목표를 군집으로 잡은 부트스트랩이다 — 같은 목표에서 나온 후보들이 서로 독립이 아니기 때문이다.

결과와 해석. 발견 단계의 2.8배 상승은 양성 18개짜리 표본의 잡음이었다. 표본을 3배로 늘린 확증 단계에서 AUC는 0.582 → 0.527로, 상승분은 +0.080 → +0.019로 내려앉았고 신뢰구간이 0을 넉넉히 포함한다. 사전등록의 발견/확증 분리가 거짓 양성을 정확히 잡아낸 첫 사례다.

스스로 반박 — 같은 실험의 다른 숫자는 아예 판독 불가다

같은 판정 파일들에는 "확신도로 상위 k개를 고른 팔(P)"과 "그냥 앞에서 k개를 집은 팔(G)"의 수용률도 있다. 그런데 예산을 키울수록 값이 오르내린다 — 후보 16개·k=4에서 G 0.100 / P 0.100(crystal_judge.json), 후보 64개·k=8에서 G 0.000 / P 0.025(crystal_judge_b64.json), 후보 256개·k=25에서 G 0.048 / P 0.032(crystal_judge_b256.json). 가장 큰 예산에서는 확신도로 고른 쪽이 더 나빴다.

하지만 이 세 줄로는 어떤 방향도 주장할 수 없다. 가장 큰 예산에서도 팔 하나의 표본은 목표 5개 × k=25 = 125개이고, G 0.048 / P 0.032는 수용 6개 대 4개라는 뜻이다. 두 개 차이다. 이 비교는 신호가 없다는 것이 아니라 검정력이 없다는 것이 정확한 진술이고, 사전등록 1차 추정량이 상위 10% 상승분(표본 1,280 전체)인 이유도 그것이다.

§6

철회된 주장 — "확신도가 수용과 역상관한다(AUC 0.315)"

2026-07-20 적대검토

무엇을 주장했고 무엇이 틀렸나

2026-07-19: "스도쿠에서 확증된 병리 — 학습된 확신도가 최상위에서 정답과 역전된다 — 가 결정 구조에서도 그대로 나타난다. 국소 확신도만 쓰면 AUC 0.315로 0.5 미만, 즉 역상관이다. 전역 구조 특징을 더하면 0.600으로 반전된다."

fable의 적대검토가 이를 폴드 아티팩트로 지목했고, 원자료 재계산에서 그 지적이 옳았다. 실제 AUC는 0.597이며 역상관이 아니다. 원인은 목표-분리 교차검증에서 폴드마다 따로 학습한 모델의 폴드-바깥 점수를 하나로 합쳐 AUC를 계산한 것이다. 이 조작은 점수와 라벨 사이에 인위적인 음의 상관을 만든다. 바로 전날 ARC에서 같은 함정을 발견해 기록해 둔 것과 정확히 같은 계열이다(INSIGHTS.md:1430-1444).

오늘 원자료에서 다시 직접 재현했다. 판정에 쓰인 특징 파일 crystal_gate_feat.json(후보 534개, 수용 56개)에서 확신도 열과 수용 열만 가지고 순위 AUC를 계산했다. 폴드도 모델도 없이, 두 열의 순위만 비교하는 계산이다.

밴드갭 목표수용 / 전체확신도 AUC (오늘 재계산)2026-07-20 기록
전체 합산56 / 5340.59730.5973 일치
0 eV17 / 760.46360.464 일치
1 eV20 / 1180.59590.596 일치
2 eV12 / 1080.59110.591 일치
3 eV3 / 1250.50550.505 일치
4 eV4 / 1070.33250.333 일치

계산 방식: 수용된 후보와 수용되지 않은 후보의 모든 쌍에 대해 확신도가 더 높은 쪽이 수용된 쪽인 비율(동점은 0.5). 소수 넷째 자리까지 2026-07-20 기록과 일치한다.

해석. 확신도에는 약한 양의 신호가 있다(전체 0.597). 다만 목표별로 보면 3 eV에서 0.506으로 무작위와 같고 4 eV에서 0.333으로 뒤집힌다 — 그런데 그 두 목표의 양성은 각각 3개와 4개다. 이 정도 표본의 AUC는 사실상 아무것도 말하지 않는다. 목표별 AUC 표를 근거로 "어려운 목표에서 확신도가 뒤집힌다"고 말하는 것은 이 데이터가 감당하지 못한다.

이 철회에서 가져갈 방법론

같은 함정을 이틀 만에 두 도메인에서 반복했다. 규칙으로 굳힌다: 폴드마다 다른 모델이 낸 점수는 하나의 순위표로 합치지 않는다. 합쳐야 한다면 폴드 안에서 지표를 계산한 뒤 지표를 평균한다. 원-특징 신호를 볼 때는 애초에 모델을 끼우지 말고 원자료 순위를 직접 본다 — 위 표가 그렇게 계산됐다.

§7

실험 3 — "학습된 확신도가 전역 특징 위에 무언가를 보태는가"

사전등록 VIII · 2026-07-20

의도. §6의 헤드라인("전역 특징을 더하니 0.600으로 좋아졌다")에는 귀속 문제가 남아 있었다. 좋아진 공이 학습된 확신도의 것인가, 아니면 전역 구조 특징만으로도 나오는가? 이 질문은 이 프로젝트 전체의 급소다 — 학습 성분의 순기여를 묻기 때문이다.

방법. 새 시드에서 후보를 다시 뽑고(구조 유효 517개, 기저 수용률 0.122), 네 팔을 목표-분리 5겹 교차검증으로 비교했다. 결정적인 것은 A2(전역 특징만)라는 통제군을 넣은 것이다. 1차 추정량은 커버리지 10%에서 A3(결합) − A2(전역만)이고, 사멸 기준은 한쪽 95% 하한이 0 이하인 것이다.

쓰는 특징선택한 상위 10%의 수용률
A0 기저선택 없음 — 517개 전체의 수용률(63/517)0.1219
A1 국소만학생 확신도0.1176
A2 전역만부피·밀도·최소 원자 간 거리·원자 수·원소 종 수·조성 엔트로피0.0784
A3 결합확신도 + 전역 6개0.0980

근거 h5_judge.json (실행 스크립트 h5_judge.py, 특징 파일 h5_feat.json 517행). 1차 추정량 d = A3 − A2 = +0.0196, 한쪽 95% 하한 +0.0000, 폴드별 부호 [+0.125, 0, 0, −0.091, 0] = 양수 1/5. 사전등록 판정 (c) 사멸.

결과. 결합이 전역 단독을 유의하게 넘지 못했다. 하한이 정확히 0에 닿았고 다섯 폴드 중 한 폴드만 양수다. §6의 "+0.16"이라는 헤드라인은 전역 구조 특징 단독의 공이었고, 학습된 확신도는 그 위에 아무것도 더하지 않았다.

스스로 반박 — 이 표를 위에서부터 다시 읽으면 더 나쁜 사실이 나온다

사전등록의 1차 추정량은 A3 − A2였다. 그런데 A0을 기준으로 보면 네 팔 중 어느 것도 기저를 넘지 못한다 — 기저 0.1219 > A1 0.1176 > A3 0.0980 > A2 0.0784. 즉 후보를 아무렇게나 집는 것이 어떤 학습된 선택기보다 낫거나 같다. 사전등록이 A3 − A2를 물었기 때문에 이 사실은 판정문에 등장하지 않지만, 실무적으로는 이쪽이 더 중요한 결론이다.

그리고 판정 스크립트의 부칙①은 "국소 신호가 실재한다"를 합산 AUC 0.702로 확인하고 통과시켰는데(h5_judge.py:11-13), 이 값은 held-out이 아니라 원자료 순위 그대로의 기술 통계다. 같은 확신도 열을 다른 시드의 후보 풀에서 재면 0.597이다(§6). 양성이 56~63개인 표본에서 이 추정치가 시드에 따라 0.1이나 움직인다. "국소 신호가 실재한다"는 문장은 이 데이터로는 강하게 말할 수 없다.

확인 못 한 것: 이 실험 계열에서 "전역 특징은 쉬운 목표에서만 신호를 준다(목표별 AUC 0.72~0.73 대 0.56/0.50)"는 요약이 오케스트레이터 메모에 있으나, 그 숫자는 INSIGHTS.md에도 h5_judge.json에도 없고 산출 스크립트도 특정되지 않는다. 이 페이지에는 싣지 않는다.

§8

실험 4 — 이 프로젝트의 중심 가설을 처음으로 직접 시험했다

사전등록 X · 2×2 요인설계 · 2026-07-24

배경이 먼저 필요하다. 이 프로젝트의 노벨티 주장은 헌법 §2에 이렇게 적혀 있다 — 선행 연구(TRM/HRM)는 샘플당 약 1,000배의 데이터 증강에 의존하는데, 최소 기술 길이(MDL) 원리가 그 증강의 대체물이라는 것이다. 그중 잠재-MDL은 생성기의 변분 KL 항이 잠재 코드의 길이를 압축하게 하는 성분이다.

배관 발견 — 그 성분은 지금까지 한 번도 켜진 적이 없었다

사전등록 X를 준비하면서 코드를 열어보니, 잠재-MDL의 KL 항은 정답 특징 y_feat이 전달되어야 활성화되는데 ARC 생성기와 결정 구조 생성기 양쪽 모두에서 그것이 전달되지 않고 있었다. 따라서 KL 항은 항상 정확히 0이었다(STRATEGY.md:306-309, 감사 docs/INTENT_TRACE.md:13). 하이퍼파라미터 --kl-beta 0.01은 선언되고 기록되고 출력됐지만 그래디언트에는 닿지 않았다.

즉 사전등록 X는 이 프로젝트에서 잠재-MDL이 실제 손실에 들어간 최초의 실험이다. 그전까지의 모든 "MDL" 관련 결과는 순수 교차엔트로피 학습의 결과였다.

설계. 두 성분을 각각 켜고 끄는 2×2다. 네 셀 모두 같은 시드·같은 하이퍼파라미터로 새로 학습했고, 플래그만 다르다.

팔 A

순수 교차엔트로피. 코드가 assert kl is None으로 KL이 꺼졌음을 강제 검증한다.

팔 B

+ 잠재-MDL. 정답 특징을 사후 분포에 전달해 KL 항을 되살린다. assert kl is not None.

팔 C

+ 자기 생성 손상복구. 배치의 절반에서 입력 캔버스의 30~90%를 그 위치의 합법 어휘 안 무작위 토큰으로 바꾸고, 정답 목표는 원본 그대로 둔다.

팔 D

둘 다.

구현 crystal_s0_train.py:194-217. 사전등록 원문 STRATEGY.md:304-330. 판정 규칙·신뢰구간 계산법·붕괴 검사를 발사 전에 고정했다.

구성기하 통과구조 유효수용수용률 (1,280 기준)
A순수 교차엔트로피1,102505610.04766
B+ 잠재-MDL1,055378370.02891
C+ 손상복구1,233718600.04688
D둘 다1,22929150.01172

근거 prX_labA~D.log · prX_verdict.json · prX_{A,B,C,D}_lab.json. "구조 유효" 열은 라벨 파일의 struct_ok 합계로 오늘 다시 세었다.

추정량무엇을 묻는가한쪽 95% 하한목표별 부호사전등록 판정
dKL잠재-MDL의 주효과 (B∪D) − (A∪C)−0.0270−0.04300 / 5(c) 사멸
dcorr손상복구의 주효과 (C∪D) − (A∪B)−0.0090−0.02852 / 5(c) 사멸
상호작용(D−C) − (B−A)−0.0164시너지 없음
drepl"MDL이 증강을 대체하는가" B − C−0.0180MDL < 손상복구

판정 — 두 주효과 모두 사멸, 그리고 재프레이밍 금지 조항이 발동됐다

사전등록 §15는 발사 전에 이렇게 못 박아 두었다: "두 주효과 모두 (c)면 헤드라인 'MDL 계열 손실은 살아있는 신호가 있는 도메인에서도 교차엔트로피에 무기여'로 확정, 재프레이밍 금지."(STRATEGY.md:325-327) 그 조항이 발동됐다.

잠재-MDL은 무기여가 아니라 유해했다. 다섯 개 밴드갭 목표 중 효과가 양수인 목표가 하나도 없고(0/5), 둘 다 켠 셀 D의 수용률은 순수 교차엔트로피 셀 A의 약 1/4이다. 이 프로젝트의 노벨티 주장이 처음으로 직접 시험대에 올라 기각됐다.

기록된 기제 가설. 사후 분포가 학습 중 정답(y_feat)을 보므로, 배포 때 실제로 쓰이는 사전 분포가 스스로 규칙을 배울 압력을 잃는다 — 실험 일지는 이를 사후 의존(posterior-의존)이라 부르고 "변분 오토인코더 문헌의 알려진 실패 양식이 재현된 것"으로 기록한다(INSIGHTS.md:1619-1621). 이것은 기록된 가설이지 검정된 기제가 아니다 — 이 실험에서 사전/사후 분포의 분리를 직접 계측하지는 않았다.

FIG B · 오늘 새로 계산한 진단 — 무엇이 실제로 부서졌나

확신도 범위
목표 5개 전체
서로 다른 토큰 배열
분모 = 생성 1,280
같은 좌표에 원자가 겹친 후보
분모 = 기하 통과분
평균 원자 수
기하 통과분
A 순수 CE−3.21 ~ −1.531280 / 1280363 / 1102 = 32.9%12.44
B +잠재-MDL−0.77 ~ −0.14921 / 1280564 / 1055 = 53.5%7.44
C +손상복구−3.86 ~ −2.581279 / 128047 / 1233 = 3.8%19.06
D 둘 다−0.69 ~ −0.0011280 / 12801198 / 1229 = 97.5%17.03

이 표는 사전등록 밖의 사후 진단이며 오늘(2026-07-27) 새로 계산했다 — 어떤 주장의 근거가 아니라 기제 가설의 방향을 좁히는 용도다. 확신도 범위는 prX_run.log의 목표별 conf[…] 최솟값·최댓값이고, 나머지 세 열은 prX_{A,B,C,D}_lab.jsontokens 열을 세어 얻었다. "같은 좌표에 원자가 겹친 후보"는 한 구조 안에서 두 개 이상의 원자 슬롯이 동일한 이산 좌표 세 쌍을 갖는 경우로 정의했다.

이 진단이 말하는 것. 잠재-MDL을 켜면 토큰 분포가 급격히 뾰족해진다 — 확신도 범위가 A의 −3.2~−1.5에서 D의 −0.69~−0.001로 사실상 결정론에 붙는다. 그 결과가 셀마다 다르게 나타난다. B에서는 1,280개 중 359개가 다른 후보와 완전히 같은 토큰 배열이 되고, D에서는 배열 자체는 전부 다르지만 한 구조 안에서 원자들이 같은 좌표 칸으로 몰린다(97.5%). 원자 두 개가 같은 좌표에 있으면 최소 원자 간 거리가 0이 되므로 구조 유효성 검사를 통과할 수 없다 — 셀 D의 구조 유효가 29개(2.4%)로 무너진 것이 바로 이것이다.

반대로 손상복구(C)는 정확히 이 실패를 고친다 — 좌표 겹침이 3.8%로 가장 낮고 구조 유효가 718개로 가장 많다. 그런데도 수용률은 오르지 않았다(0.0469 대 A의 0.0477). 이는 기록된 해석과 정합한다: 구조가 물리적으로 성립하는 것과 요구한 밴드갭을 갖는 것은 다른 능력이고, 손상복구는 앞의 것만 가르친다(INSIGHTS.md:1621-1623).

스스로 반박 — 이 진단으로 할 수 있는 말과 할 수 없는 말

할 수 있는 말: 좌표 겹침 비율은 네 셀에서 3.8% / 32.9% / 53.5% / 97.5%로 크게 갈리고, 이 순서가 구조 유효 개수(718 / 505 / 378 / 29)의 역순과 정확히 일치한다. 셀 D의 구조 붕괴는 "무엇이 부서졌는지"가 특정된다.

할 수 없는 말: 이것은 상관이지 인과가 아니다. 잠재-MDL이 좌표 겹침을 일으켰다는 것을 보이려면 KL 계수를 0에서 키우며 겹침률이 단조 증가하는지를 봐야 하고, 그 실험은 돌리지 않았다. 또 이 진단은 단일 시드이며 사전등록 밖이다 — 판정은 어디까지나 위의 d_KL 표가 하는 것이고, 이 표는 그 판정을 강화하지도 약화하지도 않는다.

§9

이 판정들의 사정거리 — "최종 사이클 효과"까지다

2026-07-26 정본화 감사

2026-07-26의 저장소 감사가 위 판정들에 범위 제한을 붙였다. 이것은 결과를 뒤집지 않지만, 결과가 무엇에 대한 진술인지를 좁힌다.

우리 생성기는 재귀 모델이다 — 잠재 상태를 K번 갱신한 뒤 마지막 상태에서 토큰을 읽어낸다. 이때 손실을 매 스텝마다 걸 수도 있고 마지막 한 번만 걸 수도 있다. 헌법 §1은 매 스텝 감독(deep supervision)을 생성기 정의에 포함시킨다.

결정 구조에는 합법이면서 매-스텝인 트레이너가 존재하지 않는다 두 후보가 각각 절반씩 어긋난다. 매 스텝인 latent_reasoning/faithful/crystal_gram_train.py는 목적함수가 헌법 §4를 위반한다 — 평균제곱오차 목표 회귀(:14-18), 스칼라 궤적 균형 손실(:555), 에너지 입력 그래디언트(:877). 합법인 experiments/crystal/crystal_s0_train.py끝점 단일 감독이다 — K번 롤아웃 뒤(:210) 마지막 상태에서 단 한 번 디코드하고 손실을 건다(:215-217). 파일 상단이 SUPERVISION = "endpoint"로 자기 선언하고 게이트가 이를 강제한다(:20-25). 근거 docs/S0_CANONICALIZATION.md:33-38단 그 문서가 인용한 줄 번호 :203-212는 그 뒤 추가된 선언 블록 때문에 약 7줄 밀렸다. 조항 이름으로 대조해야 한다.
끝점 단일이면 앞 K−1 스텝의 과제 감독 그래디언트는 정확히 0이다 추측이 아니라 실측이다. 앞 K−1 스텝을 no_grad로 감싼 것과 감싸지 않은 것을 같은 시드로 1스텝 학습해 파라미터 그래디언트를 비트 단위로 비교했더니 14개 파라미터 텐서 전부 동일(최대 절대차 0.000e+00)했고, 적대 검증에서 10/10으로 독립 재현됐다. 근거 docs/PRIOR_DIFF.md:87 · docs/CONSTITUTION.md:381-384

따라서 사전등록 X의 2×2 판정은 "최종 사이클 효과"로만 해석해야 한다(헌법 원장이 이 캐비앗을 명문화했다, docs/CONSTITUTION.md:394-397). 헌법 §1이 선언한 매-스텝 감독은 결정 구조에서 한 번도 시험되지 않았다.

그렇다고 "매 스텝으로 바꾸면 됐을 것"이라고 말하면 안 된다

같은 감사가 이 반론을 미리 차단해 두었다. 스도쿠에서 최소 차이 대조로 매-스텝 정답 감독 성분만 떼어 재면, 끝점 대비 held-out −0.00595(다중비교 보정 p=1.0) · weakOOD −0.00696(보정 p=0.679)로 낫지 않았다. 유의했던 유일한 성분은 스텝마다 다른 타깃을 주는 팔이었다(weakOOD +0.04888, 보정 p=0.0044). 근거 docs/CONSTITUTION.md:383-388

즉 감독 입도는 미검정 축이지 알려진 원인이 아니다. 정직한 진술은 "이 판정의 사정거리는 끝점 감독 조건이며, 매-스텝 조건은 별건 사전등록 대상"이다.

§10

지금 무엇이 살아 있고 무엇이 죽었나

결정 구조 한정
주장상태근거 / 무엇이 결정했나
86토큰 이산 캔버스가 결정 구조를 손실 없이 담는다 유효 사전등록 왕복 게이트: 실제 구조 64개 100% 복원, 구조 유효성 보존 1.000 INSIGHTS.md:686-687
7.8M 소형 재귀 모델이 무증강으로 조건부 결정 구조를 만든다 (수용률 약 4.8%) 유효 · 단 비교 상대 없음 61/1280 prX_labA.log. 문헌에 ±허용오차 명중률을 보고하는 조건부 생성 기준선이 없어 좌표를 잡을 수 없다 → §3
SUN 0.442 선행연구와 비교 불가 Stable 다리가 부피/원자 밴드 검사이고 에너지를 계산하지 않는다. Unique·Novel 다리는 한 개도 걸러내지 않았다 crystal_sample.py:469-484,506-508 → §3
학생 확신도로 좋은 후보를 고를 수 있다 미확증 확증 표본에서 AUC 0.527, 상위 10% 상승분 +0.019, 신뢰구간 [−0.051, +0.038] INSIGHTS.md:766-768
확신도가 수용과 역상관한다 (AUC 0.315) 철회 원자료 재계산 0.5973. 폴드-바깥 점수를 합산한 아티팩트 INSIGHTS.md:1430-1444 · 오늘 재현 → §6
학습된 확신도가 전역 구조 특징 위에 기여한다 (c) 사멸 A3 − A2 = +0.0196, 하한 +0.0000, 폴드 부호 1/5 h5_judge.json → §7
잠재-MDL이 데이터 증강의 대체물이다 (헌법 §2 노벨티 주장) (c) 사멸 · 재프레이밍 금지 dKL = −0.0270, 하한 −0.0430, 목표별 부호 0/5 prX_verdict.json → §8
자기 생성 손상복구가 수용률을 올린다 (c) 사멸 dcorr = −0.0090, 하한 −0.0285, 부호 2/5. 단 구조 유효는 505 → 718로 올린다 → §8
위 판정들이 "매 스텝 감독" 조건에도 적용된다 범위 밖 결정 구조의 합법 트레이너는 끝점 단일이며, 앞 K−1 스텝의 감독 그래디언트는 정확히 0 docs/PRIOR_DIFF.md:87 → §9
§11

이 페이지가 지목하는 다음 작업

전부 미승인 · 제안

위 세 가지 중 어느 것도 실행 승인을 받지 않았다. 이 프로젝트의 지시대로, 실험 착수 전에 Codex와 fable 양쪽 피드백·상호 논쟁·수렴을 거쳐야 한다.

§12

용어

이 페이지에서 쓴 뜻 그대로

1 단위 격자

결정에서 반복되는 최소 상자. 변 길이 세 개와 각도 세 개, 그리고 그 안의 원자 목록으로 결정 하나가 완전히 결정된다.

2 밴드갭

전자가 자유롭게 움직이려면 넘어야 하는 에너지 문턱(단위 eV). 0이면 금속처럼 전기가 통하고, 클수록 절연체다. 반도체·태양전지 설계의 1차 설계 변수다.

3 볼록 껍질 위 에너지

같은 원소 조합으로 만들 수 있는 물질들 중 에너지가 가장 낮은 조합들을 이은 곡면이 볼록 껍질이다. 어떤 구조가 그 위로 0.1 eV/원자 미만이면 안정하다고 본다. 이 계산에는 실제 에너지 값이 필요하다 — 우리 대리 지표에는 그것이 없다.

4 mp_20 / MP-20

Materials Project 데이터베이스에서 원자 20개 이하 결정만 추린 표준 벤치마크. 이 분야 논문 대부분이 여기서 수치를 보고한다. 우리 학습 분할은 27,136개다.

5 대리 백엔드

진짜 판정자(밀도범함수이론 계산, 기계학습 원자간 퍼텐셜)를 쓸 수 없을 때 대신 끼우는 값싼 계산. 값이 나온다고 같은 것을 재는 게 아니다 — 이 페이지의 §3이 그 사례다.

6 사전등록

결과를 보기 전에 추정량·표본 크기·성공 기준·판정 분기를 문서와 코드에 못 박는 절차. 이 페이지의 §5·§7·§8 판정은 전부 이 절차 아래 나왔고, §5는 그 덕에 거짓 양성을 잡았다.

7 (c) 사멸

사전등록 판정 등급. 한쪽 95% 신뢰 하한이 0 이하이면 그 성분은 "대조 대비 무기여"로 확정되고, 결과를 다른 이야기로 다시 포장하는 것이 금지된다.

8 AUC

수용된 후보와 수용되지 않은 후보를 무작위로 한 쌍 뽑았을 때, 점수가 더 높은 쪽이 수용된 쪽일 확률. 0.5면 무작위, 1.0이면 완벽, 0.5 미만이면 뒤집혀 있다는 뜻이다.

MatterGPT_RL build log · 2026-07-27 · 근거 파일: crystal_sun.log · crystal_judge*.json · crystal_gate_feat.json · h5_feat.json · h5_judge.json · prX_verdict.json · prX_{A,B,C,D}_lab.json · prX_run.log · prX_lab{A,B,C,D}.logINSIGHTS.md · STRATEGY.md · docs/CONSTITUTION.md · docs/S0_CANONICALIZATION.md · docs/PRIOR_DIFF.md. 선행연구 수치 출처는 §3 표에 병기. back to overview