| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| β 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 |
|
|
|
|