Federated Learning 실험 Q&A¶
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.py — train_ratio=0.7, val_ratio=0.1
Q2. PAPE가 피크 대응에 효과적인지 증명할 수 있는가?¶
PAPE는 피크 "크기(amplitude)" 오차 메트릭이며, 피크 "탐지(detection)" 성능과는 다른 관점이다.
PAPE 정의¶
각 예측 윈도우(24 h)에서 실제 피크값과 예측 피크값의 상대 오차율(%) 을 측정한다.
왜 중요한가?¶
- BESS 용량 계획(피크 셰이빙)에 직결 — 피크 크기를 정확히 예측해야 배터리 충·방전 스케줄을 최적 설계할 수 있다.
- 단, PAPE만으로는 피크 시점(위치)을 맞췄는지는 알 수 없다 → HR(Hit Rate)로 보완 필요.
증명 가능 여부¶
PAPE ↓ → BESS MILP 피크 셰이빙 효과 ↑ 라는 관계는, 후속 ESS 시뮬레이션에서 PAPE와 비용 절감률 간 상관관계를 보여줌으로써 정량 증명 가능하다.
📍 코드: src/peak_analysis/metrics.py — compute_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.py — PeakEvaluator
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:135→nn.MSELoss() - Scratch/FT 학습:
experiments/federated/v5_0413_fed_cold_start.py:114→nn.MSELoss()
구현된 Peak-Weighted Loss 함수들¶
| 함수 | 설명 |
|---|---|
peak_aware_mse() |
피크 시점에 가중치(기본 5×)를 부여하는 MSE |
peak_kd_loss() |
KD용 피크 가중 손실 (정규화 FFT + 피크 가중 MSE) |
horizon_weighted_mse() |
미래 시점일수록 가중치를 지수 증가시키는 MSE |
반영 방안¶
FL trainer의 _local_train()에서 criterion을 peak_aware_mse로 교체하면 바로 적용 가능하다.
→ 피크 시점 오차에 높은 페널티를 부여하므로 PAPE 개선이 기대된다.
주의점¶
peak_aware_mse는 매 배치마다find_peaks(scipy, CPU)를 호출 → 학습 속도 저하 가능- FL 환경에서 가구별 피크 패턴이 다르므로, 글로벌 모델이 특정 가구에 과적합되지 않도록 가중치(
weight) 튜닝 필요
📍 코드: src/peak_analysis/losses/kd_losses.py