BREAKING CHANGES: - Removed orphaned dqn.rs monolithic trainer (4,975 lines) - Removed orphaned dqn_ensemble.rs module (816 lines) - Removed orphaned tft.rs and tft_complete_int8_integration_test.rs - TFT trainer split into modular directory structure DQN Module Refactoring: - Split trainers/dqn.rs into modular structure (config.rs, statistics.rs, trainer.rs) - Fixed hyperopt 39D search space (continuous params only) - Boolean flags (use_dueling, use_double_dqn, use_per, use_noisy_nets) are now FIXED architectural decisions - use_distributional defaults to false (Candle BUG #36 - scatter_add gradient issues) Clean Module Structure: - ml/src/trainers/dqn/ directory with proper mod.rs exports - ml/src/trainers/tft/ directory with config.rs, types.rs, model.rs, trainer.rs, tests.rs - All P0 features validated: TD-error clamping, batch diversity, LR scheduler, priority staleness Documentation: - Added comprehensive docs in docs/codebase-cleanup/ - ADR-001 for DQN refactoring decisions - Rainbow DQN component matrix and quick reference guides Build Status: Compiles with zero errors 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
142 lines
8.0 KiB
Plaintext
142 lines
8.0 KiB
Plaintext
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
WAVE 26 P1.2: MULTI-HEAD SELF-ATTENTION - QUICK REFERENCE
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
📦 NEW FILES
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ml/src/dqn/attention.rs 580 lines, 8 tests
|
||
|
||
📝 MODIFIED FILES
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ml/src/dqn/mod.rs +2 lines (L10, L62)
|
||
|
||
🎯 IMPLEMENTATION HIGHLIGHTS
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
✅ Multi-head self-attention for temporal patterns
|
||
✅ Scaled dot-product: Attention(Q,K,V) = softmax(QK^T/√dk)V
|
||
✅ Optional causal/padding masks
|
||
✅ Xavier initialization (all layers)
|
||
✅ Optional layer normalization
|
||
✅ Optional residual connections
|
||
✅ Full GPU acceleration (CUDA)
|
||
✅ 8 comprehensive TDD tests
|
||
|
||
🔧 USAGE EXAMPLE
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
use ml::dqn::{MultiHeadAttention, MultiHeadAttentionConfig};
|
||
|
||
// Create config (embed_dim divisible by num_heads)
|
||
let config = MultiHeadAttentionConfig::new(64, 4)?;
|
||
|
||
// Initialize layer
|
||
let attn = MultiHeadAttention::new(config, &vb, &device)?;
|
||
|
||
// Forward pass: (batch, seq_len, embed_dim)
|
||
let output = attn.forward(&input, None)?;
|
||
|
||
// With causal mask
|
||
let mask = create_causal_mask(seq_len, &device)?;
|
||
let output = attn.forward(&input, Some(&mask))?;
|
||
|
||
⚙️ CONFIGURATION OPTIONS
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
embed_dim 64 Embedding dimension (divisible by num_heads)
|
||
num_heads 4 Number of attention heads
|
||
dropout 0.1 Dropout probability
|
||
use_layer_norm true Enable layer normalization
|
||
layer_norm_eps 1e-5 LayerNorm epsilon
|
||
use_residual true Enable residual connections
|
||
|
||
head_dim = embed_dim / num_heads = 64 / 4 = 16
|
||
|
||
🧪 TDD TEST COVERAGE (8 TESTS)
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
✅ test_config_validation Config validation (embed_dim % num_heads)
|
||
✅ test_default_config Default values
|
||
✅ test_attention_creation Layer instantiation
|
||
✅ test_forward_pass_shape Output shape (2,8,64) → (2,8,64)
|
||
✅ test_forward_with_mask Causal mask application
|
||
✅ test_dimension_mismatch Error handling
|
||
✅ test_residual_connection Residual connections
|
||
✅ test_multiple_heads 1,2,4,8 heads
|
||
|
||
🏗️ ARCHITECTURE DIAGRAM
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
Input (batch, seq_len, embed_dim)
|
||
|
|
||
├─> Query (WQ) ─┐
|
||
├─> Key (WK) ───┤
|
||
└─> Value (WV) ─┴─> Scaled Dot-Product Attention
|
||
|
|
||
v
|
||
Multi-Head Concat
|
||
|
|
||
v
|
||
Output Linear (WO)
|
||
|
|
||
v
|
||
LayerNorm (optional)
|
||
|
|
||
v
|
||
Residual Add (optional)
|
||
|
|
||
v
|
||
Output (batch, seq_len, embed_dim)
|
||
|
||
📊 PERFORMANCE CHARACTERISTICS
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
Memory: O(batch × seq_len² × num_heads)
|
||
Computation: O(batch × seq_len² × embed_dim × num_heads)
|
||
|
||
Typical: batch=32, seq_len=8, embed_dim=64, heads=4
|
||
→ ~16KB attention scores per batch
|
||
→ ~524K FLOPs per sample
|
||
|
||
GPU Memory: Manageable for seq_len ≤ 32
|
||
|
||
🔗 INTEGRATION PATH
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
1. Add to QNetworkConfig:
|
||
pub use_attention: bool
|
||
pub attention_config: Option<MultiHeadAttentionConfig>
|
||
|
||
2. Add to QNetwork:
|
||
attention: Option<MultiHeadAttention>
|
||
|
||
3. In forward():
|
||
if self.config.use_attention {
|
||
x = self.attention.forward(&x, None)?;
|
||
}
|
||
|
||
⚠️ CONSTRAINTS & LIMITATIONS
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
⚠️ embed_dim MUST be divisible by num_heads
|
||
⚠️ Quadratic memory with sequence length (manageable for trading)
|
||
⚠️ Recommend batch_size ≤ 64 for GPU memory
|
||
⚠️ Pre-existing codebase compilation errors (unrelated to this change)
|
||
|
||
📚 ERROR TYPES
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
MLError::ConfigurationError Invalid config (embed_dim % num_heads ≠ 0)
|
||
MLError::DimensionMismatch Input shape mismatch
|
||
MLError::InitializationError Parameter initialization failed
|
||
MLError::ModelError Forward pass failed
|
||
MLError::TensorOperationError Tensor manipulation failed
|
||
|
||
🎓 REFERENCES
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
• Vaswani et al. (2017): "Attention Is All You Need"
|
||
• Glorot & Bengio (2010): Xavier initialization
|
||
• Ba et al. (2016): Layer normalization
|
||
|
||
✅ STATUS: IMPLEMENTATION COMPLETE
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
✅ Full multi-head attention implementation
|
||
✅ TDD test suite (8 tests)
|
||
✅ Documentation
|
||
✅ Module integration (mod.rs)
|
||
⏳ Network integration (next phase)
|
||
⏳ Training validation (next phase)
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|