L0 regularization for sparse neural networks and intelligent sampling
Project description
L0 Regularization
A PyTorch implementation of L0 regularization based on Louizos, Welling, & Kingma (2017), designed for survey calibration and sparse regression.
Installation
pip install l0-python
For development:
git clone https://github.com/PolicyEngine/L0.git
cd L0
pip install -e .[dev]
Our Approach to Test-Time Gates
The original Hard Concrete formulation uses temperature (β) during training to control the sharpness of stochastic gates. At test time, there's a design choice: whether to include temperature in the deterministic gate computation.
We include temperature at test time:
# Our approach: include temperature
z = sigmoid(log_alpha / beta) * (zeta - gamma) + gamma
# Alternative: omit temperature
z = sigmoid(log_alpha) * (zeta - gamma) + gamma
Including temperature produces sharper 0/1 decisions, which we find beneficial for achieving clean sparsity in our applications. See examples/sparse_regression_demo.py for a demonstration on a 4-variable regression problem.
Primary Use Case: Survey Calibration
This package was developed for PolicyEngine's survey calibration, where we select a sparse subset of survey households while matching population targets.
import numpy as np
from scipy import sparse as sp
from l0.calibration import SparseCalibrationWeights
# Setup: Q targets, N households
Q, N = 200, 10000
M = sp.random(Q, N, density=0.3, format="csr") # Household characteristics
y = np.random.uniform(1e6, 1e8, size=Q) # Population targets
# Initialize model
model = SparseCalibrationWeights(
n_features=N,
beta=0.35,
gamma=-0.1,
zeta=1.1,
init_keep_prob=0.5,
init_weights=1.0,
log_weight_jitter_sd=0.05,
device="cuda",
)
# Train with L0+L2 regularization
model.fit(
M=M,
y=y,
lambda_l0=1e-6,
lambda_l2=1e-8,
lr=0.15,
epochs=2000,
loss_type="relative",
verbose=True,
)
# Get results
active = model.get_active_weights()
print(f"Selected {active['count']} of {N} households")
print(f"Sparsity: {model.get_sparsity():.1%}")
Key Features
- Non-negative weights: Constrained via log-space parameterization
- L0 sparsity: Directly minimizes the count of active weights
- Relative loss: Scale-invariant for targets spanning orders of magnitude
- Group-wise averaging: Balance loss across target groups with different sizes
- GPU support: CUDA acceleration for large problems
Sparse Regression
For sparse linear regression with scipy sparse matrices:
from scipy import sparse as sp
from l0.sparse import SparseL0Linear
# Sparse design matrix
X = sp.random(1000, 500, density=0.1, format="csr")
y = np.random.randn(1000)
model = SparseL0Linear(n_features=500)
model.fit(X, y, lambda_l0=0.001, epochs=1000)
# Get sparse coefficients
coef = model.get_coefficients(threshold=0.01)
Example: Variable Selection
The examples/sparse_regression_demo.py script demonstrates L0 regularization on a simple problem where the true coefficients are [1, 0, -2, 0]:
python examples/sparse_regression_demo.py
Output:
True coefficients: [ 1. 0. -2. 0.]
Recovered coefficients: [ 1.039 0. -2.069 -0. ]
Gates: [1. 0. 1. 0.]
The model correctly identifies that only variables 1 and 3 contribute to the outcome.
Testing
pytest tests/ -v --cov=l0
Citation
@article{louizos2017learning,
title={Learning Sparse Neural Networks through L0 Regularization},
author={Louizos, Christos and Welling, Max and Kingma, Diederik P},
journal={arXiv preprint arXiv:1712.01312},
year={2017}
}
License
MIT License - see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file l0_python-0.6.1.tar.gz.
File metadata
- Download URL: l0_python-0.6.1.tar.gz
- Upload date:
- Size: 37.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fbea10059813ef408255c93dcd5a61dfdd893612efb7e62c934a93f5701d45a
|
|
| MD5 |
8b9c4b7ba320a390b5a51d76f57185d3
|
|
| BLAKE2b-256 |
2afe3929e39c6e30b7b22730a2021cc108f00d0da611b48854eb67b0d49be94e
|
File details
Details for the file l0_python-0.6.1-py3-none-any.whl.
File metadata
- Download URL: l0_python-0.6.1-py3-none-any.whl
- Upload date:
- Size: 23.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a8282760bf4b48b1e7ad2e435a6878f15dcc614e97f5ec1aa5690c66510733e
|
|
| MD5 |
9f8a72487aeb54d4d3d225daa09cc79e
|
|
| BLAKE2b-256 |
1bea28fb7d49b4113953a5938c8bd39904d4aa709b619710aa27311ccf11b669
|