콘텐츠로 이동

User 결정 pending (5건) — 본 분석의 §6 성공 기준, §7 실패 프로토콜, §8 workload 는 pending 결정 결과에 따라 부분 재작성 필요: 1. W1 decoder 구조 (α=FC-MLP / β=Transformer / γ=병렬) — 본문 γ 전제 2. Aggregation 복원 범위 (decoder 단독 / v6 cos_similarity+personalized 포함) — 본문 decoder-only 전제 3. rounds 확장 (smoke 수렴 관찰 후 조건부) — 본문 rounds=10 smoke + 조건부 rounds=30 전제 4. Gate 수치 (파일럿 후 확정) — 본문 placeholder 5. Gray-zone 정책 (PAPE 45~50)

track-f Decoder Transformer 교체 — 심층 분석

§0 맥락 + 사실 관계 정정

0.1 사용자 승인 경로

  • v8 V4/V5 실패 → exp-expert가 4 옵션(a/b/c/d) 제시 → user가 d 대신 A경로 (Decoder Transformer 교체 + VQ 유지 + FL 유지) 를 선정.
  • phase 이름: track-f (ADR-009 번호 유지, v9라는 이름은 쓰지 않음. 본 phase는 v7 인프라 위에 얹히는 별도 track).

0.2 사실 관계 정정 (critic 사전 대비)

v8 실패 분석 보고서 (report/version8/exp-expert/v8_failure_root_cause_and_redesign.md §2)exp-expert 메모리 v8_failure_root_cause.md중대한 사실 오류 가 있었음을 본 분석에서 확인:

(오류) "v6 R1b decoder = Transformer (d_model=64, nhead=4, d_hid=256, nlayers=4)"

실제: v6 R1b의 args.decoder_type = "fc" (experiments/federated/v6_0415_fedpm_original.py:126). 즉 v6 R1b는 XcodeYtimeDecoder(decoder_type='fc')FCDecoderBackbone (MLP) 을 사용. Transformer가 아니라 seq_len=24, d_model=64 FC-MLP 4-layer.

근거: - experiments/federated/v6_0415_fedpm_original.py:125-130: args.decoder_type = "fc", d_model=64, nhead=4, d_hid=256, nlayers=4 (nhead는 fc 경로에서 미사용). - src/FedUnit-64D1/lib/models/decoder.py:447-491: FCDecoderBackbone = nn.Sequential of Linear(seq_len*d_model, d_hid) → Linear(d_hid, d_hid) → ... → Linear(d_hid, seq_len*d_model) + 뒤에 linear_out: Linear(seq_len*d_model, seq_out_len).

이 정정이 track-f 방향성에 미치는 영향: 1. "Transformer로 교체해야 PAPE 38 복원" 가설은 근거가 약화 — v6 R1b 자체가 Transformer를 쓰지 않았다. 2. 하지만 user가 A경로를 지시했고, decoder capacity 격차 자체는 여전히 사실(v6 FC=957K vs v7 Conv=25K, ≈38×). 따라서 capacity 회복이라는 관점에서는 track-f A경로의 동기가 유지됨. 3. 실제 "v6와 같게 복원"하려면 FC-decoder α방안 (957K FC)이 유일한 1:1 포팅. Transformer 방안 (β)은 v6와 다른 구조로의 업그레이드 시도임을 계획에서 정직하게 기술해야 함.

0.3 또 하나의 정정: FL aggregation 대상

v6 R1b와 v7 FL 모두에서 FL에 공유되는 것은 VQ codebook (PMR state) 뿐 이다. Encoder/decoder/DLinear는 per-client local, FL 비공유.

근거: - v6 R1b: experiments/federated/v6_0415_fedpm_original.py:735server.aggregate(client_updates, ...) 에서 client_updates는 line 728의 updated_memory = PMR state only. - v7: experiments/federated/v7_runner.py:1608, 1615-1622local_vq_states.append(lm.get_vq_state()) / FedAvg weighted mean은 get_vq_state() (VQ codebook 16K floats) 에만 적용.

따라서 user가 언급한 "Transformer decoder ~8× 통신량 증가" 우려는 현 FL 토폴로지에서는 적용되지 않는다. Decoder는 로컬이므로 aggregation 비용 증가는 0. 통신량은 VQ codebook 16K floats/round로 불변.

단, 이는 현 구현의 FL 가정이며 "decoder를 공유했다면" 시나리오의 타당성 평가는 Task 2에서 별도 분석.

0.4 FL aggregation 전략 차이 (신규, critic F9 반영)

공유 대상 은 v6/v7 모두 VQ codebook 이지만, aggregation 전략은 다르다:

항목 v6 R1b v7 (current)
aggregation_strategy cos_similarity fedavg (plain)
memory_fill_strategy client_personalized N/A (shared global)
similarity_threshold 0.7 N/A
gamma 0.95 (EMA coefficient) N/A

증거: mlruns\628304840000878755\5e0409718fd347d085190264e43d4284\params\{aggregation_strategy,memory_fill_strategy,similarity_threshold,gamma} (v6 R1b MLflow run).

이 정정이 track-f 방향성에 미치는 영향: 1. v6 R1b PAPE 38.40 은 "decoder capacity + 개인화 aggregation + VQ" 의 공동 효과. 본 분석 §2 이후 "v6 성공 메커니즘" 해석은 aggregation 전략도 포함하도록 수정 필요. 2. track-f W1 에서 decoder 구조만 복원 (aggregation 은 v7 FedAvg 유지) 할 경우 — PAPE 38.40 재현은 empirical 검증 사항이며 보장되지 않음. 3. "v6 1:1 복원" 주장 → "v6 decoder capacity 복원 실험 (aggregation 은 교란 요인으로 disclosure)" 로 주장 강도 downgrade. 4. 대안 (user 결정 pending): "aggregation 까지 복원 (cos_similarity + personalized memory)" 옵션 추가 (workload +2~4h). 이는 "구조적 방법론 확장" 으로 튜닝 금지 원칙에 저촉되지 않음.

§1 v7 current vs v6 R1b decoder 정량 비교

1.1 v7 ProposedModel decoder (실측)

파일: experiments/federated/v7_runner.py:735-742

self.decoder = nn.Sequential(
    nn.Conv1d(embedding_dim, embedding_dim, kernel_size=3, padding=1),  # 64→64
    nn.ReLU(),
    nn.Conv1d(embedding_dim, embedding_dim, kernel_size=3, padding=1),  # 64→64
    nn.ReLU(),
)
self.pred_head = nn.Linear(embedding_dim, 1)   # 64 → 1
  • 입력 shape: z_hat[B, D=64, seq=24] (Conv1d 기준 NCL)
  • 출력 shape: [B, seq=24, 1] — per-step scalar prediction.
  • Receptive field: kernel=3, padding=1, 2 layers ⇒ 유효 RF 5 time steps (24 중).
  • Parameter count: 24,769 (Conv1d×2 = 24,704 + pred_head Linear(64,1) = 65).

1.2 v6 R1b decoder (실측)

파일: experiments/federated/v6_0415_fedpm_original.py:207-220, src/FedUnit-64D1/lib/models/decoder.py:494-619 (XcodeYtimeDecoder(decoder_type='fc'))

구조 (flattened): 1. linear_in (d_in=64 == d_model=64, skip) 2. FCDecoderBackbone: - permute to [B, seq=24, D=64] → flatten to [B, 24*64=1536] - Linear(1536, 256) → ReLU → Dropout - Linear(256, 256) → ReLU → Dropout - Linear(256, 256) → ReLU → Dropout - Linear(256, 1536) - reshape back to [B, 24, 64] → permute to [seq, B, D] 3. permute to [B, seq, D] → flatten to [B, 1536] 4. linear_out: Linear(1536, 24)[B, 24] per-step prediction

  • 입력 shape: [seq_in_len=24, B, d_in=64] (batch_first=False)
  • 출력 shape: [B, seq_out_len=24]
  • Receptive field: 전역 (flatten + MLP → 24 step 전체가 mixed)
  • Parameter count: 956,696 (linear_in 제외 동일, dominant: Linear(1536→256)=393K + Linear(256→1536)=394K + linear_out(1536→24)=37K + 2×Linear(256→256)=131K)

1.3 비교표

항목 v7 current v6 R1b 격차
Decoder 구조 Conv1d×2 (kernel=3) + Linear(D,1) FC-MLP (1536→256→256→256→1536) + Linear(1536,24) 구조 근본 차이
Decoder params 24,769 956,696 38.6×
Receptive field (시간축) 5 steps (local) 24 steps (전역 flatten) 전역성 대폭 상이
Prediction head per-step Linear(D,1) independent across time joint Linear(1536, 24) (전 step mixed) joint vs independent
FL aggregation? No (local) No (local) 동일
FL 통신량 증가 0 0 0

결론: "decoder capacity 7~8× 격차"라고 이전 메모리에 기록됐던 수치는 실제 38.6× 이다 (v6 decoder가 FC-MLP 957K이라는 사실을 몰랐기 때문에 과소 추정). user가 승인한 "A경로 동기" 는 이 실측으로 오히려 강해진다.

§2 v6 R1b의 실제 성공 메커니즘 재해석 (revised 2026-04-20 — critic F9 반영)

이전 메모리 v8_failure_root_cause.md 가 주장한 "v6 성공 = Transformer decoder 덕분" 은 틀림. Revised 해석:

v6 R1b가 PAPE 38.40을 달성한 이유는 4 요인의 공동 효과: 1. FC-MLP decoder 의 전역(flatten) receptive field (957K params) 2. CNN-residual encoder + compression_factor=4 (96→24) 로 유효 표현 추출 3. DLinear residual (per-household local, base_lr × 0.1 differential LR) 4. 개인화된 FL aggregation (cos_similarity + personalized memory + threshold=0.7 + gamma=0.95 EMA)

즉 "decoder capacity 가 주원인" 가설은 1~3 까지만 주장 가능하며, 4번 요인이 얼마나 기여했는지는 별도 ablation 필요. track-f W1 은 1, 2, 3 을 복원 (+ critic F3 보강: RevIN biased, loss_decode, DLinear LR) 하고 4 는 미복원 이므로, PAPE 38.40 재현은 필요조건은 갖춤, 충분조건 여부 empirical 검증 필요.

이는 decoder 구조의 질적 차이(전역 vs local RF)가 capacity 차이(957K vs 25K)보다 본질적일 가능성을 시사하되, aggregation 전략 (cos_similarity + personalized) 도 잠재적 기여 요인 으로 추가 인정. track-f 는 1차적으로 decoder-only 복원, 실패 시 옵션 ii (aggregation 복원) 확장.

§3 FL aggregation 영향 분석

3.1 현 구조 (decoder 로컬) — 권장

사용자의 "Transformer decoder ~8× 통신 증가" 우려에 대한 답:

현 v7 FL은 decoder를 공유하지 않는다. 따라서 decoder를 Transformer/FC-MLP 무엇으로 바꾸어도 FL 통신량은 변하지 않는다. 통신량은 VQ codebook 16K floats/round 고정.

이 사실은 track-f A경로 실행에서 통신량 우려를 완전히 제거한다. 기존 v6 R1b가 FC-MLP 957K decoder를 로컬로 두고 PAPE 38.40을 달성한 precedent가 바로 이 구조.

3.2 "decoder 를 공유했다면" 가설 분석 (비권장)

만약 track-f에서 decoder를 shared로 전환한다면 (user 지시 없음, 순수 학술 분석):

  • Transformer decoder FL aggregation 특이점:
  • LayerNorm 파라미터 (scale/shift) — FedAvg weighted mean OK (affine scalar). 단, LN statistics는 running stats 아니므로 문제 없음.
  • Attention weights — 단순 Linear weight matrix. FedAvg에서 선형 평균이 수렴 보장 없으나, 동일 domain(electricity load)에서는 v6 encoder 내부 Transformer(Encoder_and_Retrieval.py)도 FedAvg 되었다는 precedent 부재(encoder도 로컬). 실측 데이터 없음.
  • Positional encoding — deterministic sinusoidal이면 공유 불필요. learnable이면 FedAvg 가능하나 가구 간 drift 위험.
  • FC-MLP decoder FL aggregation:
  • 단순 Linear weight만 있어 FedAvg weighted mean이 안정적일 것 (encoder/head와 동일 precedent).

결론: decoder 공유 전환은 track-f의 scope가 아니며 추가 위험 요소. track-f에서는 기존 "decoder 로컬" 구조 유지.

3.3 DLinear residual과의 결합 방식

v6 R1b 및 v7 모두 동일한 덧셈 결합 (y_hat = y_vq + y_dlinear): - v6: experiments/federated/v6_0415_fedpm_original.py Phase 3b — y_vq = model_decode(xcodes) + y_dlinear = dlinear_residual(x_raw) 덧셈. - v7: experiments/federated/v7_runner.py:789y_hat = y_vq_denorm + y_dlinear.

track-f에서는 동일한 덧셈 결합 유지. concat이나 gated 결합은 scope 아님.

§4 구현 방안 4개 비교

평가 기준

  • PAPE 회복 가능성 (target: ≤45 = A1(47.1) 돌파, stretch: ≤40)
  • Engineer workload (≤6h target)
  • 실패 재발 위험
  • 신규 FL 공유 가중치 수 (현 16K 유지 여부)

방안 비교표

방안 설명 Decoder params Workload 예상 PAPE FL 공유 크기 변화 실패 위험
α: v6 R1b 1:1 복원 XcodeYtimeDecoder(type='fc', d_model=64, d_hid=256, nlayers=4) + compression_factor=4 encoder 복원 956,696 5~7h (encoder CNN-residual도 함께 복원) 40~45 0 (로컬) 저 (v6 precedent 직접)
β: 축소 Transformer TransformerEncoder (d_model=64, nhead=4, d_hid=128 or 256, nlayers=2) + 전역 Linear out 105K~138K 3~5h (decoder 모듈만 교체) 42~48 0 중 (transformer FL 없지만 decoder 로컬이라 무관)
γ: LSTM decoder LSTM(d_hid=128, nlayers=2) + Linear out 305K 3~4h 45~50 0 중상 (sequential 학습 불안정)
δ: Hybrid (1-layer Transformer + FC head) 1-layer TransformerEncoder + Linear(D*seq, pred_len) 72K 2~3h 45~50 0 중 (1-layer self-attention capacity 한계)

선정 기준별 평가

  1. PAPE 회복 가능성 (primary):
  2. α 최선 (v6 precedent 직접). 그러나 주의: v6 R1b는 5가구 × rounds=100 + 원본 dataloader + peak_weighted_smooth_l1 설정 등 수많은 조건부로 PAPE 38.40 달성. track-f는 2가구/5가구 × 제한 라운드로 smoke 진행 예정 — α라도 38.40 재현 보장은 없음.
  3. β 중간. Transformer encoder 2-layer의 self-attention이 FC-MLP와 동급 "전역 RF" 제공, capacity 은 상대적으로 작음 (138K < 957K).
  4. γ sequential capacity는 있으나 LSTM이 시계열 24-step 예측에서 Transformer/MLP 대비 열세라는 일반 결과.
  5. δ capacity 최소 — 45~50 구간.

  6. Workload (secondary, ≤6h 선호):

  7. α 5~7h (encoder CNN-residual + decoder FC + 재조정 모두 필요). user "파라미터 튜닝 금지" 원칙과 경계: encoder + decoder 구조 교체는 "방법론 변경"이므로 튜닝이 아님. 허용 범위.
  8. β 3~5h (decoder만 교체).
  9. γ 3~4h.
  10. δ 2~3h.

  11. 실패 재발 위험:

  12. α 저 (v6 precedent).
  13. β 중 (새 구조, 다만 Transformer는 시계열 24-step에 적합한 well-known 선택).
  14. γ 중상.
  15. δ 중.

선정: 방안 α (v6 R1b 1:1 복원) — primary, 방안 β (축소 Transformer) — fallback

선정 근거 (2~3줄): 1. user가 track-f의 목표를 "v6 R1b PAPE 38.40 수준 회복"으로 사실상 설정했으므로, v6 precedent가 있는 α 가 1순위. 다른 변형(β/γ/δ)은 PAPE 회복 가능성에 대한 empirical 증거가 없음. 2. 단, α는 encoder도 함께 복원해야 (compression_factor=4 + residual blocks, 156K params) — 단순 decoder 교체가 아님. workload가 β 대비 2h 추가. 3. 실패 시 fallback = β (축소 Transformer 2-layer) — α 실패 시 Transformer 계열 대안을 "파라미터 튜닝 금지" 위반 없이 실행 가능.

중요 제한 (정직): - α가 PAPE 38.40을 회복하지 못할 가능성 — v6 R1b는 5가구 + rounds=100 + best-round 23 에서 38.40을 달성. track-f smoke에서 2가구/10 rounds로는 재현 불가능. track-f.2 (5-seed) 통계에서 5가구/rounds 확장이 필요.

§5 신규 cell 제안

v7 CELL_REGISTRY 에 W1 (Wide-decoder) cell 신규 추가. 기존 cell (B0~V5) 는 backward-compat으로 행동 변경 금지. 즉 track-f의 decoder 교체는 W1 에만 적용되고 B0~V5 cell 실행 시에는 기존 Conv1d×2 decoder 유지.

ID 상태 설명 method use_vq use_dlinear peak_loss decoder_type (NEW 필드)
B0~V5 (기존 12종) 행동 불변 v7_conv (default, legacy)
W1 (신규) active peak-loss + VQ + DLinear + v6 FC-decoder + CNN-residual encoder proposed v6_fc
W2 (선택적, β fallback) optional peak-loss + VQ + DLinear + 축소 Transformer decoder + v7 encoder proposed tf2_128

decoder_type 필드는 CellSpec 신규 인자, default v7_conv (기존 행동 유지). B0~V5 기존 cell은 이 필드를 명시적으로 기입하지 않으므로 default로 작동. Backward-compat 유지.

W1 decoder / encoder 상세 spec

Decoder (α 방안):

from lib.models.decoder import XcodeYtimeDecoder   # src/FedUnit-64D1/lib/models/decoder.py:494

XcodeYtimeDecoder(
    d_in=embedding_dim,           # 64
    d_model=64, nhead=4, d_hid=256, nlayers=4,
    seq_in_len=24,                # = SEQ_LEN / compression_factor = 96/4
    seq_out_len=24,               # = PRED_LEN
    dropout=0.0,
    decoder_type='fc',
    compression_factor=4,
    num_residual_layers=2,
    num_residual_hiddens=64,
)

Encoder (α 방안 encoder 부분, 교체 필요):

from lib.models.Encoder_and_Retrieval import Encoder  # src/FedUnit-64D1/lib/models/Encoder_and_Retrieval.py

Encoder(
    in_channels=1, num_hiddens=128,
    num_residual_layers=2, num_residual_hiddens=64,
    embedding_dim=64, compression_factor=4,
    encoder_type='cnn', seq_len=96,
)

주의: v6 R1b encoder는 seq 96 → 24 로 compression 한다. v7 ProposedModel encoder는 same-length. W1에서 v6 encoder를 쓰면 VQ 입력이 [B, 24, 64]로 바뀌고 decoder 입력 seq_in_len=24도 맞춰야 한다 (v7 patch_proj가 96→24로 이미 reshape하므로 encoder만 교체해도 shape는 일관). Engineer가 ProposedModel.__init__에 decoder_type 분기 추가 시 이 일관성 확인 필수.

W2 decoder spec (β fallback)

class TransformerDecoderW2(nn.Module):
    def __init__(self, d_in=64, d_model=64, nhead=4, d_hid=128, nlayers=2, seq_len=24, pred_len=24):
        super().__init__()
        enc_layer = nn.TransformerEncoderLayer(
            d_model, nhead, dim_feedforward=d_hid,
            batch_first=True, dropout=0.0)
        self.tf = nn.TransformerEncoder(enc_layer, num_layers=nlayers)
        self.pos = nn.Parameter(torch.zeros(1, seq_len, d_model))
        self.out = nn.Linear(d_model * seq_len, pred_len)
    def forward(self, x):
        # x: [B, seq_len=24, d_model=64]
        x = x + self.pos
        x = self.tf(x)
        x = x.flatten(1)
        return self.out(x)  # [B, pred_len=24]
  • 105K params (d_hid=128) 또는 138K (d_hid=256). track-f.1에서는 d_hid=128 사용 (더 작음).

§6 Pre-registered 성공 기준 (revised — critic F4/F5/F6 반영)

진입 순서: track-f.0 파일럿 → track-f.1 병렬 smoke → track-f.2 5-seed → track-f.3 Stage 1

track-f.0 (신규, 파일럿 — critic F6)

  • Cells: W1, W2 (옵션 γ) — α/β 선택 시 하나만
  • Seeds: {42, 123, 456}
  • Households: Apt6, Apt88
  • Rounds: 10
  • Runs: 6 (≈ 30분)
  • 산출: gate 수치 empirical 기준
  • track-f.1 PAPE threshold = 파일럿 min ± 2pp
  • track-f.2 std gate = 파일럿 std × 1.5

track-f.1 (1-seed smoke, 병렬 W1+W2 — critic F4)

  • Hardware: RTX 5070 Ti, bfloat16.
  • Cells: W1 + W2 병렬
  • Seed: 42
  • Households: Apt6 + Apt88
  • Rounds: 10 유지 (critic F5 — 튜닝 경계 보호)
  • Success gate (pre-registered, placeholder 는 파일럿 후 확정):
  • PASS: W1 또는 W2 PAPE ≤ [파일럿 후 확정]
  • Stretch: PAPE ≤ 40 (v6 R1b 38.40 근접; aggregation 비복원으로 보장 없음)
  • FAIL: 양쪽 variant PAPE > 50 → 파라미터 튜닝 금지, §7 프로토콜
  • INCONCLUSIVE: [파일럿 후 확정] < PAPE ≤ 50 → 5가구 smoke 1회 (user 승인 필요)
  • rounds 확장 조건부 승인 (critic F5):
  • smoke 완료 후 loss curve 분석: epoch 8~10 감소율 > epoch 1~4 감소율의 50% → 미수렴, rounds=30 확장 승인 요청
  • 그렇지 않으면 track-f.2 도 rounds=10 유지

track-f.2 (5-seed 통계)

  • Cell: track-f.1 에서 PAPE 낮은 variant
  • Seeds: {42, 123, 456, 789, 2024}
  • Households: 5가구 (Apt6, Apt15, Apt30, Apt51, Apt88) — v6 R1b와 정렬
  • Rounds: [10 | 30] (track-f.1 수렴 판정 결과)
  • Success gate:
  • 평균 ≤ [파일럿 확정 기준선 43], std < [파일럿 std × 1.5], rel_decrease > 0 on ≥ 4/5 seeds
  • vs B0(52.3), A1(47.1) 모두 개선

track-f.3 (Stage 1 재진입)

  • Full 12 cell (B0~V5) + 선정 W variant × 5 seed 재실행
  • Gate 1~6 (v7 stage 0.5 체계) 전면 재통과

§7 실패 프로토콜

7.1 track-f.1 FAIL (양쪽 variant PAPE > 50, revised — critic F9)

  • 파라미터 튜닝 금지 (lr, batch_size, rounds 미세조정 금지).
  • 허용되는 옵션 (exp-expert 판단 + user 승인):
  • (a) v6 decoder 코드 import 불완전 — engineer 에게 XcodeYtimeDecoder 포팅 재검증 요구. 원본 src/FedUnit-64D1/lib/models/decoder.py 와 bit-exact test 추가. 추가로 RevIN biased std / loss_decode / DLinear differential LR 3 보강 구현 재검증.
  • (b) v6 aggregation 복원 확장 (신규, critic F9)cos_similarity + personalized memory + threshold=0.7 + gamma=0.95 까지 v6 1:1 복원. workload +2~4h. 이는 "구조적 방법론 확장"이며 하이퍼파라미터 튜닝 아님.
  • (c) track-f 자체 중단 + 이전 ADR-009 draft (Option d = shared linear adapter) 복귀 — 이 경우 새 ADR-010 필요 (A경로 실패 증거 포함).
  • 금지: peak_alpha, commitment_beta, EMA gamma, kmeans_warmup 등 하이퍼파라미터 탐색.

7.2 INCONCLUSIVE (45 < PAPE ≤ 50)

  • 이 구간에서 "A1 대비 개선 없음 but B0 대비 개선 있음" 이 해석 가능.
  • 허용: 5가구 확장 smoke 1회 (user 승인 필요). 이것은 "데이터셋 조건 확장"이며 파라미터 튜닝 아님.
  • 허용되지 않음: peak_alpha/rounds 등 조정.

7.3 track-f.2 FAIL (revised — critic F9)

  • 5-seed 통계에서 4/5 이상이 A1 수준이면 선정 variant 방안 기각.
  • 다음 의사결정은 user 몫:
  • (α) 다른 variant (W1 ↔ W2) 실행.
  • (β) v6 aggregation 복원 확장 (§7.1 b 옵션 — decoder 이미 교체됐으니 aggregation 추가 실험).
  • (γ) FL narrative 자체를 포기하고 KD 논문 축 유지 (paper_draft.md 노선 + ADR-010).

§8 Workload + Timeline

8.1 본 cycle (exp-expert plan, revised)

항목 시간
심층 분석 보고서 (본 문서) + cycle 2/2 revision 0.7h
ADR-009 rewrite (track-f 이름) + cycle 2/2 0.3h
track_f_decoder_swap.md design spec + cycle 2/2 0.4h
todos/track-f_decoder_swap.md + cycle 2/2 0.2h
Engineer contract + cycle 2/2 (F3 3 보강) 0.4h
메모리 업데이트 0.1h
소계 (본 cycle) ~2.1h

8.2 Engineer 실행 단계 (revised — critic F3 3 보강 반영)

항목 시간
ProposedModel 에 decoder_type, dlinear_lr_scale 인자 추가 (default backward-compat) 0.6h
v6_fc 분기 구현 (XcodeYtimeDecoder import + encoder 교체 + RevIN biased + tuple return) 2.5h
tf2_128 분기 구현 (Transformer + RevIN biased + tuple return) 1.2h
Training loop 수정 (loss_decode 추가, optimizer param group 분리) 0.8h
CELL_REGISTRY 에 W1, W2 추가 (dlinear_lr_scale=0.1) 0.3h
Unit tests (11개: 기본 7 + F3 보강 4) 2h
uv run pytest 통과 확인 + backward-compat shim 0.6h
소계 (engineer) ~8h (F3 보강으로 +2h 증가)

8.3 실험 실행 단계 (revised — critic F4/F5/F6 반영)

항목 시간
track-f.0 파일럿 (W1+W2 × 3 seed × Apt6+Apt88 × rounds=10) 30분
track-f.1 병렬 smoke (W1 + W2, 1 seed, rounds=10) ~20분 (10분 × 2 variant)
수렴 판정 + user rounds 승인 대기 (코드 아님)
track-f.2 5-seed (선정 variant × 5 seed × 5 가구, rounds=[10 or 30]) ~40분 (rounds=10) 또는 ~2h (rounds=30)
track-f.3 Stage 1 (13 cell × 5 seed × 5 가구) ~2h (rounds=10) 또는 ~3.5h (rounds=30)
소계 (실험) ~3h (rounds=10) 또는 ~6.5h (rounds=30)

8.4 Total (revised)

단계 시간 (rounds=10) 시간 (rounds=30)
exp-expert 계획 (본 cycle 2/2) 2.1h 2.1h
engineer 구현 (F3 보강 포함) 8h 8h
실험 실행 3h 6.5h
track-f 총계 ~13.1h ~16.6h

파일럿(+30분) + 병렬 smoke(+10분) + F3 3 보강(+2h) 반영 시 총 +3h 증가. rounds=30 확장은 smoke 수렴 판정 후 조건부 승인이므로 기본은 rounds=10 가정.

§9 v7/v8 에서 계승 사항

  • 단계 0 사전 등록: Golden tensor G1~G5, definition_hash 8be2bd2f691deed0, Apt_max_load=Apt88 — 그대로 유지.
  • v7_runner.py: CLI + CELL_REGISTRY 기존 12종 행동 불변. W1/W2 는 추가.
  • 공용 모듈: src/peak_analysis/v7/metrics.py — 변경 없음.
  • smoke infrastructure: v7_stage05_smoke_analysis.py + 6 Gates + rel_decrease — 변경 없음.
  • 155+ tests 전부 유지 + W1/W2 unit test 약 5개 추가.
  • 9-run smoke + V4/V5 MLflow 데이터: 실패 증거로 보존, 재실행 없음.
  • peak-aware loss (peak_weighted_smooth_l1, alpha=2.0): 변경 없음.
  • 5-seed set {42, 123, 456, 789, 2024}: 유지.

§10 폐기 사항

없음. 기존 cell (B0~V5) 와 기존 테스트는 모두 유지. 추가만 있음.

§11 v8 실패 분석의 관련 가설 vs track-f 검증

가설 증거 track-f에서의 취급
"decoder capacity 붕괴가 지배적 원인" v7 25K vs v6 957K (38.6×) track-f가 직접 검증 — W1에서 decoder+encoder 복원
"VQ는 거의 무시된 통신 채널 (util 4%)" v6 R1b util 4.06%, V5 util 86% but PAPE 53.32 track-f에서 VQ 유지하되 performance 지표는 decoder 교체 효과로 해석
"v6 decoder = Transformer" 틀림. 실제 FC-MLP 본 분석에서 정정 — 이전 메모리는 업데이트 필요
"Option d (shared linear adapter) 가 최선" ADR-009 draft user가 A경로로 선회 — ADR-009 rewrite

§12 한계 및 자기 검증 (critic cycle 1/2 CONDITIONAL APPROVE 지적 해소 내역)

  1. critic F1 — user 결정 pending 5건 명시 (revised)
  2. design spec / TODO / engineer contract / analysis 4 문서 상단에 pending 결정 5건 frontmatter 삽입 완료.
  3. 5건: (D1) decoder 구조 α/β/γ, (D2) aggregation 복원 범위, (D3) rounds 조건부, (D4) gate placeholder, (D5) gray-zone 정책.

  4. critic F3 — W1 forward pass 3 누락 보강 (revised)

  5. (1) RevIN biased std: var(unbiased=False).sqrt() 로 PyTorch default 와 차이 제거. test_w1_revin_biased_std 로 검증.
  6. (2) loss_decode aux: decoder forward 가 (y, y_decode_intermediate) tuple 반환. training loss 에 loss_decode = smooth_l1(intermediate, target_norm) 추가.
  7. (3) DLinear differential LR: CellSpec dlinear_lr_scale=0.1 (W1/W2) 로 optimizer param group 분리.

  8. critic F4 — primary/fallback → 병렬 실행 (revised)

  9. 이전 "W1 primary / W2 fallback" 순차 프레이밍 폐기. W1+W2 병렬 실행 (옵션 γ) 을 기본 경로로 승격. track-f.0 파일럿 및 track-f.1 smoke 에서 양자 동시 실행 → PAPE 낮은 variant 선정.
  10. user 지시 "Transformer 교체" 원문 존중 + v6 FC-MLP precedent 양립.

  11. critic F5 — rounds=30 조건부 승인 (revised)

  12. track-f.1 smoke 는 rounds=10 유지 (튜닝 경계 보호).
  13. smoke 후 loss curve 분석: epoch 8~10 감소율 > epoch 1~4 감소율의 50% → 미수렴, rounds=30 확장 승인 요청.

  14. critic F6 — Gate 수치 파일럿 기반 재설정 (revised)

  15. track-f.0 신규 파일럿 단계 (W1+W2 × seed {42,123,456} × Apt6+Apt88 × rounds=10, ~30분) 추가.
  16. 파일럿 결과로 track-f.1 PAPE threshold = min ± 2pp, track-f.2 std gate = std × 1.5 확정.
  17. 현재 gate 수치는 placeholder [파일럿 후 확정].

  18. critic F9 — FL aggregation 전략 차이 명시 (revised)

  19. v6 R1b 는 cos_similarity + personalized memory + threshold=0.7 + gamma=0.95, v7 는 FedAvg 를 명시화.
  20. "v6 1:1 복원" → "v6 decoder capacity 복원 실험 (aggregation 은 교란 요인 disclosure)" 로 주장 강도 downgrade.
  21. W1 실패 시 (b) v6 aggregation 복원 확장 옵션 제공 (workload +2~4h).

  22. 유효 유지 (critic 지적 없음 또는 강점으로 인정)

  23. F2: FC-MLP 956,696 params 수치 유지
  24. F7: naming 관행 유지
  25. F10: gray-zone 프로토콜 (PAPE 45~50 → 5가구 확장) 유지
  26. Backward-compat (decoder_type="v7_conv" default) 유지
  27. 실패 프로토콜 3단 구조 유지

  28. 경계 사례 주의 (critic 사전 대비)

  29. (a) W1 vs A3 baseline 일관성: seed/rounds/peak_alpha 등 다른 변수 고정 시 decoder 교체 단독 효과 측정 가능.
  30. (b) rounds=30 확장의 튜닝 경계: smoke 수렴 판정 후 user 승인 절차로 완화 (critic F5 해소).
  31. (c) 5가구 확장 smoke: 데이터셋 조건 보강 (튜닝 아님), user 승인 절차 존재.

§13 결론 요약 (revised, 1~2문장 + aggregation 정정)

track-f A경로는 v7 Conv1d×2 decoder (25K) 를 v6 R1b FC-MLP decoder + CNN-residual encoder (957K, 전역 RF) 로 교체하는 것이며, 단 v6 R1b 의 cos_similarity + personalized memory aggregation 은 비복원 교란 요인 으로 disclosure (v7 FedAvg 유지). Decoder capacity 격차 실측은 38.6× 이고 decoder 단독 교체의 PAPE 38.40 재현은 empirical 검증 사항이며 보장되지 않음. 병렬 W1 (FC) + W2 (Transformer) 를 track-f.0 파일럿 (gate 수치 확정) 후 1-seed smoke 에서 동시 수행 → 낮은 쪽 선정. 실패 시: (a) 포팅 검증, (b) v6 aggregation 복원 확장 (+2~4h, 튜닝 아닌 방법론 확장), (c) Option d rollback (새 ADR-010).


§14 산출물 경로

  • 본 보고서: report/version8/exp-expert/track_f_decoder_analysis.md (현재 파일)
  • ADR: docs/decisions/ADR-009_v8_to_track_f_decoder_swap.md (rewritten)
  • 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
  • 메모리: .claude/agent-memory/exp-expert/track_f_decoder_plan.md

§15 근거 소스 경로

  • v6 R1b decoder type: experiments/federated/v6_0415_fedpm_original.py:126 (args.decoder_type = "fc")
  • v6 R1b FC decoder 본체: src/FedUnit-64D1/lib/models/decoder.py:447-491 (FCDecoderBackbone)
  • v7 ProposedModel decoder: experiments/federated/v7_runner.py:735-742
  • v6 FL aggregation 대상 (PMR only): experiments/federated/v6_0415_fedpm_original.py:735, 728
  • v7 FL aggregation 대상 (VQ only): experiments/federated/v7_runner.py:1615-1622
  • v6 R1b MLflow run: mlruns/628304840000878755/5e0409718fd347d085190264e43d4284 (PAPE 38.3965, util 4.06%)
  • v8 V4/V5 MLflow runs: mlruns/488793251950638315/{2fab575c...,584cc9a6...}