작성일: 2026-04-08 최종 업데이트: 2026-04-09 (야간) 작성자: lab-leader 실행 담당: engineer (P0 완료) → exp-expert (P2 종료) 마감: 2026-04-14 상태: P2 KD Ablation 종료 — A_adp KD 스토리라인 REJECT / 다음 방향 결정 필요
GWN Multivariate KD 프로세스: 버그 수정 → Feature 전달 설계 → 실험¶
목적¶
- P0 블로커 2건 (DataLoader 시간 정렬, PAPE 정의 통일) 해결
- GWN의 spatial feature를 Student에 전달하는 방법 설계 및 구현
- 기존
0407_revised_GWN_KD_experiment.mdPhase 2 KD Ablation 진행
Phase 0: 블로커 수정 (담당: engineer, 마감: 04-09)¶
0-1. DataLoader 시간 정렬 버그 [CRITICAL]¶
현황: GWNSoftDTWTrainer.train_epoch()에서 ECPair DataLoader와 GWN DataLoader가 독립적으로 shuffle → 동일 batch의 시간 window 불일치.
해결 방향: GWN soft target 사전 계산 방식으로 전환
class GWNSoftDTWTrainer(ECPairTrainer):
def _precompute_soft_targets(self) -> dict[str, torch.Tensor]:
"""전체 데이터에 대해 GWN Teacher inference → soft target 저장."""
# 1. GWN DataLoader (shuffle=False)로 전체 순회
# 2. 가구별 예측값 [num_samples, pred_len] 텐서로 저장
# 3. ECPair Dataset의 index와 1:1 매핑 보장
검증: tests/test_gwn_softdtw_alignment.py
- ECPair index 0의 시간 window == GWN soft target index 0의 시간 window
- shuffle 후에도 매핑 유지
0-2. PAPE 정의 통일 [HIGH]¶
현황: ec_pair_trainer.py와 gwn_dataset.py에서 PAPE 계산 방식이 다를 수 있음.
해결: 단일 함수 compute_pape(y_true, y_pred) 정의 후 양쪽에서 호출.
# src/peak_analysis/metrics.py (또는 기존 위치)
def compute_pape(y_true: torch.Tensor, y_pred: torch.Tensor) -> float:
"""Peak Absolute Percentage Error.
각 샘플의 실제 피크값 대비 예측 피크값의 오차율.
PAPE = mean(|peak(y_true) - peak(y_pred)| / peak(y_true)) * 100
"""
true_peaks = y_true.max(dim=-1).values
pred_peaks = y_pred.max(dim=-1).values
return (torch.abs(true_peaks - pred_peaks) / (true_peaks + 1e-8)).mean().item() * 100
0-3. 기타 정리¶
- DLinear Teacher 불필요 학습 제거 (
kd_method == "gwn_softdtw"조건 분기) - 가구 정합성 검증 (
assert apt_name in GWN_HOUSEHOLDS) - MAPE를 주 지표에서 제거 (MSE + MAE + PAPE 3종으로 한정)
Phase 1: Feature 전달 설계 (담당: lab-leader + engineer)¶
배경: 왜 Feature 전달이 필요한가?¶
현재 Response-based KD (soft target)만으로는 GWN이 학습한 가구 간 공간적 관계(A_adp)가 Student에 전달되지 않는다. Lin et al. 논문도 Response-based만 사용하므로, Feature 전달은 본 연구의 핵심 차별화 포인트가 된다.
문제: DLinear는 단변량 (channels=1)¶
A_adp [N, N]이나 GWN hidden state [B, N, hidden_dim]을 직접 입력으로 받을 수 없다.
후보 방법론 비교¶
방법 B: SC-DLinear (Spatial-Conditioned DLinear) — 권장¶
DLinear의 출력을 가구의 공간적 위치(A_adp)에 따라 변조(modulation).
DLinear backbone (변경 없음)
↓ y_base = [B, pred_len]
A_adp[i,:] → MLP(N, 16, 2*pred_len) → (gamma, beta) # scale/shift 파라미터
↓
y_out = gamma * y_base + beta # FiLM-style conditioning
| 항목 | 값 |
|---|---|
| 추가 파라미터 | N16 + 162pred_len = 5016 + 16*48 = ~1,568 |
| 총 파라미터 | 4,656 + 1,568 = ~6,224 (34% 증가) |
| 장점 | DLinear 핵심 구조 유지, A_adp의 공간 정보를 직접 활용 |
| 단점 | A_adp가 시간 불변 → 모든 window에 동일 변조 적용 |
| Critic 우려 | 방법 A와 유사한 "상수 bias" 한계 가능성 |
방법 C: GA-DLinear (Graph-Aware DLinear) — 대안¶
이웃 가중합 시계열을 2번째 채널로 추가.
x_self = [B, seq_len, 1] # 자기 가구 시계열
x_neighbor = sum(A_adp[i,j] * x_j for j != i) # 이웃 가중합
x_input = [x_self, x_neighbor] → [B, seq_len, 2]
DLinear(channels=2, individual=True)
| 항목 | 값 |
|---|---|
| 추가 파라미터 | channels 1→2: Linear 2개 추가 = ~4,656 |
| 총 파라미터 | ~9,312 (2배) |
| 장점 | 시간 변동하는 이웃 정보 활용 가능, 직관적 |
| 단점 | 파라미터 2배, inference 시 이웃 데이터 필요 (on-device 제약) |
| Critic 우려 | 가중 평균의 피크 평활화 위험 (Variant 2와 동일 문제) |
방법 D: Mini-GWN Student — 참고¶
| 항목 | 값 |
|---|---|
| 총 파라미터 | ~15K~30K (DLinear의 3~6배) |
| 장점 | Teacher와 동일 아키텍처 → Feature KD가 자연스러움 |
| 단점 | on-device 경량성 목적 위반, inference에 전체 N가구 데이터 필요 |
선택 및 실행 방향¶
1순위: 방법 B (SC-DLinear) - 이유: 파라미터 증가 최소, DLinear 구조 유지, 논문 기여 명확 - 단, Critic이 "상수 bias" 한계를 지적할 가능성 → ablation으로 검증
2순위: 방법 C (GA-DLinear) - 방법 B가 유의미하지 않을 경우 대안 - 이웃 시계열을 A_adp로 가중합하되, 피크 보존 변환 적용 (max pooling 등)
3순위: 방법 E (Hidden Alignment + Projector) - Student 모델 변경 없이 loss 레벨에서 feature 전달 - 방법 B/C와 조합 가능
구현 우선순위¶
Phase 1a: SC-DLinear 구현 (engineer, 0.5일)
└─ DLinear 클래스에 spatial_conditioning 옵션 추가
└─ A_adp[i,:] 입력받는 MLP conditioning module 추가
└─ 단위 테스트: shape, gradient flow, 파라미터 수 검증
Phase 1b: GA-DLinear 구현 (engineer, 0.5일, 조건부)
└─ DLinear(channels=2, individual=True) 설정
└─ 이웃 가중합 전처리 파이프라인 추가
└─ 피크 보존 변환 옵션 (mean vs max)
Phase 2: KD Ablation 실험 (담당: exp-expert, 마감: 04-12)¶
Gate 조건: Phase 0 완료 + GWN N=50 Teacher 체크포인트 확보¶
현재 GWN N=50 Teacher MSE = 0.5049 (kW²) → DLinear baseline(0.5207) 초과 확인됨.
체크포인트: outputs/models/gwn_teacher_ec50_50hh.pt
2-1. 확장 Ablation Design (기존 4-way + Feature 전달)¶
| ID | Student | Teacher | KD Loss | Feature 전달 | 목적 |
|---|---|---|---|---|---|
| A1 | DLinear | None | — | — | M0 Baseline |
| A2 | DLinear | GWN | MSE | — | Response-only KD |
| A3 | DLinear | GWN | Soft-DTW | — | Soft-DTW KD |
| A4 | DLinear | GWN | Soft-DTW | Adj-Guided λ (방법 E) | Loss-level feature 전달 |
| A5 | SC-DLinear | GWN | Soft-DTW | A_adp conditioning | Feature 전달 (본 연구 핵심) |
| A6 | SC-DLinear | GWN | MSE | A_adp conditioning | Feature + Response MSE |
| A7 | SC-DLinear | No-KD | A_adp conditioning only | — | 2×2 Factorial |
2-2. Hyperparameter 탐색¶
| Parameter | 범위 |
|---|---|
| lambda_KD | {0.01, 0.05, 0.1, 0.3, 0.5} |
| gamma (Soft-DTW) | {0.01, 0.1, 1.0} |
| SC-DLinear MLP hidden | {8, 16, 32} |
2-3. 평가 메트릭 (통일)¶
- MSE (kW²): 주 지표
- MAE (kW): 보조 지표
- PAPE (%): 피크 예측 정확도 —
compute_pape()통일 함수 사용 - ~~MAPE~~: 제거
Phase 3: 결과 평가 및 Critic 전달 (마감: 04-14)¶
3-1. 성공 기준¶
| 메트릭 | 기준 | 근거 |
|---|---|---|
| A5 (SC-DLinear) MSE | < A3 (DLinear+Soft-DTW) | Feature 전달의 marginal 효과 |
| A5 MSE | < 0.4947 (M0 - 5%) | 실질적 개선 |
| PAPE | A5 ≤ A1 (비악화) | 피크 예측 보호 |
| 일관성 | 5가구 중 3/5 이상 개선 | 일반화 |
3-2. Multi-seed 검증¶
최적 설정에 대해 seed={42, 123, 456} 3회 반복. Paired t-test로 통계적 유의성 확인.
3-3. 논문 기여 정리¶
- Lin et al. 대비 차별화: Response-based KD → Feature-aware KD (SC-DLinear)
- DistilTS 대비 차별화: Transformer Teacher → GWN(공간) + Chronos(시간) Dual-Teacher
- 핵심 주장: "GWN의 Self-Adaptive Adjacency Matrix가 인코딩한 가구 간 공간적 관계를 경량 Student에 conditioning으로 전달하면, 단순 soft target 대비 유의미한 개선을 달성한다"
Phase 4 (후속): Chronos Dual-Teacher KD¶
Phase 3 완료 후 0408_chronos_hidden_kd_plan.md에 따라 진행.
GWN(공간) + Chronos(시간) → SC-DLinear Student.
체크리스트¶
P0 (engineer, 04-09) — 완료¶
- DataLoader 시간 정렬 버그 수정 (
ec_pair_trainer.py) — GWN soft target 사전 계산 방식 전환 - PAPE 통일 함수 구현 및 적용 —
compute_pape()공통 함수 도입 - DLinear Teacher 불필요 학습 제거 —
gwn_softdtw모드 조건 분기 - 가구 정합성 검증 코드 추가 —
assert apt_name in GWN_HOUSEHOLDS - MAPE 주 지표 제거 — MSE + MAE + PAPE 3종 통일
- 단위 테스트 작성 및 통과 확인 — 218/218 통과
P1 (engineer, 04-10) — 완료¶
- SC-DLinear 구현 (spatial conditioning module) — FiLM-style,
src/peak_analysis/models/students/sc_dlinear.py - SC-DLinear 단위 테스트 (shape, gradient, param count) — 11/11 통과
- GA-DLinear 구현 (조건부, SC-DLinear 실패 시) — 보류 중
P2 (exp-expert, 04-09~12) — 종료 (REJECT)¶
- A_adp 품질 검질 (entropy, 대각선 지배도) — CONDITIONAL PASS (Entropy PASS, 대각선 지배도 FAIL: 23.84, 기준 5.0의 4.8배)
- A1 Baseline (5가구) — Mean MSE=0.5223, Mean PAPE=42.55%
- A2 (DLinear + GWN MSE KD, 5가구) — Mean MSE=0.5186 (재실험)
- A6 (SC-DLinear + GWN MSE KD + A_adp, 5가구) — Mean MSE=0.5091, -2.5% vs A1
- A7 (SC-DLinear + No-KD, A_adp conditioning only) — 2×2 Factorial 실험으로 추가
- exp-critic 2차 리뷰 — REJECT (A7 누락, 모든 비교 p>0.05, Apt51 단일 가구 의존)
- 2×2 Factorial + Null Test 실행 (A1/A2/A7/A6 + AN)
- KD main effect: p=0.2403 (비유의)
- A_adp main effect: p=0.3339 (비유의)
- Interaction: p=0.4446 (비유의)
- Null test (A6 vs AN): p=0.3711 (비유의) — A_adp가 random 대비 정보 전달 증거 없음
- 최종 결론: GWN → A_adp → SC-DLinear 스토리라인 현재 데이터로 지지되지 않음
- A_adp 대각선 지배도 23.84 (off-diagonal 정보 약함)
- Apt51이 A6-AN 차이의 98.6% 차지 (단일 가구 의존)
- FiLM conditioning이 실질적 spatial information 전달 불가
P3 (exp-expert, 04-12~14) — 보류 (P2 REJECT로 재설계 필요)¶
- 최적 설정 Full Evaluation (5가구) — 보류
- Multi-seed 검증 (seed={42, 123, 456}) — 보류
- Critic 최종 리뷰 통과 후 reporter 전달 — 보류
2026-04-09 진행 현황 (최종)¶
오전: exp-critic 1차 리뷰 → 버그 5건 수정 → A1/A2/A6 재실험¶
- exp-critic 1차 리뷰 완료: C1(스케일 불일치), M5(shuffle), M6(통계검정), M1(batch_size), M3(Gate 0-A) 버그 5건 발견
- 버그 5건 전부 수정 완료 (inverse_transform 추가, _SoftTargetDataset, stats_utils.py 등)
- A1/A2/A6 재실험 완료:
- A1 Mean MSE=0.5223, PAPE=42.55%
- A2 Mean MSE=0.5186
- A6 Mean MSE=0.5091 (-2.5% vs A1), 그러나 PAPE 4/5 가구 악화 (42.55% → 43.39%)
오후: exp-critic 2차 리뷰 → REJECT → 2×2 Factorial + Null Test¶
- exp-critic 2차 리뷰 REJECT:
- A7 누락으로 A_adp conditioning 단독 효과 분리 불가
- 모든 비교 통계적 비유의 (p > 0.05)
-
Apt51 단일 가구가 전체 MSE 개선의 85.8% 차지
-
2×2 Factorial (A1/A2/A7/A6) + Null Test (AN) 실행:
- KD main effect: +0.0059, p=0.2403
- A_adp main effect: +0.0073, p=0.3339
- Interaction: -0.0044, p=0.4446
- Null test: A6 vs AN diff=0.0043, p=0.3711
결론: A_adp KD 스토리라인 REJECT¶
"GWN → A_adp → SC-DLinear → 성능 향상" 스토리라인은 현재 데이터로 지지되지 않는다.
- 근본 원인: A_adp 대각선 지배도 23.84 (off-diagonal 정보 약함) → FiLM conditioning이 실질적 spatial information 전달 불가
- 다음 방향: docs/reference/chronos_hidden_kd_design.md 참조 (우선순위 격상)
리스크¶
| 리스크 | 심각도 | 대응 |
|---|---|---|
| SC-DLinear의 A_adp conditioning이 "상수 bias"에 불과할 가능성 | HIGH | GA-DLinear 대안 준비, ablation으로 검증 |
| GA-DLinear의 이웃 가중합이 피크 평활화 유발 | MEDIUM | max pooling 변형 테스트 |
| On-device 배포 시 A_adp 접근 불가 (단일 가구만 관측) | HIGH | 학습 시에만 A_adp 사용, inference 시 frozen embedding → 추가 설계 필요 |
| 논문 마감 04-30 (3주) | CRITICAL | P0~P2를 4일 내 완료 목표 |