콘텐츠로 이동

작성일: 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 전달 설계 → 실험

목적

  1. P0 블로커 2건 (DataLoader 시간 정렬, PAPE 정의 통일) 해결
  2. GWN의 spatial feature를 Student에 전달하는 방법 설계 및 구현
  3. 기존 0407_revised_GWN_KD_experiment.md Phase 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.pygwn_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)

DLinear: [B, seq_len=96, 1] → decompose → Linear → [B, pred_len=24, 1]
         (4,656 params)

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 — 참고

Mini-GWN: hidden_dim=8, num_layers=2, embed_dim=4
입력: [B, N, seq_len] → 출력: [B, N, pred_len]
항목
총 파라미터 ~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 재실험

  1. exp-critic 1차 리뷰 완료: C1(스케일 불일치), M5(shuffle), M6(통계검정), M1(batch_size), M3(Gate 0-A) 버그 5건 발견
  2. 버그 5건 전부 수정 완료 (inverse_transform 추가, _SoftTargetDataset, stats_utils.py 등)
  3. A1/A2/A6 재실험 완료:
  4. A1 Mean MSE=0.5223, PAPE=42.55%
  5. A2 Mean MSE=0.5186
  6. 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

  1. exp-critic 2차 리뷰 REJECT:
  2. A7 누락으로 A_adp conditioning 단독 효과 분리 불가
  3. 모든 비교 통계적 비유의 (p > 0.05)
  4. Apt51 단일 가구가 전체 MSE 개선의 85.8% 차지

  5. 2×2 Factorial (A1/A2/A7/A6) + Null Test (AN) 실행:

  6. KD main effect: +0.0059, p=0.2403
  7. A_adp main effect: +0.0073, p=0.3339
  8. Interaction: -0.0044, p=0.4446
  9. 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일 내 완료 목표