Source:
report/version10/exp-expert/v10-04_E1_NBEATSx_DecompCB_analysis.md
v10-04 E1 NBEATSx + DecompCB Single-Run Analysis (revision 1)¶
0. 한 줄 결론¶
E1은 단일 seed=42 점추정에서 test_pape=55.01, HR@1=15.71 로 동일 backbone no-VQ baseline B2(46.38 / 17.14) 대비 +8.63 PAPE / -1.43 HR@1 격차 관찰, Local no-FL Phase1 NBEATSx(33.01 / 19.58) 대비 +22.00 PAPE / -3.87 HR@1 격차. 이 격차들이 systematic 한지 단순 seed 변동 (v9-06 NBEATSx CI 폭 ≈ 7.75%p, R5 reference) 안인지 단일 seed 점추정으로는 분리 불가 — 3-seed 확장 후 재판정 필요. H10-2 (trend block basis expansion이 alignment anchor)는 본 run에서 검정 불가 — falsification 메트릭(trend/generic θ-drift L2 Wilcoxon) 미로깅 + trend CB 자체가 inherent sparse 표현 공간(n_polynomials=3)이라 utilization-based 간접 추론도 결정적이지 않음. 통신량은 -90.6% (B2 262,736 → 24,576 bytes/round) 절감 사실 확인. 본 보고서는 점추정 한정 사실 만 기술하며, 본 revision 1 cycle 에서 E1_simple ablation (run_id 8f344fa9) 비교를 §3.5 로 통합 — 그 결과 "C1+C2+C3+M1 주입사항이 effective"라는 narrative 는 6변수 동시 변경 묶음으로 격하되었다.
1. 비교 baseline 정렬 (단일 seed=42, split v10-7102, 50가구 동일)¶
| Run | run_id | fl_mode | VQ | bytes/round | test_pape | test_hr1 | test_hr2 | test_mse | best_round |
|---|---|---|---|---|---|---|---|---|---|
| E1 NBEATSx+DecompCB | 1f7606b7 |
FL (Memory Alignment) | Decomp 3 CB × M=32 | 24,576 | 55.01 | 15.71 | 31.43 | 0.8074 | 16 |
| B2 NBEATSx no-VQ FedAvg | 46415746 |
FedAvg | none | 262,736 | 46.38 | 17.14 | 42.86 | 0.8083 | 23 |
| Phase1 NBEATSx Local | 9644fa45 |
local (per-household) | none | 0 | 33.01 | 19.58 | 29.34 | 0.6105 | (no FL rounds) |
Metric 정의 통일 (revision 1): test_hr1 (E1, B2) ≡ test_hr_tol1 (Phase1, NeuralForecast naming) ≡ ±1 hour tolerance Hit Ratio at top-peak. ADR-010 §3.5 정합 가정. test_hr2 ≡ ±2 hour tolerance HR.
확인된 통제 정합성:
- 동일 split tag split_version=v10-7102 (E1, B2), Phase1 또한 split 7:1:2 (train_ratio=0.7, val_ratio=0.1).
- 동일 데이터 풀: n_clients=50 (E1, B2) / n_households=50 (Phase1).
- 동일 backbone family: NBEATSx (E1·B2 MinimalNBEATSxDecompVQ/MinimalNBEATSxNoVQ, n_polynomials=3, n_harmonics=5; Phase1 NeuralForecast NBEATSx, max_steps=500, lr=1e-3).
- 동일 input/horizon (96 / 24), batch_size=128, peak_alpha=2.0, peak_beta=0.1, seed=42.
구현 차이 (분리 해석에 영향):
- Phase1 = NeuralForecast 패키지 NBEATSx (인터프리터블 stack), max_steps=500, lr=1e-3, AdamW. Fold-별(가구별) 독립 학습/평가 → "FL+VQ 효과 없음, 모델 자체 점추정 floor".
- B2 = MinimalNBEATSxNoVQ (raw torch loop, 30 round × 3 local epoch FedAvg). Phase1과 동일 NBEATSx 가족이지만 별개 구현. Phase1 vs B2 격차(33.01 → 46.38, +13.37 PAPE)는 (a) NF 패키지 vs minimal raw torch 구현 차, (b) FedAvg aggregation 손실의 합으로 분리되지 않음. 본 보고서는 "FL aggregation + 구현 차이" 묶음을 단일 부호로 기록.
- E1 = MinimalNBEATSxDecompVQ (raw torch loop, FL+Memory Alignment γ_per_cb={trend:0.98, seasonal:0.95, generic:0.85}, δ=0.7, EMA=0.99, β=0.25, n_codewords=32 × 3 CB).
따라서 E1 vs B2 만이 "VQ 이식 단독 효과" 의 정정 비교 (구현/aggregation 동질). E1 vs Phase1은 "FL+VQ+구현 묶음" 비교로만 가치.
2. H10-2 검증¶
2.1 가설 재정의¶
ADR-010 §H10-2: "NBEATSx + Decomp CB 에서 trend block basis expansion 자체가 alignment anchor (외생변수 없음) — round-wise alignment drift 감소".
v10-02 §1.2 falsification: "round 간 trend block θ-계수의 weighted L2 drift 가 generic block 대비 통계적으로 낮지 않음 (Wilcoxon p ≥ 0.1) → 기각".
2.2 직접 증거의 부재¶
본 run의 MLflow 로깅 schema는 v10-02 §9.3 가 명세한 trend_theta_drift_l2_round_* / generic_theta_drift_l2_round_* 메트릭을 기록하지 않았음 — 실제 logged metrics는 round-wise codebook_utilization_{trend,seasonal,generic}, commitment_loss_{trend,seasonal,generic}, round_train_loss, round_val_pape, round_val_hr1만 존재. 따라서 H10-2의 falsification 조건(θ drift Wilcoxon)은 본 run으로 직접 검정 불가. 이는 본 run에 대한 critical limitation.
2.3 간접 증거: codebook utilization 패턴¶
H10-2의 anchor 명제 중 한 가지 운영적 해석은 "낮은 차원의 trend θ 가 FL aggregation 에서 안정적으로 align 되며, 이 align 결과가 codebook 에 분산 매핑된다"는 것. 이 해석에서 trend CB는 일정 utilization 으로 "정보를 담는" 행태가 기대됨. 실측은 다음과 같다.
| CB | mean util (rounds 0-29) | min | max | active codes (M=32) | rounds < 20% (alert) |
|---|---|---|---|---|---|
| Trend | 5.05% | 3.68% | 6.14% | 평균 1.8/32 | 30/30 |
| Seasonal | 17.43% | 5.50% | 21.22% | 평균 5.5/32 | 25/30 |
| Generic | 9.14% | 5.25% | 11.31% | 평균 2.9/32 | 30/30 |
관찰: 1. Trend CB가 3 CB 중 최저 utilization. 평균 1.8/32 active codes ≈ 30개 dead. v10-02 §3.6 collapse guard "util < 20% alert" 임계 30/30 round 위반. 2. Seasonal CB만 round 4 이후 점진 회복 (round 18, 25에서 ≥ 21%로 일시 도달, 6/30 rounds ≥ 20%). 3. Generic CB는 30/30 rounds < 12% — 사실상 round 내내 collapse.
2.3a Inherent sparsity 대안 가설 (revision 1 추가)¶
위 관찰의 해석에는 critic 이 제기한 대안 가설 이 본 run 으로는 배제되지 않는다:
- NBEATSx interpretable config의 trend block 은
n_polynomials=3→ 3-d polynomial coefficient 만 출력. 즉 표현 공간 자체가 본질적으로 sparse. - M=32 codebook entry 대비 3-d 표현이 사용할 수 있는 cluster 수는 이론상 한정적이며, 5.05% util ≈ 1.6 entry 는 trend block 의 inherent dimensionality 와 일치 가능.
- 즉 "낮은 util ⇒ anchor 미작동" 이라는 추론은 "높은 util 이 anchor 작동의 필요조건" 이라는 미증명 전제를 깐 것이다.
- 본 run 으로 anchor 작동 여부를 결정하려면 (a) trend block basis MLP weight 의 round 0 vs round 29 변화량, (b) θ output 의 sample 간 분산, (c) codebook sparseness 가 표현 sparseness 때문인지 commitment loss decay 때문인지 — 이 셋의 분리가 필요하나 본 run logging schema 로는 불가.
expert 의 견해 (revision 1): trend CB 의 inherent sparsity 가설과 anchor 미작동 가설은 본 run 에서 관찰적으로 동치 (둘 다 low util 을 produce). 본 보고서는 둘 중 어느 것이 우위인지 판정할 데이터를 갖지 않는다. 따라서 §2.4 의 H10-2 판정은 단일 방향의 "Fail" 으로 기울이지 않는다.
2.4 H10-2 판정 (단일 seed 한정)¶
- falsification 조건의 직접 검정은 불가 (θ drift 미로깅).
- 간접 증거 (utilization) 는 양 방향 해석이 모두 가능:
- 해석 A (anchor 미작동): trend CB 1.8 active entry 평균은 정보 채널의 대부분이 비활성. anchor 가 "용량 측면" 으로 작동한다고 보면 미작동.
- 해석 B (inherent sparsity): trend block 의 3-d output 공간 자체가 sparse 이므로 1.6 active entry 는 표현의 본성과 일치. 본 데이터로 배제 불가 (§2.3a).
- 또한 H10-2 의 원래 운영 정의가 "θ-drift L2 Wilcoxon" 인 점에서, 낮은 utilization 자체가 drift 를 trivially 작게 만들 수 있다 (사용 안 되는 entry 는 update 되지 않음 → drift ≈ 0). 이 경우 statistic 은 supported 되지만 그 의미가 anchor 작동인지 단지 "사용 안 됨" 인지 분리되지 않음.
- 판정 (single-seed point estimate, revision 1): Watch (검정 불가). 본 run 의 logged metric 은 H10-2 의 statement (trend block 이 alignment anchor 로 작동) 를 PASS 측으로도 FAIL 측으로도 결론짓기에 부족. 가설 검증 자체를 위해 필요한 것: (a) trend/generic θ drift L2 직접 logging, (b) trend block basis MLP weight trajectory 보존, (c) 3-seed 확장 (noise vs signal 분리). revision 1 이전 draft 의 "Watch → Fail 경향" 표현은 inherent sparsity 대안 가설 미검토 위에 세워진 over-claim 이었으며 본 revision 에서 격하된다.
3. VQ vs no-VQ baseline (E1 vs B2): VQ 이식의 단독 효과¶
3.1 점추정 격차¶
| metric | E1 (VQ) | B2 (no-VQ) | Δ (E1 − B2) | 방향 |
|---|---|---|---|---|
| test_pape | 55.01 | 46.38 | +8.63 | E1 악화 |
| test_hr1 | 15.71 | 17.14 | -1.43 | E1 악화 |
| test_hr2 | 31.43 | 42.86 | -11.43 | E1 악화 |
| test_mse | 0.8074 | 0.8083 | -0.0009 | tie |
| test_mae | 0.6377 | 0.6401 | -0.0024 | tie |
| best_val_pape | 64.62 | 55.16 | +9.46 | E1 악화 |
| best_round | 16 | 23 | -7 | E1 조기 정지 |
| bytes/round | 24,576 | 262,736 | -238,160 (-90.6%) | E1 우위 |
HR1/HR2 분모 동일성 (revision 1 보강): E1 과 B2 는 동일 split (split_version=v10-7102) + 동일 50가구 풀 + 동일 peak 정의 (ground truth y_true 로 결정). 따라서 두 run 의 HR@k 분모 (target peak event 총 수) 는 동일하며 격차는 분자 (적중한 peak 수) 차이에서만 발생. denominator manipulation 영향 없음.
해석 (점추정 한정, 격차의 systematic 여부 미검정): - PAPE/HR1/HR2 모든 peak metric 에서 본 run 점추정상 E1 악화 관찰. HR2 격차 -11.43%p 는 가구당 평균 peak event 수 단위로 환산 시 50가구 × ~14 day = ~700 events 기준 약 80 hits 차이. 이 격차가 systematic 인지 단일 seed 로는 미결정. - MSE/MAE 거의 동일 (Δ < 0.003) — 평균 예측 정확도는 동등하지만 peak window metric 만 차별적으로 변화. 이 분리는 점추정 사실로 안정적. - best_round=16 (E1) vs 23 (B2): E1 은 round 17 이후 개선 없음 / 발산성 (round 24 spike 131). B2 는 round 23까지 단조 개선. - bytes/round -90.6% 는 의도한 통신 효율 (decomp 3 CB × 32 codewords vs 전체 모델 weight). 단 PAPE 격차 +8.63 과의 trade-off 는 §6 에서 별도 평가.
3.2 학습 dynamics 비교 (round-wise)¶
| E1 round_train_loss range | B2 round_train_loss range | E1 round_val_pape | B2 round_val_pape | |
|---|---|---|---|---|
| round 0 | 1.1894 | 0.4440 | 85.04 | 62.84 |
| round 5 | 1.0217 | 0.3916 | 79.79 | 60.99 |
| round 15 | 1.0012 | 0.3773 | 70.24 | 60.27 |
| round 29 | 0.9936 | 0.3673 | 65.79 | 56.00 |
| spikes | round 1: val_pape=206.17; round 24: val_pape=131.11 | 없음 | (median 70.46) | (median 58.13) |
- E1 train_loss 가 B2 의 2.5-2.7 배 수준에서 고착 — commitment loss + reconstruction error overhead. E1 round_train_loss는 round 0→29에서 1.19→0.99 (Δ-0.20). B2는 0.44→0.37 (Δ-0.07) 로 둘 다 저감폭 작음.
- E1은 round 1과 round 24에서 val_pape spike (206, 131). 이는 codebook restart 또는 commitment loss 폭발 후 reconstruction trajectory 재정렬 의 signature 가능. (단 본 run stdout 부재로 직접 검증 불가 — §5.3 격하 결정.)
- B2는 round 0의 62.83 부터 단조 감소, 발산 없음 — VQ 부재 시 NBEATSx FedAvg 자체는 수렴.
판정 (revision 1, 점추정 한정): 본 run 점추정에서 PAPE +8.63, HR2 -11.43, train_loss 2.5x 격차가 관찰되었음. 단 이 격차가 systematic 인지 (true effect of VQ 이식) seed 변동인지 (v9-06 NBEATSx 95% CI 폭 ≈ 7.75%p 가 reference) 본 단일 seed 로는 분리 불가. revision 1 이전 draft 의 "VQ 이식은 ... 손해" 단정형 결론은 점추정 한정 사실 + ADR-010 R3 트리거 조건 (≥ 2%p 차이) 충족 + 3-seed 확장 후 재판정 으로 격하한다. 일반화 주장 불가는 동일.
3.5 E1_simple ablation 비교 (revision 1 신설)¶
3.5.1 사실¶
E1_simple run 8f344fa94f2548e8a3adab7a0f79a965, run_name "E1_simple_seed42", 동일 seed=42 / 동일 split v10-7102 / 동일 50가구.
| metric | E1 main | E1_simple | Δ (main − simple) |
|---|---|---|---|
| test_pape | 55.01 | 61.67 | -6.66 (main 우위) |
| test_hr1 | 15.71 | 14.29 | +1.42 (main 우위) |
| test_hr2 | 31.43 | 22.86 | +8.57 (main 우위) |
| test_mse | 0.8074 | 0.9231 | -0.1157 (main 우위) |
| best_val_pape | 64.62 | 69.37 | -4.75 (main 우위) |
| best_round | 16 | 15 | +1 |
3.5.2 변경된 변수 (사용자 컨텍스트가 "C1+C2+C3+M1 effective" 로 라벨)¶
| 변수 | E1 main | E1_simple |
|---|---|---|
| vq_strategy | DecompCB | DecompCBSimple |
| model class | MinimalNBEATSxDecompVQ | MinimalNBEATSxDecompVQSimple |
| per_cb_gamma | trend 0.98 / S 0.95 / G 0.85 (차등) | 0.95 / 0.95 / 0.95 (균등) |
| uniform_gamma | False (추정 default) | True |
| dead_code_restart | True (추정 default) | False |
| kmeans_init | True (추정 default) | False |
→ 6 변수 동시 변경. main vs simple 의 PAPE 격차 -6.66 (main 우위) 는 이 묶음의 합성 효과이며, 단일 ablation 으로는 component 분리 불가.
3.5.3 codebook utilization 비교¶
E1_simple 의 30-round 평균 utilization (Critic 직접 계산값 인용):
| CB | E1 main util mean | E1_simple util mean | Δ |
|---|---|---|---|
| Trend | 5.05% | 3.75% | -1.30 (simple 더 낮음) |
| Seasonal | 17.43% | 4.81% | -12.62 (simple 더 낮음) |
| Generic | 9.14% | 5.31% | -3.83 (simple 더 낮음) |
→ E1_simple 이 utilization 측면에서 모든 CB 가 main 보다 낮은데 PAPE 도 더 나쁘다.
3.5.4 해석 (revision 1)¶
이 비교 결과는 본 보고서 §2.3 (utilization 을 anchor 작동 proxy 로 사용한 추론) 의 약화 시그널이다:
- 만약 "낮은 util ⇒ 모델 성능 악화" 가 단조 관계라면, simple (낮은 util) 이 main (더 높은 util) 보다 PAPE 가 나쁜 것은 정합. 이 방향만 보면 §2.3 의 추론이 강화되는 듯하다.
- 그러나 (a) main 의 trend util 5.05% 와 simple 의 trend util 3.75% 는 절대값 모두 collapse 영역 (< 20% alert) — 즉 두 run 모두 "anchor 가 codebook 채널을 통해 정보를 담는" 가설의 긍정적 region 에 도달하지 못함. (b) seasonal util 의 격차 -12.62%p (main 17.43 vs simple 4.81) 는 "main 의 seasonal CB 만이 부분 회복하는 그림" 인데, 이 회복이 PAPE 우위를 가져왔는지 다른 5 변수 (model class, uniform_gamma, dead_restart, kmeans_init, gamma 차등) 영향인지 분리 불가.
- expert 견해 (재반론 가능 영역): 본 6-변수 묶음 중 어느 변수가 main effect 인지 본 단일 ablation 으로는 결정 불가. 직관적 후보 우선순위는:
- kmeans_init (main=True / simple=False): codebook 초기 분포 자체가 random vs warm-start 으로 다르며 학습 trajectory 의 시작점이 다름 → seasonal CB 회복 여부에 가장 큰 영향 가능성.
- dead_code_restart (main=True / simple=False): dead entry 재초기화 사이클이 main 에서만 동작 → §5.3 의 "60+ dead restart" 정황이 main 에서만 적용 가능.
- per_cb_gamma 차등 vs 균등 (main=차등 / simple=균등): seasonal CB γ=0.95 가 두 run 동일하므로 seasonal util 격차 12.62%p 의 직접 원인은 아닐 가능성.
- vq_strategy / model class: DecompCB vs DecompCBSimple 는 일부 forward 로직 차이 가능성. 코드 verification 없이는 영향 추정 불가.
단 위 우선순위는 expert 의 견해이며 본 run 데이터로 검증 불가. component-level split-out ablation (§11 #4) 으로만 decision 가능. - 점추정 사실 (revision 1 기록): 1. E1_main vs E1_simple 격차 PAPE -6.66 (main 우위) 는 R3 트리거 (≥ 2%p) 충족 → seed std 분리 위해 3-seed 보강 권고. 2. utilization-PAPE 비단조성: simple 은 모든 CB util 이 main 보다 낮은데도 PAPE 도 나쁨. 이는 §2.3 의 "낮은 util ⇒ anchor 미작동 ⇒ 성능 악화" 단조 추론을 약화시킨다 — utilization 만으로 anchor 작동을 진단하기에 부족. 3. 6 변수 묶음의 "C1+C2+C3+M1 effective" narrative 는 단일 ablation 으로 component 분리 불가하므로, 본 보고서는 "이 6변수 묶음 변경이 main 점추정에서 -6.66 PAPE 격차를 produce 했다" 는 사실까지만 기록. 4. E1_simple 이 dead_code_restart=False / kmeans_init=False 인 사실은 §5.3 의 "60+ dead code restart" 신호가 main 에는 적용 가능, simple 에는 적용 불가 임을 의미 — 두 run 의 dead-code 사이클 차이가 PAPE 격차의 일부일 가능성 (추정 미검증).
4. Local vs FL+VQ (E1 vs Phase1): 손해의 분리¶
4.1 점추정 격차¶
| metric | Phase1 Local | E1 FL+VQ | Δ (E1 − Phase1) |
|---|---|---|---|
| test_pape | 33.01 | 55.01 | +22.00 |
| test_hr1 | 19.58 | 15.71 | -3.87 |
| test_hr2 | 29.34 | 31.43 | +2.09 |
| test_mse | 0.6105 | 0.8074 | +0.1969 |
| test_mae | 0.5090 | 0.6377 | +0.1287 |
4.2 손해 분해 (점추정, 단일 seed)¶
E1 vs Phase1 의 격차 +22.00 PAPE 는 다음 3 성분의 합:
- 구현 / 학습 setup 차이 (NF 패키지 max_steps=500 lr=1e-3 → Minimal raw torch loop 30 round × 3 local_epoch). Phase1 vs B2 격차로 추정 = +13.37 PAPE (= 46.38 − 33.01).
- FL aggregation 손실 — 위 13.37 안에 fold(별 가구 독립) → FedAvg aggregation 으로 인한 personalization 손실 포함됨. B2 는 FedAvg+Minimal 묶음이라 분리 안 됨.
- VQ 이식 손실 = E1 vs B2 격차 = +8.63 PAPE.
→ 합 = 13.37 + 8.63 = 22.00 (정확히 일치).
중요한 분리 한계: 성분 1과 2를 본 데이터로는 분리할 수 없음 (Phase1과 B2 사이에 "Minimal+FedAvg+no-VQ" 중간 baseline 부재). 즉 "FedAvg가 단독으로 얼마를 손해보는가"는 본 비교만으로는 모름. ADR-010이 "B0/B1/B2/B3 신규 재학습 전면 스킵"을 결정한 결과 이 ablation 격리가 어려워졌음 — 한계로 명시.
4.3 해석¶
- Local 1위 모델(Phase1 NBEATSx 33.01)을 FL+VQ로 묶었을 때 PAPE 가 약 1.67 배 (33.01 → 55.01). HR1은 0.80 배 (19.58 → 15.71). HR2 는 +2.09 (29.34 → 31.43) — 유일하게 약간 개선.
- HR2 약간 개선은 FL aggregation 의 generalization 효과로 해석 가능 (가구별 cherry-picked peak 이외 인접 시간대도 잡음). 단 HR1·PAPE 우위는 Local에 압도적.
- FL 자체가 NBEATSx 의 peak 우위를 깎는다는 본 run 단일 점추정 사실. Phase1과 B2 간 "FedAvg ablation" 보강 없이는 "FL 가 비-VQ 환경에서도 NBEATSx에 부정적" 결론을 일반화하지 못함.
5. Codebook collapse 분석¶
5.1 정량 지표 (E1, MLflow round 0-29)¶
num_codewords=32 per CB, commitment_beta=0.25, ema_decay=0.99, per_cb_gamma={trend:0.98, seasonal:0.95, generic:0.85}.
| 라운드 그룹 | trend util | seasonal util | generic util |
|---|---|---|---|
| Round 0 (init) | 4.27% | 8.66% | 5.99% |
| Round 1 (직후 spike) | 3.68% (low) | 5.50% (low) | 5.25% (low) |
| Round 2-10 (회복기) | 4.5-5.5% | 10-17% | 8-10% |
| Round 11-23 (peak window) | 4.8-5.8% | 19-22% | 7-12% |
| Round 24 (spike 동반) | 4.64% | 18.42% | 9.25% |
| Round 25-29 (말기) | 5.0-5.5% | 19-21% | 8-11% |
| 30-round 평균 | 5.05% | 17.43% | 9.14% |
| min / max | 3.68 / 6.14 | 5.50 / 21.22 | 5.25 / 11.31 |
5.2 ADR-009 V4/V5 패턴 비교¶
ADR-009(archived 2026-04-21) V4/V5 단계는 "util 4-86%, PAPE 53-57 발산"을 기록. E1 의 trend util 5.05% 평균 + min 3.68%는 V5 RESET 직후 패턴(near-collapse) 과 정합. V5 RESET 자체는 commitment loss β=1.0 등가의 EMA + reset dead code.
E1의 차이점: - per-CB γ 차등 적용 (trend 0.98 / seasonal 0.95 / generic 0.85). γ 큰 CB(trend) 가 alignment update 가 큰 비중을 받지만 활성 entry 자체가 적어 align 할 곳이 없음 — γ 차등은 활성 codebook 이 있을 때만 의미. - seasonal CB만 부분 회복: round 4 부터 util 14% 도달, round 6 이후 16%+ 유지. 이는 seasonal harmonic basis (n_harmonics=5) 의 출력 차원이 trend(3) 대비 더 다양한 representation 을 codebook 에 매핑 가능했기 때문으로 추정 (세부 검증 미실시).
5.3 "60+ dead code restart" 신호 (revision 1: 격하)¶
revision 1 격하 결정: 본 보고 대상 E1 run 1f7606b7 의 stdout 은 별도 파일로 보존되지 않았다. outputs/v10_main_run/logs/e1*.log 3종 (e1.log, e1_parallel_v2.log, e1_seed7.log) 은 모두 다른 run_id 의 출력이다 — 특히 e1_parallel_v2.log 는 run_id=ba6a23e6 (test_pape 47.30) 으로 본 run과 다른 결과를 produce 한 별개 run.
따라서 컨텍스트가 인용하는 "60개의 유효하지 않거나 중복된 코드 정리되었습니다" WARNING 은 본 run 1f7606b7 에서는 직접 검증 불가. 이 메시지는 다른 run 의 stdout 에서 확인된 행태이며, dead-code restart 는 확률적 메커니즘 (k-means re-init, random reset) 이므로 다른 run 의 60개 reset 이 본 run 에서도 60개 reset 임을 보장하지 않는다.
본 run 에 한정해서 직접 검증 가능한 것은: - MLflow round-wise utilization metric 이 30 round 동안 trend 5.05% / seasonal 17.43% / generic 9.14% 평균으로 유지된 것. - round 1, round 24 의 val_pape spike 가 utilization 의 하강 (각 -0.59%p, -1.18%p T util 감소) 과 시간적으로 정합한 것.
위 두 가지로부터 "각 round 종료 시 dead/duplicate entry reset 사이클이 작동했을 가능성" 을 정황적으로 추정 할 수 있으나, 그 reset 의 절대 개수 (60개) 는 본 run 으로 확인 불가. revision 1 이전 draft 의 "96 entry 중 60+개가 매 round에서 collapse → reset 사이클" 표현은 다른 run 의 stdout 을 본 run 에 transplant 한 추론이며, 본 revision 에서 격하한다.
(추가: §3.5 의 E1_simple ablation 에서 dead_code_restart=False 임이 확인되었으므로, dead-code restart 메커니즘 자체는 default-True 인 main run 에서는 동작했을 가능성이 높음. 단 그 작동 강도/주기/규모는 본 run 의 stdout 부재로 미확인.)
5.4 판정 (revision 1)¶
- 3 CB 모두 v10-02 §3.6 "util < 20% alert" 임계 위반. 30/30 rounds (T) / 25/30 rounds (S) / 30/30 rounds (G).
- trend CB는 active code 1.8/32 평균 — H10-2 의 한 운영적 해석 (codebook 다양성 분산 매핑) 은 미충족이나, inherent sparsity 대안 가설 (§2.3a) 도 본 run 으로 배제 불가.
- ADR-010 §"open risks" R2 의 γ=0.8 rollback 트리거 조건에 해당. 본 run 의 rollback 발동 여부 (γ 동적 0.95 → 0.8 변경 발생) 는 본 보고서에서 미확인. logged params 에는
per_cb_gamma={trend:0.98, seasonal:0.95, generic:0.85}단일 값만 존재하나, MLflowlog_params의 일반 동작상 동일 키에 마지막 값만 남으므로 dynamic update 가 있었어도 single-value 로 보일 수 있다. round-wise γ value 가 metric 으로 logged 되지 않아 trajectory 추출 불가. 가드 작동 여부는 engineer 의 코드 verification (§11 #2) 후 결정 가능.
6. 통신량 trade-off 평가¶
6.1 정량¶
| run | bytes/round | 30 round 누적 | test_pape | pape_per_kb (logged) |
|---|---|---|---|---|
| E1 | 24,576 = 24.0 KB | 720 KB | 55.01 | (mlflow logged value) |
| B2 | 262,736 = 256.6 KB | 7.7 MB | 46.38 | (mlflow logged value) |
E1 통신량 = B2 의 9.36% (-90.6% 절감). 30 round 누적 720 KB vs 7.7 MB.
6.2 실용성 평가¶
연구 목적이 "on-device ESS 환경의 KD-기반 lightweight peak forecasting" (CLAUDE.md) 라면 통신량은 중요한 축이지만:
- PAPE +8.63 격차 (점추정 한정, systematic 미검정) 는 현재 단계 점추정에서 통신량 절감을 deployment 측면으로 정당화하지 못함. v9-05/06 Strict gating "PAPE ≤ 43 AND HR1 ≥ 37" 모두 위반 (E1 55.01/15.71, B2 46.38/17.14 — 둘 다 Strict Fail). 즉 본 run 점추정에서 두 모델 다 deployment 가능 라인 미달.
- 통신 효율 metric
pape_per_kb는 logged 되어 있으나 PAPE 값이 절대 임계 이하일 때 의미 — 본 run은 두 모델 다 본 점추정에서 임계 미달이므로 통신 효율 비교는 실용적 결론 없음. - 실용 결론 (점추정 한정): E1 의 90.6% bytes 절감은 기술적 효과로 본 run 에서 확인. peak 예측력의 동시 보존 이라는 v10 phase 목적은 본 run 점추정에서 미달성. 3-seed 후 systematic 여부 재판정 필요.
7. best_round=16 vs val_pape spike round 25 분석¶
7.1 사실 정렬¶
(주의: 본 보고는 mlflow round 인덱싱 0-based 사용. stdout 로그의 "Round 1/30" = mlflow step=0 에 해당.)
| MLflow step | val_pape | val_hr1 | train_loss | util_T | util_S | util_G | 비고 |
|---|---|---|---|---|---|---|---|
| 0 | 85.04 | 14.01 | 1.1894 | 4.27% | 8.66% | 5.99% | init noise |
| 1 | 206.17 | 11.52 | 1.2853 | 3.68% | 5.50% | 5.25% | 첫 spike |
| 16 | 64.62 | 18.38 | 1.0250 | 6.14% | 19.69% | 10.26% | best (val_pape 최저) |
| 24 | 131.11 | 18.21 | 1.1614 | 4.64% | 18.42% | 9.25% | 두 번째 spike |
| 29 | 65.79 | 18.90 | 0.9936 | 5.02% | 20.25% | 9.90% | 종료 |
7.2 spike 원인 가설 (점추정 한정)¶
본 run에는 codebook restart 횟수 / γ rollback 발동 / lr schedule 같은 메타정보가 metric으로 logged 되지 않아 직접 추적 불가. 정황 증거:
- Round 1 spike (val_pape 206): round 0 직후 VQ encoder/decoder 가 처음으로 FedAvg aggregation 을 통과. 모든 client 의 codebook 이 init 직후 매우 다양한 분포 → aggregation 후 "평균된 codebook" 이 어느 client 의 reconstruction 에도 적합하지 않은 상태. T util 이 round 0의 4.27% → round 1의 3.68% 로 감소한 점이 정합 (aggregation 후 더 적은 entry 사용). 동시에 commitment loss (round 0 T=0.0025 → round 1 T=0.0012) 도 절반 — encoder 가 사실상 codebook 을 우회. 가설: aggregation-induced codebook drift 가 reconstruction error 를 일시적으로 폭발.
- Round 24 spike (val_pape 131): round 23 → 24 에서 T util 5.82% → 4.64%, S util 19.38% → 18.42%, G util 9.79% → 9.25% 모두 동시 감소. 이는 dead code mass-restart event 의 signature로 가설 가능 — 일부 entry 가 더 이상 사용되지 않아 EMA decay 0.99 누적 후 "live → restart" 로 재초기화. restart 직후 reconstruction 이 일시적으로 망가짐.
- best_round=16 후 발산 경향: round 16 의 64.62 이후 round 17-23 에서 67-73 범위, round 24 spike 후 round 25-29 가 67-73 으로 회복 못 함. mean_pape 30 round = 77.75. NBEATSx + DecompCB 의 학습은 round 16 시점에서 효과적으로 종료 — 그 이후 학습은 무용 또는 부정적.
7.3 Memory Alignment γ per-CB 차등의 영향 (revision 1)¶
per_cb_gamma={trend:0.98, seasonal:0.95, generic:0.85} 의 의도는 "trend CB 는 더 안정적으로 정렬, generic 은 더 유동적" 이지만:
- Trend CB 의 알 수 있는 활성 entry 가 1.8개 평균 — γ_T=0.98 로 강한 EMA 를 적용해도 대상 자체가 거의 비어있어 alignment 효과 미미.
- Generic CB γ=0.85 는 더 유동적인 update 허용 의도이나 generic util 이 9.14% 평균으로 trend 보다는 높지만 여전히 collapse 영역.
- 차등 γ 는 각 CB 의 utilization 회복을 자체적으로 수행하지 못함 (γ 는 alignment 강도이지 codebook utilization 정책이 아니므로 당연한 결과). v10-02 §3.6 의 "γ=0.8 rollback" 가드가 "util < 20% 시 trigger" 로 명시되어 있으나 3 CB 모두 30/30 rounds 에서 임계 위반인데도 logged params 에서 γ trajectory 추출 불가 — 본 보고서는 가드 작동 여부 미확인 으로 기록한다 (§5.4 동일 표현). 결정은 engineer 의 코드 verification (§11 #2) 후 가능.
8. v9-05/06 Strict gating 판정¶
| 임계 | 조건 | E1 결과 | 판정 |
|---|---|---|---|
| Strict | PAPE ≤ 43 AND HR1 ≥ 37 | 55.01 / 15.71 | FAIL (양쪽 모두 위반) |
| Watch (v9-05 OR) | PAPE ≤ 43 OR HR1 ≥ 37 | 55.01 / 15.71 | FAIL |
| Watch (v9-06 AND, 약화) | PAPE ≤ 46 AND HR1 ≥ 30 | 55.01 / 15.71 | FAIL |
E1은 모든 gating 정의에서 Fail. v10-02 §1.3 의 "Collapse-Free (CB util ≥ 20%)" 도 trend 30/30 rounds 위반 / generic 30/30 rounds 위반 / seasonal 25/30 rounds 위반으로 fail.
9. 한계 및 자기 인정 (revision 1)¶
- 단일 seed (42) 점추정. seed std 추정 불가. 본 run 의 PAPE +8.63 vs B2 격차가 noise 인지 systematic 손해인지 분리 불가. ADR-010 R3 "차이 ≥ 2%p 시 3-seed 확장 자동 트리거" 조건 충족 (8.63 ≫ 2.0). v9-06 NBEATSx 95% CI 폭 ≈ 7.75%p (R5 reference) 와 격차가 동급이므로 systematic 주장 보류. 3-seed 확장 권고.
- θ-drift 메트릭 미로깅 — H10-2 falsification 직접 검정 불가. critical limitation. checkpoint 가 final-round weight 만 보존하므로 retrospective recovery 도 불가. engineer 에게
trend_theta_drift_l2_round_*,generic_theta_drift_l2_round_*(v10-02 §9.3 spec) 로깅 보강 + round-wise basis MLP weight checkpoint 보존 요청 필요. - Phase1 vs B2 사이 "FedAvg + Minimal raw torch + no-VQ" 중간 baseline 부재 — FL aggregation 단독 손해와 Minimal 구현 단독 손해 분리 불가. ADR-010 의 "베이스라인 재학습 전면 스킵" 결정의 결과로 본 보고서가 "FL 손해 7-8 + VQ 손해 14-15" 라고 주장한 컨텍스트의 분리 명제를 검증하지 못함. 컨텍스트가 제시한 분리 비율은 본 run 데이터로 지지되지 않음 (정확한 분리는 추가 baseline 필요).
- 본 run 의 stdout 로그 미보존 —
outputs/v10_main_run/logs/e1*.log파일 3종 (e1.log,e1_parallel_v2.log,e1_seed7.log) 은 모두 다른 run_id 의 출력. 추가로 mlruns 내run_name=E1_NBEATSx_DecompCB_seed42의 동명 run 이 다수 존재 (예:ba6a23e6test_pape 47.30 — 본 보고 대상1f7606b7와 별개). 동명 run 이 다수 있는 사실은 본 run 의 stdout/이벤트 trajectory 식별을 더욱 어렵게 만든다. dead-code restart 시점 / γ rollback 발동 여부 / 실제 collapse guard alert 빈도를 직접 검증 불가. 컨텍스트가 명시한 "60+ dead code restart" 는 다른 run 로그의 행태이며 본 특정 run 에 대한 직접 증거 아님 (§5.3 격하 결정 참조). - per-apt metric 부재 (영구적 한계, revision 1 격상) — 본 run 의 MLflow logged metric 은 50 client mean 만 포함하며 per-apt breakdown 이 없다. Phase1 (9644fa45) 가 100 가구 per-apt 를 logged 한 것과 대조. 그 결과:
- 5-apt EVAL subset (v10-02 §11 R7 가드) 추출 자체가 불가 — 본 run 데이터로는 reporter 단계에서도 회복 불가.
- Apt51 outlier (v9-06 NBEATSx PAPE 47.51) 의 v10 E1 시 행태는 본 보고에서 분석 불가.
- HR1 / HR2 / PAPE 격차의 가구 분포 (소수 outlier 가구의 영향력) 분리 불가. 본 run 의 영구적 한계로 격상. 후속 E1 재실행 시 per-apt logging 보강 필수 (engineer 액션, §11 #1 a 항목으로 추가).
- "VQ 가 좋은 결과 가능성" 추측 회피. 단일 점추정에서 PAPE +8.63 격차 관찰이라는 사실만 기록 (systematic 여부 미검정). 가능성 / 향후 향상 시나리오는 본 보고서의 범위 외. (memory feedback v9_06_revision1 "VQ 가 좋을 수 있다 정당화 금지" 준수.)
10. H10-2 단독 가설 종합 판정 (revision 1)¶
| 검증 축 | 본 run 증거 | 판정 |
|---|---|---|
| θ-drift L2 (trend vs generic) Wilcoxon | 메트릭 미로깅, retrospective recovery 불가 | 검정 불가 |
| Trend CB utilization (>0% sustained 활용도) | mean 5.05%, min 3.68%, 30/30 alert violation | 양 방향 해석 가능 (anchor 미작동 vs inherent sparsity, §2.3a) |
| Trend CB 가 다른 CB 대비 상대적으로 안정 | 가장 낮음 (S 17.43 / G 9.14 대비 5.05) | utilization 만으로 anchor 작동 진단 불가 — E1_simple 의 비단조성 (§3.5.4) 이 추론 약화 |
| FL+VQ 점추정 PAPE 가 no-VQ 대비 동등 이상 | 55.01 vs 46.38 (+8.63), 단 systematic 미검정 | 점추정 격차 관찰, systematic 주장 보류 |
H10-2 종합 (single seed=42 limited, revision 1): Watch (검정 불가). revision 1 이전 draft 의 "Watch → Fail 경향" 표현은 inherent sparsity 대안 가설 미검토 + 단일 seed 점추정 noise 구분 불가 위에 세워진 over-claim 이었으며 본 revision 에서 격하한다. 본 run 의 logged metric 으로는 H10-2 의 statement 를 PASS 측으로도 FAIL 측으로도 결론짓지 못한다. v10-02 §5.6 의 후속 조치 ("H10-2 기각 시 E1 drop, v11 에서 trend block regularizer 추가") 트리거 조건 도달 여부는 본 run 으로 결정 불가. 확정 판정은 (a) θ-drift 직접 logging + round-wise basis MLP weight checkpoint 보존, (b) 3-seed 확장, (c) component-level split-out ablation (§3.5.4 우선순위) 모두 충족 후 가능.
11. 다음 단계 제안 (engineer / orchestrator 결정 대기, revision 1)¶
- engineer: E1 스크립트에 다음 logging 보강:
- a. per-apt metric — 50가구 각각 PAPE/HR1/HR2 round-wise + final test logged (§9 #5 영구 한계 해결의 전제).
- b. θ-drift L2 —
trend_theta_drift_l2_round_*,generic_theta_drift_l2_round_*(v10-02 §9.3 spec). H10-2 직접 검정 가능하게 보강. - c. trend block basis MLP weight checkpoint — round 0 / 5 / 15 / 29 등 sparse snapshot 으로도 trajectory 추출 가능. inherent sparsity 대안 가설 (§2.3a) 검증의 전제.
- engineer:
cb_util < 20%자동 alert + γ=0.8 rollback 의 actual trigger condition 코드 verify. logged params 에 동적 γ 변동 미반영 → 가드 동작 미확인. round-wise γ value 를 metric 으로 logged 하도록 보강 권고. - orchestrator: ADR-010 R3 트리거 충족 (E1 vs B2 격차 8.63 ≥ 2%p, E1 main vs E1_simple 격차 6.66 ≥ 2%p). seed {7, 123} 추가 2 seed E1 main 재실행 결정. 이는 VQ 효과의 noise vs signal 분리 축.
- orchestrator (revision 1 추가): component-level split-out ablation — §3.5 의 6변수 묶음 중 expert 우선순위 (§3.5.4) 1-2 변수에 대해 1-seed split-out 실행. 권고:
- kmeans_init on/off 단일 변수 토글 (다른 5 변수는 main config 유지).
- dead_code_restart on/off 단일 변수 토글.
- 이 두 split-out 으로 E1_main 우위 -6.66 PAPE 의 main effect 가 어느 변수에 sensitive 한지 부분 격리. component 분리 축은 §11 #3 의 noise 분리 축과 직교한다.
- wall-clock 부담: 3-seed × 6-component matrix (= 18 runs) 는 부담이 크므로, 1차로는 (a) 3-seed full E1 main 우선 + (b) 우선순위 1-2 변수의 1-seed split-out. full matrix 는 H10-2 가설 자체가 PASS 측으로 기우는 후속 evidence 가 나온 후 결정.
- orchestrator: "Minimal+FedAvg+NBEATSx (no VQ)" 변형이 이미 B2 라면 — Phase1과 B2 사이 격차의 "구현 차" vs "FL aggregation 차" 분리는 추가 baseline 없이 불가. ADR-011 후보로 등록 검토.
- 본 보고서는 단일 E1 run 분석 한정. H10-5 (정합 vs 비정합 비교) / E2-E4 결과 / cold-start CS0-CS3 결과 와의 종합 결론은 reporter 단계에서 수행 (본 expert 의 책임 외).
12. MLflow 산출물 경로¶
- E1 run:
mlruns/738860791398377455/1f7606b7b2774ee480105ced08fb8572/ - artifacts/checkpoints/E1_NBEATSx_DecompCB_seed42_best.pt (333,562 bytes)
- artifacts/predictions/E1_NBEATSx_DecompCB_seed42_y_true.npy (6,848 bytes)
- artifacts/predictions/E1_NBEATSx_DecompCB_seed42_y_pred.npy (6,848 bytes)
- B2 run:
mlruns/738860791398377455/46415746ea984c00b816e911892581e3/ - Phase1 NBEATSx Local run:
mlruns/738860791398377455/9644fa45a1c74c9487764e919ea4ad25/
13. 보고서 메타¶
- 본 보고서는 v0 draft 제출 → exp-critic 적대 리뷰 (verdict CONDITIONAL PASS) → revision 1 (in-place) 의 cycle 1 산출물.
- 통계 비유의 표기 규약 (CLAUDE.md / memory v9_06_revision1) 준수: p-value, 95% CI, std 표기 없음. seed=42 단일 점추정만.
- denominator manipulation 회피: 모든 비교는 동일 50가구 풀, 동일 split_version=v10-7102 에서 측정된 metric 직접 기록. HR1/HR2 분모 동일성 명시 (§3.1). Apt51 cherry-picking 본 run 데이터 부족으로 실시 불가 (per-apt metric 본 run 에 부재 — §9 #5 영구 한계).
13.1 revision 1 변경 요약 (8 mandatory items 처리)¶
| critic 요구 | 처리 위치 | 처리 방식 |
|---|---|---|
| 1. §3.5 신설 — E1_simple 비교 통합 | §3.5.1-3.5.4 | 신설 (run_id 8f344fa9, 6변수 묶음 변경 명시, utilization-PAPE 비단조성 기록, expert 우선순위 견해 §3.5.4) |
| 2. §0/§3.2 톤 격하 ("VQ 손해" → "점추정 한정 사실") | §0 한 줄 결론, §3.2 판정 | "관찰" / "점추정 한정" / "systematic 여부 미검정" 으로 수정 |
| 3. §2.4/§10 H10-2 판정 ("Watch → Fail 경향" → "Watch (검정 불가)") | §2.4, §10 | 격하 + §2.3a inherent sparsity 대안 가설 1단락 추가 |
| 4. §3.1 HR2 분모 동일성 1줄 | §3.1 표 직후 | 추가 (동일 split + 동일 peak 정의 → 분모 동일) |
| 5. §5.3 dead-code restart 격하 | §5.3 | "다른 run stdout 인용, 본 run 직접 검증 불가" 로 격하 |
| 6. §5.4/§7.3 rollback 표현 통일 | §5.4, §7.3 | "미실시 가능성 높음" → "미확인 (engineer verification 필요)" 통일 |
| 7. §9 영구 한계 격상 | §9 #4 (동명 run_id 다수), §9 #5 (per-apt 부재) | 영구 한계로 격상 |
| 8. §11 component-level split-out 추가 | §11 #4 (신설) | kmeans_init / dead_code_restart 우선 1-seed split-out, 18-run matrix 제외 |
13.2 본 revision 의 잔존 한계¶
- 점추정 한정 사실 만 기록 (이전 draft 와 동일).
- H10-2 의 PASS/FAIL 결정 자체가 보류 — 본 보고서는 검정 불가 상태로 reporter 에게 인계.
- E1_simple 6변수 묶음 의 component 분리는 expert 견해만 명시, 본 데이터 검증 불가.
- 가드 작동 여부 (γ rollback) 는 engineer verification 대기.