실험6 Phase 1 중간 리뷰: FeDPM Codebook MVP¶
1. 실험 개요¶
| 항목 | 내용 |
|---|---|
| 목표 | FeDPM Codebook MVP — 연합학습 가능성 + 피크 성능 확인 |
| 핵심 가설 (H6-1) | Vanilla FeDPM(V1)은 FedAvg+DLinear(B1)과 동등하거나 낮은 MSE를 달성한다 |
| 판정 기준 | V1 mean MSE ≤ B1 mean MSE |
| 설계서 | report/version6/lab-leader/v6_0415_exp6_design.md |
| 데이터 | EC50 중 5가구 (Apt6, Apt15, Apt30, Apt51, Apt88), seq_len=96, pred_len=24 |
| 날짜 | 2026-04-15 |
2. 실험 진행 경과¶
Phase 1에서 총 3회 실행하였으며, 모두 FAIL 판정.
실행 1: 초기 MVP¶
| 항목 | 값 |
|---|---|
| Clients | 5 |
| Memory size M | 64 |
| Learning rate | 1e-4 |
| FL rounds | 30 |
| Early stopping patience | 5 |
| Shared ratio gamma | 0.8 |
결과: Round 6에서 early stopping. V1 MSE=0.616 > B1 MSE=0.505.
- Codebook utilization: 8~22%
- 문제 진단: lr이 원본(1e-5) 대비 10배 높아 학습 불안정. M=64가 원본(256) 대비 1/4 수준으로 과소.
실행 2: 원본 하이퍼파라미터 적용¶
| 항목 | 값 | 변경 사항 |
|---|---|---|
| Clients | 5 | 유지 |
| Memory size M | 256 | 64 → 256 |
| Learning rate | 1e-5 | 1e-4 → 1e-5 |
| FL rounds | 100 | 30 → 100 |
| Early stopping patience | 10 | 5 → 10 |
| Shared ratio gamma | 0.95 | 0.8 → 0.95 |
결과: V1 MSE=0.620, codebook utilization 1~3%.
- 문제 진단: M=256으로 늘렸으나 오히려 utilization 급감. 5 clients로는 256개 codebook entry를 충분히 활용할 수 없음.
실행 3: 50 clients + local epochs 증가¶
| 항목 | 값 | 변경 사항 |
|---|---|---|
| Clients | 50 | 5 → 50 |
| Memory size M | 256 | 유지 |
| Learning rate | 1e-5 | 유지 |
| Local epochs | 10 | 5 → 10 |
| FL rounds | 100 | 유지 |
| Early stopping patience | 10 | 유지 |
| Shared ratio gamma | 0.95 | 유지 |
결과: Round 13에서 early stopping. V1 MSE=0.626 > B1 MSE=0.505.
Round별 학습 추이 (실행 3)¶
| Round | Train Loss | Val Loss | Codebook Util | Clusters |
|---|---|---|---|---|
| 1 | 0.2089 | 0.1338 | 8.5% | 369 |
| 3 | 0.2049 | 0.1302 (best) | 8.9% | 407 |
| 13 | 0.3245 | 0.2097 | 6.0% | 245 |
Round 3 이후 val_loss가 단조 증가하여 발산 양상을 보임.
3. 개별 가구 결과 (실행 3 기준)¶
| Apt | B0 MSE | B0 PAPE | B1 MSE | B1 PAPE | V1 MSE | V1 PAPE | V1 Util |
|---|---|---|---|---|---|---|---|
| Apt6 | 0.776 | 40.96% | — | — | 0.959 | 63.53% | 4.5% |
| Apt15 | 0.154 | 38.25% | — | — | 0.184 | 52.28% | 14.9% |
| Apt30 | 0.089 | 41.86% | — | — | 0.110 | 56.54% | 3.7% |
| Apt51 | 0.683 | 46.89% | — | — | 0.807 | 62.95% | 7.0% |
| Apt88 | 0.911 | 44.80% | — | — | 1.069 | 62.46% | 12.9% |
| Mean | 0.522 | 42.55% | 0.505 | 43.55% | 0.626 | 59.55% | 8.6% |
B1 결과: FedAvg+DLinear, 50 clients, Round 14 early stopping. avg_mse=0.5051, avg_mae=0.4671, avg_pape=43.55%.
주요 관측¶
- V1은 B0 대비 MSE +19.9%, PAPE +17.0pp 악화
- V1은 B1 대비 MSE +24.0% 악화
- Codebook utilization 전 가구 평균 8.6%로, 설계서 SUB-FAIL 기준(30%) 크게 하회
- 모든 가구에서 일관되게 V1이 B0, B1보다 열등
4. 버그 수정 이력¶
Bug #1: Global codebook 크기 불일치¶
- 증상:
global_codebook이 alignment 후[num_shared, D]로 축소되어, 다음 round에서 클라이언트 codebook과 크기 불일치 발생. - 수정: 각 클라이언트가 자신의 정렬된 codebook을 유지하도록 변경.
Bug #2: align() topk 에러¶
- 증상: 클러스터 수 <
num_shared일 때shared_protos크기 부족으로topk()에러 발생. - 수정: Isolated prototypes로 부족분을 채우고 M 크기를 보장하는 로직 추가 (assert문 포함).
5. 원본 코드 비교 분석¶
원본 FeDPM 코드(src/FedUnit-64D1/)를 확보하여 비교한 결과, 핵심적인 구조적 차이가 발견됨.
| 항목 | 우리 MVP | 원본 FeDPM |
|---|---|---|
| Encoder | 2-layer same-padding Conv1d + ReLU | Strided Conv1d (4x downsampling) + ResidualStack + pre_vq_conv |
| Decoder | Symmetric CNN + patch-wise Linear(64,1) | XcodeYtimeDecoder: FC flatten → Linear(D*L, pred_len) |
| MuStdModel | 없음 (RevIN만) | 별도 MLP로 mean/std 예측 |
| Loss | SmoothL1 + VQ loss (2항) | decode + mu + std + all + VQ loss (5항) |
| Personalized 전략 | diversity score만 (freq=1 고정) | usage_count 기반 diversity score |
| M 기본값 | 64 (후에 256으로 수정) | 256 |
| lr 기본값 | 1e-4 (후에 1e-5로 수정) | 1e-5 |
| gamma 기본값 | 0.8 (후에 0.95로 수정) | 0.95 |
근본 원인 분석¶
가장 치명적인 차이는 Encoder의 정보 병목(bottleneck) 부재.
- 원본 FeDPM encoder는 strided convolution으로 시계열을 4배 다운샘플링하여 정보를 압축한 후, 이 압축된 표현을 codebook에 전달한다.
- 우리 MVP encoder는 same-padding convolution을 사용하여 입력 차원을 그대로 유지하므로, VQ codebook이 의미 있는 prototype을 학습할 유인이 없다.
- 정보 병목이 없으면 codebook lookup은 단순한 pass-through가 되어 utilization이 저하되고, 연합학습을 통한 지식 공유 효과도 사라진다.
하이퍼파라미터 차이(lr 10x, M 4x, gamma)도 학습 안정성에 영향을 미쳤으나, 아키텍처 차이가 더 근본적인 원인이다.
6. exp-critic 판정¶
| 항목 | 내용 |
|---|---|
| 판정 | REJECT |
| 근거 | "간소화된 구현의 실패이지 알고리즘 한계가 아님" |
지적된 핵심 이슈 4가지¶
| ID | 이슈 | 설명 |
|---|---|---|
| C1 | Encoder에 정보 병목 없음 | Same-padding Conv1d는 VQ의 필수 전제인 정보 압축을 수행하지 않음 |
| C2 | Decoder가 시간 의존성 무시 | Patch-wise Linear는 시점 간 관계를 모델링하지 못함 |
| C3 | MuStdModel 누락 | 원본의 mean/std 예측 경로가 빠져 비정규 시계열 처리 불가 |
| C4 | B1 vs V1 비교 불공정 | DLinear(B1)와 CNN+VQ(V1)의 모델 용량 및 구조가 달라 순수 FL 효과 비교 불가 |
결론: Phase 1 FAIL은 FeDPM 알고리즘의 한계가 아닌, MVP 구현의 구조적 결함에 기인. 원본 코드 기반 재실험 필요.
7. 현재 상태 및 다음 단계¶
| 항목 | 상태 |
|---|---|
| Phase 1 판정 | FAIL (3회 모두) |
| exp-critic 판정 | REJECT (재실험 요구) |
| 분기 경로 | 설계서 FAIL 분기가 아닌, 구현 결함에 의한 재실험 |
| PR | #9 생성 완료 (feat/exp6-fedpm-mvp) |
다음 단계: 원본 코드 기반 재실험¶
- 원본 FeDPM 코드(
src/FedUnit-64D1/)의 Encoder, PMR, XcodeYtimeDecoder, Server 모듈을 그대로 import하여 EC50 데이터로 실행 예정. - exp-expert가 재실험 스크립트 작성 중.
- 원본 아키텍처로 H6-1을 재검증한 후, Phase 1 Gate 판정을 재수행.
8. 교훈¶
-
원본 코드 우선 확보 원칙: 논문 기반 직접 구현 시, 원본 코드가 있다면 반드시 먼저 확보하여 비교해야 한다. "논문 설명 기반 구현"은 핵심 설계 결정을 누락할 위험이 높다.
-
VQ-VAE에서 정보 병목은 필수: VQ-VAE 계열 모델에서 encoder의 정보 압축(bottleneck)은 codebook 학습의 핵심 전제조건이다. 이를 생략하면 codebook이 무의미한 pass-through가 된다.
-
하이퍼파라미터 < 아키텍처: 실행 1→2에서 lr, M, gamma를 원본 값으로 맞췄음에도 성능 개선이 없었다. 아키텍처 구조의 차이가 하이퍼파라미터 조정으로 보상되지 않음을 확인.
부록: 3회 실행 요약¶
| 실행 | Clients | M | lr | Rounds (실제) | V1 MSE | Codebook Util | 주요 문제 |
|---|---|---|---|---|---|---|---|
| 1 | 5 | 64 | 1e-4 | 6 (ES) | 0.616 | 8~22% | lr 10x 과다, M 과소 |
| 2 | 5 | 256 | 1e-5 | 100 | 0.620 | 1~3% | 5 clients로 M=256 활용 불가 |
| 3 | 50 | 256 | 1e-5 | 13 (ES) | 0.626 | 5~9% | Encoder 병목 부재 → 발산 |
비교 기준: B0 mean MSE=0.522, B1 mean MSE=0.505. 세 실행 모두 B1을 초과.