Skip to main content

deep-lyapunov

Analyze neural network training stability using Lyapunov exponents and perturbation-based trajectory analysis.

PyPI version Python 3.9+ License: MIT

What is deep-lyapunov?

deep-lyapunov helps you understand how stable your neural network training is. It answers questions like:

  • Do small changes in initialization lead to similar or different final models?
  • Is my training process reproducible?
  • Which architectures are more stable to train?

It uses concepts from dynamical systems theory—specifically Lyapunov exponents—to quantify training stability.

Key Concepts

Metric What It Tells You
Convergence Ratio Do weight trajectories come together (< 1) or spread apart (> 1)?
Lyapunov Exponent Rate of trajectory separation. Negative = stable, Positive = chaotic
Effective Dimensionality How many degrees of freedom in your weight dynamics?

Installation

pip install deep-lyapunov

For development:

pip install deep-lyapunov[dev]

Quick Start

import torch
import torch.nn as nn
from deep_lyapunov import StabilityAnalyzer

# Your model (any PyTorch nn.Module)
model = nn.Sequential(
    nn.Linear(784, 128),
    nn.ReLU(),
    nn.Linear(128, 10)
)

# Create analyzer
analyzer = StabilityAnalyzer(
    model=model,
    perturbation_scale=0.01,  # 1% perturbation
    n_trajectories=5,          # Compare 5 perturbed copies
)

# Analyze stability during training
results = analyzer.analyze(
    train_fn=your_training_function,
    train_loader=train_loader,
    n_epochs=10,
)

# View results
print(f"Convergence Ratio: {results.convergence_ratio:.2f}x")
print(f"Lyapunov Exponent: {results.lyapunov:.4f}")
print(f"Training is: {results.behavior}")  # 'convergent' or 'divergent'

# Generate visualizations
results.plot_trajectories()
results.save_report("stability_report/")

Manual Recording Mode

If you have a custom training loop:

analyzer = StabilityAnalyzer(model)

analyzer.start_recording()
for epoch in range(10):
    train_one_epoch(model, train_loader)
    analyzer.record_checkpoint()

results = analyzer.compute_metrics()

Understanding Results

Convergent Training (ratio < 1.0)

  • Different initializations converge to similar solutions
  • Training is reproducible
  • Good for production deployment

Divergent Training (ratio > 1.0)

  • Small differences amplify during training
  • Multiple distinct solutions exist
  • Good for ensemble diversity

API Reference

StabilityAnalyzer

StabilityAnalyzer(
    model: nn.Module,
    perturbation_scale: float = 0.01,
    n_trajectories: int = 5,
    n_pca_components: int = 10,
    track_gradients: bool = False,
    device: str = "auto",
)

AnalysisResults

results.convergence_ratio  # float: final_spread / initial_spread
results.lyapunov           # float: average Lyapunov exponent
results.behavior           # str: 'convergent' or 'divergent'
results.spread_evolution   # np.ndarray: spread at each epoch
results.pca_trajectories   # np.ndarray: trajectories in PCA space

results.plot_trajectories()  # Visualize weight trajectories
results.plot_convergence()   # Plot spread evolution
results.save_report(path)    # Generate full report
results.to_dict()            # Export as dictionary

Examples

See the examples/ directory for:

  • basic_usage.py - Simple stability analysis
  • custom_training.py - Integration with custom training loops
  • comparing_architectures.py - Compare stability across architectures

Theory

The analysis is based on perturbation-based trajectory analysis:

  1. Start with a base model initialization
  2. Create N copies with small Gaussian perturbations (scale ε)
  3. Train all copies independently on the same data
  4. Track how the weight trajectories evolve
  5. Compute stability metrics from trajectory spread

The Lyapunov exponent λ is computed as:

λ = (1/T) × log(final_spread / initial_spread)
  • λ < 0: Trajectories converge (stable)
  • λ > 0: Trajectories diverge (chaotic/sensitive)
  • λ ≈ 0: Neutral stability

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

Citation

If you use deep-lyapunov in your research, please cite:

@software{deep_lyapunov,
  title = {deep-lyapunov: Neural Network Training Stability Analysis},
  author = {Sampathkumar, Rajesh},
  year = {2025},
  url = {https://github.com/aiexplorations/deep-lyapunov}
}

License

MIT License - see LICENSE for details.

Metadata

Release files for deep-lyapunov 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for deep-lyapunov 0.1.2
File Size Uploaded Provenance
deep_lyapunov-0.1.2.tar.gz 41.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for deep-lyapunov 0.1.2
File Interpreter ABI Platform
deep_lyapunov-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 72.8 kB

Release files / deep_lyapunov-0.1.2.tar.gz

Download URL deep_lyapunov-0.1.2.tar.gz
Size 41.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4f6c020fddd907057bda8bfcd79129ab9601492ed6bc8c3a2813e51e82134bfc
BLAKE2b-256 checksum
How to use checksums
ccb0464a3bd9e6743c8525b83b69b82df73679802b1e13cb7fb083e03c08508d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / deep_lyapunov-0.1.2-py3-none-any.whl

Download URL deep_lyapunov-0.1.2-py3-none-any.whl
Size 31.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9ed35d8ee876a69e4e6f46cb812e2e7a0a7da131231a92fbba066ecd86196a08
BLAKE2b-256 checksum
How to use checksums
707b819a8afd5f5349047c33daa6c9070cc30e28b6a9974604ab6c6bd01253b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Security for deep-lyapunov 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page