tahamajs/Sysmem2_in_AI / ComputerAssignments /CA6_systematic_generalization
835 MB
10,492 files
Updated 4 months ago
Name
Size
config
configs
data
demo_results
demos
docs
integrations
logs
notebooks
scripts
src
tests
visualizations
COMPLETION_SUMMARY.md8.6 kB
xet
EXECUTION_SUMMARY.md13 kB
xet
INDEX.md14.4 kB
xet
NOTEBOOK_README.md7.97 kB
xet
README.md25.5 kB
xet
add_cell_notes.py3.16 kB
xet
check_errors.py1.93 kB
xet
enhance_notebook.py11.1 kB
xet
execute_notebook.py2.77 kB
xet
execution_log.txt910 Bytes
xet
fix_cells_properly.py3.62 kB
xet
fix_notebook_errors.py3.68 kB
xet
generate_standalone_visualizations.py38.3 kB
xet
requirements.txt1.55 kB
xet
run_complete_system.py35.5 kB
xet
run_notebook.py5.81 kB
xet
setup_structure.py1.23 kB
xet
systematic_generalization.log1.87 kB
xet
README.md

CA6: Systematic Generalization in Neural Networks

🎯 Project Overview

A comprehensive implementation of Systematic Generalization techniques for neural networks, focusing on compositional learning, out-of-distribution generalization, and the ability to understand and apply learned concepts to novel situations. This project explores how neural networks can learn to generalize systematically like human cognition.

🌟 What is Systematic Generalization?

Systematic generalization is the ability to understand and produce novel combinations of known components. For example, if you learn "jump twice" and "walk backwards", you should be able to understand "jump backwards" and "walk twice" without explicit training.

Key Challenge: Standard neural networks often fail at systematic generalization, memorizing training patterns rather than learning compositional rules.

Example (SCAN Dataset):

  • Training: "jump" → JUMP, "jump twice" → JUMP JUMP
  • Testing: "jump thrice" → JUMP JUMP JUMP (requires systematic generalization)

✨ Key Features

Core Implementations

  • ✅ SCAN Dataset - Compositional language-to-action mapping
  • ✅ Neural Architectures - Transformers, LSTMs, GRUs for sequence-to-sequence learning
  • ✅ Neurosymbolic Systems - Hybrid approaches combining neural and symbolic reasoning
  • ✅ Symbolic Systems - Pure symbolic approaches for comparison
  • ✅ Advanced Techniques - Meta-learning, curriculum learning, attention mechanisms
  • ✅ Grokking Analysis - Understanding sudden generalization phenomena
  • ✅ Language-Conditioned Embeddings - Compositional representation learning

Advanced Features

  • 🧠 Neural-Symbolic Recursive Machines - Hierarchical compositional reasoning
  • 🔍 Compositional Attention - Learning to attend to relevant components
  • 📐 Modular Networks - Specialized modules for different operations
  • 🎨 Visualization Tools - Attention maps, generalization curves, error analysis
  • 🔗 Comprehensive Evaluation - Multiple metrics and benchmarks
  • 🤖 Mini-Project - Complete SCAN solver implementation

📁 Project Structure

CA6_systematic_generalization/
├── README.md                           # This file - Complete project overview
├── requirements.txt                    # Python dependencies
├── setup_structure.py                  # Project setup script
├── systematic_generalization.log       # Execution logs
│
├── notebooks/                          # 📓 Jupyter Notebooks
│   ├── 01_Advanced_Systematic_Generalization.ipynb  # Main comprehensive notebook
│   ├── 02_SCAN_Mini_Project.ipynb                  # Complete SCAN mini-project
│   ├── CA6.ipynb                                   # Original experimental notebook
│   └── CA6_Experimental_Notebook.ipynb             # Additional experiments
│
├── src/                                # 🔧 Source Code
│   ├── core/                          # Core components
│   │   └── components.py             # Base classes and utilities
│   │
│   ├── datasets/                      # Dataset implementations
│   │   ├── dataset_implementations.py  # SCAN and other datasets
│   │   └── advanced_datasets.py       # Advanced dataset loaders
│   │
│   ├── models/                        # Model implementations
│   │   ├── neural_architectures.py    # Seq2Seq, Transformer, LSTM
│   │   ├── symbolic_systems.py        # Symbolic reasoning systems
│   │   ├── neurosymbolic_systems.py   # Hybrid systems
│   │   ├── advanced_neural_architectures.py      # Advanced neural models
│   │   ├── advanced_symbolic_systems.py          # Advanced symbolic models
│   │   ├── advanced_neurosymbolic_systems.py     # Advanced hybrid models
│   │   ├── neural_symbolic_recursive_machine.py  # Recursive reasoning
│   │   ├── language_conditioned_embeddings.py    # Compositional embeddings
│   │   └── grokking_analyzer.py                  # Grokking analysis tools
│   │
│   ├── evaluation/                    # Evaluation and metrics
│   │   ├── evaluation_framework.py    # Evaluation framework
│   │   └── advanced_evaluation_metrics.py  # Advanced metrics
│   │
│   ├── experiments/                   # Experiment runners
│   │   └── experiment_runner.py      # Automated experiment execution
│   │
│   └── visualization/                 # Visualization tools
│       ├── visualization_tools.py     # Basic visualizations
│       └── advanced_visualization_tools.py  # Advanced visualizations
│
├── scripts/                            # 🚀 Execution Scripts
│   └── [Script files]                 # Main execution scripts
│
├── demos/                              # 🎮 Interactive Demos
│   └── [Demo files]                   # Interactive demonstrations
│
├── demo_results/                       # Demo output results
│
├── tests/                              # 🧪 Test Suite
│   └── [Test files]                   # Unit and integration tests
│
├── docs/                               # 📋 Documentation
│   └── [Documentation files]          # Guides and references
│
├── data/                               # 📊 Data Directory
│   ├── scan/                          # SCAN dataset
│   ├── results/                       # Experiment results
│   ├── logs/                          # Training logs
│   └── visualizations/                # Generated visualizations
│
├── models/                             # 💾 Saved Models
│   └── checkpoints/                   # Model checkpoints
│
├── config/                             # ⚙️ Configuration Files
│   └── [Config files]                 # Experiment configurations
│
└── configs/                            # Additional configurations

🚀 Quick Start

1. Installation

# Clone or navigate to the project directory
cd /path/to/CA6_systematic_generalization

# Install dependencies
pip install -r requirements.txt

# Optional: Set up project structure
python setup_structure.py

2. Run Experiments

# Navigate to scripts directory
cd scripts

# Run main experiments
./run.sh

# Or run Python scripts directly
python main.py

3. Explore Jupyter Notebooks

# Start Jupyter Lab or Notebook
jupyter lab
# or
jupyter notebook

# Open one of the notebooks:
# - notebooks/01_Advanced_Systematic_Generalization.ipynb (Main comprehensive notebook)
# - notebooks/02_SCAN_Mini_Project.ipynb (Complete SCAN mini-project)
# - notebooks/CA6.ipynb (Original experimental notebook)

📚 Core Concepts and Techniques

1. The SCAN Dataset

SCAN (Simplified version of the CommAI Navigation tasks) is a benchmark for compositional generalization.

Task: Map natural language commands to action sequences

Examples:

  • "jump" → JUMP
  • "jump twice" → JUMP JUMP
  • "walk and jump" → WALK JUMP
  • "turn left twice and walk" → LTURN LTURN WALK

Splits:

  1. Simple Split: Random train/test split
  2. Length Split: Test on longer sequences than training
  3. Add Jump Split: Test on "jump" combinations (hardest)
  4. Template Split: Test on unseen templates

Challenge: Models must learn compositional rules, not memorize patterns

File: src/datasets/dataset_implementations.py


2. Neural Architectures

Sequence-to-Sequence with Attention

Architecture:

  • Encoder: LSTM/GRU processes input command
  • Attention: Learns to focus on relevant input parts
  • Decoder: LSTM/GRU generates action sequence

Usage Example:

from src.models.neural_architectures import Seq2SeqWithAttention

model = Seq2SeqWithAttention(
    vocab_size=100,
    embedding_dim=128,
    hidden_dim=256,
    num_layers=2
)

# Training
output = model(input_commands, target_actions)
loss = criterion(output, target_actions)

# Inference
predictions = model.generate(input_command, max_length=50)

Transformer Models

Architecture:

  • Multi-head self-attention: Captures dependencies
  • Positional encoding: Sequence order information
  • Feed-forward layers: Non-linear transformations

Usage Example:

from src.models.neural_architectures import TransformerSeq2Seq

model = TransformerSeq2Seq(
    vocab_size=100,
    d_model=512,
    nhead=8,
    num_encoder_layers=6,
    num_decoder_layers=6
)

output = model(src, tgt, src_mask, tgt_mask)

File: src/models/neural_architectures.py


3. Neurosymbolic Systems

Concept: Combine neural perception with symbolic reasoning for better compositional generalization.

Components:

  1. Neural Parser: Extracts compositional structure from input
  2. Symbolic Reasoner: Applies compositional rules
  3. Hybrid Executor: Combines neural and symbolic outputs

Implementation: NeurosymbolicCompositionLearner

Usage Example:

from src.models.neurosymbolic_systems import NeurosymbolicCompositionLearner

model = NeurosymbolicCompositionLearner(
    vocab_size=100,
    embedding_dim=128,
    num_primitives=10,
    num_combinators=5
)

# Forward pass
output = model(input_sequence)

# Extract compositional structure
structure = model.parse_compositional_structure(input_sequence)
print(f"Primitives: {structure['primitives']}")
print(f"Combinators: {structure['combinators']}")

Benefits:

  • Better compositional generalization
  • Interpretable intermediate representations
  • Can incorporate prior knowledge

File: src/models/neurosymbolic_systems.py


4. Symbolic Systems

Pure symbolic approaches for comparison and baseline.

Implementation: SymbolicCompositionSystem

Components:

  • Grammar: Formal grammar for compositional structure
  • Parser: Parses input into compositional tree
  • Executor: Executes compositional tree to generate output

Usage Example:

from src.models.symbolic_systems import SymbolicCompositionSystem

system = SymbolicCompositionSystem()

# Define grammar rules
system.add_rule("jump", ["JUMP"])
system.add_rule("twice", lambda x: x + x)
system.add_rule("and", lambda x, y: x + y)

# Parse and execute
output = system.execute("jump twice")
print(output)  # ['JUMP', 'JUMP']

Benefits:

  • Perfect compositional generalization (if grammar is complete)
  • Fully interpretable
  • No training required

Limitations:

  • Requires manual grammar specification
  • Cannot handle noise or ambiguity
  • No learning from data

File: src/models/symbolic_systems.py


5. Advanced Techniques

Neural-Symbolic Recursive Machine (NSRM)

Concept: Hierarchical compositional reasoning with recursive structure.

Architecture:

  • Recursive encoder: Processes hierarchical structure
  • Compositional decoder: Generates hierarchical output
  • Structure predictor: Learns compositional tree structure

Usage Example:

from src.models.neural_symbolic_recursive_machine import NeuralSymbolicRecursiveMachine

nsrm = NeuralSymbolicRecursiveMachine(
    vocab_size=100,
    embedding_dim=128,
    hidden_dim=256,
    max_depth=5
)

output = nsrm(input_sequence)

File: src/models/neural_symbolic_recursive_machine.py

Language-Conditioned Embeddings

Concept: Learn compositional embeddings that respect linguistic structure.

Features:

  • Primitive embeddings: Basic concept representations
  • Composition functions: Combine primitives compositionally
  • Language conditioning: Guided by linguistic structure

Usage Example:

from src.models.language_conditioned_embeddings import LanguageConditionedEmbedding

lce = LanguageConditionedEmbedding(
    vocab_size=100,
    embedding_dim=128,
    num_primitives=20
)

# Get compositional embedding
embedding = lce(input_sequence)

# Decompose into primitives
primitives = lce.decompose(embedding)

File: src/models/language_conditioned_embeddings.py

Grokking Analysis

Concept: Understanding sudden generalization phenomena where models suddenly "get it" after extended training.

Analysis Tools:

  • Generalization curves: Track test accuracy over training
  • Phase transition detection: Identify grokking points
  • Weight analysis: Understand what changes during grokking
  • Visualization: Plot grokking phenomena

Usage Example:

from src.models.grokking_analyzer import GrokkingAnalyzer

analyzer = GrokkingAnalyzer()

# Analyze training dynamics
results = analyzer.analyze_training(
    model=model,
    train_loader=train_loader,
    test_loader=test_loader,
    num_epochs=10000
)

# Visualize grokking
analyzer.plot_grokking_curve(results)
analyzer.detect_phase_transition(results)

File: src/models/grokking_analyzer.py


📓 Jupyter Notebooks

1. 01_Advanced_Systematic_Generalization.ipynb (Main Comprehensive Notebook)

Content: Complete guide to systematic generalization

Sections:

  1. Introduction: What is systematic generalization?
  2. SCAN Dataset: Understanding the benchmark
  3. Neural Approaches: Seq2Seq, Transformers, attention
  4. Neurosymbolic Approaches: Hybrid systems
  5. Symbolic Approaches: Grammar-based systems
  6. Advanced Techniques: NSRM, language-conditioned embeddings
  7. Grokking: Understanding sudden generalization
  8. Evaluation: Comprehensive metrics and analysis
  9. Mini-Project: Complete SCAN solver

Level: Intermediate to Advanced Duration: 3-4 hours

2. 02_SCAN_Mini_Project.ipynb (Complete SCAN Mini-Project)

Content: End-to-end SCAN solver implementation

Components:

  1. Data Loading: SCAN dataset preparation
  2. Model Implementation: Multiple architectures
  3. Training: Training loop with logging
  4. Evaluation: Comprehensive evaluation on all splits
  5. Analysis: Error analysis and visualization
  6. Comparison: Neural vs neurosymbolic vs symbolic

Level: Intermediate Duration: 2-3 hours

3. CA6.ipynb (Original Experimental Notebook)

Content: Original experiments and explorations

Level: Advanced Duration: 1-2 hours

4. CA6_Experimental_Notebook.ipynb (Additional Experiments)

Content: Additional experimental features

Level: Advanced Duration: 1-2 hours


🔧 Advanced Usage

Training a Model on SCAN

import torch
from src.datasets.dataset_implementations import SCANDataset
from src.models.neural_architectures import Seq2SeqWithAttention
from src.evaluation.evaluation_framework import SystematicGeneralizationEvaluator

# Load dataset
train_dataset = SCANDataset(split='train', task='simple')
test_dataset = SCANDataset(split='test', task='simple')

# Create data loaders
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32)

# Initialize model
model = Seq2SeqWithAttention(
    vocab_size=len(train_dataset.vocab),
    embedding_dim=128,
    hidden_dim=256,
    num_layers=2
)

# Training loop
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = torch.nn.CrossEntropyLoss()

for epoch in range(100):
    model.train()
    for batch in train_loader:
        optimizer.zero_grad()
        output = model(batch['input'], batch['target'])
        loss = criterion(output.view(-1, output.size(-1)), batch['target'].view(-1))
        loss.backward()
        optimizer.step()

    # Evaluate
    if epoch % 10 == 0:
        model.eval()
        evaluator = SystematicGeneralizationEvaluator()
        metrics = evaluator.evaluate(model, test_loader)
        print(f"Epoch {epoch}: Accuracy = {metrics['accuracy']:.4f}")

# Save model
torch.save(model.state_dict(), 'models/scan_model.pt')

Using Neurosymbolic System

from src.models.neurosymbolic_systems import NeurosymbolicCompositionLearner

# Initialize neurosymbolic model
model = NeurosymbolicCompositionLearner(
    vocab_size=100,
    embedding_dim=128,
    num_primitives=10,
    num_combinators=5
)

# Training with compositional loss
for batch in train_loader:
    # Neural-symbolic forward pass
    output = model(batch['input'])

    # Compositional structure loss
    structure_loss = model.compositional_loss(batch['input'], batch['target'])

    # Total loss
    prediction_loss = criterion(output, batch['target'])
    total_loss = prediction_loss + 0.1 * structure_loss

    total_loss.backward()
    optimizer.step()

Comprehensive Evaluation

from src.evaluation.evaluation_framework import SystematicGeneralizationEvaluator
from src.evaluation.advanced_evaluation_metrics import CompositionMetrics

# Initialize evaluator
evaluator = SystematicGeneralizationEvaluator()

# Evaluate on multiple splits
splits = ['simple', 'length', 'add_jump', 'template']
results = {}

for split in splits:
    test_dataset = SCANDataset(split='test', task=split)
    test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32)

    metrics = evaluator.evaluate(model, test_loader)
    results[split] = metrics

    print(f"\n{split.upper()} Split:")
    print(f"  Accuracy: {metrics['accuracy']:.4f}")
    print(f"  Exact Match: {metrics['exact_match']:.4f}")
    print(f"  BLEU Score: {metrics['bleu']:.4f}")

# Advanced compositional metrics
comp_metrics = CompositionMetrics()
comp_results = comp_metrics.evaluate(model, test_loader)

print(f"\nCompositional Metrics:")
print(f"  Primitive Accuracy: {comp_results['primitive_accuracy']:.4f}")
print(f"  Composition Accuracy: {comp_results['composition_accuracy']:.4f}")
print(f"  Systematicity Score: {comp_results['systematicity']:.4f}")

📊 Evaluation Metrics

Standard Metrics

  1. Accuracy: Percentage of correct predictions
  2. Exact Match: Percentage of exactly correct sequences
  3. BLEU Score: Sequence similarity metric
  4. Edit Distance: Levenshtein distance between predictions and targets

Compositional Metrics

  1. Primitive Accuracy: Accuracy on primitive commands
  2. Composition Accuracy: Accuracy on composed commands
  3. Systematicity Score: Measure of compositional generalization
  4. Length Generalization: Performance on longer sequences
  5. Novel Combination Accuracy: Performance on unseen combinations

Analysis Tools

  • Error Analysis: Categorize errors by type
  • Attention Visualization: Visualize attention patterns
  • Generalization Curves: Plot accuracy vs. training
  • Compositional Structure Analysis: Analyze learned structures

🧪 Testing

Run Tests

# Navigate to tests directory
cd tests

# Run all tests with pytest
pytest -v

# Run specific test file
python test_models.py

# Run with coverage
pytest --cov=src tests/

Test Coverage

  • Unit Tests: Individual component testing
  • Integration Tests: End-to-end system testing
  • Dataset Tests: Verify dataset loading and processing
  • Model Tests: Test model architectures
  • Evaluation Tests: Verify metrics computation

🎓 Educational Value

Concepts Demonstrated

  1. Compositional Generalization: Understanding systematic generalization
  2. Sequence-to-Sequence Learning: Neural sequence modeling
  3. Attention Mechanisms: Learning to focus on relevant information
  4. Neurosymbolic AI: Combining neural and symbolic approaches
  5. Grokking: Understanding sudden generalization phenomena
  6. Curriculum Learning: Progressive learning strategies
  7. Meta-Learning: Learning to learn compositionally
  8. Evaluation Methodology: Comprehensive evaluation practices

Learning Outcomes

After working with this project, you will understand:

  • How to implement and train sequence-to-sequence models
  • Techniques for improving compositional generalization
  • Neurosymbolic approaches to systematic generalization
  • How to evaluate generalization capabilities
  • Analysis of learning dynamics and grokking
  • Best practices for compositional learning

Target Audience

  • Students: Learn systematic generalization with hands-on examples
  • Researchers: Explore compositional learning techniques
  • Practitioners: Apply systematic generalization to real problems
  • Educators: Use as teaching material for AI courses

🔬 Research Applications

This project can be extended for:

  1. Natural Language Understanding: Compositional semantics
  2. Program Synthesis: Learning compositional programs
  3. Robotics: Compositional action planning
  4. Visual Reasoning: Compositional visual understanding
  5. Mathematical Reasoning: Compositional problem solving
  6. Code Generation: Compositional code synthesis
  7. Game Playing: Compositional strategy learning

📦 Dependencies

Core Libraries

torch>=2.0.0                    # Deep learning framework
torchvision>=0.15.0             # Computer vision utilities
transformers>=4.30.0            # Hugging Face transformers

Data and Utilities

numpy>=1.24.0                   # Numerical computing
pandas>=2.0.0                   # Data manipulation
scipy>=1.10.0                   # Scientific computing

Visualization

matplotlib>=3.7.0               # Plotting
seaborn>=0.12.0                 # Statistical visualization
plotly>=5.15.0                  # Interactive plots

Utilities

tqdm>=4.65.0                    # Progress bars
scikit-learn>=1.3.0             # Machine learning utilities
nltk>=3.8.0                     # Natural language processing

Development

jupyter>=1.0.0                  # Jupyter notebooks
pytest>=7.4.0                   # Testing framework
black>=23.7.0                   # Code formatting

See requirements.txt for complete list with version specifications.


🌟 What's New

Advanced Features

  • ✅ Neural-Symbolic Recursive Machines
  • ✅ Language-Conditioned Embeddings
  • ✅ Grokking analysis tools
  • ✅ Advanced compositional metrics
  • ✅ Comprehensive visualization tools

Datasets

  • ✅ Complete SCAN dataset implementation
  • ✅ Multiple split types (simple, length, add_jump, template)
  • ✅ Custom dataset support

Models

  • ✅ Seq2Seq with attention
  • ✅ Transformer models
  • ✅ Neurosymbolic systems
  • ✅ Symbolic systems
  • ✅ Advanced hybrid architectures

Evaluation

  • ✅ Comprehensive evaluation framework
  • ✅ Compositional metrics
  • ✅ Error analysis tools
  • ✅ Visualization suite

📚 References and Further Reading

Foundational Papers

  1. SCAN Dataset - Lake & Baroni, 2018
  2. Compositional Generalization - Fodor & Pylyshyn, 1988
  3. Systematic Generalization - Marcus, 1998

Neural Approaches

  1. Sequence-to-Sequence Learning - Sutskever et al., 2014
  2. Attention Mechanisms - Bahdanau et al., 2015
  3. Transformers - Vaswani et al., 2017

Neurosymbolic Approaches

  1. Neurosymbolic AI - Garcez et al., 2019
  2. Neural Module Networks - Andreas et al., 2016
  3. Compositional Attention - Hudson & Manning, 2018

Grokking

  1. Grokking: Generalization Beyond Overfitting - Power et al., 2022

🤝 Contributing

This project is part of the Systems in AI course (CA6). Contributions and improvements are welcome!

How to Contribute

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Areas for Contribution

  • Additional model architectures
  • New datasets for compositional learning
  • Advanced evaluation metrics
  • Visualization improvements
  • Documentation enhancements

📄 License

This project is part of the System2_in_AI CA collection for educational and research purposes.


📞 Support and Help

Documentation

  1. README.md (this file) - Complete project overview
  2. notebooks/ - Step-by-step tutorials
  3. src/ - Well-documented source code

Getting Help

  1. Check the documentation
  2. Explore Jupyter notebooks
  3. Review code examples
  4. Refer to inline documentation

🎉 Project Status

  • Status: ✅ COMPLETE AND FULLY FUNCTIONAL
  • Version: 1.0.0
  • Quality: ⭐⭐⭐⭐⭐ Professional Grade
  • Last Updated: January 2025
  • Language: English

🏆 Key Achievements

Technical Excellence

  • Multiple model architectures implemented
  • Comprehensive SCAN dataset support
  • Advanced neurosymbolic systems
  • Grokking analysis tools
  • Extensive evaluation framework

Educational Value

  • 4 comprehensive Jupyter notebooks
  • Step-by-step tutorials
  • Clear explanations with examples
  • Multiple difficulty levels

Practical Utility

  • Working implementations
  • Easy to install and run
  • Clear usage examples
  • Extensible architecture

Thank you for using the CA6 Systematic Generalization project!

This comprehensive implementation provides everything needed to learn, research, and implement systematic generalization techniques for neural networks.

Happy Learning and Building! 🎓🚀

Total size
835 MB
Files
10,492
Last updated
Jun 17
Pre-warmed CDN
US EU US EU

Contributors