콘텐츠로 이동

Federated Learning 실험 Q&A

참고 보고서: report/version5/exp-expert/v5_0413_FL_Report.md


Q1. Fine-Tuning 시 데이터 분할은 어떻게 했나?

일반적으로 7 : 1 : 2 비율을 사용하는데, 본 실험도 동일한가?

Train 70 % / Val 10 % / Test 20 % 비율로 시간순(chronological) 분할하였다.

구분 비율 용도
Train 70 % FL 학습 및 Fine-Tuning
Val 10 % Early stopping / 하이퍼파라미터 선택
Test 20 % 최종 성능 평가
  • 분할은 셔플 없이 시간순으로 수행한다 — 앞쪽 70 %가 train, 다음 10 %가 val, 마지막 20 %가 test.
  • Fine-Tuning에도 동일한 분할을 사용한다. FL 글로벌 모델 가중치를 초기값으로 로드한 뒤, 해당 가구의 train split으로 추가 학습(10 ep 또는 50 ep)하고, test split으로 평가한다.
  • Few-shot 실험(data_fraction < 1.0)에서는 train split의 앞부분 일부만 사용하되, val/test는 항상 전체를 사용하여 공정 비교를 보장한다.

📍 코드: src/fed_learning/data_utils.pytrain_ratio=0.7, val_ratio=0.1


Q2. PAPE가 피크 대응에 효과적인지 증명할 수 있는가?

PAPE는 피크 "크기(amplitude)" 오차 메트릭이며, 피크 "탐지(detection)" 성능과는 다른 관점이다.

PAPE 정의

PAPE = mean( |max(y_true) − max(y_pred)| / max(y_true) ) × 100

각 예측 윈도우(24 h)에서 실제 피크값과 예측 피크값의 상대 오차율(%) 을 측정한다.

왜 중요한가?

  • BESS 용량 계획(피크 셰이빙)에 직결 — 피크 크기를 정확히 예측해야 배터리 충·방전 스케줄을 최적 설계할 수 있다.
  • 단, PAPE만으로는 피크 시점(위치)을 맞췄는지는 알 수 없다 → HR(Hit Rate)로 보완 필요.

증명 가능 여부

PAPE ↓ → BESS MILP 피크 셰이빙 효과 ↑ 라는 관계는, 후속 ESS 시뮬레이션에서 PAPE와 비용 절감률 간 상관관계를 보여줌으로써 정량 증명 가능하다.

📍 코드: src/peak_analysis/metrics.pycompute_pape()


Q3. 시간 대응 메트릭인 HR(Hit Rate)은?

HR은 이미 PeakEvaluator 클래스에 구현되어 있다.

메트릭 정의
HR (Hit Rate) 실제 피크 중 예측 피크가 ±1시간 이내에 존재하는 비율 (= Recall)
Precision 예측 피크 중 실제 피크와 매칭되는 비율
F1-Score Precision과 HR의 조화 평균

현재 한계

FL 실험(v5_0413)에서는 MSE, MAE, PAPE만 보고에 포함되었고, HR/Precision/F1은 기록되지 않았다. 이는 FL 실험이 윈도우 단위 compute_pape()를 사용했기 때문이다 (시계열 전체에 find_peaks를 적용하는 PeakEvaluator와 다른 계산 경로).

향후 보완

FL 실험 결과를 PeakEvaluator로 재평가하거나, FL 스크립트에 HR/Precision/F1 계산을 추가하여 시간 대응 성능을 함께 보고해야 한다.

📍 코드: src/peak_analysis/metrics.pyPeakEvaluator


Q4. Cold-Start의 정확한 정의 및 프로세스

Cold-Start란 FL 학습에 참여하지 않은 신규 가구에 모델을 적용하는 시나리오를 의미한다.

프로세스

1. Federation Pool 구성
   EC50 중 평가 대상 5가구(Apt6, 15, 30, 51, 88) 제외 → 45가구로 FL 학습

2. FL 글로벌 모델 학습
   45가구로 FedAvg 10 rounds 수행 → 글로벌 모델 획득

3. 신규 가구 적용 (4가지 조건 비교)
   ┌──────────────────┬─────────────────────────────────────┐
   │ CS0 (Scratch)    │ 자체 데이터만으로 50 ep 학습 (FL 미사용) │
   │ CS1 (Fed-Direct) │ 글로벌 모델 그대로 적용 (zero-shot)     │
   │ CS2 (Fed-FT-10)  │ 글로벌 모델 + 10 ep fine-tuning        │
   │ CS3 (Fed-FT-50)  │ 글로벌 모델 + 50 ep fine-tuning        │
   └──────────────────┴─────────────────────────────────────┘

4. Few-shot 변수
   data_fraction ∈ {0.1, 0.3, 0.5, 1.0} 으로 학습 데이터 양도 변화

핵심 결론

데이터가 극히 적은 상황(frac = 0.1)에서 FL 글로벌 모델(Fed-Direct)이 MSE 기준 12.9 % 개선을 달성 → Cold-Start 문제 해결에 FL의 가치가 명확히 입증됨.


Q5. Scratch(CS0)에도 data_fraction이 적용되는가?

그렇다. 공정한 비교를 위해 Scratch에도 동일하게 data_fraction이 적용된다.

  • train_scratch() 함수가 data_fraction 인자를 받아 create_household_dataloaders(data_fraction=data_frac)으로 전달한다.
  • data_fraction < 1.0이면 train split(전체의 70 %)의 앞부분 일부만 잘라서 사용한다.
frac Scratch (CS0) MSE Fed-Direct (CS1) MSE 개선율
0.1 0.573 0.499 12.9 %

frac이 작을수록 Scratch 성능이 나빠지고, FL 모델 대비 격차가 벌어진다.

📍 코드: experiments/federated/v5_0413_fed_cold_start.py:96-110, src/fed_learning/data_utils.py:71-73


Q6. DLinear의 손실함수는? Peak-Weighted Loss 반영 가능한가?

현재는 순수 nn.MSELoss()만 사용하고 있다. 하지만 Peak-Weighted Loss는 이미 구현되어 있어 반영 가능하다.

현재 상태

  • FL 학습: src/fed_learning/trainer.py:135nn.MSELoss()
  • Scratch/FT 학습: experiments/federated/v5_0413_fed_cold_start.py:114nn.MSELoss()

구현된 Peak-Weighted Loss 함수들

함수 설명
peak_aware_mse() 피크 시점에 가중치(기본 5×)를 부여하는 MSE
peak_kd_loss() KD용 피크 가중 손실 (정규화 FFT + 피크 가중 MSE)
horizon_weighted_mse() 미래 시점일수록 가중치를 지수 증가시키는 MSE

반영 방안

FL trainer의 _local_train()에서 criterionpeak_aware_mse로 교체하면 바로 적용 가능하다. → 피크 시점 오차에 높은 페널티를 부여하므로 PAPE 개선이 기대된다.

주의점

  • peak_aware_mse는 매 배치마다 find_peaks(scipy, CPU)를 호출 → 학습 속도 저하 가능
  • FL 환경에서 가구별 피크 패턴이 다르므로, 글로벌 모델이 특정 가구에 과적합되지 않도록 가중치(weight) 튜닝 필요

📍 코드: src/peak_analysis/losses/kd_losses.py