이 페이지는 새 실험이 아니라 이미 돌린 결정 구조 실험 전체를 처음부터 다시 설명하고, 스스로 반박하는 문서다. 결정 구조 생성이 무엇인지 모르는 사람을 기준으로 썼다. 모든 수치에는 표본 크기·신뢰구간·측정 백엔드·사전등록 여부를 붙였고, 파일과 줄 번호로 근거를 댈 수 없는 숫자는 "미확인"으로 남겼다.
결정(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) 계산을 돌려야 하고, 그건 후보 하나에 수 시간이 든다.
그런데 바로 그 점이 이 도메인의 함정이기도 하다. 손 자가 없으므로 우리는 대리 판정자를 쓴다 — 신경망 밴드갭 예측기와 기하 검사기다. 그러면 "생성기가 좋아졌다"와 "생성기가 대리 판정자를 만족시키는 법을 배웠다"가 구분되지 않는다. 이 페이지의 모든 수용률 숫자는 이 한계를 안고 있다.
아래는 우리 저장소의 구현 기준이다. 같은 이름의 지표가 논문마다 다르게 계산되므로, 이름이 아니라 계산식을 봐야 한다 — §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의 분해가 이를 그대로 반영한다), 표기가 독자를 오도하기 쉽다.
먼저 선행연구의 좌표다. 아래는 모두 MP-20(Materials Project에서 원자 20개 이하 결정만 추린 표준 벤치마크, CDVAE 논문이 도입)에서 보고된 수치다. 우리가 쓰는 학습 분할은 27,136개다.
| 모델 | 구조 유효성 | 조성 유효성 | SUN | 출처·조건 |
|---|---|---|---|---|
| CDVAE | 99.15% | 99.49% | — | FlowLLM 논문 표 1 재보고 |
| DiffCSP | 99.71% | 99.76% | — | 같은 표 |
| FlowMM | 99.49% | 99.58% | — | 같은 표 |
| FlowLLM | 99.06% | 99.82% | 4.92% | MP-20 무조건 생성. 안정 17.82% 중 약 48%가 신규, 그중 58%가 중복 아님 |
| MatterGen | — | — | 38.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%를 탈락) |
| Stable | 501 / 534 = 93.8% | 부피/원자가 5~40 ų 구간에 있으면 0, 벗어나면 벗어난 만큼. 문턱 0.1과 비교. 에너지를 계산하지 않는다 (crystal_sample.py:469-484) | 사실상 안 걸러냄 |
| Unique | 534 / 534 = 100% | pymatgen StructureMatcher로 배치 내 중복 제거 | 한 개도 안 걸러냄 |
| Novel | 534 / 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%와 정합한다. 이것이 이 도메인에서 우리 생성기의 실제 위치다.
의도. 이 프로젝트는 스도쿠·ARC·결정 구조를 하나의 레시피로 다루려 한다 — 같은 재귀 생성기, 같은 손실(교차엔트로피 + 잠재 잡음 KL), 같은 이산 캔버스. 그러려면 연속량인 결정 구조를 정수 토큰의 고정 길이 캔버스로 바꿔야 했다.
방법. 2026-07-18에 확정된 인코딩(experiments/crystal/crystal_tokens_v2.py:29-35)은 결정 하나를 정확히 86개의 정수로 적는다.
FIG A · 86토큰 캔버스의 배치
이 표현이 정보를 잃지 않는지 먼저 확인했다. 사전등록한 왕복 게이트 — 실제 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, 폭 512 | prX_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 구조 객체로 변환된다는 뜻일 뿐, 그 구조가 물리적으로 말이 된다는 뜻이 아니다. 말이 되는지는 다음 단계인 구조 유효성이 판정하고, 거기서 절반 이상이 탈락한다.
의도. 생성기가 후보를 여러 개 뽑는다면, 그중 어느 것이 통과할지를 생성기 자신이 알 수 있는가? 알 수 있다면 대리 판정자를 부르기 전에 걸러낼 수 있고, 그것이 이 프로젝트가 노리는 "자(ruler)"의 가장 값싼 형태다.
가설. 학생의 자기 확신도 — 생성한 토큰들의 로그 확률 평균, c(x) = exp(mean log p) — 가 수용 여부와 양의 상관을 가지며, 상위 10%를 고르면 수용률이 유의하게 오른다.
방법. 발견 단계(시드 0·1)와 확증 단계(시드 2)를 표본을 분리해 사전등록했다. 1차 추정량은 상위 10% 선택의 수용률 상승분이고, 성공 기준은 목표별 군집 부트스트랩 신뢰구간의 한쪽 하한이 0보다 큰 것이다.
| 단계 | 표본 | 확신도-수용 AUC | 상위 10% 상승분 | 95% 신뢰구간 | 판정 |
|---|---|---|---|---|---|
| 발견 (시드 0·1) | 후보 400 · 양성 18 | 0.582 | +0.080 (4.5%→12.5%) | [−0.015, +0.100] | 시사적, 미확증 |
| 확증 (시드 2) | 후보 1,280 · 양성 56 | 0.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 전체)인 이유도 그것이다.
무엇을 주장했고 무엇이 틀렸나
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 / 534 | 0.5973 | 0.5973 일치 |
| 0 eV | 17 / 76 | 0.4636 | 0.464 일치 |
| 1 eV | 20 / 118 | 0.5959 | 0.596 일치 |
| 2 eV | 12 / 108 | 0.5911 | 0.591 일치 |
| 3 eV | 3 / 125 | 0.5055 | 0.505 일치 |
| 4 eV | 4 / 107 | 0.3325 | 0.333 일치 |
계산 방식: 수용된 후보와 수용되지 않은 후보의 모든 쌍에 대해 확신도가 더 높은 쪽이 수용된 쪽인 비율(동점은 0.5). 소수 넷째 자리까지 2026-07-20 기록과 일치한다.
해석. 확신도에는 약한 양의 신호가 있다(전체 0.597). 다만 목표별로 보면 3 eV에서 0.506으로 무작위와 같고 4 eV에서 0.333으로 뒤집힌다 — 그런데 그 두 목표의 양성은 각각 3개와 4개다. 이 정도 표본의 AUC는 사실상 아무것도 말하지 않는다. 목표별 AUC 표를 근거로 "어려운 목표에서 확신도가 뒤집힌다"고 말하는 것은 이 데이터가 감당하지 못한다.
이 철회에서 가져갈 방법론
같은 함정을 이틀 만에 두 도메인에서 반복했다. 규칙으로 굳힌다: 폴드마다 다른 모델이 낸 점수는 하나의 순위표로 합치지 않는다. 합쳐야 한다면 폴드 안에서 지표를 계산한 뒤 지표를 평균한다. 원-특징 신호를 볼 때는 애초에 모델을 끼우지 말고 원자료 순위를 직접 본다 — 위 표가 그렇게 계산됐다.
의도. §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에도 없고 산출 스크립트도 특정되지 않는다. 이 페이지에는 싣지 않는다.
배경이 먼저 필요하다. 이 프로젝트의 노벨티 주장은 헌법 §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다. 네 셀 모두 같은 시드·같은 하이퍼파라미터로 새로 학습했고, 플래그만 다르다.
순수 교차엔트로피. 코드가 assert kl is None으로 KL이 꺼졌음을 강제 검증한다.
+ 잠재-MDL. 정답 특징을 사후 분포에 전달해 KL 항을 되살린다. assert kl is not None.
+ 자기 생성 손상복구. 배치의 절반에서 입력 캔버스의 30~90%를 그 위치의 합법 어휘 안 무작위 토큰으로 바꾸고, 정답 목표는 원본 그대로 둔다.
둘 다.
구현 crystal_s0_train.py:194-217. 사전등록 원문 STRATEGY.md:304-330. 판정 규칙·신뢰구간 계산법·붕괴 검사를 발사 전에 고정했다.
| 셀 | 구성 | 기하 통과 | 구조 유효 | 수용 | 수용률 (1,280 기준) |
|---|---|---|---|---|---|
| A | 순수 교차엔트로피 | 1,102 | 505 | 61 | 0.04766 |
| B | + 잠재-MDL | 1,055 | 378 | 37 | 0.02891 |
| C | + 손상복구 | 1,233 | 718 | 60 | 0.04688 |
| D | 둘 다 | 1,229 | 29 | 15 | 0.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.0430 | 0 / 5 | (c) 사멸 |
| dcorr | 손상복구의 주효과 (C∪D) − (A∪B) | −0.0090 | −0.0285 | 2 / 5 | (c) 사멸 |
| 상호작용 | (D−C) − (B−A) | −0.0164 | — | — | 시너지 없음 |
| drepl | "MDL이 증강을 대체하는가" B − C | −0.0180 | — | — | MDL < 손상복구 |
판정 — 두 주효과 모두 사멸, 그리고 재프레이밍 금지 조항이 발동됐다
사전등록 §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.53 | 1280 / 1280 | 363 / 1102 = 32.9% | 12.44 |
| B +잠재-MDL | −0.77 ~ −0.14 | 921 / 1280 | 564 / 1055 = 53.5% | 7.44 |
| C +손상복구 | −3.86 ~ −2.58 | 1279 / 1280 | 47 / 1233 = 3.8% | 19.06 |
| D 둘 다 | −0.69 ~ −0.001 | 1280 / 1280 | 1198 / 1229 = 97.5% | 17.03 |
이 표는 사전등록 밖의 사후 진단이며 오늘(2026-07-27) 새로 계산했다 — 어떤 주장의 근거가 아니라 기제 가설의 방향을 좁히는 용도다. 확신도 범위는 prX_run.log의 목표별 conf[…] 최솟값·최댓값이고, 나머지 세 열은 prX_{A,B,C,D}_lab.json의 tokens 열을 세어 얻었다. "같은 좌표에 원자가 겹친 후보"는 한 구조 안에서 두 개 이상의 원자 슬롯이 동일한 이산 좌표 세 쌍을 갖는 경우로 정의했다.
이 진단이 말하는 것. 잠재-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 표가 하는 것이고, 이 표는 그 판정을 강화하지도 약화하지도 않는다.
2026-07-26의 저장소 감사가 위 판정들에 범위 제한을 붙였다. 이것은 결과를 뒤집지 않지만, 결과가 무엇에 대한 진술인지를 좁힌다.
우리 생성기는 재귀 모델이다 — 잠재 상태를 K번 갱신한 뒤 마지막 상태에서 토큰을 읽어낸다. 이때 손실을 매 스텝마다 걸 수도 있고 마지막 한 번만 걸 수도 있다. 헌법 §1은 매 스텝 감독(deep supervision)을 생성기 정의에 포함시킨다.
따라서 사전등록 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
즉 감독 입도는 미검정 축이지 알려진 원인이 아니다. 정직한 진술은 "이 판정의 사정거리는 끝점 감독 조건이며, 매-스텝 조건은 별건 사전등록 대상"이다.
| 주장 | 상태 | 근거 / 무엇이 결정했나 |
|---|---|---|
| 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 |
SUN을 다시 재거나, 아니면 보고를 그만둔다
지금 값은 부피 밴드 검사다. 선택지는 둘 — 기계학습 원자간 퍼텐셜(CHGNet 등)을 설치해 실제 에너지로 Stable을 재고 참조 조성 집합을 mp_20에서 채우거나, 아니면 SUN을 지표 목록에서 내리고 수용률만 보고한다. 지금처럼 이름만 SUN인 숫자를 남겨두는 것이 가장 나쁘다.
수용 라벨을 예측기 잡음과 분리한다
±0.3 eV 문턱이 검증기 자신의 test MAE 0.362 eV보다 작다. 같은 구조를 여러 번 채점하거나 독립적인 두 번째 예측기를 붙여, 수용률 중 얼마가 구조의 성질이고 얼마가 예측기 잡음인지를 분리해야 한다. 이 분리 없이는 어떤 수용률 개선도 해석되지 않는다.
§8 진단을 인과로 승격하려면 KL 계수 스윕
좌표 겹침률과 구조 유효 개수의 역순 일치는 상관이다. KL 계수를 0 → 0.001 → 0.01 → 0.1로 올리며 겹침률이 단조 증가하는지 보면 기제가 인과로 굳는다. 사전등록 대상이며, 그전에는 §8 표를 "진단"으로만 인용한다.
위 세 가지 중 어느 것도 실행 승인을 받지 않았다. 이 프로젝트의 지시대로, 실험 착수 전에 Codex와 fable 양쪽 피드백·상호 논쟁·수렴을 거쳐야 한다.
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}.log 및 INSIGHTS.md · STRATEGY.md · docs/CONSTITUTION.md · docs/S0_CANONICALIZATION.md · docs/PRIOR_DIFF.md. 선행연구 수치 출처는 §3 표에 병기. back to overview