v8 VQ Methodology Rescue — Closure Report¶
§0 요약 (Executive Summary)¶
v8 phase 는 실패로 공식 종결한다. MemoryAlignmentServer + RESET 2 기법을 v7 에 편입한 V4/V5 1-seed smoke 에서 PAPE 가 각각 56.51, 53.32 로 primary gate (<50) 를 통과하지 못했다. 후속 경로는 track-f (decoder capacity swap, ADR-009) 로 확정되었으며, cycle 1 에서 제안되었던 Option d (shared linear adapter, v9 adapter) 는 dominant 원인을 해결하지 못한다는 판단에 따라 docs/archive/decisions/ADR-009_v8_to_v9_vq_redesign_archived_2026-04-21.md 로 archive 되었다 (rollback 발동 시 참조 자료로만 보존). 쉬운 말로, "VQ 를 서버에서 정렬하면 v6 성능(PAPE 38)이 돌아오리라" 던 v8 가설은 기각되었고, 원인은 VQ 알고리즘이 아니라 v7 의 decoder 용량 자체가 너무 작았다는 쪽으로 무게중심이 이동했다.
§1 Pre-registered 성공 기준 vs 실제 결과¶
ADR-008 §1 은 "V4 또는 V5 가 PAPE < 50 달성 (A1 47.1 이하 초과)" 을 primary gate 로 선언했다. 결과는 2/2 미달.
| 구분 | Cell | Pre-registered gate | 실측 PAPE | 판정 | MLflow run |
|---|---|---|---|---|---|
| Primary | V4 (alignment, no RESET) | PAPE < 50 | 56.51 | FAIL | mlruns/488793251950638315/2fab575cef1e470ba8016fd210e9b48f |
| Primary | V5 (alignment + RESET) | PAPE < 50 | 53.32 | FAIL | mlruns/488793251950638315/584cc9a61eba4afe808b677efd4a6c17 |
| 대조 | v6 R1b (원본) | reference | 38.40 | — | mlruns/628304840000878755/5e0409718fd347d085190264e43d4284 |
| 대조 | A1 (no VQ, DLinear only) | reference | 47.1 | — | v7 Stage 0.5 smoke |
| 대조 | B0 Local baseline | reference | 52.3 | — | v7 Stage 0.5 smoke |
쉬운 요약: V4 는 서버 정렬이 매 라운드 덮어써지며 학습이 거꾸로 갔고 (train_loss 1.09→1.91, +75%), V5 는 RESET 으로 util 을 86% 까지 복원했지만 PAPE 는 여전히 A1 보다 나쁘다. "VQ 가 잘 쓰이는 것" 과 "예측이 좋아지는 것" 은 별개였다. 이후부터는 V4/V5 run 을 각각 V4 run 2fab575c, V5 run 584cc9a6, v6 대조를 v6 R1b 5e040971 로 축약 인용한다.
§2 실패 원인 (cycle 2 critic 통과 버전)¶
원인은 3층으로 분해된다. cycle 1 에서 dominant 로 지목했던 "decoder capacity" 는 방향은 맞았으나 수치와 구조명이 틀렸고, cycle 2 에서 실측 근거로 정정되었다.
2.1 Dominant — Decoder capacity 붕괴 (38.6× 격차)¶
- v6 R1b 의 decoder 는 Transformer 가 아니라 FC-MLP 였다. cycle 1 보고서의 "Transformer" 기술은 생성자 default 인자를 분기 로직 없이 읽은 오인이며, cycle 2 에서 MLflow
params/decoder_type=fc+experiments/federated/v6_0415_fedpm_original.py:126의args.decoder_type = "fc"+src/FedUnit-64D1/lib/models/decoder.py:447의FCDecoderBackbone실체로 정정되었다. - 실측 파라미터 수: v6 decoder 956,696 (~957K) vs v7 Conv1d×2 decoder 24,769 (~25K) → 38.6× 격차. Total 기준으로도 v6 ~1.13M vs v7 ~50K (20~25×).
- 수용야 측면에서도 v6 는
(seq_in_len × d_model) = 24 × 64 = 1536을 flatten 후 4-layer MLP 로 처리하는 전역 수용야인 반면, v7 는 kernel=3 Conv1d 만으로 5-step 수준의 로컬 수용야만 가진다. - 간접 증거: A1 (VQ 제거, DLinear only) 이 PAPE 47.1 에 머문다는 사실은, VQ 가 전혀 없어도 v7 infra 는 47.1 아래로 못 내려간다 는 empirical floor 이다. 즉 v6→v7 의 16pp 격차는 VQ 쪽이 아니라 decoder 쪽에서 발생한 것으로 해석하는 게 자연스럽다.
쉬운 요약: v6 는 "24시간 전체를 한 번에 보는 큰 MLP" 로 예측을 만들었는데, v7 은 "3시간짜리 작은 창만 보는 CNN" 으로 바꿔버렸다. 정보의 양이 38.6 배 차이났고, 서버가 VQ 를 아무리 정돈해도 읽어낼 decoder 가 작으면 소용이 없다.
2.2 Secondary — MemoryAlignmentServer moving-target¶
- V4 의 BFS 기반 alignment 는 라운드마다 codebook 을 overwrite 한다. 그 결과:
codebook_alignment_sim_mean: 0.1198 → 0.0095 (92% 감소)codebook_n_components: 8 → 178 (22배 증가)train_loss: 1.0866 → 1.9055 (+75%, 단조 증가)- V5 는 RESET (dead-code replacement, threshold=2) 로 이 불안정성을 완화하여 train_loss 를 안정화 (1.08→1.15, +6%) 하고 util 을 86% 까지 올렸으나, PAPE 는 53.32 로 여전히 A1 이하. codebook utilization 과 PAPE 가 decoupled 라는 empirical 결론.
- 쉬운 요약: V4 는 "서버가 매번 책상을 다시 정리" 해서 학생(encoder)이 어디에 뭐가 있는지 못 외웠고, V5 는 "안 쓰는 물건을 버려서" 책상은 정돈했지만 정작 시험 성적은 안 올랐다.
2.3 Tertiary (보류) — rounds=10 수렴성¶
- v6 R1b 는 100 rounds 에서 best_round=23 이었다. V4/V5 smoke 는 rounds=10 이라 수렴 불충분 가능성 잔존.
- cycle 1 은 단독 기각을 시도했으나 근거 부족 → cycle 2 에서 "보류" 로 완화. rounds=30 V4/V5 1-seed 재실행은 user 결정권에 남김 (§6 Q5 참조).
§3 중요 발견 (cycle 1/2 과정에서 새로 드러남)¶
3.1 v6 R1b 의 VQ 는 실질적으로 "부차적 보조 경로"¶
- v6 R1b MLflow
test_avg_codebook_util = 0.04063(4.06%). 즉 256 개 코드북 중 ~10개 정도만 활성. - 단,
VectorQuantizer(src/fed_learning/fedpm.py:112) 의 util 정의는unique_codes / M(frequency-weighted 아님) 이므로, "10개 코드가 배치의 100% 를 cover" 와 관측상 구별 불가. cycle 1 의 "VQ 무시" 단정은 cycle 2 에서 "부차적 보조 경로" 로 완화. - per-household 수치로 보면 VQ 경로는 완전히 죽지 않았다:
Apt6 vq_magnitude=0.467,Apt88 vq_magnitude=0.395등. 다만res_ratio가 0.425~0.838 로 DLinear residual 이 예측의 다수를 차지함은 분명. - 논문 영향: 초록 claim "(ii) shared VQ codebook for federated pattern exchange" 의 empirical 근거는 기존 수치만으로는 약하다. track-f 결과에 따라 claim 의 재정의가 필요할 수 있음 (§8 참조).
3.2 v6 decoder 구조 정정 — Transformer → FC-MLP¶
- 이번 closure 이전까지 팀 내부 정본이었던 "v6 decoder = Transformer (d_model=64, nhead=4, d_hid=256, nlayers=4)" 는 cycle 1 expert 의 단일 실수가 아니라, 생성자 호출만 보고 분기 로직을 누락한 데서 온 구조적 오인이었다. 이후 문서 (paper_draft, 발표자료 초안 등) 에 전파되었을 가능성이 있으므로 track-f 착수 전 1회 점검 권고.
- 실측 근거:
experiments/federated/v6_0415_fedpm_original.py:126+src/FedUnit-64D1/lib/models/decoder.py:447FCDecoderBackbone+ MLflowparams/decoder_type="fc".
3.3 v6 FL aggregation 교란 발견¶
- v6 R1b 는 plain FedAvg 가 아니라 개인화된 aggregation 을 사용했다.
aggregation_strategy = cos_similaritymemory_fill_strategy = client_personalizedsimilarity_threshold = 0.7gamma = 0.95(EMA decay)- v7/v8 은 plain FedAvg weighted mean. 따라서 track-f W1/W2 가 decoder 만 복원해도 PAPE 38.40 재현은 보장되지 않는다. 이 교란은 track-f ADR-009 F9 disclosure 로 기록됨.
- 쉬운 요약: v6 의 서버는 "비슷한 가구끼리만 지식을 섞어주는" 개인화 평균을 썼는데, v7 은 그냥 단순 평균이다. track-f 가 decoder 만 바꿔도 v6 성능이 완전히 돌아오지 않을 수 있다.
§4 채택 경로 — A안 확정 (2026-04-21)¶
4.1 결정¶
- Primary: track-f W1 (FC-MLP decoder 복원) + W2 (축소 Transformer decoder) 를 병렬 1-seed smoke 로 진입. PAPE 낮은 variant 를 5-seed primary 로 선정.
- Second rollback: Option d (shared linear adapter) — track-f W1/W2 모두 PAPE > 50 시 3h 내 smoke 발동.
- Archive: v9 adapter ADR 은 별도 번호 재할당 없이
docs/archive/decisions/ADR-009_v8_to_v9_vq_redesign_archived_2026-04-21.md로 이동. ADR-009 번호는 track-f 가 단독 계승.
4.2 근거¶
- Dominant 원인 직접 해결: track-f 는 §2.1 decoder capacity 38.6× 격차를 직접 복원하지만, Option d 는 decoder/encoder 를 그대로 두고 VQ 만 제거한다. v7 decoder bottleneck 이 real 이라면 Option d 는 PAPE 47 대에 머무를 가능성이 높다 (v9 design spec §7 line 49 자체도 "≤45 는 정직하게 어려움" 인정).
- 초록 claim 보존: track-f 는 VQ 경로를 유지하므로 abstract 수정 불필요. Option d 는 "shared VQ codebook" → "shared low-rank adapter" 로 downgrade 필요 → 2026-05 workshop 일정 bind 시 abstract 재작성 risk.
- 안전장치 보장: track-f 실패해도 3h 내 Option d 로 rollback 가능 (§6 Q6 참조).
4.3 명명 규칙 해석 (ADR 번호 경로 A)¶
- expert v2 §5.1 은 경로 A (번호 유지 + archive) / 경로 B (Option d 를 ADR-010 재할당) 두 안을 제시했고, user 는 2026-04-21 에 경로 A 를 선택.
- 결과: ADR-009 = track-f (단일 active), v9 adapter 는
docs/archive/decisions/로 이동. rollback 발동 시 신규 ADR 작성 필요.
§5 v8 에서 계승된 자산¶
track-f 및 이후 phase 에서 재사용 가능한 v8 유산.
| 자산 | 위치 | 상태 |
|---|---|---|
| v7_runner.py CLI + CELL_REGISTRY (B0~V5 14 cells) | experiments/federated/v7_runner.py |
행동 불변 보존 |
| V4/V5 MLflow runs (FAIL 증거) | mlruns/488793251950638315/{2fab575c..., 584cc9a6...} |
재실행 없음, 증거 보존 |
| MemoryAlignmentServer + VQWithReset 코드 | experiments/federated/v7_runner.py + src/fed_learning/fedpm.py |
track-f.3 VQ 재탐색 시 reuse 가능 |
| Golden tensor G1~G5 pre-registration | definition_hash 8be2bd2f691deed0 |
track-f 에 동일 적용 |
| 155+ test suite | tests/ |
track-f 에서 +5 테스트 추가 예정 |
| 5-seed set | {42, 123, 456, 789, 2024} | 유지 |
| Fail-fast threshold | val ratio > 1.5, train > 3.0 | 유지 |
| peak-aware loss (α=2.0, β=0.1) | src/peak_analysis/v7/metrics.py |
변경 없음 |
§6 Open Decisions (track-f 착수 전 user 결정 필요)¶
expert v2 §의사결정 요구 6건 중 Q2 (ADR 번호 A안) 는 2026-04-21 결정됨. 잔여 5건:
| 번호 | 질문 | default | 비고 |
|---|---|---|---|
| Q1 | track-f W1+W2 병렬 primary + Option d second rollback 분기 수용? | Yes | expert/critic 모두 권고 |
| Q3 | track-f aggregation 복원 범위 (decoder-only vs v6 cos_similarity+personalized 포함)? | decoder-only | 확장 시 workload +2~4h |
| Q4 | 2026-05 workshop 제출 bind 여부? | (user 결정) | bind 확정 시 Q6 "동시 병렬" 권고 |
| Q5 | V4/V5 rounds=30 1-seed 재실행 (§2.3 rounds 가설 실측)? | 보류 | 실행 시 +30분 |
| Q6 | Option d 를 track-f 와 동시 병렬 smoke (+3h) vs 순차 rollback? | 순차 | Q4 bind 확정 시 동시 권고 |
§7 Future Direction (사용자 아이디어, track-f 보조)¶
2026-04-21 user 가 제안한 "VQ = HR (peak hit rate) 향상 vs PAPE (mean accuracy) 사이의 tunable trade-off 축" 재정의 가능성이 있다. 현재 v7/v8 data 에서는 trade-off 가 성립하지 않는다 (VQ cells V1~V5 모두 PAPE 와 HR 이 동시 악화). 다만 track-f 에서 decoder 를 원복한 뒤에는 codebook size sweep 등으로 Pareto frontier 가 드러날 가능성이 있다.
track-f.3 sub-phase 후보 (pending literature):
- track-f.3a — codebook size sweep (M=64/128/256/512): user 아이디어 직접 검증
- track-f.3b — FSQ / LFQ (codebook-free quantization)
- track-f.3c — Gumbel-softmax VQ (soft relaxation)
- track-f.3d — RQ-VAE / PQ (multi-stage residual, codebook 분해)
track-f.3 는 track-f.2 5-seed 통계 통과 후에 sub-phase 로 편입한다. 상세 설계는 VQ 리터러처 조사 (docs/reference/vq/vq_literature_survey.md) 완료 후 결정하며, 본 closure 시점에는 "pending literature 참조" 상태이다.
§8 초록 Claim 수정 전망¶
현재 초록: "(i) peak-aware loss, (ii) shared VQ codebook for federated pattern exchange, (iii) lightweight on-device deployment".
| 시나리오 | (ii) claim 처리 | 근거 |
|---|---|---|
| track-f 성공 (PAPE ≤ 파일럿 min + 2pp) | 유지 가능 (VQ 가 decoder 원복 상태에서 기능할 여지). 단 util 4% 해석 fact-check 필수 | track-f W1/W2 VQ 경로 보존 |
| track-f 실패 + Option d rollback | "shared low-rank adapter" 로 downgrade | VQ 제거, abstract 재작성 별도 workload |
| track-f.3 성공 (codebook sweep Pareto 발견) | "VQ codebook as tunable accuracy-sensitivity operating point" 로 재정의 | user 아이디어 반영 |
| third rollback (track-f + Option d 모두 실패) | (β) FL claim 전량 철회 + KD 단독 또는 (γ) empirical study 프레이밍 | expert v2 §5.6.2 참조 |
쉬운 요약: track-f 가 성공하면 지금 초록을 그대로 쓸 수 있고, 실패하면 "VQ 공유" 를 "저차원 어댑터 공유" 로 바꿔야 한다. user 가 제안한 "HR–PAPE trade-off" 아이디어가 검증되면 오히려 claim (ii) 가 더 강력한 서술로 진화할 여지도 있다.
§9 정리 — 다음 액션¶
| # | 액션 | 시점 | 담당 |
|---|---|---|---|
| T1 | v8 TODO (todos/track-v8_vq_rescue.md) 를 todos/archive/ 로 이동 |
본 보고서 직후 | orchestrator |
| T2 | docs/reference/project_state/track_v8_vq_rescue.md status archived 로 전환 |
본 보고서 직후 | orchestrator |
| T3 | VQ 리터러처 survey 완료 대기 (docs/reference/vq/vq_literature_survey.md) |
— | 문헌 조사 진행 중 |
| T4 | track-f 착수 plan (§6 Q1/Q3/Q4/Q5/Q6 user 결정 후) | 별도 orchestrator plan | orchestrator |
본 closure 보고서가 v8 관련 최종 산출물이며, 이후 v8 관련 보고서 신규 작성 없음. track-f 의 상세 설계, track-f.3 sub-phase 확정, 초록 재작성 등은 본 보고서 범위 밖이며 별도 track 에서 다룬다.
참고 — MLflow run ID / 소스 전체 인용¶
- v6 R1b 원본:
mlruns/628304840000878755/5e0409718fd347d085190264e43d4284 params/decoder_type = "fc",params/aggregation_strategy = "cos_similarity",params/memory_fill_strategy = "client_personalized",params/similarity_threshold = "0.7",params/gamma = "0.95"metrics/test_avg_codebook_util = 0.04063,metrics/test_avg_pape = 38.3965,metrics/test_avg_hr = 0.2228- v7 V4 seed=42:
mlruns/488793251950638315/2fab575cef1e470ba8016fd210e9b48f(PAPE 56.51) - v7 V5 seed=42:
mlruns/488793251950638315/584cc9a61eba4afe808b677efd4a6c17(PAPE 53.32) - 소스:
experiments/federated/v6_0415_fedpm_original.py:126, 310-313,src/FedUnit-64D1/lib/models/decoder.py:447-491,src/fed_learning/fedpm.py:112, 350,experiments/federated/v7_runner.py:663, 1490
참고 — 입력 문서¶
report/version8/exp-expert/v8_failure_root_cause_and_redesign_v2.md(cycle 2 final, polish 완료)report/version8/exp-critic/v8_0420_failure_analysis_review.md(cycle 1)- cycle 2 critic 은 독립 파일로 저장되지 않았으며 CONDITIONAL PASS + N1~N5 polish 지시는 expert v2 Changelog (line 461) 와 §6 self-check (line 380~) 에 수용 기록으로 보존됨
docs/decisions/ADR-008_v7_to_v8.md(v7→v8 결정 근거)docs/decisions/ADR-009_v8_to_track_f_decoder_swap.md(track-f 후속 ADR)docs/archive/decisions/ADR-009_v8_to_v9_vq_redesign_archived_2026-04-21.md(v9 adapter archive)docs/reference/project_state/track_v8_vq_rescue.md(v8 design spec, 본 closure 로 archived)docs/reference/project_state/track_f_decoder_swap.md(후속 design spec)todos/track-v8_vq_rescue.md(v8 TODO, 본 closure 로 archive 이동 예정)