aiflow-math-ink-06-intermediate / reports /FEDERATION_AUDIT_20260724.md
cwLeeDev's picture
Document rejected affine ablation and resumable federation training.
ddda67c verified
|
Raw
History Blame Contribute Delete
16.2 kB

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한다.

Online affine 불변성 pilot

UJI의 writer/device 차이가 단순 기울기·크기 분포 차이인지 분리하기 위해, source 특화 규칙 없이 online 19-feature 입력의 좌표·방향 채널에만 회전 ±10°, 등방 scale ±8%를 적용하는 seed-17 대조 학습을 시작했다. 시간·pen-up·pressure·missing metadata 채널은 바꾸지 않았고, teacher와 raster branch는 원본 입력을 유지했다.

1 epoch validation pilot은 macro online top-1 **88.47%**였다. 같은 초기 checkpoint의 무증강 epoch-1은 88.01%, epoch-2는 **88.57%**였다. UJI online top-1은 각각 79.67%, 78.67%, **80.00%**였다. 즉 초기 +1.00%p 신호는 있으나 무증강 추가 epoch의 범위 안이며, UJI 단독 개선도 +1.00%p에 그쳤다.

동일 설정의 일관된 full-source run(stage4_affine_consistent_epoch1)을 최종 확인한 결과, 검증 macro online top-1은 **88.07%**로 기준선 **88.57%**보다 낮았다. UJI는 80.00%로 같았지만 HWRT online top-1 90.04%→88.89%, raster top-1 78.16%→76.63%가 되어 모든 full update와 일부 interpolation이 HWRT guard에서 탈락했다. 선택 checkpoint는 epoch 0 / alpha 0.0, test delta는 모든 source에서 0이었다. 따라서 affine 증강은 성능 후보가 아니라 기각된 ablation이다.

Windows launcher의 Path/PATH 환경 중복으로 처음 실행이 중단되었고, 이후 중복 GPU child가 생긴 것을 즉시 정리했다. 따라서 이 pilot은 최종 test checkpoint를 만들지 않았으며 배포 후보에 포함하지 않는다. 다음 반복은 epoch별 checkpoint를 남기는 단일 launcher에서, affine 강도 grid와 full writer/device-disjoint test를 함께 수행해야 한다.

이 요구를 위해 federated online trainer에 epoch-state 저장/재개 계약을 추가했다. epoch-state는 student·선택 best·anchor model state, Adam state, source-balanced sampler generator, Python/NumPy/PyTorch/CUDA RNG, 선택 history를 함께 저장한다. base checkpoint SHA-256, seed, source ID, train 수, split subset 상한이 완전히 같을 때만 --resume-state를 허용한다. 따라서 중단된 GPU 실행은 같은 data/난수 계약으로 다음 epoch부터 복구할 수 있으며, 다른 모델이나 다른 split을 이어붙이는 오류는 fail-closed로 거부한다.

기하 계약 교정 후 affine+raster-loss 재검증

2026-07-25에 위 affine helper가 canvas_x/y·direction만 변환하고 shape·curvature·bbox·aspect·speed를 원본 값으로 남기는 계약 오류를 발견했다. 변환 좌표와 파생 feature가 한 sample 안에서 모순되므로, 해당 중단 run은 평가 근거가 아니다. helper는 이제 변환한 canvas coordinate에서 모든 기하 파생 채널을 재생성하며, stroke start/progress·time delta·missing/source modality만 불변으로 보존한다. 관련 단위 9건과 전체 Python 회귀 367 passed를 통과했다.

교정 helper로 stage-3 full-source checkpoint에 rotation ±10°, scale ±8%, raster exact/family supervised loss 0.25/0.10을 넣어 15,829개 표본에서 CUDA 1 epoch를 재실행했다. validation macro online top-1은 88.57%→88.07%, HWRT online/raster top-1은 90.04/78.16%→88.89/76.63%, UJI online top-1은 **80.00%→80.00%**였다. alpha 0.25 interpolation만 HWRT tolerance를 지켰지만 macro 88.33%라 기준선을 넘지 못했다. trainer는 selected_epoch=0, alpha=0.0으로 원 checkpoint를 보존했고, stage4_affine_consistent_epoch1_20260725는 배포·shadow 후보 어느 쪽에도 채택하지 않는다. 다음 loop는 단순 affine/loss 증대가 아닌 독립 online P-source와 실제 formula-row context를 우선한다.

Cross-source same-label alignment rejection and reproducibility correction

source cap 6,000 probe의 source-label balanced sampler를 측정하면 batch 안에서 같은 exact label·다른 source positive를 갖는 anchor가 1,587/17,372, 즉 **9.14%**에 불과했다. UJI↔HWRT는 66 labels, 세 source 공통은 digit 10 labels만 겹친다. 이에 batch 절반을 동일 label의 서로 다른 source pair로 고정하고, shared trajectory embedding에 supervised contrastive loss(weight 0.05, temperature 0.20)를 추가하는 1-epoch seed-17 shadow를 만들었다. 이 sampler/loss와 epoch resume 경로의 회귀는 15건을 통과했다.

첫 실행은 global cap으로 13,371개가 되어 비교 근거에서 제외했다. source cap CSV를 추가해 재실행했지만 Pendigits에 validation split이 없어 현재 trainer가 origin partition을 먼저 적용한다는 점을 확인했다. 실제 구성은 14,286개였고, 과거 stage-3 report의 15,829개 선택 set은 현 코드와 동일하게 재현할 수 없었다. 이는 accuracy 문제가 아니라 checkpoint training-sample provenance 부족이다. 이후 trainer는 source별 실제 count와 (source, sample_id, origin_id) 전체 SHA-256을 report/checkpoint/resume contract에 기록하며, 같은 표본 수이지만 다른 origin을 사용하는 재개를 fail-closed로 막는다.

14,286개 cross-source run은 validation macro online top-1을 88.57→89.23%, UJI validation을 80.00→82.00%로 높였지만, held-out UJI/HWRT online top-1은 각각 −0.2/−0.4%p, Pendigits raster top-1은 −3.2%p였다. 따라서 validation 상승을 채택 근거로 사용하지 않고 checkpoint는 shadow로 격리한다. stage-3 과거 selection set의 재현 fingerprint가 없으므로 이 실험도 baseline 대체 근거가 아니다. 앞으로의 정식 baseline은 현재 loader가 기록한 source count와 sample-origin fingerprint에서 새로 학습한 뒤에만 ablation 비교를 허용한다.

Provenance baseline v1

현재 loader로 stage-2 checkpoint부터 seed-17 CUDA 3 epoch를 다시 학습해 첫 재현 가능한 federation baseline을 만들었다. 선택 training set은 15,829개이며 source count는 Pendigits 4,457, UJI v2 5,372, HWRT 6,000이고, (source, sample_id, origin_id) SHA-256은 fc103edba331d3682875171b04942a2028232a401a0ca72cd0b1c52da5608c91이다. epoch 3/alpha 1.0이 validation guard를 통과해 선택됐다.

held-out source online top-1 / top-5 raster top-1 / top-5
Pendigits 95.0 / 99.4% 31.6 / 60.6%
UJI Pen v2 73.2 / 94.6% 39.4 / 69.8%
HWRT writer-disjoint 84.2 / 99.0% 74.4 / 94.6%

전수 7,031개 error audit은 online top-1/top-5 86.06/97.50%, visual-family top-1 90.91%, writer p10 60.0%다. Exact 오류의 34.80%는 같은 visual family 내부이며 1→2 38건, 7→1 32건, c→C 32건, s→S 30건, x→X 27건, o→O 17건이 상위다. 즉 기준선·provenance는 교정됐지만 UJI unseen writer의 case/O-0와 virtual-stroke raster 분포 병목은 남아 있다. 이 checkpoint는 release 92/99/90, 30 source, 3-seed 조건을 하나도 충족하지 못하므로 product_validation=false다.

외부 data federation 발견 갱신

공식 Mendeley Data v3의 Ink and Identity를 새 출처로 조사했다. 이 출처는 CC BY 4.0, 서로 다른 수집 방식의 사진 기반 문자 450개라는 점에서 raster geometry/pseudo-stroke 후보가 될 수 있다. 다만 현재는 label manifest, 작성자 또는 촬영 group, 원본 content hash와 기존 raster 중복 검사가 없으므로 rights_review에만 추가했다. 배포 checkpoint와 verifier 학습에는 넣지 않았으며, registry 조사 수는 39/200으로만 변했다.

온라인 분야에서는 UCI Character Trajectories(CC BY 4.0, 한 writer)와 BRUSH(170 writer이나 non-commercial)를 다시 대조했다. 전자는 이미 geometry-only rights review로 유지하고, 후자는 상용 P-track에서 제외한다. 따라서 이번 조사로 P supervised source 수나 product gate는 증가하지 않았다.

epoch-state의 parameter·optimizer·sampler 복원과 contract mismatch 거부를 포함해 전체 Python 회귀는 369개를 통과했다.

후속 조사에서는 ISGL Online/Offline Character Recognition Dataset을 확인했다. CC BY 4.0이며 64 writer의 tablet x/y, timestamp, pen-up/down online 기록을 포함하므로 image-only 후보보다 0.6 canonical tap 및 virtual-stroke pretrain에 더 적합하다. 다만 파일 구조, label mapping, writer group, origin hash 확인 전에는 geometry_pretrain rights review로만 등록했다. registry 조사 수는 40/200이고, P supervised source·승인 독립 그룹·product gate에는 변화가 없다.