v8 VQ Rescue 실패 분석 + v9 재설계안¶
ADR-008 §5 실패 프로토콜 발동. V4/V5 모두 PAPE ≥ 50 달성 (V4 56.51, V5 53.32). 파라미터 튜닝 금지 하에 VQ 방법론 근본 재설계 필요.
§0 상충 가설 정립 (시작점)¶
"같은 구조 v6 R1b는 PAPE 38.40을 달성했는데 v7/v8은 53~56이다. 구현 결함 때문이다." (ADR-008 §근거)
이 가설은 부분적으로만 맞다. MLflow 재조사 결과 v6 R1b와 v7은 같은 구조가 아니다. 네 가지 구조적 차이가 존재하며, 그 중 하나도 "MemoryAlignmentServer 미통합"이 아니다 — 그건 v8 V4/V5에서 통합했지만 실패했다는 사실로 반증된다.
§1 V4/V5 진단 수치 (원본 MLflow 직독)¶
MLflow 경로: mlruns/488793251950638315 (v7-peak-aware-fl).
1.1 V4 run (2fab575c, seed=42, Apt6+Apt88, rounds=10)¶
| metric | round 1 | round 10 | 변화 |
|---|---|---|---|
codebook_alignment_sim_mean |
0.1198 | 0.0095 | ↓ 92% |
codebook_n_components |
8 | 178 | ↑ 22배 |
train_loss |
1.0866 | 1.9055 | ↑ 75% |
val_loss |
0.6469 | 0.6544 | 평탄 |
| PAPE_avg (final) | — | 56.51 | — |
| ff_codebook_util | — | 0.2515 (25%) | 비교적 양호 |
해석: BFS 정렬이 매 라운드마다 codebook을 shared prototype으로 overwrite하는데, 다음 라운드에서 encoder는 덮어쓰기 직전 embedding 분포를 기준으로 gradient를 누적한 상태이므로 codebook이 moving target이 된다. 그 결과 train_loss가 단조 증가(1.09→1.91). n_components가 8→178로 폭증한다는 것은 BFS가 라운드 후반부에는 유효 클러스터를 형성할 수 없고 거의 모든 code가 isolated임을 뜻한다. val_loss가 동시에 평탄한 이유는 per-household DLinear residual(local, FL 비공유)이 예측을 떠받치고 있기 때문 — 즉 VQ 경로가 무너져도 DLinear가 바닥을 깔고 있으나 PAPE 기준에서는 부족.
1.2 V5 run (584cc9a6, seed=42, Apt6+Apt88, rounds=10)¶
| metric | round 1 | round 10 | 변화 |
|---|---|---|---|
codebook_alignment_sim_mean |
0.1706 | 0.1020 | ↓ 40% (V4보다 안정) |
codebook_n_components |
4 | 11 | ↑ 2.75배 (V4의 178 대비 극소) |
train_loss |
1.0804 | 1.1490 | ↑ 6% (V4의 75% 대비 안정) |
val_loss |
0.6523 | 0.6349 | 약한 ↓ |
| PAPE_avg (final) | — | 53.32 | — |
| ff_codebook_util | — | 0.8586 (86%) | 매우 높음 |
해석: RESET이 dead entry를 계속 현 batch 기반으로 리샘플링하므로 codebook 분포가 encoder output 분포에 항상 잡혀있다. 그래서 BFS로 잡히는 클러스터 수가 4~11로 작게 유지되고 (codebook이 수축된 게 아니라 "같은 방향"을 향하고 있어서 쉽게 클러스터링됨) ff_codebook_util=0.86으로 크게 활성화된다. 그럼에도 PAPE 53.32 (A1 47.1 대비 악화)의 원인은 §2에서 규명.
1.3 v6 R1b 동일 cell 대조 (MLflow: 5e0409718fd347d085190264e43d4284)¶
| metric | v6 R1b 값 |
|---|---|
test_avg_codebook_util |
4.06% (!!) |
test_avg_pape |
38.3965 |
test_avg_hr |
22.28% |
test_avg_mse |
0.6252 |
best_round |
23 (of 100) |
| Apt별 res_ratio ( | y_res |
파괴적 함의: v6 R1b는 codebook utilization이 4%(!!) 임에도 PAPE 38.4를 달성했다. 즉 codebook 활용도는 PAPE와 무관하다. 예측 대부분은 per-household DLinear residual이 담당 (Apt88 res_ratio 84%). VQ는 "어떤 shared 패턴 사전"으로 기능한 것이 아니라 거의 무시된 통신 채널이었다. 그런데도 R1b가 38.4를 찍은 이유는 §2.
§2 진짜 원인: v6 R1b ≠ v7 ProposedModel (구조 변경)¶
v6 R1b 원본(experiments/federated/v6_0415_fedpm_original.py) vs v7 ProposedModel (experiments/federated/v7_runner.py:663) 를 소스 직접 비교한 결과:
| 구성 | v6 R1b 원본 | v7 ProposedModel |
|---|---|---|
| Encoder | CNN + residual blocks (2 layers, num_hiddens=128, num_residual_hiddens=64) + compression_factor=4 (seq 96→24) |
단순 Conv1d×2 (padding=1, same length, no compression, no residual) |
| VQ codebook | M=256, D=64 | M=256, D=64 (v8에서 동일) |
| Decoder | Transformer (d_model=64, nhead=4, d_hid=256, nlayers=4) |
단순 Conv1d×2 + Linear(D,1) (비 Transformer) |
| Residual path | DLinear (local, non-shared) — Phase 3b | DLinear (local, non-shared) — 동일 |
| Optimizer | AdamW (v6_0415_fedpm_mvp.py:197) / Adam + differential LR (v6_original 3b) | torch.optim.Adam + differential LR (vq 1×, dlinear 0.1×) |
sim_threshold (δ) |
0.7 (config default) | 0.6 (v7_runner hardcoded line 1490) |
| Local epochs | 5 | 5 (동일) |
| Rounds | 100 (best@23) | v8 V4/V5는 10 (실험 설계 자체가 휴리스틱) |
| 가구 수 | 5 (Apt6, Apt15, Apt30, Apt51, Apt88) | v8 V4/V5 smoke: 2 (Apt6, Apt88) |
정량적 구조 격차 (대략적 파라미터): - v6 R1b: CNN-residual encoder (≈50K) + Transformer decoder (≈200K+) + DLinear (≈5K/가구) + VQ codebook (16K) ≈ ~270K base - v7 ProposedModel: Linear patch_proj + Conv1d×2 encoder/decoder (≈10K) + DLinear (≈5K) + VQ codebook (16K) ≈ ~35K base
즉, v7은 v6 대비 모델 capacity가 7~8배 작다. 또한 decoder 구조가 Conv1d 로컬 window vs Transformer 전역 attention으로 질적으로 다르다.
2.1 원인 3층 분해¶
- (Dominant) 모델 capacity 붕괴 — v7 ProposedModel의 Conv1d decoder는 24-step prediction을 local receptive field로만 수행. v6 Transformer decoder는 24 time step 전역 attention. 이 격차가 PAPE 38→53 대부분을 설명. A1 (no VQ, DLinear only) PAPE 47.1이 같은 v7 infra에서 나왔다는 점이 이를 뒷받침 — A1은 DLinear 단독이라 v7 decoder 병목을 우회하고 38~47 구간의 상단(47)에 머문다.
- (Secondary) BFS 정렬의 round-wise overwrite로 인한 moving-target 문제 — V4 train_loss 75% 증가가 증거. codebook이 round마다 centroid로 덮어써져 encoder가 수렴 실패.
- (Tertiary) v7 V4/V5 smoke는 rounds=10, 2 households — v6 R1b는 rounds=100, best@23. 10 rounds만으로는 decoder가 안정화될 시간 자체가 없음. 그러나 이건 실험 설계 이슈이지 VQ 알고리즘 실패가 아님.
2.2 v6 R1b가 PAPE 38.40을 찍은 실제 메커니즘¶
- Transformer decoder가 per-household local personalization 을 흡수 (attention이 24-step 내부 autocorrelation 학습)
- DLinear residual이 per-household trend/seasonality 보정 (res_ratio 40~84%)
- VQ codebook은 거의 무시됨 (util 4%, 256개 중 실질 활성 ~10개) — 하지만 "있어도 해롭지 않은" 통신 채널
즉 v6 R1b의 성공은 VQ 기법 덕분이 아니라 Transformer decoder + DLinear residual 덕분이다. VQ는 초록 claim의 "shared codebook for federated pattern exchange" 서사의 근거로는 매우 약하다. 이것이 track-e v3 에서 이미 관찰된 "VQ codebook은 '패턴 사전'보다 'FL 통신 효율' 성격" (exp6 summary H6 발견 #2) 과 정확히 일치한다.
2.3 Commitment weight / β drift 여부¶
- v6_0415_fedpm_mvp.py (B0/B1 baseline):
loss = task_loss + vq_loss, vq_loss 내부에commitment_beta=0.25(FEDPM_COMMITMENT_BETA) - v7_runner.py line 1592:
loss = task_loss + vq_loss, 동일하게 VectorQuantizer 내부 commitment_beta=0.25 - β는 drift하지 않음. task_loss side의 peak_alpha=2.0 도 동일 (FedPM paper default).
§3 4 옵션 비교 (ADR-008 §5)¶
평가 기준 (user 명시)¶
- v8.2 5-seed 통계 재진입 workload ≤ 4h 선호
- PAPE 회복 예상치 A1(47.1) 이하 confident
- 초록 claim 유지 선호 (단, 문구 조정 가능)
옵션 비교표¶
| 옵션 | workload (engineer hours) | 예상 PAPE | 초록 claim | 실패 재발 위험 |
|---|---|---|---|---|
| a. Gumbel-softmax VQ | 중 (VQ layer 교체 + τ annealing + 테스트) ~6~10h | 49~52 | "shared VQ codebook" 유지 (hard→soft relaxation이지만 여전히 codebook) | 중 — τ 스케줄링 실패 시 여전히 collapse. 원인 §2의 §2.1 1번(capacity) 미해결 |
| b. Product Quantization (PQ) | 중~상 (m개 sub-codebook, sub-dim 결합 cross-attention) ~10~16h | 49~52 | "shared VQ codebook" 유지 가능 | 중상 — sub-codebook 간 독립성 가정이 same-domain FL에서 더 심한 fragmentation 유발 가능. §2.1 1번 미해결 |
| c. RQ-VAE | 상 (multi-stage, 잔차 quantizer 여러 개) ~12~20h | 48~50 | "shared VQ codebook (residual)" 유지 | 상 — FL에서 multi-stage codebook 동기화 복잡도 폭증. 각 stage마다 독립 alignment 필요. §2.1 1번 미해결 + 새 실패 지점 추가 |
| d. Shared linear adapter (VQ 대체) | 저 (~2~4h) | 45~47 (A1 수준) | 문구 수정 필요 (VQ → shared projection/adapter) | 낮음 — deterministic, no collapse, gradient 경로 명확 |
예상 PAPE 회복 정도 근거¶
- a/b/c: 모두 §2.1 1번(v7 decoder capacity 붕괴)을 해결하지 못함. VQ 알고리즘을 바꿔도 v7 decoder가 Conv1d×2인 한 PAPE 47 이상 (A1 수준)으로 떨어지지 않는다. Gumbel/PQ/RQ 각각 soft relaxation, 분해, 잔차로 collapse는 완화할 수 있지만 v6 R1b 수준(38.40) 복원은 decoder 교체 없이는 불가. 실험적으로 V5가 RESET으로 util 0.86까지 올려도 PAPE가 53.32라는 사실이 이를 뒷받침한다.
- d (linear adapter): VQ 경로를 제거하고 shared low-rank projection (e.g.,
Linear(D,D')shared weight + per-household bias)로 대체. Federated aggregation이 단순 평균 (FedAvg)으로 환원되어 no collapse. A1 구조(= no VQ, DLinear only)에 shared adapter layer 하나 추가한 형태로 A1 PAPE 47.1에서 소폭 개선이 이론적으로 기대됨. 그러나 decoder 교체 없이는 38.40은 불가.
workload 상세¶
- a. Gumbel:
VectorQuantizerGumbel(nn.Module)신규 작성, τ annealing schedule, straight-through gumbel, 테스트 5~8개. 8h 중앙값. - b. PQ: m개 sub-codebook, query/key decomposition, aggregation logic 재설계. 12h 중앙값.
- c. RQ-VAE: multi-stage quantization loop, 각 stage MemoryAlignmentServer 반복, 테스트 대폭 확장. 16h 중앙값.
- d. Linear adapter:
SharedAdapter(nn.Module) = Linear(D_in, D_out), FedAvg aggregation 기존 코드 재사용, ProposedModel.vq → ProposedModel.adapter, 테스트 3~5개. 3h 중앙값.
§4 선정: Option d (Shared linear adapter, VQ 대체)¶
근거 (3~5줄)¶
- 진짜 원인 §2.1 1번(decoder capacity)은 4 옵션 중 누구도 해결하지 못한다. 따라서 VQ 알고리즘 복잡도를 늘리는 a/b/c는 PAPE 회복 없이 workload만 증가시킬 위험이 크다.
- v6 R1b의 실제 성공 메커니즘 (§2.2)이 "VQ는 거의 무시되고 Transformer decoder + DLinear residual이 예측을 담당"이므로, VQ를 shared linear adapter로 대체해도 PAPE에 거의 영향 없음이 예측된다. A1(47.1)이 이를 empirical하게 지지.
- Option d는 workload 3h 로 v8.2 재진입(4h 상한) 이내, 실패 위험 최저, 구현 명확성 최고.
- 초록 claim 문구 수정 비용은 발생하지만, 기존 "shared VQ codebook for federated pattern exchange" 는 v6 R1b에서도 사실이 아니었음이 이번 분석으로 드러났다 — 문구를 유지하는 것은 오히려 과대 주장이다. Truthful downgrade: "shared low-rank adapter for cross-household feature alignment".
- 부수 효과로 v9는 VQ 방법론 논문 경로를 포기하고 "peak-aware FL + personalization" 서사로 안정화. 이는 v7 A1 PAPE 47.1 + B0 52.3 격차(=peak-loss 단독 효과 +5.2pp)를 핵심 기여로 재정의 가능하며, 이미 pre-register 된 Gate 1~6/ golden tensor 체계를 그대로 활용 가능.
단, 선정이 바꾸지 못하는 것 (정직한 제한)¶
- PAPE 38.40 회복은 기대할 수 없다. v9 option d 예상 PAPE = 45~47 (A1 소폭 개선 ~ A1 동등). v6 R1b 수준 복원은 v7 decoder를 Transformer로 재교체해야만 가능. 그러나 user가 "파라미터 튜닝 금지"로 설정한 제약이 "모델 아키텍처 교체 금지"를 의미하는지는 모호. v9 design에서 이 옵션을 별도 제안하되 critic 검증에서 user 결정권 요구.
§5 v9 phase 전환 계획¶
산출물 (이 보고 직후)¶
- ADR-009:
docs/decisions/ADR-009_v8_to_v9_vq_redesign.md(본 보고 직후 동시 작성) - Design spec:
docs/reference/project_state/track_v9_vq_redesign.md(동시 작성) - TODO:
todos/track-v9_vq_redesign.md(engineer 착수 후)
v9 신규 Cell (설계 초안)¶
| ID | 설명 | use_vq | use_dlinear | use_adapter | peak_loss |
|---|---|---|---|---|---|
| A1 (유지) | Baseline: peak-loss + DLinear 단독 | ✗ | ✓ | ✗ | ✓ |
| V6 (신규) | peak-loss + DLinear + shared linear adapter | ✗ | ✓ | ✓ | ✓ |
| V7 (신규, 선택적) | peak-loss + DLinear + shared adapter + peak-aware loss variant | ✗ | ✓ | ✓ | alpha=3.0 |
V4/V5 (VQ) cell은 v9에서 archive 처리 (실패 증거로 보존, 재실행 없음).
Workload 추정 (v9 완주까지)¶
| 단계 | 시간 |
|---|---|
| 문서 작성 (orchestrator + exp-expert 병렬) | 0.5h |
| engineer: SharedAdapter 구현 + V6 cell 등록 + 테스트 3~5개 | 3h |
| V9.1: 1-seed smoke (V6, Apt6/Apt88, rounds=20) | 5분 |
| V9.2: 5-seed 통계 (V6 × 5 seed × 2 가구) | 1.5h |
| V9.3: Stage 1 재진입 (B0/B1/B2/B3/B4/A1/V6 × 5 seed = 35 runs) | 3.5h |
| v9 소계 | ~8~9h (v8과 동일 범위) |
초록 claim 수정 작업: 별도 0.5h, user 승인 필요.
v9 성공 기준 (pre-registered 초안)¶
- V9.1 (1-seed): V6 PAPE ≤ A1 (47.1), rel_decrease ≥ 0
- V9.2 (5-seed): V6 PAPE 평균 ≤ 47.0, std < 3.0, rel_decrease ≥ 0 on ≥ 4/5 seeds
- v6 R1b 38.40 복원은 비목표 (explicit하게 드롭)
v9 실패 시 (second rollback)¶
V6 PAPE > 50 이면 — 이 때는 다음 의사결정이 user 몫: - (α) v7 decoder를 Transformer로 교체한 아키텍처 변경 phase (v10) - (β) FL narrative 자체를 드롭하고 KD 논문 축 유지 (paper_draft.md 노선)
§6 이 보고의 한계 (adversarial critic 대비 self-check)¶
- rounds=10 이 V4/V5 실패의 진짜 원인이라는 대안 가설: 가능성은 인정. 그러나 (a) v6 R1b는 best@23이라 10 rounds는 부족, (b) V4 train_loss가 1.09→1.91로 단조 증가이므로 rounds 늘려도 발산 가속, (c) V5 train_loss는 안정이지만 val_loss 개선 없음 → rounds 늘리면 early stopping에 걸릴 가능성이 높아 PAPE 회복 제한. 유효 반론 아님.
- 2 households (Apt6, Apt88) 가 BFS 실패 원인: 가능. BFS는 N≥3일 때 cluster 의미 있음. 그러나 Apt6/Apt88 두 가구로도 v6 5가구의 pairwise similarity 일부를 재현해야 함. 2-가구 smoke로 판정한 것은 실험 설계의 약점이되, 5-가구 확장으로 PAPE 38 복원 가능성은 낮음(decoder capacity가 결정적이므로).
- δ=0.6 vs v6 δ=0.7 의 영향: δ 높을수록 edge 수 감소 → n_components 증가. v7 δ=0.6이 오히려 더 관대해서 v6 대비 BFS가 더 쉽게 cluster 를 만들어야 함. 그런데 V4 n_components=178이라는 것은 sim_mean 자체가 δ=0.6 threshold 아래 (0.01 << 0.6) 이므로 δ 조정은 효과 없음. 파라미터 튜닝 금지 규칙 준수.
- A1 PAPE 47.1 이 v6 R1b 38.40 대비 격차: A1은 VQ 미사용 + DLinear 단독. 이 격차 9pp가 "v7 decoder capacity + peak-loss tuning" 격차에 대응. 즉 A1도 v6 수준 복원이 안 됨. §2.1 1번 가설의 empirical 증거.
결론 요약 (1~2문장)¶
v4/v5 실패의 진짜 원인은 MemoryAlignmentServer의 round-wise overwrite로 인한 moving-target 문제(V4 sim_mean 0.12→0.01, train_loss 75% 증가)와 v7 ProposedModel의 decoder capacity 붕괴(Conv1d×2 vs v6 Transformer) 이 중첩된 결과이며, 후자가 지배적이다. Option d (shared linear adapter, VQ 대체) 를 선정 — workload 3h, A1 수준(PAPE 45~47) 회복이 confident, 초록 claim 문구 조정(truthful downgrade)으로 대응 가능. 단 v6 R1b 38.40 복원은 decoder 재교체 없이는 불가하므로 v9 성공 기준을 재보정.
산출물 경로¶
- 본 보고서:
report/version8/exp-expert/v8_failure_root_cause_and_redesign.md(현재 파일) - ADR-009 초안:
docs/decisions/ADR-009_v8_to_v9_vq_redesign.md - v9 design spec:
docs/reference/project_state/track_v9_vq_redesign.md - 메모리 업데이트:
.claude/agent-memory/exp-expert/v8_failure_root_cause.md(본 cycle 종료 후)
근거 MLflow 경로¶
- v6 R1b best:
mlruns/628304840000878755/5e0409718fd347d085190264e43d4284 - v7 V4 seed42 Apt6+Apt88:
mlruns/488793251950638315/2fab575cef1e470ba8016fd210e9b48f - v7 V5 seed42 Apt6+Apt88:
mlruns/488793251950638315/584cc9a61eba4afe808b677efd4a6c17