실험6 Phase 2: Peak-Weighted Loss 적용¶
1. 목적¶
Phase 1에서 원본 FeDPM 아키텍처의 MSE(0.579)가 B0(0.522)과 유사한 수준으로 학습됨을 확인. 단, PAPE가 49.77%로 B0(42.55%) 대비 악화 — 피크 예측 정확도 개선이 필요.
Phase 2는 Peak-Weighted Loss를 적용하여 PAPE를 직접 공략한다.
2. Phase 1 결과 요약 (원본 FeDPM)¶
| Apt | MSE | PAPE (%) | CB Util (%) |
|---|---|---|---|
| Apt6 | 0.826 | 47.40 | 6.25 |
| Apt15 | 0.183 | 43.57 | 3.12 |
| Apt30 | 0.106 | 50.77 | 3.52 |
| Apt51 | 0.751 | 54.74 | 3.12 |
| Apt88 | 1.030 | 52.35 | 3.52 |
| Mean | 0.579 | 49.77 | 3.91 |
3. Codebook 분석 결과¶
Phase 2 설계 전 codebook 패턴을 분석하여 다음을 확인:
3-1. MVP vs 원본 codebook 차이¶
| MVP (same-pad Conv) | 원본 (strided Conv) | |
|---|---|---|
| 사용 코드 | 18/256 (7.0%) | 31/256 (12.1%) |
| 코드간 cosine sim | 0.597 (높음 = 구분력 낮음) | 0.039 (낮음 = 구분력 높음) |
원본 encoder의 정보 압축(4x downsampling)이 코드간 구분력을 크게 향상시킴.
3-2. 피크/비피크 코드 사용 패턴¶
두 모델 다 피크 전용 코드가 거의 없음 (원본: 0개, MVP: 1개). 모든 코드가 피크/비피크에 골고루 사용됨 (Peak% 14~22%, 기대값 18%).
→ 현재 codebook은 피크를 구분하지 못함. 피크 가중치 loss가 필요.
3-3. 추가 특성 피크 구분력 분석¶
| 특성 | 피크/비피크 비율 | 평가 |
|---|---|---|
| Window range (max-min) | 1.45x | 가장 높음 |
| Max 1st derivative | 1.44x | 급등 감지 |
| Window max | 1.44x | 높음 |
| FFT freq1 (96h trend) | 1.41x | trend |
| 1st derivative | 평균 |
특성 추가보다 loss function 변경이 더 직접적이라 판단하여 Phase 2 우선 진행.
4. Peak-Weighted Loss 설계¶
4-1. 수식¶
weight_t = 1 + alpha * (|target_t| / max(|target|, dim=T))
loss_peak = mean(weight_t * SmoothL1(pred_t, target_t))
alpha=2.0: 피크 시점 가중치 최대 3.0x, 저소비 시점 최소 1.1x- 피크/저소비 가중치 비율: 2.7x
4-2. 적용 위치 (핵심)¶
loss_decode = SmoothL1(ytime, norm_y) # 정규화 공간 (기존 유지)
loss_all = peak_weighted_smooth_l1(y_pred, y, alpha=2.0) # 원본 kW 스케일 (피크 가중)
loss = loss_decode + loss_all + vq_loss
정보 유출 검증:
- loss_all의 y(target)는 미래 24h 실제값 — 학습 시 정답이므로 유출 아님
- 가중치 계산에 사용되는 |target_t| / max(|target|)도 target 내부 연산 — 추론 시에는 가중치 불필요 (loss는 학습에만 사용)
- 추론 시 모델은 동일하게 y_hat만 출력 — 정보 유출 없음
정규화 호환성 검증:
- 정규화 공간(RevIN 후)에서 abs() 기반 가중치 적용 시, 음수 값이 피크로 오인될 수 있음
- 따라서 역정규화된 원본 스케일(kW)의 loss_all에만 적용 — 값이 항상 양수이므로 안전
4-3. 검증 결과¶
동일 크기 오차 (1.0 kW) 기준:
피크 시점 (5.0 kW) loss: 0.2500
비피크 시점 (1.0 kW) loss: 0.1167
비율: 2.14x → 피크 오차에 더 강한 페널티 확인
4-4. Alpha 값별 가중치 범위¶
| alpha | Weight range | Peak/Low ratio |
|---|---|---|
| 1.0 | [1.05, 2.00] | 1.9x |
| 2.0 | [1.10, 3.00] | 2.7x |
| 3.0 | [1.15, 4.00] | 3.5x |
| 5.0 | [1.25, 6.00] | 4.8x |
alpha=2.0을 기본값으로 선택 (설계서 기준, 과도한 피크 집중 방지).
5. 코드 변경 사항¶
변경 파일: experiments/distillation/v6_0415_fedpm_original.py¶
peak_weighted_smooth_l1import 추가local_train()에use_peak_loss,peak_alpha파라미터 추가loss_all계산에서use_peak_loss=True일 때peak_weighted_smooth_l1적용run_fedpm_original()에use_peak_loss,peak_alpha전달- CLI에
--phase {1,2},--alpha옵션 추가 - MLflow 실험명, 태그, CSV 파일명에 phase 구분 반영
변경하지 않은 것¶
loss_decode(정규화 공간): 기존 SmoothL1 유지vq_loss: commitment + codebook loss 유지- 모델 아키텍처: 변경 없음 (encoder/decoder/PMR 동일)
- Memory Alignment: 변경 없음
6. 실행¶
# Phase 2: Peak-Weighted Loss (alpha=2.0)
uv run python experiments/distillation/v6_0415_fedpm_original.py \
--phase 2 --alpha 2.0 --rounds 100 --local_epochs 5 --patience 10
7. 가설 (H6-2)¶
P1 mean PAPE < V1 mean PAPE (49.77%)
Phase 1의 V1 PAPE(49.77%)보다 개선되는지 확인. B0 PAPE(42.55%)에 근접하거나 이하가 되면 유의미한 성과.
8. 예상 결과 시나리오¶
| 시나리오 | MSE | PAPE | 해석 |
|---|---|---|---|
| 성공 | ~0.58 (유지) | <45% | 피크 가중치가 PAPE 개선, MSE 유지 |
| 부분 성공 | ~0.60 (약간 악화) | <48% | PAPE 개선되나 MSE trade-off |
| 실패 | >0.65 | >50% | 피크 가중치가 학습 불안정 초래 |
9. 다음 단계¶
- Phase 2 결과 확인 후 exp-critic 리뷰
- PAPE 개선 확인 시 → Phase 3 (Residual Path) 진행
- PAPE 미개선 시 → alpha 조정 (1.0, 3.0) 또는 track-d 종료 판단