# v11 Architecture - Quick Start Guide ## What is v11? The v11 series represents a major architectural enhancement addressing the classification accuracy plateau at ~51% in the Spatial-BEATs model. It introduces: 1. **SpatialDeltaPatchAdapterV2**: Enhanced front-end spatial encoder (17.4M params) 2. **SpatialAdapterLayer**: In-trunk spatial conditioning (1.2M params total) 3. **Multiple routing options**: Route A/B (track-based) or Route C (ACCDOA class-based) --- ## Four v11 Variants ### 1. v11_phase1_cls - Phase 1 Classification Refinement **Use this first** to diagnose if the new adapter improves classification accuracy. **What it does:** - Enables SpatialDeltaPatchAdapterV2 only - Freezes direction/distance heads - Trains classification + num_active heads - Hot-starts from v10 phase-1 best checkpoint **Command:** ```bash ./run_ov1_v11_phase1_cls.sh ``` **Environment variables:** ```bash SPATIAL_EPOCHS=10 # Default: 10 epochs SPATIAL_LR=7.5e-6 # Default: 7.5e-6 BATCH_SIZE=8 # Default: 8 GPUS=8 # Default: 8 ``` **Expected output:** ``` Epoch 1: cls_acc=0.720 (should be at least v10 level) Epoch 5: cls_acc=0.755 (expect improvement trend) Epoch 10: cls_acc=0.78+ (best of phase-1) ``` **What to look for:** - Does cls_acc improve beyond v10 phase-1 peak (0.78)? - How quickly does it converge? - Does val_loss plateau or continue improving? --- ### 2. v11a_ov123_top4 - Route B + Spatial Demixer (Full Architecture) **Use after v11_phase1_cls confirms improvement.** **What it does:** - Enables SpatialDeltaPatchAdapterV2 + trunk adapters + spatial_head_demixer - Trains all heads (activity, class, direction, distance) - Uses demixer for both class AND spatial heads - Hot-starts from v9 ov123_top4 best checkpoint **Command:** ```bash ./run_ov1_v11a_ov123_top4.sh ``` **Key metrics:** - `azi_mae_deg`: Azimuth mean absolute error (primary DOA metric) - `class_acc`: Matched-source class accuracy - `activity_f1`: Source presence F1-score **Expected improvement:** ``` Metric v9 Baseline v11a Target Expected Delta ──────────────────────────────────────────────────────────────────── azi_mae_deg (train) 10° 8-9° -1 to -2° azi_mae_deg (val) 30° 24-26° -4 to -6° class_acc (val) 73% 75%+ +2% ``` **What to look for:** - Validation azimuth error should be significantly lower - Train/val gap should narrow (from ~20° toward ~15°) - No collapse in accuracy metrics --- ### 3. v11b_ov123_top4 - Route B + LocalSpatial Demixer KV **Use for comparison with v11a.** **What it does:** - Same as v11a, BUT - Demixer attends to LocalSpatial's 7-channel pre-pool (FOA + IV) - Instead of BEATs mono mel-filterbank features - Hypothesis: Spatial features better for DOA decomposition **Command:** ```bash ./run_ov1_v11b_ov123_top4.sh ``` **Comparison with v11a:** ``` Aspect v11a (BEATs KV) v11b (LocalSpatial KV) ───────────────────────────────────────────────────────────────── Demixer KV source BEATs trunk LocalSpatial pre-pool Channels 1 (mono fbank) 7 (4 FOA + 3 IV) Prior knowledge Semantic Spatial physics Expected advantage Better for class Better for direction Computational cost Lower Higher ``` **When to pick v11b over v11a:** - If DOA error (azi_mae_deg) is more important than class accuracy - If you have GPU budget for extra feature processing - For acoustic scenes where spatial features matter more --- ### 4. v11c_ov123_accdoa - Paradigm Shift to ACCDOA (Route C) **Use as a "simplicity first" baseline.** **What it does:** - Enables SpatialDeltaPatchAdapterV2 + trunk adapters - Replaces query decoder + Hungarian matching with per-class ACCDOA heads - Each class gets its own spatial slot (no matching needed) - Activity encoded in vector magnitude, direction in unit vector **Command:** ```bash ./run_ov1_v11c_ov123_accdoa.sh ``` **Key differences from v11a:** ``` Aspect v11a (Route B, Track) v11c (Route C, ACCDOA) ───────────────────────────────────────────────────────────────────── Paradigm K learnable tracks Per-class slots Matching Hungarian (clip-level) None (inherent per-class) Activity loss Binary cross-entropy MSE on magnitude Direction repr. L2 normalized vector Unit vector (normalized) Scalability O(K×T_s) per-frame O(num_classes×T_s) ov2/ov3 fit Good (overlap ambiguity) Better (same-class=0) ``` **When to pick v11c:** - For DCASE evaluation (uses official SELD metrics) - If Hungarian matching is a bottleneck - For datasets with no overlapping same-class sources (ov2/ov3 constraints) - For interpretability (each class = one direction) --- ## Decision Tree: Which v11 to Run? ``` START │ ├─→ "Do I want to diagnose if new adapters help classification?" │ └─→ YES: Run v11_phase1_cls │ ↓ (wait for results) │ Does cls_acc improve? │ ├─→ YES ✓ │ │ └─→ Proceed to multi-head experiments │ └─→ NO ✗ │ └─→ Back to drawing board (architecture issue) │ ├─→ "Is direction-of-arrival (DOA) error my primary concern?" │ ├─→ YES: Need DOA focus │ │ ├─→ "Do I have GPU budget for LocalSpatial features?" │ │ │ ├─→ YES: Run v11b_ov123_top4 │ │ │ └─→ NO: Run v11a_ov123_top4 │ └─→ NO: Skip v11a/v11b │ └─→ "Am I targeting DCASE evaluation / ov2/ov3 constraints?" ├─→ YES: Run v11c_ov123_accdoa └─→ NO: Run v11a_ov123_top4 (default full-featured) ``` --- ## Monitoring Experiments ### Key Metrics to Track **Classification**: - `class_acc`: Top-1 accuracy on matched sources - `class_precision`: Per-class precision - `class_recall`: Per-class recall **Direction (DOA)**: - `azi_mae_deg`: **Primary metric** - azimuth mean absolute error - `ele_mae_deg`: Elevation mean absolute error - `azi_std_deg`: Azimuth error standard deviation **Distance**: - `dist_mae_m`: Distance mean absolute error **Activity**: - `activity_f1`: Source presence F1-score - `num_active_mae`: Mean absolute error in source count **Gap Analysis**: - `train_azi_mae_deg`: Training set azimuth error - `val_azi_mae_deg`: Validation set azimuth error - `gap = val - train`: **Gap should decrease with v11** ### TensorBoard Visualization ```bash tensorboard --logdir=checkpoints/spatial_beats_v11_phase1_cls_exp/ov123_top4 --port=6006 ``` **Plots to monitor:** - `metrics/val_azi_mae_deg`: Should decrease smoothly - `metrics/train_azi_mae_deg`: Should decrease with training - `loss/total`: Should follow training dynamics (may oscillate) - `loss/frame_direction`: DOA-specific loss component --- ## Checkpoint Management ### Hot-Start Strategy Each v11 variant is designed to hot-start from a previous checkpoint: **v11_phase1_cls**: ``` Loads from: v10_phase1_cls best.pt Missing params: V2 adapter + trunk adapters Initialize with: Zero-init adapters (identity at epoch-0) Benefit: Inherits v10's frozen classification features ``` **v11a_ov123_top4**: ``` Loads from: v9_ov123_top4 best.pt Missing params: V2 + trunk adapters + spatial_demixer (added to heads) Initialize with: Zero-init everything (identity at epoch-0) Benefit: Inherits v9's proven multi-head balance ``` **v11b_ov123_top4**: ``` Same as v11a, but adds LocalSpatial pre-pool processing ``` **v11c_ov123_accdoa**: ``` Loads from: ov1_local_spatial baseline (v9 incompatible) Missing params: ACCDOAHeads (entire head replacement) Initialize with: Zero-init (no class/spatial heads to inherit) Benefit: Simpler routing = faster convergence ``` ### How to Load a Checkpoint Manually ```python import torch from train_spatial_beats import make_ov1_local_spatial_v11a_ov123_top4_config from spatial_beats import SpatialBEATs # Create model with v11a config cfg = make_ov1_local_spatial_v11a_ov123_top4_config() model = SpatialBEATs(cfg) # Load v9 checkpoint (strict=False ignores new params) ckpt = torch.load('checkpoints/.../v9_best.pt') model.load_state_dict(ckpt['model'], strict=False) # New params are zero-initialized (identity behavior) # Ready to train! model.train() ``` --- ## Troubleshooting ### Issue: "CUDA out of memory" **Solution**: Reduce batch size or sequence length ```bash BATCH_SIZE=4 ./run_ov1_v11a_ov123_top4.sh ``` ### Issue: "ClassHeadSpectralDemixer not initialized" **Solution**: Ensure config enables it: ```python cfg.use_class_head_demixer = True # For v11a cfg.use_spatial_head_demixer = True # For v11a (added in v11) ``` ### Issue: "Large train/val gap not shrinking" **Diagnosis steps**: 1. Check if Dropout is OFF during evaluation 2. Verify SpecAugment is applied only during training 3. Run diagnostic: evaluate same checkpoint in train/eval modes ```bash python -c " model.eval() val_error_no_dropout = evaluate(model, val_loader) model.train() val_error_with_dropout = evaluate(model, val_loader) print(f'Dropout effect: {val_error_with_dropout - val_error_no_dropout:.1f}°') " ``` ### Issue: "Trunk adapters not being applied" **Check**: Verify config flag is True ```python if not cfg.use_trunk_spatial_adapters: print("WARNING: Trunk adapters disabled!") cfg.use_trunk_spatial_adapters = True ``` --- ## Next Steps After v11 Experiments 1. **Analyze results** (docs/V11_IMPLEMENTATION_SUMMARY.md contains diagnostic templates) 2. **Pick best variant** based on your primary metric 3. **Fine-tune hyperparameters** (learning rate, dropout rate if you modify later) 4. **Run official evaluation** on test set using DCASE metrics 5. **Consider multi-stage training**: - Stage 1: Classification only (v11_phase1_cls) - Stage 2: Full pipeline (v11a/b/c) - Stage 3: Fine-tuning (reduce LR, increase epochs) --- ## Citation & References This architecture is built on: - **BEATs** (Microsoft): Base semantic encoder (https://arxiv.org/abs/2212.09058) - **DCASE SELD**: Official evaluation metrics (https://github.com/sharathadavanne/seld-dcase2023) - **EINV2 paradigm**: Track-based source modeling - **Spatial audio physics**: FOA (First-Order Ambisonics) + Intensity Vectors For detailed technical justification, see: - docs/V11_IMPLEMENTATION_SUMMARY.md - docs/doa_train_valid_gap_analysis.md - SPATIAL_AUDIO_FRAMEWORKS_ANALYSIS_COMPREHENSIVE.md