콘텐츠로 이동

실험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. 교훈

  1. 원본 코드 우선 확보 원칙: 논문 기반 직접 구현 시, 원본 코드가 있다면 반드시 먼저 확보하여 비교해야 한다. "논문 설명 기반 구현"은 핵심 설계 결정을 누락할 위험이 높다.

  2. VQ-VAE에서 정보 병목은 필수: VQ-VAE 계열 모델에서 encoder의 정보 압축(bottleneck)은 codebook 학습의 핵심 전제조건이다. 이를 생략하면 codebook이 무의미한 pass-through가 된다.

  3. 하이퍼파라미터 < 아키텍처: 실행 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을 초과.