콘텐츠로 이동

Source: report/version6/exp-expert/v6_0415_exp6_phase2_peak_loss.md

실험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_ally(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

  1. peak_weighted_smooth_l1 import 추가
  2. local_train()use_peak_loss, peak_alpha 파라미터 추가
  3. loss_all 계산에서 use_peak_loss=True일 때 peak_weighted_smooth_l1 적용
  4. run_fedpm_original()use_peak_loss, peak_alpha 전달
  5. CLI에 --phase {1,2}, --alpha 옵션 추가
  6. 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 종료 판단