ADR-009: v8 → track-f 전환 (Decoder Capacity Swap, A경로)¶
상태: Draft (2026-04-20) — user 승인 대기¶
User 결정 pending (5건) — 본 ADR 은 pending 결정 결과에 따라 부분 재작성 필요: 1. W1 decoder 구조 선택 (옵션 α=FC-MLP / β=Transformer / γ=병렬) 2. Aggregation 복원 범위 (decoder 구조 단독 / v6 cos_similarity+personalized까지 복원) 3. rounds 확장 (smoke 수렴 관찰 후 조건부 30라운드 승인) 4. Gate 수치 (track-f.0 파일럿 결과 반영 후 확정; 현재는 placeholder) 5. Gray-zone 진입 정책 (PAPE 45~50 → 5가구 smoke 확장 허용 범위)
본문은 옵션 γ(병렬 W1+W2) + decoder-only aggregation + rounds 조건부 + gate placeholder 를 전제로 작성. 다른 선택 시 해당 절 재작성.
맥락¶
v8 VQ Rescue Phase (ADR-008) 의 1-seed smoke 결과 (rounds=10, Apt6+Apt88, seed=42):
| Cell | PAPE | HR | 결론 |
|---|---|---|---|
| V4 (alignment, no RESET) | 56.51 | 0.507 | 발산 (train_loss 1.09→1.91) |
| V5 (alignment + RESET) | 53.32 | 0.506 | util 86% 달성했으나 A1 수준 미달 |
| 기준 A1 (no VQ, DLinear only) | 47.1 | 0.68 | — |
| 기준 B0 Local | 52.3 | 0.68 | — |
| v6 R1b 원본 (MLflow 5e040971) | 38.40 | 0.22 | v7/v8 대비 16pp 우위 |
ADR-008 §5 실패 프로토콜 (PAPE ≥ 50 시 파라미터 튜닝 금지 + 재설계) 발동.
exp-expert 원인 분석 (report/version8/exp-expert/track_f_decoder_analysis.md) 결론:
- V4 실패 메커니즘: BFS 정렬의 round-wise overwrite → codebook moving target → encoder 수렴 실패.
- V5 실패 메커니즘: RESET이 util 86%까지 복원했으나 PAPE는 여전히 A1 이하 → codebook utilization과 PAPE decoupled.
- v6 R1b 실제 성공 메커니즘 재해석 (이전 보고 §2 정정):
- v6 R1b는 codebook util 4.06% 임에도 PAPE 38.40
- per-household res_ratio 0.43~0.84 — DLinear residual 지배적
- VQ는 "거의 무시된 통신 채널"
- 이전 v8 보고 (
v8_failure_root_cause_and_redesign.md) 의 "v6 decoder = Transformer (4-layer)" 기술은 오류. 실제 v6 R1b 는args.decoder_type = "fc"→FCDecoderBackbone(MLP) 사용. - 구조적 격차 (v6 R1b vs v7 ProposedModel, 실측):
- v6 decoder = FC-MLP
XcodeYtimeDecoder(type='fc'), 956,696 params, 전역 receptive field (flatten + MLP) - v7 decoder = Conv1d×2 + pred_head, 24,769 params, 5 step local RF
- Decoder capacity 격차 38.6× (이전 "7~8×" 추정의 5배)
- v6 encoder = CNN + residual blocks + compression_factor=4 (156K), v7 encoder = Conv1d×2 same-length (25K)
- FL aggregation 범위 (정정): v6/v7 모두 VQ codebook만 공유. Decoder는 per-client local. 따라서 decoder 교체의 FL 통신량 증가 = 0.
- FL aggregation 전략 차이 (신규 disclosure, 2026-04-20 revision): v6 R1b 는
aggregation_strategy=cos_similarity, memory_fill_strategy=client_personalized, similarity_threshold=0.7, gamma=0.95의 개인화된 FL aggregation 을 사용한 반면, v7 는 plain FedAvg weighted mean. 따라서 v6 R1b PAPE 38.40 은 "decoder capacity + 개인화 aggregation + VQ 조합"의 공동 효과이며, track-f W1 에서 decoder 구조만 복원할 경우 단독 효과는 empirical 검증 사항 (재현 보장 없음). - 증거:
mlruns\628304840000878755\5e0409718fd347d085190264e43d4284\params\{aggregation_strategy,memory_fill_strategy,similarity_threshold,gamma} - 이 사실은 critic F9 지적 반영 으로 이번 revision 에 명시화됨.
결정¶
track-f = Decoder Capacity Swap Phase (A경로). v7 ProposedModel 의 Conv1d×2 decoder (+ Conv1d×2 encoder) 를 v6 R1b 의 FC-MLP decoder + CNN-residual encoder 로 교체한다. VQ 경로는 유지 (A3 cell 구조 유지). FL aggregation 토폴로지는 decoder-only 교체 변형에서는 변경 없음 (v7 FedAvg 유지) — 단, user 가 "aggregation 까지 복원" 을 승인할 경우 cos_similarity + personalized memory 를 포함한 v6 1:1 복원 변형으로 확장 가능 (workload +2~4h).
선정 근거 (revised 2026-04-20 — critic F9 반영)¶
- v6 R1b PAPE 38.40 precedent 는 decoder/encoder capacity + 개인화 aggregation 공동 효과. track-f W1 의 decoder 구조만 복원 이 PAPE 38 수준 재현을 보장하지 않는다는 점을 명시. 재현 실패 시 "decoder 단독 효과 미충분" 이 empirical 결론으로 가능.
- W1 목표 재정의 (revised): "v6 1:1 복원" → "v6 decoder capacity 복원 실험 (aggregation 은 v7 FedAvg 고정, 교란 요인 disclosure)".
- 4 옵션 (α v6 1:1 FC / β 축소 Transformer / γ LSTM / δ Hybrid) 중 α 와 β 가 decoder capacity 회복 가설의 유력 후보. critic F4 반영으로 primary/fallback 순차 프레이밍을 폐기하고 γ 병렬 실행 (W1+W2 동시 1-seed smoke) 을 기본 경로로 승격.
- Workload 5~7h (decoder-only) + 병렬 smoke 2h + 파일럿 30분 = 총 ~8h, 예산 12h 이내.
- FL 통신량 증가 0 (decoder 로컬 구조 유지; decoder-only 변형 기준).
- 파라미터 튜닝 금지 원칙 준수 — 이것은 아키텍처 구조 교체이며 하이퍼파라미터 조정이 아님. rounds 확장은 smoke 수렴 관찰 후 조건부 승인 (§실패 프로토콜).
이름 결정¶
- track-f (phase 이름) — 번호 ADR-009는 유지하되, 파일명에
v9대신track_f_decoder_swap사용. - 이전 ADR-009 draft (
ADR-009_v8_to_v9_vq_redesign.md, Option d shared linear adapter) 는 본 파일로 대체 (user가 A경로 선정으로 d 기각).
v7/v8 에서 계승¶
- 단계 0 사전 등록: Golden tensor G1~G5, definition_hash
8be2bd2f691deed0, Apt_max_load=Apt88 — 유지 - v7_runner.py: CLI + CELL_REGISTRY 기존 12종 (B0~V5) 행동 불변, decoder_type 필드로 확장만
- 공용 모듈:
src/peak_analysis/v7/metrics.py— 변경 없음 - smoke infrastructure:
v7_stage05_smoke_analysis.py+ 6 Gates + rel_decrease — 유지 - 155+ tests 전부 유지 (W1/W2 테스트 ~5개 추가)
- 9-run smoke + v8 V4/V5 MLflow 데이터: 보존 (실패 증거)
- peak-aware loss (alpha=2.0, beta=0.1): 변경 없음
- 5-seed set {42, 123, 456, 789, 2024}: 유지
- Fail-fast threshold (val ratio > 1.5, train > 3.0): 유지
track-f 신규 사항¶
1. CELL_REGISTRY 확장 (기존 12종 불변)¶
| ID | 상태 | 설명 | use_vq | use_dlinear | peak_loss | decoder_type (신규 필드) |
|---|---|---|---|---|---|---|
| B0~V5 (기존 12종) | 행동 불변 | — | — | — | — | v7_conv (default) |
| W1 (신규, α 병렬) | active | peak-loss + VQ + DLinear + v6 FC-decoder + CNN-residual encoder | ✓ | ✓ | ✓ | v6_fc |
| W2 (신규, β 병렬) | active | peak-loss + VQ + DLinear + 축소 Transformer decoder | ✓ | ✓ | ✓ | tf2_128 |
decoder_type 필드는 CellSpec의 신규 인자 + default v7_conv (기존 B0~V5 행동 유지).
프레이밍 변경 (critic F4 반영): 이전 "W1 primary / W2 fallback" 순차 구조를 폐기하고 W1 + W2 병렬 실행 (track-f.0 파일럿 + track-f.1 smoke 양자 동시) → PAPE 낮은 variant 를 track-f.2 primary 로 선정. user 지시 "Transformer 교체" 원문 존중과 v6 FC-MLP precedent 양쪽을 모두 수용하기 위함.
2. ProposedModel 확장¶
experiments/federated/v7_runner.py:663 ProposedModel에 decoder_type kwarg 추가:
def __init__(self, ..., decoder_type: str = "v7_conv"):
...
if decoder_type == "v7_conv":
# 기존 Conv1d×2 로직 유지 (backward-compat)
self.encoder = ...existing...
self.decoder = ...existing...
self.pred_head = ...existing...
elif decoder_type == "v6_fc":
from lib.models.Encoder_and_Retrieval import Encoder as V6Encoder
from lib.models.decoder import XcodeYtimeDecoder
self.encoder = V6Encoder(in_channels=1, num_hiddens=128, ...)
self.decoder = XcodeYtimeDecoder(decoder_type='fc', ...)
self.pred_head = None # XcodeYtimeDecoder이 output projection 포함
elif decoder_type == "tf2_128":
self.encoder = ...existing v7 encoder...
self.decoder = TransformerDecoderW2(d_hid=128, nlayers=2)
...
Backward-compat 필수: default v7_conv 분기는 기존 12 cell의 MLflow run 과 bit-exact 재현 가능해야 함.
3. 신규 테스트 (engineer contract에 상세)¶
test_w1_decoder_params()— W1 decoder 파라미터 수 = 956,696 assertiontest_w2_decoder_params()— W2 decoder 파라미터 수 = 105,368 assertiontest_legacy_cells_backward_compat()— B0~V5 cell의 ProposedModel이 defaultv7_conv로 인스턴스화 되고 기존 24,769 param count 유지test_v6_fc_decoder_output_shape()— W1 forward pass로[B, 24, 1]출력 확인test_tf2_128_decoder_output_shape()— W2 동일 출력 shape 확인
4. MLflow 로깅 추가¶
decoder_typeparam 로깅 (per run)decoder_param_countparam 로깅- 기존 train_loss / val_loss / codebook_util / PAPE / HR 등 지표는 그대로
실패 시 프로토콜 (user 지정)¶
track-f.0 (신규, 파일럿 — critic F6 반영)¶
Pre-registered gate 수치 empirical 근거 확보용 사전 파일럿. - Cells: W1 (+ W2, user 옵션 γ 선택 시) - Seeds: {42, 123, 456} - Households: Apt6, Apt88 - Rounds: 10 - Runs: 3 seed × 2 variants = 6 runs, ~30분 - 목적: track-f.1/.2 gate 수치 (PAPE threshold, std gate) 의 empirical 기준 확보 - Gate 재설정 규칙: - track-f.1 PAPE threshold = 파일럿 min ± 2pp - track-f.2 std gate = 파일럿 std × 1.5 (안전 margin)
track-f.1 (1-seed smoke, 병렬 W1+W2 — critic F4 반영)¶
- Pass: W1 또는 W2 PAPE ≤ [파일럿 후 확정] (A1 47.1 돌파 기준)
- Stretch: PAPE ≤ 40 (v6 R1b 38.40 근접, 단 v6 aggregation 미복원으로 보장 없음)
- Inconclusive (45 < PAPE ≤ 50): 5가구 확장 smoke 1회 (user 승인). 이는 "데이터셋 조건 보강"이며 튜닝 아님.
- Fail (두 variant 모두 PAPE > 50):
- 파라미터 튜닝 금지 (lr, rounds, peak_alpha, EMA gamma 등 절대 조정 금지)
- 가능 옵션 (exp-expert 분석 + user 승인):
- (a) v6 decoder 포팅 검증 실패 의심 — XcodeYtimeDecoder import 및 shape 재검증, v6 원본 MLflow run과 모델 output 대조
- (b) v6 aggregation 복원 확장 — cos_similarity + personalized memory 까지 복원 (workload +2~4h) — 이는 "구조적 방법론 확장"이며 하이퍼파라미터 튜닝 아님
- (c) track-f 중단 + Option d rollback — 이 경우 ADR-010 필수 (A경로 실패 증거 + Option d 복귀)
rounds 확장 프로토콜 (critic F5 반영)¶
- track-f.1 smoke 는 rounds=10 유지 (튜닝 경계 보호)
- smoke 완료 후 loss curve 분석:
- epoch 8~10 구간 loss 감소율 > epoch 1~4 평균 감소율의 50% → 미수렴 판단, rounds=30 확장 승인 (user 결정 사항)
- 그렇지 않으면 rounds=10 유지
- 이 분석은 track-f.2 진입 조건으로 pre-register
track-f.2 (5-seed, 5가구, rounds=[10|30] conditional)¶
- Pass: 선정 variant PAPE 평균 ≤ [파일럿 후 확정], std < [파일럿 std × 1.5], rel_decrease > 0 on ≥ 4/5 seeds
- Fail: 4/5 이상 seed에서 A1 수준 미달 → user 결정권 호출
- (α) 다른 variant 선정 (W1 → W2 또는 역순)
- (β) v6 aggregation 복원 확장
- (γ) FL narrative 포기 + KD paper 경로 유지 (ADR-010)
금지 항목¶
- peak_alpha, commitment_beta, EMA gamma, kmeans_warmup 하이퍼파라미터 탐색 금지
- lr / batch_size / rounds 단독 조정 금지 (rounds는 track-f.2의 30으로 1회 확정한 이후 변경 금지)
- 기존 B0~V5 cell의 행동 변경 금지
src/fed_learning/fedpm.py(v6 파일) 수정 금지src/FedUnit-64D1/lib/(v6 원본 라이브러리) 수정 금지 — import onlysrc/peak_analysis/v7/metrics.py수정 금지v7-planningbranch 유지
근거¶
- v6 R1b precedent: 같은 도메인 electricity load 5가구 + VQ + DLinear residual로 PAPE 38.40 달성 (MLflow
5e0409718fd347d085190264e43d4284) - v7 A1 (no VQ) empirical: PAPE 47.1 — decoder만 Conv1d×2인 상태에서는 A1(DLinear 단독)보다 낮춰지지 않음을 증명
- v8 V5 empirical: util 86% 달성해도 PAPE 53.32 — VQ 알고리즘 고도화 없이 decoder 교체가 우선순위임을 증명
미결 사항 (user 결정 필요, revised 5건 — critic F1 반영)¶
- W1 decoder 구조 선택 — user 가 "Transformer 교체" 라고 지시한 것과 v6 R1b 실제 FC-MLP precedent 간 정합 결정:
- 옵션 α: W1 = FC-MLP (v6 정확 복원), W2 없음
- 옵션 β: W1 = Transformer (축소), W2 없음 (A경로 엄밀 해석)
- 옵션 γ: W1 + W2 둘 다 실행 (본 revision 기본 경로) — workload +2h
- 권고 (critic F4 반영): 옵션 γ — user 원문 존중 + empirical 증거 획득 양립
- Aggregation 복원 범위 (신규, critic F9 반영) — v6 R1b 는
cos_similarity + personalized memory + threshold=0.7 + gamma=0.95사용, v7 는 FedAvg: - 옵션 i: decoder 구조만 교체 (aggregation 은 v7 FedAvg 유지) — 본 revision 기본 경로
- 옵션 ii: aggregation 까지 v6 복원 (cos_similarity + personalized memory 포함) — workload +2~4h
- rounds 확장 승인 (조건부, critic F5 반영) — smoke 수렴 관찰 후 조건부 승인 프로토콜:
- track-f.1 smoke 에서 epoch 8~10 감소율 > epoch 1~4 감소율의 50% 일 때만 rounds=30 승인
- 그렇지 않으면 rounds=10 유지
- Gate 수치 파일럿 기반 설정 (신규, critic F6 반영) — track-f.0 파일럿 (W1/W2 × seed {42,123,456} × Apt6,Apt88 × rounds=10) 결과로 pre-registered gate 확정:
- track-f.1 PAPE threshold = 파일럿 min ± 2pp
- track-f.2 std gate = 파일럿 std × 1.5
- Gray-zone 진입 정책 (PAPE 45~50) — 5가구 확장 smoke 1회 허용 범위 및 반복 횟수 제한
진행 현황¶
- track-f 방향 결정 (user 2026-04-20)
- exp-expert 심층 분석 (
report/version8/exp-expert/track_f_decoder_analysis.md) - ADR-009 rewrite (본 파일, cycle 1/2)
-
docs/reference/project_state/track_f_decoder_swap.md작성 -
todos/track-f_decoder_swap.md작성 - exp-critic cycle 1/2 adversarial review (CONDITIONAL APPROVE, 10 findings)
- exp-expert cycle 2/2 revision — critic F1/F3/F4/F5/F6/F9 반영
- user 승인 (미결 사항 5건 결정)
- engineer contract dispatch
- engineer: W1/W2 구현 + 테스트
- track-f.0 파일럿 (gate 수치 확정)
- track-f.1 병렬 smoke (W1+W2)
- track-f.2 5-seed
- track-f.3 Stage 1
관련 ADR¶
- ADR-007: v6 → v7 clean restart
- ADR-008: v7 → v8 VQ Rescue (실패)
- ADR-009 (prior draft, superseded): v8 → v9 Shared linear adapter (Option d)
- ADR-009 (본 파일, active): v8 → track-f Decoder capacity swap (A경로)
관련 문서¶
- 심층 분석:
report/version8/exp-expert/track_f_decoder_analysis.md - Design spec:
docs/reference/project_state/track_f_decoder_swap.md - TODO:
todos/track-f_decoder_swap.md - Engineer contract:
report/version8/exp-expert/track_f_engineer_contract.md - Memory:
.claude/agent-memory/exp-expert/track_f_decoder_plan.md