Source:
report/version8/exp-expert/track_f_decoder_analysis.mdUser 결정 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:735 — server.aggregate(client_updates, ...) 에서 client_updates는 line 728의 updated_memory = PMR state only.
- v7: experiments/federated/v7_runner.py:1608, 1615-1622 — local_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:789 — y_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 한계) |
선정 기준별 평가¶
- PAPE 회복 가능성 (primary):
- α 최선 (v6 precedent 직접). 그러나 주의: v6 R1b는 5가구 × rounds=100 + 원본 dataloader + peak_weighted_smooth_l1 설정 등 수많은 조건부로 PAPE 38.40 달성. track-f는 2가구/5가구 × 제한 라운드로 smoke 진행 예정 — α라도 38.40 재현 보장은 없음.
- β 중간. Transformer encoder 2-layer의 self-attention이 FC-MLP와 동급 "전역 RF" 제공, capacity 은 상대적으로 작음 (138K < 957K).
- γ sequential capacity는 있으나 LSTM이 시계열 24-step 예측에서 Transformer/MLP 대비 열세라는 일반 결과.
-
δ capacity 최소 — 45~50 구간.
-
Workload (secondary, ≤6h 선호):
- α 5~7h (encoder CNN-residual + decoder FC + 재조정 모두 필요). user "파라미터 튜닝 금지" 원칙과 경계: encoder + decoder 구조 교체는 "방법론 변경"이므로 튜닝이 아님. 허용 범위.
- β 3~5h (decoder만 교체).
- γ 3~4h.
-
δ 2~3h.
-
실패 재발 위험:
- α 저 (v6 precedent).
- β 중 (새 구조, 다만 Transformer는 시계열 24-step에 적합한 well-known 선택).
- γ 중상.
- δ 중.
선정: 방안 α (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 지적 해소 내역)¶
- critic F1 — user 결정 pending 5건 명시 (revised)
- design spec / TODO / engineer contract / analysis 4 문서 상단에 pending 결정 5건 frontmatter 삽입 완료.
-
5건: (D1) decoder 구조 α/β/γ, (D2) aggregation 복원 범위, (D3) rounds 조건부, (D4) gate placeholder, (D5) gray-zone 정책.
-
critic F3 — W1 forward pass 3 누락 보강 (revised)
- (1) RevIN biased std:
var(unbiased=False).sqrt()로 PyTorch default 와 차이 제거. test_w1_revin_biased_std 로 검증. - (2) loss_decode aux: decoder forward 가
(y, y_decode_intermediate)tuple 반환. training loss 에loss_decode = smooth_l1(intermediate, target_norm)추가. -
(3) DLinear differential LR: CellSpec
dlinear_lr_scale=0.1(W1/W2) 로 optimizer param group 분리. -
critic F4 — primary/fallback → 병렬 실행 (revised)
- 이전 "W1 primary / W2 fallback" 순차 프레이밍 폐기. W1+W2 병렬 실행 (옵션 γ) 을 기본 경로로 승격. track-f.0 파일럿 및 track-f.1 smoke 에서 양자 동시 실행 → PAPE 낮은 variant 선정.
-
user 지시 "Transformer 교체" 원문 존중 + v6 FC-MLP precedent 양립.
-
critic F5 — rounds=30 조건부 승인 (revised)
- track-f.1 smoke 는 rounds=10 유지 (튜닝 경계 보호).
-
smoke 후 loss curve 분석: epoch 8~10 감소율 > epoch 1~4 감소율의 50% → 미수렴, rounds=30 확장 승인 요청.
-
critic F6 — Gate 수치 파일럿 기반 재설정 (revised)
- track-f.0 신규 파일럿 단계 (W1+W2 × seed {42,123,456} × Apt6+Apt88 × rounds=10, ~30분) 추가.
- 파일럿 결과로 track-f.1 PAPE threshold = min ± 2pp, track-f.2 std gate = std × 1.5 확정.
-
현재 gate 수치는 placeholder
[파일럿 후 확정]. -
critic F9 — FL aggregation 전략 차이 명시 (revised)
- v6 R1b 는
cos_similarity + personalized memory + threshold=0.7 + gamma=0.95, v7 는 FedAvg 를 명시화. - "v6 1:1 복원" → "v6 decoder capacity 복원 실험 (aggregation 은 교란 요인 disclosure)" 로 주장 강도 downgrade.
-
W1 실패 시 (b) v6 aggregation 복원 확장 옵션 제공 (workload +2~4h).
-
유효 유지 (critic 지적 없음 또는 강점으로 인정)
- F2: FC-MLP 956,696 params 수치 유지
- F7: naming 관행 유지
- F10: gray-zone 프로토콜 (PAPE 45~50 → 5가구 확장) 유지
- Backward-compat (
decoder_type="v7_conv"default) 유지 -
실패 프로토콜 3단 구조 유지
-
경계 사례 주의 (critic 사전 대비)
- (a) W1 vs A3 baseline 일관성: seed/rounds/peak_alpha 등 다른 변수 고정 시 decoder 교체 단독 효과 측정 가능.
- (b) rounds=30 확장의 튜닝 경계: smoke 수렴 판정 후 user 승인 절차로 완화 (critic F5 해소).
- (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...}