Skip to main content

NATO: Fourier Spectral Regularization

PyPI version Python 3.8+ License: MIT

NATO — Fourier Spectral Regularization (FSR) with selective high-frequency penalty, N-D FFT gradient filtering, and experimental directional regularization for PyTorch.

Features

  • 📊 Fourier Spectral Penalty (FSP): Selective high-frequency penalty (Definition 3.2) with configurable τ cutoff, hypercube & radial masks
  • 🔧 Low-Pass Gradient Filtering: N-D FFT-based gradient smoothing with correct frequency-domain masking
  • 🚀 NATOOptimizer: Custom Adam-variant optimizer with tethered updates (experimental)
  • 🎯 Kakeya Directional Penalty: Gradient direction consistency regularization (experimental)
  • ⚡ GPU Accelerated: Full CUDA support for all operations

Installation

From PyPI

pip install nato-opt

From Source (Editable)

git clone https://github.com/Malhar1912/NATO.git
cd NATO
pip install -e .

Quick Start

import torch
import torch.nn as nn
from nato_opt import fourier_spectral_penalty, low_pass_filter_gradients

model = nn.Sequential(nn.Conv2d(3, 16, 3), nn.ReLU(), nn.Linear(16, 10))
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

for inputs, targets in dataloader:
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)

    # Selective high-frequency penalty (Definition 3.2)
    # tau=2 penalizes only high-frequency weight components
    fsp = fourier_spectral_penalty(model, lambda_fsp=1e-6, tau=2, mask_mode="hypercube")
    total_loss = loss + fsp
    total_loss.backward()

    # Low-pass filter gradients before optimizer step (Theorem 9.1)
    low_pass_filter_gradients(model, tau_ratio=0.5)

    optimizer.step()

Full-spectrum mode (ℓ₂ weight decay, Proposition 3.2)

# tau=None (default) gives P_FSP^full = ||W||_F² — equivalent to weight decay
fsp = fourier_spectral_penalty(model, lambda_fsp=1e-6, tau=None)

API Reference

fourier_spectral_penalty

fourier_spectral_penalty(
    model,
    lambda_fsp=1e-6,
    tau=None,             # None = full-spectrum (weight decay), float = selective HF
    mask_mode="hypercube", # "hypercube" (ℓ∞, Def 2.2) or "radial" (ℓ₂, §3.4)
    include_conv=True,
    include_linear=True,
    module_whitelist=None,
    module_blacklist=None,
    device=None
) -> torch.Tensor

Compute Fourier Spectral Penalty on model weights. The returned tensor retains grad_fn so autograd can differentiate through it.

Parameters:

  • model: PyTorch model
  • lambda_fsp: Penalty coefficient (default: 1e-6)
  • tau: Frequency cutoff. None = full-spectrum (≡ weight decay). float >= 0 = selective HF penalty.
  • mask_mode: "hypercube" (ℓ∞ cutoff) or "radial" (ℓ₂ cutoff)
  • include_conv: Include Conv layers (default: True)
  • include_linear: Include Linear layers (default: True)
  • module_whitelist: Only include these module names
  • module_blacklist: Exclude these module names

Returns: Scalar penalty tensor (with grad_fn)


low_pass_filter_gradients

low_pass_filter_gradients(
    model,
    tau_ratio=0.5,    # ρ(τ): fraction of frequencies to keep per dimension
    skip_bias=True,
    in_place=True
)

Apply low-pass FFT filtering to gradients, smoothing high-frequency noise. Uses fftshift/ifftshift internally so the centered mask correctly selects near-DC frequencies.

Parameters:

  • model: PyTorch model with computed gradients
  • tau_ratio: Frequency retention ratio ρ(τ), 0 < tau_ratio ≤ 1. Lower = more filtering.

adjust_learning_rate

adjust_learning_rate(optimizer, epoch, ...)

Utility function for learning rate scheduling.


Experimental Components

Note: The following components are part of the broader DSR (Directional–Spectral Regularization) research hypothesis described in DSR_Concept_Note.md. They are not covered by the FSR paper's theoretical guarantees.

NATOOptimizer

NATOOptimizer(params, lr=1e-3, beta1=0.9, beta2=0.999,
              epsilon=1e-8, gamma=0.01, tether_interval=100, ...)

Custom Adam-variant optimizer with a tether term that penalizes drift from a periodic parameter checkpoint.

kakeya_directional_penalty

kakeya_directional_penalty(
    model,
    state,          # persistent dict for gradient history
    lambda_k=1e-4
) -> torch.Tensor

Penalizes gradients that maintain high cosine similarity with previous gradients.

Usage (must be added to loss before .backward()):

kakeya_state = {}  # persistent across steps

for inputs, targets in dataloader:
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)

    # Kakeya uses stored gradients from the PREVIOUS step
    k_penalty = kakeya_directional_penalty(model, kakeya_state)

    total_loss = loss + k_penalty
    total_loss.backward()
    optimizer.step()

Requirements

  • Python >= 3.8
  • PyTorch
  • NumPy

License

MIT License - see LICENSE for details.

Authors

Citation

If you use this in your research, please cite:

@software{nato_opt,
  title = {NATO: Fourier Spectral Regularization},
  author = {Pangarkar, Malhar and Khambete, Atharva},
  year = {2026},
  url = {https://github.com/Malhar1912/NATO}
}

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Release files for nato-opt 0.1.3

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

Source distribution (sdist)

Source distribution for nato-opt 0.1.3
File Size Uploaded
nato_opt-0.1.3.tar.gz 24.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nato-opt 0.1.3
File Interpreter ABI Platform
nato_opt-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 39.6 kB

Release files / nato_opt-0.1.3.tar.gz

Download URL nato_opt-0.1.3.tar.gz
Size 24.2 kB
Tags Source
SHA-256 checksum
How to use checksums
711e6e06c200c822cc2d12e811cd726d69975077fa28fcf67ff637a11023b902
BLAKE2b-256 checksum
How to use checksums
7836f6af8e530cbacc379582b2c81948eb1491463c3f824c76b08da966f054c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.0

Release files / nato_opt-0.1.3-py3-none-any.whl

Download URL nato_opt-0.1.3-py3-none-any.whl
Size 15.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e14ee996233c33175d617c15c3c327925686243ae4acc07227c5984e4b71e950
BLAKE2b-256 checksum
How to use checksums
79862dcec1056148dd7174ae62deee0a9d5fdadd2338a8f0fa2bd8d7be90d9ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.0

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

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