콘텐츠로 이동

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) 결론:

  1. V4 실패 메커니즘: BFS 정렬의 round-wise overwrite → codebook moving target → encoder 수렴 실패.
  2. V5 실패 메커니즘: RESET이 util 86%까지 복원했으나 PAPE는 여전히 A1 이하 → codebook utilization과 PAPE decoupled.
  3. v6 R1b 실제 성공 메커니즘 재해석 (이전 보고 §2 정정):
  4. v6 R1b는 codebook util 4.06% 임에도 PAPE 38.40
  5. per-household res_ratio 0.43~0.84 — DLinear residual 지배적
  6. VQ는 "거의 무시된 통신 채널"
  7. 이전 v8 보고 (v8_failure_root_cause_and_redesign.md) 의 "v6 decoder = Transformer (4-layer)" 기술은 오류. 실제 v6 R1b 는 args.decoder_type = "fc"FCDecoderBackbone (MLP) 사용.
  8. 구조적 격차 (v6 R1b vs v7 ProposedModel, 실측):
  9. v6 decoder = FC-MLP XcodeYtimeDecoder(type='fc'), 956,696 params, 전역 receptive field (flatten + MLP)
  10. v7 decoder = Conv1d×2 + pred_head, 24,769 params, 5 step local RF
  11. Decoder capacity 격차 38.6× (이전 "7~8×" 추정의 5배)
  12. v6 encoder = CNN + residual blocks + compression_factor=4 (156K), v7 encoder = Conv1d×2 same-length (25K)
  13. FL aggregation 범위 (정정): v6/v7 모두 VQ codebook만 공유. Decoder는 per-client local. 따라서 decoder 교체의 FL 통신량 증가 = 0.
  14. 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 검증 사항 (재현 보장 없음).
  15. 증거: mlruns\628304840000878755\5e0409718fd347d085190264e43d4284\params\{aggregation_strategy,memory_fill_strategy,similarity_threshold,gamma}
  16. 이 사실은 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 반영)

  1. v6 R1b PAPE 38.40 precedent 는 decoder/encoder capacity + 개인화 aggregation 공동 효과. track-f W1 의 decoder 구조만 복원 이 PAPE 38 수준 재현을 보장하지 않는다는 점을 명시. 재현 실패 시 "decoder 단독 효과 미충분" 이 empirical 결론으로 가능.
  2. W1 목표 재정의 (revised): "v6 1:1 복원" → "v6 decoder capacity 복원 실험 (aggregation 은 v7 FedAvg 고정, 교란 요인 disclosure)".
  3. 4 옵션 (α v6 1:1 FC / β 축소 Transformer / γ LSTM / δ Hybrid) 중 α 와 β 가 decoder capacity 회복 가설의 유력 후보. critic F4 반영으로 primary/fallback 순차 프레이밍을 폐기하고 γ 병렬 실행 (W1+W2 동시 1-seed smoke) 을 기본 경로로 승격.
  4. Workload 5~7h (decoder-only) + 병렬 smoke 2h + 파일럿 30분 = 총 ~8h, 예산 12h 이내.
  5. FL 통신량 증가 0 (decoder 로컬 구조 유지; decoder-only 변형 기준).
  6. 파라미터 튜닝 금지 원칙 준수 — 이것은 아키텍처 구조 교체이며 하이퍼파라미터 조정이 아님. 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 assertion
  • test_w2_decoder_params() — W2 decoder 파라미터 수 = 105,368 assertion
  • test_legacy_cells_backward_compat() — B0~V5 cell의 ProposedModel이 default v7_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_type param 로깅 (per run)
  • decoder_param_count param 로깅
  • 기존 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 only
  • src/peak_analysis/v7/metrics.py 수정 금지
  • v7-planning branch 유지

근거

  • 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 반영)

  1. W1 decoder 구조 선택 — user 가 "Transformer 교체" 라고 지시한 것과 v6 R1b 실제 FC-MLP precedent 간 정합 결정:
  2. 옵션 α: W1 = FC-MLP (v6 정확 복원), W2 없음
  3. 옵션 β: W1 = Transformer (축소), W2 없음 (A경로 엄밀 해석)
  4. 옵션 γ: W1 + W2 둘 다 실행 (본 revision 기본 경로) — workload +2h
  5. 권고 (critic F4 반영): 옵션 γ — user 원문 존중 + empirical 증거 획득 양립
  6. Aggregation 복원 범위 (신규, critic F9 반영) — v6 R1b 는 cos_similarity + personalized memory + threshold=0.7 + gamma=0.95 사용, v7 는 FedAvg:
  7. 옵션 i: decoder 구조만 교체 (aggregation 은 v7 FedAvg 유지) — 본 revision 기본 경로
  8. 옵션 ii: aggregation 까지 v6 복원 (cos_similarity + personalized memory 포함) — workload +2~4h
  9. rounds 확장 승인 (조건부, critic F5 반영) — smoke 수렴 관찰 후 조건부 승인 프로토콜:
  10. track-f.1 smoke 에서 epoch 8~10 감소율 > epoch 1~4 감소율의 50% 일 때만 rounds=30 승인
  11. 그렇지 않으면 rounds=10 유지
  12. Gate 수치 파일럿 기반 설정 (신규, critic F6 반영) — track-f.0 파일럿 (W1/W2 × seed {42,123,456} × Apt6,Apt88 × rounds=10) 결과로 pre-registered gate 확정:
  13. track-f.1 PAPE threshold = 파일럿 min ± 2pp
  14. track-f.2 std gate = 파일럿 std × 1.5
  15. 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