Spatial-BEATs / docs /train_valid_gap_diagram.txt
dieKarotte's picture
Add files using upload-large-folder tool
dd39446 verified
Raw
History Blame Contribute Delete
16.4 kB
╔═══════════════════════════════════════════════════════════════════════════════════════════════╗
β•‘ SPATIAL-BEATS TRAINING VS VALIDATION DATA FLOW β•‘
β•‘ (SHOWING THE ROOT CAUSES OF DOA GAP) β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
TRAINING PATH (epoch T) VALIDATION PATH (epoch T)
════════════════════════════════════════════════════════════════════════════════════════════════
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ FOA Waveform [4, T] β”‚ β”‚ FOA Waveform [4, T] β”‚
β”‚ (W, X, Y, Z channels) β”‚ β”‚ (W, X, Y, Z channels) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β–Ό ─────────────────────────────────────────► β–Ό
╔══════════════════════╗ ╔═══════════════════╗
β”‚ PREPROCESSING β”‚ β”‚ PREPROCESSING β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β€’ Normalize (same) β”‚ β”‚ β€’ Normalize (same)β”‚
β”‚ β€’ Mel filterbank (OK)β”‚ β”‚ β€’ Mel filterbank β”‚
β”‚ β€’ FOA features (OK) β”‚ β”‚ (OK) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
⚠️ ISSUE #1 β—„β”€β”€β”˜β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ⚠️ ISSUE #1
SpecAugment: SpecAugment:
β”œβ”€ freq_masks=2Γ—27 β”œβ”€ NO MASKING
β”œβ”€ time_masks=2Γ—100 β”œβ”€ w_logmel unchanged
└─ Applied to W channel └─ Returns w_logmel as-is
Result: ~20-50% of spec erased Result: Full pristine spectrum
β”‚ β”‚
β–Ό ─────────────────────────────────────────► β–Ό
╔══════════════════════╗ ╔═══════════════════╗
β”‚ ENCODER (Frozen) β”‚ β”‚ ENCODER (Eval) β”‚
β”‚ β€’ BEATs backbone β”‚ β”‚ β€’ BEATs backbone β”‚
β”‚ β€’ SpatialFuser β”‚ β”‚ β€’ SpatialFuser β”‚
β”‚ β€’ LocalSpatialEnc β”‚ β”‚ β€’ LocalSpatialEnc β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
[B, T_s, D] [B, T_s, D]
β”‚ β”‚
β–Ό β–Ό
╔══════════════════════╗ ╔═══════════════════╗
β”‚ PREDICTION HEADS β”‚ β”‚ PREDICTION HEADS β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ activity_head β”‚ β”‚ activity_head β”‚
β”‚ class_head β”‚ β”‚ class_head β”‚
β”‚ direction_head β”‚ β”‚ direction_head β”‚
β”‚ distance_head β”‚ β”‚ distance_head β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”‚ pred_activity [B, T_s, K] β”‚
β”‚ pred_class [B, T_s, K, C] β”‚
β”‚ pred_dir [B, T_s, K, 3] β”‚ (STALE in v10p1)
β”‚ pred_dist [B, T_s, K] β”‚
β”‚ β”‚
β–Ό β–Ό
╔══════════════════════╗ ╔═══════════════════╗
β”‚ HUNGARIAN MATCHING β”‚ β”‚ HUNGARIAN MATCHINGβ”‚
β”‚ (per-frame) β”‚ β”‚ (per-frame) β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ For each (b, t): β”‚ β”‚ For each (b, t): β”‚
β”‚ cost = act_cost + β”‚ β”‚ cost = act_cost +β”‚
β”‚ cls_nll + β”‚ β”‚ cls_nll + β”‚
β”‚ dir_cost + β”‚ β”‚ dir_cost +β”‚
β”‚ dist_cost β”‚ β”‚ dist_cost β”‚
β”‚ β”‚ β”‚ β”‚
⚠️ β”‚ ISSUE #4: Fixed cost β”‚ ────────────────── β”‚ ISSUE #4: But β”‚
β”‚ weights (1.0 each) β”‚ (v10p1: matches β”‚ loss uses lambda β”‚
β”‚ but loss uses β”‚ on stale DOA) β”‚ weights (0.0) β”‚
β”‚ variable lambda β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
matched_slot matched_slot
[B, N_gt, T_s] [B, N_gt, T_s]
β”‚ β”‚
β–Ό β–Ό
╔══════════════════════╗ ╔═══════════════════╗
β”‚ LOSS COMPUTATION β”‚ β”‚ METRICS COMPUTATION
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ loss_activity Γ— β”‚ β”‚ For matched pairs: β”‚
β”‚ Ξ»_frame_activity β”‚ β”‚ pred_azi_deg β”‚
β”‚ loss_class Γ— β”‚ β”‚ pred_ele_deg β”‚
β”‚ Ξ»_frame_class β”‚ β”‚ tgt_azi_deg β”‚
β”‚ loss_direction Γ— ◄─ v10p1: 0.0 β”‚ tgt_ele_deg β”‚
β”‚ Ξ»_frame_direction β”‚ β”‚ β”‚
β”‚ loss_distance Γ— ◄─ v10p1: 0.0 β”‚ azi_mae = MAE β”‚
β”‚ Ξ»_frame_distance β”‚ β”‚ ele_mae = MAE β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
⚠️ ISSUE #2 β”‚ v9: Full training β”‚
────────────► β”‚ v10 phase-1: FROZEN dir/dist head β”‚
β”‚ no gradients! β”‚
β”‚ β”‚
β–Ό β–Ό
loss_total azi_mae, ele_mae
(backprop) (forward only)
KEY ASYMMETRIES CAUSING TRAIN/VALID GAP
════════════════════════════════════════════════════════════════════════════════════════════════
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Aspect β”‚ Training β”‚ Validation β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ SpecAugment β”‚ Masking 45% of spectrum β”‚ NO masking β”‚
β”‚ β”‚ β†’ιŸ³ι’‘η‰Ήζ€§δΈεŒ β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Spatial Augmentation (Rotation) β”‚ NONE β”‚ NONE β”‚
β”‚ β”‚ β†’ DOA diversity limited β”‚ β†’ Unseen β”‚
β”‚ β”‚ to ~1 epoch β”‚ angles β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Direction Head State (v10p1) β”‚ FROZEN (no gradients) β”‚ FROZEN + β”‚
β”‚ β”‚ Ξ»=0.0 (no loss signal) β”‚ STALE (from β”‚
β”‚ β”‚ β”‚ v9 epoch 3)β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Matching Cost Weights β”‚ Unweighted sum β”‚ Same unweighted
β”‚ β”‚ act + cls + dir + dist β”‚ sum, but on β”‚
β”‚ β”‚ (but loss uses lambda) β”‚ frozen DOA β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Gradient Flow β”‚ Through loss (v9) or β”‚ Validation β”‚
β”‚ β”‚ None (v10p1) β”‚ mode: no β”‚
β”‚ β”‚ β”‚ gradients β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
IMPACT CASCADE (Most Severe Scenario: ov3, v10 Phase-1)
════════════════════════════════════════════════════════════════════════════════════════════════
1. Training sees only ~single orientation per azimuth per epoch
No rotation aug β†’ limited DOA diversity
β”œβ”€β†’ Model sees: (azi=0Β°, ele=0Β°), (azi=1Β°, ele=1Β°), ...
└─→ Model learns: limited generalization to unseen angles
2. Direction head frozen at v10 phase-1 start
Ξ»_frame_direction = 0.0 β†’ no training signal
freeze_frame_track_spatial_heads = True β†’ no gradients
β”œβ”€β†’ Head receives: ZERO gradients from loss
β”œβ”€β†’ Head receives: ZERO gradients from backward pass
└─→ Result: Output completely stale (from v9 epoch 3)
3. At validation: direction head outputs used to compute metrics
But outputs are unchanged from 10 epochs ago
And model hasn't learned ov2/ov3 multi-source DOA at all
β”œβ”€β†’ Validation sees: unseen azimuth combos (not in training)
β”œβ”€β†’ Validation sees: multi-source situations unfamiliar to frozen head
└─→ Result: 20-30Β° azimuth errors
4. SpecAugment makes training acoustic features different
Masking 45% of W channel during training
Zero masking at validation
└─→ Result: +2-5Β° additional error on top
FIX #1: Add Rotation Augmentation
════════════════════════════════════════════════════════════════════════════════════════════════
Current (BROKEN):
FOA [W, X, Y, Z] β†’ (no change) β†’ Encoder β†’ DOA predictor
Fixed (CORRECT):
FOA [W, X, Y, Z] β†’ Rotate(ΞΈ, Ο†, ψ) β†’ [W', X', Y', Z']
β†’ Encoder β†’ DOA predictor
Labels: (azi, ele, dist) β†’ Rotate_targets(ΞΈ, Ο†, ψ) β†’ (azi', ele', dist)
Result: Same class, different DOA β†’ model learns generalization
FIX #2: Make SpecAugment Train/Val Consistent
════════════════════════════════════════════════════════════════════════════════════════════════
Current (BROKEN):
Training: if self.training: apply_masking() βœ“
Validation: if not self.training: skip_masking() βœ— (mismatch!)
Fixed (OPTION A):
Training: No masking (simplified, possibly less robust)
Validation: No masking (consistent)
Fixed (OPTION B):
Training: apply_masking() βœ“
Validation: apply_same_masking_with_fixed_seed() βœ“ (consistent)
FIX #3: Don't Fully Freeze Direction Head (v10)
════════════════════════════════════════════════════════════════════════════════════════════════
Current v10 (BROKEN):
Ξ»_frame_direction = 0.0
freeze_frame_track_spatial_heads = True
β†’ Head receives zero signal for 10 epochs
Fixed (BETTER):
Ξ»_frame_direction = 0.1 (not zero!)
freeze_frame_track_spatial_heads = False
β†’ Head receives weak signal to fine-tune on multi-source
β†’ Prevents complete staleness at v10 unfreezing