# AIFlow Math Ink 0.6 — Federation 정식 감사 검증일: 2026-07-24 상태: 연구 기준선 교정 완료, 제품 출시 불가 ## 결론 기존 0.6 federation은 origin ID만 보면 누수가 없었지만, 정규화 trajectory와 writer 기준으로는 두 문제가 있었다. - UJI Pen v1의 1,364개 trajectory가 UJI Pen v2에 전부 포함돼 있었다. - HWRT 공식 train/test 사이에 동일 writer 93명이 존재했고, 학습 코드가 train 표본을 sample hash로 다시 나눠 writer-independent 조건을 만족하지 못했다. 따라서 기존 federation checkpoint의 정확도는 연구 이력으로만 남기며 제품 근거로 사용하지 않는다. 교정한 로더로 다시 학습하기 전에는 새 기준선으로 승격하지 않는다. ## 교정 내용 1. UJI v2를 `uji-pen-family`의 canonical source로 선택했다. 2. 이동·크기를 제거한 stroke별 trajectory SHA-256으로 label-aware 중복을 제거했다. 3. 같은 trajectory에 여러 label이 붙은 표본은 자동으로 정답을 발명하지 않고 전부 격리했다. 4. HWRT 공식 test는 제품 로더에서 완전히 제외했다. 5. 승인된 HWRT train writer 275명을 안정적 hash 순서로 train/validation/test 80/10/10에 가깝게 분리했다. 6. UJI v2 공식 test는 보존하고, 공식 train writer의 10%만 validation으로 격리했다. 7. 학습·평가 스크립트는 로더의 명시적 split을 사용하며 HWRT를 sample hash로 재분할하지 않는다. ## 수정 전후 | 감사 항목 | 수정 전 | 수정 후 | |---|---:|---:| | 유효 supervised source | 4 | 3 | | UJI v1↔v2 trajectory overlap | 1,364 | 0 | | HWRT train/test writer overlap | 93 | 0 | | 전체 origin overlap | 0 | 0 | | 전체 trajectory signature overlap | 1,364 | 0 | | origin/writer/device split leakage | 93 | 0 | | UJI v2 train/validation/test | 5,971/0/2,981 | 5,372/599/2,981 | | HWRT train/validation/test | 잘못된 sample 재분할 | 27,387/261/552 | UJI v1은 데이터가 사라진 것이 아니라 v2의 완전한 mirror라 독립 source와 sampler mass에서 제외됐다. HWRT는 지원 어휘와 승인 train만 남겨 28,200개를 사용한다. ## 출시 gate 현재 출처 registry와 checkpoint는 다음 이유로 정식 gate를 통과하지 못한다. - 조사 출처: 38/200 - 승인된 배포 독립 그룹: 7/30 - 실제 교정 federation supervised 독립 source: 3 - 현재 checkpoint의 `training_source_ids`: 0개 - 교정 loader로 재학습한 seed 17·31·47 checkpoint: 없음 중복·split 누수 gate는 통과했지만 데이터 수와 checkpoint provenance gate는 실패다. 따라서 `product_validation=false`가 맞다. ## 다음 실험 1. 권리 검토가 끝난 24개 미전처리 source를 raster verifier·geometry pretrain 용도로 materialize한다. 2. supervised 378-label trajectory는 mirror가 아닌 독립 source를 우선 확보한다. 3. 교정 federation으로 seed 17·31·47을 GPU 재학습한다. 4. 각 checkpoint에 실제 `training_source_ids`, 독립 group, registry SHA-256을 기록한다. 5. writer/device/source-disjoint top-1 92%, top-5 99%와 raster label 보존 90%를 모두 통과한 경우에만 모바일 student를 다시 만든다. 기계 판독 가능한 결과는 `research/runs/math_ink_06_federation_release_audit_20260724/federation_audit.json`에 저장했다. ## 교정 후 seed-17 GPU 재학습 CUDA 12.1 PyTorch를 D: 격리 환경에 설치해 GTX 1650에서 실행했다. 기존 federated trainer가 `MathInk06Engine`의 CPU 기본값을 그대로 사용하던 결함을 발견해 `--device auto|cpu|cuda`를 추가하고, 명시적 CUDA 요청이 CPU로 조용히 fallback하지 않게 했다. Raster top-4의 batch 64는 4GB WDDM peak OOM이 발생해 batch 16으로 고정했다. Federation 이전 fusion checkpoint에서 3 epoch를 학습하고, 선택 checkpoint를 7 epoch 추가 미세조정했다. 두 단계 모두 seed 17이며 서로 다른 seed ensemble이 아니다. | Source | Online top-1 | Online top-5 | Raster top-1 | Raster top-5 | |---|---:|---:|---:|---:| | Pendigits | 90.2% | 99.2% | 36.6% | 64.6% | | UJI Pen v2 | 69.6% | 93.0% | 37.8% | 69.8% | | HWRT 교정 test | 83.2% | 99.0% | 75.6% | 94.4% | 전체 7,031개 test를 전수 평가하면 online top-1/top-5는 82.41/96.60%, visual-family top-1은 87.01%다. Exact 오류의 26.19%는 동일 visual family 안에서 발생했다. Writer accuracy p10은 56.08%이며 최저 writer는 0%다. 상위 오류는 `1→2` 72건, `7→1` 41건, `c→C` 36건, `s→S` 27건, `x→X` 26건이다. 지원량이 많은 숫자도 `1` top-1 73.44%로 낮고, UJI 계열 소문자 `s/x/o/c`는 top-1 12.77/14.58/14.89/15.56%에 그친다. 따라서 현재 병목은 다음 두 갈래다. 1. UJI unseen writer에서 대소문자와 `O/0/o` exact 의미를 고립 shape만으로 결정하려는 문제 2. raster가 virtual stroke로 변환된 뒤 online encoder 분포를 보존하지 못하는 문제 단순 seed 31·47 반복은 모든 seed가 개별 92/99/90 gate를 통과해야 한다는 조건을 만족시킬 가능성이 낮아 보류한다. 먼저 source별 오류 감사에 따라 크기·행 문맥 exact resolver와 독립 raster vectorizer 데이터를 보강한다. 새 checkpoint SHA-256은 `9190d9b997110657a831209b5041ea0d053b9051304b87560766a2e084516589`인 3-epoch checkpoint에서 시작했으며, stage-2 checkpoint와 오류 감사는 `research/runs/math_ink_06_federation_clean_seed17_stage2_20260724/`에 저장했다. 제품 검증은 계속 false다. ## Source cap 해제와 decoder shadow 실험 UJI의 낮은 일반화가 2,000개 source cap 때문인지 확인하기 위해 Pendigits 6,000개, UJI v2 전체 5,372개, HWRT 4,457개를 사용해 총 15,829개로 다시 학습했다. GTX 1650에서는 batch 32가 OOM 없이 동작했고, batch 64만 raster top-4 peak OOM이었다. | Source | Online top-1 | Online top-5 | Raster top-1 | Raster top-5 | |---|---:|---:|---:|---:| | Pendigits | 93.2% | 99.4% | 42.8% | 72.6% | | UJI Pen v2 | 71.8% | 93.8% | 41.0% | 72.4% | | HWRT 교정 test | 84.0% | 99.0% | 74.4% | 94.6% | 증가량은 UJI online top-1 +2.2%p, raster top-1 +3.2%p에 그쳤다. 따라서 단순 source cap 해제로 UJI writer generalization 또는 378-class exact ambiguity를 해결할 수 없다는 결론이다. 같은 checkpoint에서 raster encoder·causal virtual decoder만 2 epoch 학습한 shadow 실험도 수행했다. Pendigits raster가 validation 45.67%에서 최고 63.33%까지 오르지만 HWRT는 78.16%에서 71.65%로 떨어져 모든 interpolation이 source holdout guard에서 탈락했다. 이 변경은 checkpoint로 채택하지 않았고 3번째 epoch는 중단했다. 다음 구현 우선순위는 (1) UJI의 case/O-0/cross family를 formula-relative size·neighbor context로 푸는 exact resolver, (2) source-aware virtual decoder 또는 더 다양한 paired raster↔stroke 데이터다. 이 두 작업 전에는 seed 31·47을 반복하지 않는다. 전체 Python 회귀는 367개를 통과했다. 상대크기 resolver를 현 UJI/HWRT test의 동일-writer isolated-glyph proxy에 적용한 결과는 UJI 51.09%→45.63%(-5.47%p), HWRT 53.57%→39.29%(-14.29%p)였다. 이 proxy는 실수식의 같은 행 baseline·상대크기가 아니라 writer의 서로 무관한 glyph를 anchor로 사용하므로 product evidence가 아니다. 다만 해로운 자동 뒤집힘을 실제로 확인했으므로 resolver는 현재 고립기호 0.6 반환에 연결하지 않고, 향후 P Formula row의 validated context가 있을 때만 activation한다.