콘텐츠로 이동

Source: report/version9/lab-leader/v9-06_baseline_extension_2.md

v9-06 Baseline Extension 2 — NF MLP 계열 + TSLib 4종 확장

0. 범위 고지

본 설계는 v9-05 (NF Transformer 3종 FAIL) extension 이다. v9-05 결과 (H9-5a FAIL, PAPE 52–53, HR@1 15–27) 분석에서 decomposition + attention 계열의 peak smoothing 가설이 도출됐고, 본 phase 는 (a) N-HiTS 계열 MLP 구조 (NBEATSx/TSMixer/TiDE) 와 (b) TSLib hierarchical/attention variant 4종 을 동일 프로토콜로 평가해 VQ-친화 backbone 후보를 재탐색한다. 사용자가 확정한 Track A/B 모델·가설·gating·P1 강제사항을 준수하며, 추가 ablation/확장은 설계하지 않는다.


1. 목적 및 가설

1.1 배경

v9-05 는 Autoformer/Informer/FEDformer 3종이 PAPE 52.04–53.40, HR@1 15.33–27.05 로 (PAPE ≤ 43 AND HR@1 ≥ 37) gating 을 전수 FAIL 했다. v9-05 reporter §4 "주요 관찰" 에서 확인된 패턴:

  • N-HiTS (v6, PAPE 39.26, HR@1 22.29) 와 v9-05 신규 3종 간 PAPE 격차 13%p — hierarchical interpolation + multi-rate sampling 구조가 peak 축에 우위.
  • Decomposition (Autoformer MovingAvg=25) + attention (Informer ProbSparse, FEDformer Fourier top-k) 공통점 → peak 좌표를 low-pass / sparse 표현으로 smoothing 하는 구조적 한계 가설 (revision 1 에서 "가설, ablation 미수행" 으로 한정).

v9-05 reporter §8.1 은 TSLib 2차 착수 판단 자료로 "Track B 4종 중 기계학습적으로 1차 3종과 강하게 차별되는 카테고리는 SCINet (non-attention hierarchical) 정도" 라고 명시. 본 phase 는 이 관찰을 검증하기 위해 (Track A) N-HiTS 친척인 MLP 계열 3종 + (Track B) TSLib 4종 을 함께 평가한다.

v9-05 reporter §8.3 P1 강제사항 ("Lightning on_train_epoch_end callback 으로 per-epoch train/val loss MLflow 로깅") 은 본 phase 구현 요구사항으로 이전된다.

본 실험은 v9-05 와 동일하게 VQ 이식 전 단계의 순수 예측 성능 벤치마크 이다. VQ 결합·FL·KD 는 범위 밖.

1.2 핵심 연구 질문

EC50 5가구(Apt6/15/30/51/88) 가구별 독립 학습 조건에서, (A) N-HiTS 계열 MLP 구조 (NBEATSx, TSMixer, TiDE)(B) TSLib hierarchical/variant 4종 (SCINet, ETSformer, Pyraformer, Crossformer) 중 (PAPE ≤ 43 AND HR@1 ≥ 37) gating 을 통과하는 모델이 존재하는가. 특히 SCINet (Track B 내 hierarchical 구조) 이 v9-05 decomposition+attention 계열 FAIL 패턴과 차별되는지.

1.3 가설 (H9-6)

  • H9-6a (NF MLP 계열 peak 우위 재현): NBEATSx / TSMixer / TiDE 중 최소 1개 이상이 5-apt × 3-seed 평균으로 (PAPE ≤ 43 AND HR@1 ≥ 37) 를 달성한다.
  • 근거: N-HiTS (PAPE 39.26, HR@1 22.29, v6 NF baseline) 가 NF Transformer 3종 대비 PAPE 13%p 우위. NBEATSx 는 N-HiTS 선조 basis-residual 구조, TSMixer/TiDE 는 attention 회피 all-MLP 구조 → v9-05 decomposition+attention smoothing 가설을 우회할 가능성.
  • 주의: HR@1 ≥ 37 은 Chronos zero-shot (37.71) 수준이며 어떠한 NF/TSLib 모델도 v6/v9-01 benchmark 에서 도달한 적 없음 — H9-6a Pass 는 공격적 기준. Watch 판정 (단일 축 Pass) 도 meaningful 결과로 취급.

  • H9-6b (TSLib SCINet 단독 기대): SCINet 이 hierarchical sample-convolution-interaction 구조 (N-HiTS 유사 multi-resolution) 로 Track B 내 나머지 3종 (ETSformer / Pyraformer / Crossformer) 대비 peak 축 (PAPE, HR@1) 상대 우위. 단 절대 gating (PAPE ≤ 43 AND HR@1 ≥ 37) 통과 여부는 사전에 확신 불가 — 상대 우위만 H9-6b 의 판정 대상.

  • 근거: SCINet 의 SCI-Block binary tree 구조는 N-HiTS 의 hierarchical interpolation 과 기계학습적으로 동류. Track B 내 나머지 3종은 ETSformer (decomposition 계열, Autoformer 유사) / Pyraformer (hierarchical attention) / Crossformer (multivariate 특화, 단변량에서 무력화).
  • 판정: Track B 4종 내 PAPE ≤ min(ETSformer, Pyraformer, Crossformer) AND HR@1 ≥ max(세 모델 HR@1) 둘 다 만족 시 H9-6b 지지. 절대 gating 통과는 부가.

  • H9-6c (TSLib Transformer variants FAIL 재현): ETSformer / Pyraformer / Crossformer 는 v9-05 Autoformer/Informer/FEDformer 와 동질 패턴 (PAPE 50+, HR@1 ≤ 30) 으로 H9-5a-type FAIL 을 재현한다.

  • 근거: 세 모델 모두 decomposition 또는 attention 기반이며 (ETSformer = ETS decomp + attention, Pyraformer = pyramidal attention, Crossformer = cross-dim attention). v9-05 FAIL 가설 (decomp+attention smoothing) 의 외부 validation 역할.
  • 판정: 세 모델 모두 5-apt × 3-seed 평균 PAPE > 43 OR HR@1 < 37 이면 H9-6c 지지.

1.4 Gating (H9-6a 기준, v9-05 §1.4 일치)

레벨 조건 판정
Pass Track A/B 통합, 1개 이상 모델이 (PAPE ≤ 43 AND HR@1 ≥ 37) 3-seed 평균 달성 H9-6a PASS, VQ 후보 확정
Watch 1개 이상이 단일 축만 달성 (PAPE ≤ 43 OR HR@1 ≥ 37) 후보 확정 보류, per-apt std 심화 분석
Fail 전 모델 두 축 모두 미달 v10 이후 VQ 재시도 방향 사용자 결정 (v9-05 §8.2 옵션 재심)

Track 분리 판정: 상위 gating 과 별개로 본 보고서에서 Track A Pass 여부 / Track B Pass 여부 / SCINet 단독 판정 (H9-6b) 3건을 분리해 기록.


2. 모델 카탈로그

2.1 Track A — NeuralForecast MLP 계열 3종

NF 3종의 기본값은 Nixtla 공식 API docs 기준(2026-04-24 확인, nixtlaverse.nixtla.io/neuralforecast/) 이며, v6/v9-05 NF baseline 과 직접 비교 가능하도록 프로젝트 override 를 적용한다. 모델-specific 구조 파라미터는 NF 기본값 유지.

2.1.1 NBEATSx (NeurIPS 2020, Oreshkin et al.; NeurIPS 2023 Olivares et al. exogenous)

  • 특징: basis-expansion block (identity/trend/seasonality) + backward/forward residual. N-HiTS 의 선조. 해석 가능성 + peak 보존 능력.
  • NF docs 기본값: stack_types=["identity","trend","seasonality"], n_blocks=[1,1,1], mlp_units=3*[[512,512]], n_harmonics=2, n_polynomials=2, dropout_prob_theta=0.0, activation="ReLU", learning_rate=1e-3, max_steps=1000, batch_size=32.
  • VQ 친화성 논거 (v10 이후 설계 수준): basis-residual 분리 → basis coefficient 를 discrete codebook 에 매핑 가능. Sparse-VQ Transformer 2024 와 동류 (FFN-free + VQ).
  • v9-06 override: max_steps=500, early_stop_patience_steps=50, val_check_steps=50, scaler_type="standard", random_seed=<seed>, input_size=96, h=24.

2.1.2 TSMixer (TMLR 2023, Chen et al., Google)

  • 특징: all-MLP, time-mixing (temporal MLP) + feature-mixing (cross-feature MLP) 교대. attention 회피. Long-term benchmark 에서 PatchTST/FEDformer/Autoformer/TFT 를 outperform 주장.
  • NF docs 기본값: n_block=2, ff_dim=64, dropout=0.9, revin=True, scaler_type="identity", learning_rate=1e-3, max_steps=1000, batch_size=32, val_check_steps=100.
  • VQ 친화성 (설계 수준): MLP-mixer 의 token dimension mixing → feature embedding 에 VQ 삽입 자연스러움. Sparse-VQ 계열 적용 대상.
  • v9-06 override: max_steps=500, early_stop_patience_steps=50, val_check_steps=50, scaler_type="standard", random_seed=<seed>, input_size=96, h=24. scaler_type 은 NF default "identity" 에서 "standard" 로 강제 — v9-05 비교 가능성 유지. 주의: TSMixer 는 revin=True 내장이므로 external standard scaler 와 중복 정규화 가능성. Smoke 에서 finite 확인 및 NaN 검사 필수. 실패 시 fallback: revin=False 로 재시도.

2.1.3 TiDE (TMLR 2024, Das et al., Google)

  • 특징: Time-series Dense Encoder. Encoder-decoder dense MLP (no attention, no RNN). Univariate long-term forecasting 특화. NLinear-competitive.
  • NF docs 기본값: hidden_size=512, dropout, layernorm 옵션. learning_rate, max_steps, batch_size 은 NF 공통 default (1e-3 / 1000 / 32) 추정 — docs 직접 미명시, source 에서 확인 필요 (engineer checklist §5.1).
  • VQ 친화성 (설계 수준): dense encoder 출력을 codebook 에 매핑 가능. 단 decomposition/frequency 같은 명시적 구조 분리 없음 — VQ 삽입 논거는 약함.
  • v9-06 override: max_steps=500, early_stop_patience_steps=50, val_check_steps=50, scaler_type="standard", random_seed=<seed>, input_size=96, h=24.

2.2 Track B — TSLib 4종

src/tslib/ clone (THUML Time-Series-Library, v9-05 설계서 §2.2 에서 위험 정리). TSLib run.py 공식 argparse defaults 기준, 프로젝트 override 는 v9-05 와 일관되게 적용.

TSLib 공통 default (run.py): d_model=512, n_heads=8, d_ff=2048, e_layers=2, d_layers=1, factor=1, dropout=0.1, learning_rate=1e-4, batch_size=32, train_epochs=10, patience=3, seq_len=96, label_len=48, pred_len=96, features='M', activation='gelu'.

Track B 공통 override: seq_len=96, label_len=48, pred_len=24, features='S' (univariate), learning_rate=1e-3 (v9-05 일치 → v6/v9-05 비교 가능성 유지; TSLib default 1e-4 대비 10× 상향), batch_size=32, train_epochs=50, patience=5 (v9-05 early_stop_patience_steps=50 과 epoch 스케일 ≈ 대응). 모델별 구조 파라미터는 아래 기본값 유지.

2.2.1 SCINet (NeurIPS 2022, Liu et al.) — Track B 내 기대주

  • 특징: Sample Convolution + Interaction. Binary tree 구조 (SCI-Block = downsample → conv → interact → upsample). Hierarchical multi-resolution — N-HiTS 와 구조 동류.
  • TSLib models/SCINet.py 기본값: engineer 가 src/tslib/models/SCINet.py::__init__ 읽고 num_stacks, num_levels, num_decoder_layer, concat_len, groups, kernel, dropout, single_step_output_One, positionalE, modified, RIN 의 default 를 스크립트 상단 주석에 기록. 본 설계는 TSLib default 유지 를 원칙으로 하며, 명시적 override 는 Track B 공통 override (seq_len, pred_len, features, lr, bs, epochs, patience) 에 한정.
  • v9-06 기대치: Track B 4종 내 PAPE 상대 최소, HR@1 상대 최대. 절대 gating 통과 여부는 smoke 후 재평가.

2.2.2 ETSformer (arXiv 2022, Woo et al.)

  • 특징: ETS (Exponential Smoothing) 분해 + exponential smoothing attention.
  • TSLib 기본값 주의: layers/ETSformer_EncDec.py, layers/ETSformer_Layer.py 의존 — import sys.path 주입 후 확인. 추가 하이퍼파라미터: K (ETSformer top-K frequency).
  • 기대치 (H9-6c): v9-05 Autoformer 와 decomposition 계열 동질 → PAPE 50+ FAIL 예상.

2.2.3 Pyraformer (ICLR 2022, Liu et al.)

  • 특징: Pyramidal attention (inter-scale C-ary tree + intra-scale).
  • Input 제약: Pyraformer 는 window_size=[C1, C2, ...]seq_len 이 product 관계여야 함 (예: seq_len=96, window_size=[4,4] 면 pyramid level 수 = 2). TSLib models/Pyraformer.pywindow_size default 가 96 과 호환되는지 smoke 필수 검증.
  • 기대치 (H9-6c): hierarchical attention → Track A SCINet 과 구조 유사성 있으나 attention 기반이라 Autoformer/Informer 와 동질. Fail 예상하되, 만약 Pass 에 근접하면 사후 분석 대상.

2.2.4 Crossformer (ICLR 2023, Zhang & Yan)

  • 특징: Two-Stage Attention (cross-time + cross-dimension) + Routers.
  • Univariate 부적합성: kW 1개 변수만 존재하는 본 프로젝트 세팅 (가구별 독립 학습) 에서 cross-dimension attention 이 trivial 경로로 축소될 가능성 높음.
  • 추가 하이퍼파라미터: seg_len (segmentation length) — seq_len / seg_len 이 정수여야 함. 기본 TSLib 설정 확인 후 96 과 호환되는 값 유지.
  • 기대치 (H9-6c): 강한 FAIL 예상 (구조적 무력화). 실패 시 "univariate 부적합" 이 primary 원인으로 해석, 비판적 결론.

2.3 중복 제외

  • NF 기존 모델 (NHITS / TFT / TimesNet / PatchTST / iTransformer / DLinear) 및 v9-05 3종 (Autoformer / Informer / FEDformer) 은 재실행하지 않고 v9-05 reporter §2.2 의 baseline 테이블을 §6 비교표에 그대로 인용한다.
  • TSLib 에도 TiDE/TSMixer 구현이 존재하나, NF 공식 구현이 peak_analysis 와 더 통합된 상태이므로 Track A (NF) 경로만 사용. TSLib Autoformer/Informer/FEDformer/TimesNet 도 사용하지 않음 (NF 와 동등한 baseline 이므로 중복).

3. 데이터 파이프라인

3.1 Track A (NF) — v6/v9-05 파이프라인 재사용

  • 가구: GWN_HOUSEHOLDS = ["Apt6","Apt15","Apt30","Apt51","Apt88"], year=2016.
  • 로더: peak_analysis.community.load_apartment_hourly(apt, year)pd.Series (index=DatetimeIndex, values=kW).
  • NF 변환: experiments/forecasting/v6_0415_nf_baseline.py::prepare_nf_dataframe 그대로 import 사용.
  • 분할: v6_0415_nf_baseline.py::split_nf_dataframe (train:val:test = 0.7:0.1:0.2).
  • test sliding: stride=HORIZON=24 non-overlapping.
  • 정규화: scaler_type="standard" (NF 내부 StandardScaler) — v6/v9-05 일치.
  • seeds: {42, 7, 123} → NF 모델 random_seed 에 주입.
  • INPUT_SIZE=96, HORIZON=24.

3.2 Track B (TSLib) — Adapter 레이어 신규 구현

TSLib 는 data_provider/data_loader.py::Dataset_Custom 이 CSV 파일 → 4-tuple (seq_x, seq_y, seq_x_mark, seq_y_mark) 를 반환하도록 고정돼 있다. peak_analysis 는 이미 가구별 pd.Series 로드 파이프라인이 존재하므로, adapter 레이어를 신규 구현 한다.

3.2.1 Adapter 요구사항 (engineer 구현 대상)

peak_analysis.community.load_apartment_hourly(apt, year)
    → pd.Series (hourly kW)
    → train/val/test 분할 (0.7/0.1/0.2, v6/v9-05 와 동일)
    → 각 분할에 대해 sliding window (stride=1 train/val, stride=HORIZON test)
    → torch.utils.data.Dataset 로 wrapping, __getitem__ 반환 4-tuple:
        seq_x: shape (seq_len=96, 1)   float32, standardized kW
        seq_y: shape (label_len+pred_len = 48+24 = 72, 1)  float32
        seq_x_mark: shape (96, 4)    [month, day, weekday, hour] normalized to [-0.5, 0.5]
        seq_y_mark: shape (72, 4)    동일
  • 표준화: train split mean/std 로 fit, val/test 에 transform. Track A (NF) 와 동일 scaler 정책.
  • 역변환: 예측 후 test y_pred 에 inverse transform 적용. Track A 와 동일 원본 kW 스케일 비교 보장.
  • File path: adapter 는 experiments/forecasting/v9_0424_baseline_extension_2.py 내부 class TSLibHouseholdDataset(torch.utils.data.Dataset) 로 구현. 별도 패키지 승격 없음 (본 phase 범위 한정).

3.2.2 TSLib Model 호출 어댑터

TSLib Model __init__(configs: argparse.Namespace) 규약:

from types import SimpleNamespace
import sys
from pathlib import Path

TSLIB_ROOT = Path(__file__).parents[2] / "src" / "tslib"
sys.path.insert(0, str(TSLIB_ROOT))

from models.SCINet import Model as SCINetModel  # example

configs = SimpleNamespace(
    task_name="long_term_forecast",
    seq_len=96, label_len=48, pred_len=24,
    enc_in=1, dec_in=1, c_out=1,           # univariate
    d_model=512, n_heads=8, d_ff=2048,
    e_layers=2, d_layers=1, factor=1,
    dropout=0.1, activation="gelu",
    embed="timeF", freq="h",
    output_attention=False,
    # 모델별 추가 파라미터는 각 TSLib 소스에서 필요 필드 확인 후 주입
)
model = SCINetModel(configs)
  • engineer checklist: 각 모델 models/<Model>.py::Model.__init__ 읽고 필요 configs 필드 전수 확인 (missing attribute 시 AttributeError). 본 설계는 어댑터 skeleton 만 제시, 모델별 missing field 채움은 engineer 책임 (§5.1).

3.2.3 학습 루프

  • TSLib exp/exp_long_term_forecasting.py::Exp_Long_Term_Forecastimport 하지 말고, peak_analysis 자체 loop 을 작성.
  • Optimizer: torch.optim.Adam(model.parameters(), lr=1e-3).
  • Loss: torch.nn.MSELoss().
  • Early stopping: val MSE 개선 없이 patience=5 epoch → 중단.
  • Epoch 상한: 50.
  • Device: cuda (RTX 5070 Ti).
  • bf16 mixed precision: 기본 False (TSLib 모델 일부 dtype 호환 미검증 — smoke 에서 검증).
  • Batch loop:
  • seq_x, seq_y, seq_x_mark, seq_y_mark = batch.to(device).
  • dec_inp = torch.zeros_like(seq_y[:, -pred_len:, :])
  • dec_inp = torch.cat([seq_y[:, :label_len, :], dec_inp], dim=1)
  • y_pred = model(seq_x, seq_x_mark, dec_inp, seq_y_mark)[:, -pred_len:, :]
  • loss = MSE(y_pred, seq_y[:, -pred_len:, :])

3.3 시드 처리

  • Seed 집합 {42, 7, 123} (v9-05 일치).
  • Track A: NF random_seed 파라미터 주입.
  • Track B: torch.manual_seed(seed), np.random.seed(seed), random.seed(seed), torch.cuda.manual_seed_all(seed) 각 run 시작 시 호출. torch.use_deterministic_algorithms(False) (v9-05 일치, 성능 우선).

3.4 TSLib 버전 해시 기록

  • 본 phase 실행 진입 시 engineer 가 cd src/tslib && git rev-parse HEAD 수행, 결과를 docs/reference/project_state/v9_baseline_ext_2.md 에 기록 (v9-05 설계서 §2.2 R4 에서 지시된 재현성 요구사항).

4. MLflow 로깅 스키마 (P1: per-epoch 강제)

4.1 Experiment & Run

  • Experiment name: v9-baseline-ext-2 (v9-05 v9-baseline-ext 와 분리).
  • Run name 규약: {track}_{model}_{apt}_seed{seed} — 예: A_NBEATSx_Apt6_seed42, B_SCINet_Apt88_seed123.
  • Aggregate run: Track × model 별 3-seed × 5-apt 완료 후 {track}_{model}_aggregate_mean run 생성 (v6/v9-05 패턴).

4.2 Params

모든 run 공통 기록:

track: "A" | "B"
model: str                  # "NBEATSx" | "TSMixer" | "TiDE" | "SCINet" | "ETSformer" | "Pyraformer" | "Crossformer"
apt: str                    # "Apt6" | ... | "Apt88"
seed: int                   # 42 | 7 | 123
input_size: 96
horizon: 24
max_steps: 500              # Track A
train_epochs: 50            # Track B
early_stop_patience_steps: 50   # Track A
patience: 5                     # Track B
val_check_steps: 50         # Track A
learning_rate: 1e-3
scaler_type: "standard"     # (Track B 는 adapter scaler 동등)
batch_size: 32
features: "S"               # Track B only, univariate
tslib_git_hash: str         # Track B only, engineer 가 sys 호출로 주입
model_specific: json        # 모델별 NF/TSLib 기본값 요약

4.3 Metrics (per-epoch & final)

  • [P1 강제] Per-step metricsmlflow.log_metric(..., step=epoch) 호출 필수. v9-05 위반 재발 방지.
  • train_loss — epoch 평균 training loss (MSE).
  • val_loss — epoch 말 validation loss (MSE).
  • val_mse — NF 내부 validation metric (Track A).
  • Track A (NF/Lightning) 구현: pytorch_lightning.callbacks.Callback 를 상속해 on_train_epoch_end(self, trainer, pl_module) 에서 trainer.callback_metrics["train_loss_epoch"] 등을 mlflow.log_metric(...) 로 re-emit. mlflow.pytorch.autolog(log_every_n_epoch=1) 병용 가능 여부는 engineer 판단.
  • Track B (raw torch loop) 구현: epoch 끝에서 직접 mlflow.log_metric("train_loss", epoch_train_loss, step=epoch) + mlflow.log_metric("val_loss", epoch_val_loss, step=epoch) 호출.
  • sanity check: 본 phase 실험 완료 후 MlflowClient().get_metric_history(run_id, "train_loss") 결과 길이가 1 이상임을 random 3 run 에서 확인 (v9-05 len(hist) == 0 재발 방지). exp-expert 가 결과 보고서 §2.0 에 이 확인 결과를 명시 기록.

  • Final metrics (가구별 test):

  • 7-metric: mse, mae, mape, smape, pape, hr_tol1, hr_tol2 — v9-05 compute_metrics_v95 재사용.
  • 집계 run 에서는 {model}_{metric}_mean, {model}_{metric}_std.

4.4 Artifacts

artifact_path 내용 생성 경로
predictions/{track}_{model}_{apt}_seed{seed}_y_true.npy shape=(N_window, 24), float64, kW 스케일 outputs/v9_baseline_ext_2/predictions/
predictions/{track}_{model}_{apt}_seed{seed}_y_pred.npy 동일 shape 동일
checkpoints/{track}_{model}_{apt}_seed{seed}/best.ckpt (Track A) best.pt (Track B) 최상 val 시점 체크포인트 outputs/v9_baseline_ext_2/checkpoints/
metrics/{track}_{model}_{apt}_seed{seed}.json 가구별 7 metric JSON 동일
summary.csv (aggregate run) (track, model, apt, seed, metric) 전체 테이블 outputs/v9_baseline_ext_2/summary.csv
training_curves/{run_id}.png (선택) per-epoch train/val loss 곡선, H9-6 수렴 해석용 동일

4.5 v9-05 재인용

v9-05 NF 3종 (Autoformer/Informer/FEDformer) 및 v6/v9 기존 baseline (NHITS/TFT/TimesNet/PatchTST/iTransformer/DLinear/Chronos/B0/B1/R1b) 수치는 v9-05 reporter §2.2 의 baseline 테이블 + v9-05 v9-baseline-ext experiment (id=766380978402830870) 를 직접 인용. 재학습 없음.


5. 실행 단계

5.1 의존성 확인 + engineer checklist

  • Track A:
  • uv run python -c "from neuralforecast.models import NBEATSx, TSMixer, TiDE; print('ok')" 통과 확인.
  • TiDE hidden_size / learning_rate / max_steps / batch_size default 값을 neuralforecast/neuralforecast/models/tide.py 에서 직접 확인 후 스크립트 상단 주석 기록.
  • Track B:
  • cd src/tslib && git rev-parse HEADdocs/reference/project_state/v9_baseline_ext_2.md 에 기록.
  • sys.path.insert(0, str(TSLIB_ROOT))from models.SCINet import Model 등 4 모델 전수 import 성공 확인.
  • 각 모델 Model.__init__ 소스 읽고 필요한 configs 필드 전수 목록화 (SCINet 은 num_stacks, num_levels, concat_len, groups, kernel, dropout, single_step_output_One, positionalE, modified, RIN / Crossformer 는 seg_len / Pyraformer 는 window_size). 누락 시 AttributeError.

5.2 스크립트 생성

  • 파일: experiments/forecasting/v9_0424_baseline_extension_2.py (단일 파일, argparse --track {A,B} 로 Track 스위치).
  • 분리 가능하나 본 설계는 단일 파일 원칙 (v9-05 와 일관, import 경로 혼선 최소화).
  • 재사용:
  • v9-05 의 compute_metrics_v95, prepare_nf_dataframe, split_nf_dataframe, run_single_v95 (또는 그 하위 루틴) 를 import.
  • Track A: build_single_model 을 NBEATSx/TSMixer/TiDE 추가 factory 로 확장.
  • Track B: TSLibHouseholdDataset (어댑터) + build_tslib_model(name, configs) + train_tslib_model(model, loaders, mlflow_run) 신규 함수 3종.
  • MLflow 콜백 (Track A, P1):
  • class EpochMLflowCallback(pytorch_lightning.callbacks.Callback) 정의:
    • on_train_epoch_end: mlflow.log_metric("train_loss", trainer.callback_metrics["train_loss_epoch"].item(), step=self.current_epoch)
    • on_validation_epoch_end: mlflow.log_metric("val_loss", trainer.callback_metrics["val_loss"].item(), step=self.current_epoch)
  • NF fit() 호출 전에 nf.models[0].trainer_kwargs["callbacks"] = [EpochMLflowCallback()] 주입. NF 내부 Lightning trainer 에 callback 을 attach 하는 방법은 NF source 의 BaseAuto.fit / NeuralForecast.fit 을 확인 후 engineer 결정 (fallback: NF Lightning logger 를 MLFlowLogger 로 교체).
  • MLflow 로깅 (Track B, P1):
  • 자체 train loop 내 for epoch in range(train_epochs): 에서 epoch 끝에 mlflow.log_metric("train_loss", ..., step=epoch) 직접 호출.
  • argparse:
  • --track: A / B / both (기본 both).
  • --models: 기본은 Track 에 따른 전체 리스트, smoke 시 단일 모델.
  • --seeds: 기본 [42, 7, 123], smoke 시 [42].
  • --apts: 기본 GWN_HOUSEHOLDS, smoke 시 ["Apt6"].
  • --max-steps (Track A) / --train-epochs (Track B): smoke 시 50 / 3.

5.3 Smoke 단계

smoke 의 목적은 (i) Track A P1 callback 동작 검증, (ii) Track B 어댑터 전체 경로 검증, (iii) Pyraformer input_len=96 호환성 검증, (iv) Crossformer seg_len 호환성 검증 4건.

  • Smoke 실행 조합:
  • A-smoke: NBEATSx × Apt6 × seed42 × max_steps=50.
  • B-smoke-SCINet: SCINet × Apt6 × seed42 × train_epochs=3.
  • B-smoke-Pyraformer: Pyraformer × Apt6 × seed42 × train_epochs=3. input_len=96 호환 실패 시 본 phase Pyraformer 제외 (H9-6c 대상 축소).
  • B-smoke-Crossformer: Crossformer × Apt6 × seed42 × train_epochs=3. seg_len 파라미터 호환 확인.
  • B-smoke-ETSformer: ETSformer × Apt6 × seed42 × train_epochs=3.
  • Smoke 성공 기준:
  • y_true/y_pred shape == (N_test_window, 24).
  • 7-metric 모두 finite.
  • [P1] MlflowClient().get_metric_history(run_id, "train_loss") 길이 ≥ 1 확인 — per-epoch 로깅 동작 증거.
  • Smoke 실패 대응:
  • Track A NBEATSx 실패 → TSMixer/TiDE 도 동일 NF trainer 문제 가능성, engineer 가 원인 판별.
  • Track B 모델 실패 → 해당 모델만 본 phase 제외. 제외 사실을 exp-expert 결과 보고서 §1 에 명시. 나머지 Track B 모델은 계속 진행.
  • Smoke 소요: 5–10분 내 전체 종료 (5 smoke run × 30s–2min).

5.4 본 실행

  • Track A (NF MLP 3종): 3 models × 5 apts × 3 seeds = 45 run.
  • 순차 실행, NF 내부 Lightning trainer, RTX 5070 Ti 단일 GPU.
  • 예상 per-run: NBEATSx ~2–3분, TSMixer ~2분, TiDE ~2–3분 (v9-05 Informer 39s 기준 유사).
  • Track A 총 소요: 30–45분.
  • Track B (TSLib 4종): 4 models × 5 apts × 3 seeds = 60 run.
  • 순차 실행. TSLib 모델은 raw torch loop.
  • 예상 per-run: SCINet ~2분, ETSformer ~3분, Pyraformer ~3분, Crossformer ~2분 (TSLib run.py epoch=10 baseline 참고, 본 phase epochs=50).
  • Track B 총 소요: 1.5–2시간.
  • 전체 소요 (45 + 60 = 105 run): 2–3시간 wall-clock.
  • 중단/재개: 각 run 독립 MLflow run. 부분 재실행 허용.

5.5 집계

  • Per-run metric → outputs/v9_baseline_ext_2/summary.csv.
  • v9-05 summary.csv + v6 NF-Baseline MLflow 를 query 해 summary_combined.csv 생성 — 본 phase 신규 7 모델 + v9-05 신규 3 모델 + v6 기존 11 baseline = 21 모델 비교 표.
  • 집계 스크립트: outputs/v9_baseline_ext_2/_aggregate_analysis.py (engineer 작성).

5.6 후속 체인

  • exp-expert 결과 보고서: report/version9/exp-expert/v9-06_baseline_ext_2_results.md — 3-seed 결과, per-apt std, Track 분리 gating 판정 (H9-6a, H9-6b, H9-6c 각각).
  • exp-critic 자동 트리거 (CLAUDE.md hook).
  • reporter 최종 요약: report/version9/reporter/v9-06_baseline_ext_2_summary.md.
  • Project state 기록: docs/reference/project_state/v9_baseline_ext_2.md — TSLib git hash, smoke 제외 모델, 후속 VQ 후보 선정.

6. Gating 상세 (H9-6 판정)

6.1 H9-6a (Track A/B 통합)

기준 수치는 5가구 평균 × 3-seed 평균.

Metric Pass Watch Fail
PAPE (%) ≤ 43.00 ≤ 46.00 > 46.00
HR@tol=1 (%) ≥ 37.00 ≥ 30.00 < 30.00
Seed std (PAPE, HR@1) < 1.00%p / 1.50%p < 2.00%p / 3.00%p ≥ 2.00%p
  • Pass: PAPE Pass AND HR@1 Pass AND seed std < 2.00%p / 3.00%p.
  • Watch: 단일 축 Pass.
  • Fail: 양축 Fail.

6.2 H9-6b (SCINet 단독, Track B 내부)

  • 지지 조건: SCINet PAPE ≤ min(ETSformer PAPE, Pyraformer PAPE, Crossformer PAPE) AND SCINet HR@1 ≥ max(세 모델 HR@1). 절대 gating 통과는 추가 평가.
  • 미지지: 위 조건 미충족.

6.3 H9-6c (TSLib Transformer variants FAIL 재현)

  • 지지: ETSformer, Pyraformer, Crossformer 세 모델 모두 (PAPE > 43 OR HR@1 < 37).
  • 미지지 (예상외 Pass): 세 모델 중 1개 이상이 H9-6a Watch 이상 → v9-05 decomp+attention smoothing 가설 재검증 필요, post-hoc 분석 대상.

6.4 대체 판정 (H9-6a Fail 시)

본 phase 도 전수 Fail 이면 v9-05 reporter §8.2 의 옵션 재심:

  • 옵션 A: 추가 backbone 탐색 없이 VQ track 방향 재검토 (ADR 작성, 사용자 결정).
  • 옵션 B: hyperparameter 재탐색 (max_steps↑, lr sweep) — 본 설계 범위 밖, 별도 phase 필요.
  • 옵션 C: peak-aware loss / target transform 같은 손실 축 접근 재개 (v6 Phase3b 폐기 근거 재검토 필요).

본 설계는 옵션 선택을 강제하지 않는다.


7. Risks & Mitigation

# 리스크 영향도 Mitigation
R1 TSLib 어댑터 구현 비용 초과 (engineer 2일 이상) smoke 에서 SCINet 하나 먼저 성공시킨 뒤 나머지 3종은 같은 어댑터 skeleton 재사용. 실패 모델은 즉시 제외.
R2 Pyraformer input_len=96 비호환 (pyramid level 제약) smoke 에서 검증. 실패 시 Pyraformer 본 실행 제외, H9-6c 3→2 모델로 축소, 결과 보고서 §1 에 명시.
R3 Crossformer seg_len 호환 실패 또는 univariate trivial 수렴 smoke 에서 seg_len={24, 48} 조합 시도. univariate 에서 의미 없는 constant 예측 시 결과는 기록하고 "univariate 부적합" 으로 해석 (H9-6c 지지 증거).
R4 TSMixer revin=True + external scaler_type="standard" 중복 정규화로 loss NaN smoke 에서 finite 확인. NaN 발생 시 fallback: revin=False 재시도. fallback 도 실패면 TSMixer 제외.
R5 [P1] Lightning callback 이 NF 내부 trainer 에 주입되지 않아 per-epoch 로깅 재발 실패 smoke 단계에서 MlflowClient().get_metric_history(run_id, "train_loss") 길이 ≥ 1 직접 확인 필수. 실패 시 본 실행 진입 금지, engineer 재수정.
R6 Track B raw torch loop 의 seed 비결정성이 NF 보다 훨씬 커서 seed std 증폭 3-seed 결과 std 가 Track A 대비 2× 이상이면 결과 보고서에서 해석 주의 표시. 본 설계에서는 torch.use_deterministic_algorithms(False) 유지.
R7 총 105 run × 1–2분 = 2–3시간 예상이 실제 5시간 이상으로 초과 FEDformer wall-clock (v9-05 94.3s) 기준 Track B 도 유사 범위로 추정하나 실제 편차 가능. Track A 먼저 완료 후 Track B smoke 직후 시간 재측정 → 본 실행 중 필요 시 max_steps/epochs 축소 의사결정 (exp-expert 판단).
R8 SCINet num_levels/num_stacks default 가 seq_len=96, pred_len=24 와 부적합 TSLib 공식 ETTh1 script default 참조 (engineer 확인). 부적합 시 TSLib README ETTh1 기본값 복제.
R9 TSMixer NF default dropout=0.9 가 univariate single-household 에 과도 → underfit fallback 으로 dropout=0.1 재시도. 본 설계는 NF default 유지가 원칙.

8. 산출물 경로

8.1 스크립트

  • 메인 학습 스크립트: experiments/forecasting/v9_0424_baseline_extension_2.py (engineer 구현).
  • Track A 분기 + Track B 분기 (어댑터 + raw loop).
  • v9-05 compute_metrics_v95, prepare_nf_dataframe, split_nf_dataframe import 재사용.
  • Track A P1 callback: EpochMLflowCallback 내장.
  • Track B P1: epoch 끝에 직접 mlflow.log_metric(..., step=epoch) 호출.
  • 집계 스크립트: outputs/v9_baseline_ext_2/_aggregate_analysis.py (engineer).

8.2 출력

  • 원시: outputs/v9_baseline_ext_2/
  • predictions/*.npy (MLflow artifact 와 동일, log 후 선택적 삭제)
  • checkpoints/{track}_{model}_{apt}_seed{seed}/best.{ckpt,pt}
  • metrics/{track}_{model}_{apt}_seed{seed}.json
  • summary.csv, summary_smoke.csv, summary_combined.csv (v9-05 + v6 병합)
  • logs/{track}_{model}_{apt}_seed{seed}.log
  • MLflow: experiment v9-baseline-ext-2.

8.3 보고서

  • 설계서 (본 문서): report/version9/lab-leader/v9-06_baseline_extension_2.md.
  • 실험 결과 (exp-expert): report/version9/exp-expert/v9-06_baseline_ext_2_results.md.
  • 적대적 검토 (exp-critic): report/exp-critic/v9-06_baseline_ext_2_critic.md (hook 자동 생성).
  • 최종 요약 (reporter): report/version9/reporter/v9-06_baseline_ext_2_summary.md.

8.4 Project state / TODO

  • Project state: docs/reference/project_state/v9_baseline_ext_2.md — TSLib git rev-parse 해시, smoke 제외 모델, Track A/B/SCINet 판정, VQ 후보 확정 또는 부재 기록.
  • TODO: todos/track-f_baseline_extension.md (v9-05 에서 이미 사용 중이면 append, 없으면 신규). orchestrator 가 todos/README.md 인덱스에 반영.

9. 참고 문헌

Track A 모델 원 논문

  • Oreshkin, B. N. et al. "N-BEATS: Neural basis expansion analysis for interpretable time series forecasting". ICLR 2020 (NeurIPS 2019 workshop 선). https://arxiv.org/abs/1905.10437
  • Olivares, K. G. et al. "Neural basis expansion analysis with exogenous variables: Forecasting electricity prices with NBEATSx". International Journal of Forecasting 2023. https://arxiv.org/abs/2104.05522
  • Chen, S.-A. et al. "TSMixer: An All-MLP Architecture for Time Series Forecasting". TMLR 2023. https://arxiv.org/abs/2303.06053 / https://openreview.net/forum?id=wbpxTuXgm0 / https://research.google/blog/tsmixer-an-all-mlp-architecture-for-time-series-forecasting/
  • Das, A. et al. "Long-term Forecasting with TiDE: Time-series Dense Encoder". TMLR 2024. https://arxiv.org/abs/2304.08424

NF 공식 문서 (기본값 근거, 2026-04-24 확인)

  • NBEATSx docs: https://nixtlaverse.nixtla.io/neuralforecast/models.nbeatsx.html
  • TSMixer docs: https://nixtlaverse.nixtla.io/neuralforecast/models.tsmixer.html
  • TiDE docs: https://nixtlaverse.nixtla.io/neuralforecast/models.tide.html
  • NF repo: https://github.com/Nixtla/neuralforecast

Track B 모델 원 논문

  • Liu, M. et al. "SCINet: Time Series Modeling and Forecasting with Sample Convolution and Interaction". NeurIPS 2022. https://arxiv.org/abs/2106.09305
  • Woo, G. et al. "ETSformer: Exponential Smoothing Transformers for Time-series Forecasting". arXiv 2022. https://arxiv.org/abs/2202.01381
  • Liu, S. et al. "Pyraformer: Low-complexity Pyramidal Attention for Long-range Time Series Modeling and Forecasting". ICLR 2022. https://openreview.net/forum?id=0EXmFzUn5I
  • Zhang, Y. & Yan, J. "Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series Forecasting". ICLR 2023. https://github.com/Thinklab-SJTU/Crossformer
  • THUML Time-Series-Library: https://github.com/thuml/Time-Series-Library / run.py argparse defaults: https://github.com/thuml/Time-Series-Library/blob/main/run.py

전력/부하 도메인

  • "Enhanced N-BEATS for Mid-Term Electricity Demand Forecasting". 2024. https://arxiv.org/html/2412.02722v1
  • "Benchmarking Time Series Foundation Models for Short-Term Household Electricity Load Forecasting". arXiv 2024. https://arxiv.org/html/2410.09487v1

프로젝트 내부 선행

  • report/version9/lab-leader/v9-05_baseline_extension.md — v9-05 설계서 (포맷 준수 기준).
  • report/version9/exp-expert/v9-05_baseline_ext_results.md (revision 1) — v9-05 결과, per-epoch 로깅 누락 고지.
  • report/version9/reporter/v9-05_baseline_ext_summary.md — v9-05 reporter 요약, TSLib 2차 착수 판단 자료.
  • experiments/forecasting/v9_0424_baseline_extension.py — Track A factory 확장 기준.
  • experiments/forecasting/v6_0415_nf_baseline.py — 데이터 파이프라인 재사용.
  • docs/reference/project_state/v9_baseline_ext_lessons.md (v9-05 P3 권고 생성 대상) — Lightning callback 구현 가이드 참조 (engineer 작성).

10. Self-Verify 체크리스트

  • 웹 서치 수행 (NF NBEATSx/TSMixer/TiDE docs, TSLib run.py defaults, Pyraformer window_size 제약, TSMixer/SCINet 원 논문)
  • 가설 H9-6a / H9-6b / H9-6c 명확·정량 정의 및 판정 조건 분리
  • 성공 기준 3-tier (Pass/Watch/Fail) 정량 정의 (v9-05 와 일치 + Watch 기준 약간 완화)
  • 베이스라인 (v9-05 + v6 baseline) 근거 명시
  • Track A/B 각 모델 기본값 (NF docs / TSLib run.py argparse) 근거 첨부, override 는 v9-05 조건과 일치
  • Track B 어댑터 skeleton 명시 (sys.path 주입, SimpleNamespace configs, 4-tuple DataLoader, raw torch loop)
  • P1 강제사항 (Lightning callback per-epoch 로깅) 구현 패턴 명시 + smoke sanity check 절차 내장
  • 실행 계획에 v9_0424_baseline_extension_2.py, v9-05/v6 재사용 모듈 참조
  • Risks (어댑터 비용, Pyraformer/Crossformer 호환, TSMixer dropout, P1 재발 방지) 전수 기재
  • 범위 엄수 — Track A/B 실행 외 추가 ablation (lr sweep, dropout sweep, stack_type ablation) 없음. fallback 은 smoke 실패 시에만 적용.
  • 파일명 규약 v{N}-{NN}_{제목}.md (v9-06)
  • 언어 규약 (한국어 헤더 + 영어 기술 용어)
  • v9-05 reporter §8.3 P1 강제사항 본 phase 에 승계 및 명시 (§4.3, §5.3 smoke sanity, §7 R5)