Eine Bibliothek für differenzierbare nichtlineare Optimierung
Papier • Video • Twitter • Webseite • Tutorials
Theseus ist eine effiziente anwendungsunabhängige Bibliothek zum Aufbau von maßgeschneiderten nichtlinearen Optimierungsschichten in Pytorch, um die Konstruktion verschiedener Probleme in Robotik und Vision als End-to-End-Architekturen zu unterstützen.
Die differenzierbare nichtlineare Optimierung bietet ein allgemeines Schema zur Kodierung induktiver Priors, da die objektive Funktion teilweise durch neuronale Modelle und teilweise mit expertenspezifischen differenzierbaren Modellen parametrisiert werden kann. Die Fähigkeit, End-to-End-Gradienten zu berechnen, wird durch Differenzierung durch den Optimierer beibehalten, wodurch Neuralmodelle den endgültigen Aufgabenverlust trainieren und gleichzeitig die vom Optimierer erfassten Priors nutzen können.
Die Liste der Artikel, die mit Theseus veröffentlicht wurden, für Beispiele in verschiedenen Anwendungsdomänen.
Unsere Implementierung bietet eine benutzerfreundliche Schnittstelle, um benutzerdefinierte Optimierungsebenen zu erstellen und an jede neuronale Architektur zu anschließen. Die folgenden differenzierbaren Funktionen sind derzeit verfügbar:
Wir unterstützen verschiedene Funktionen, die die Berechnungszeiten und den Speicherverbrauch verbessern:
torch . Um für Ihre spezielle CPU/CUDA -Konfiguration zu installieren, befolgen Sie die Anweisungen auf der Pytorch -Website.nvcc --version kompiliert wird. Wenn nicht, installieren Sie es und stellen Sie sicher, dass der Standort auf $PATH -Variablen Ihres Systems liegt.suitesparse , die Sie installieren können:sudo apt-get install libsuitesparse-dev (Ubuntu).conda install -c conda-forge suitesparse (MAC).Pypi
pip install theseus-aiWir stellen derzeit Räder unsere CUDA -Erweiterungen zur Verfügung, die mit CUDA 11.6 und Python 3.10 zusammengestellt wurden. Für andere CUDA -Versionen erwägen Sie die Installation von Quelle oder verwenden Sie unser Build -Skript.
Beachten Sie, dass pypi -Installation unsere experimentellen Theseus -Labors nicht enthält. Dazu installieren Sie bitte von der Quelle.
Der einfachste Weg, um Theseus aus der Quelle zu installieren, besteht darin, Folgendes auszuführen (siehe weiter unten, um auch Basspacho einzuschließen).
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .Wenn Sie daran interessiert sind, zu Theseus beizutragen, installieren Sie stattdessen
pip install -e " .[dev] "
pre-commit installund folgen Sie den detaillierteren Anweisungen zum Beitrag.
Installation von Basspacho -Erweiterungen aus der Quelle
Standardmäßig enthält die Installation von Source nicht unsere Erweiterung der Sparse Solver Solver. Befolgen Sie dazu die folgenden Schritte:
Kompilieren Sie hier Basspacho aus der Quelle, die die folgenden Anweisungen verfolgen. Wir empfehlen die Verwendung von Flags -DBLA_STATIC=ON -DBUILD_SHARED_LIBS=OFF .
Laufen
git clone https://github.com/facebookresearch/theseus.git && cd theseus
BASPACHO_ROOT_DIR= < path/to/root/baspacho/dir > pip install -e . wo die Baspacho -Wurzel -Dire die Binärdateien im Unterverzeichnis build muss.
dev -Installation) python -m pytest tests Standardmäßig enthalten Unit -Tests Tests für unsere CUDA -Erweiterungen. Sie können die Option -m "not cudaext" hinzufügen, um sie beim Installieren ohne CUDA -Unterstützung zu überspringen. Zusätzlich werden die Tests für Sparse Solver Basspacho automatisch übersprungen, wenn das Extlib nicht zusammengestellt wird.
Einfaches Beispiel. Dieses Beispiel passt zur Kurve ein Objective mit einer einzelnen CostFunction modelliert, die den Rest berechnet Objective und der GaussNewton -Optimierer werden in einen TheseusLayer eingekapselt. Mit Adam und MSE -Verlust, TheseusLayer unterschieden wird.
import torch
import theseus as th
x_true , y_true , v_true = read_data () # shapes (1, N), (1, N), (1, 1)
x = th . Variable ( torch . randn_like ( x_true ), name = "x" )
y = th . Variable ( y_true , name = "y" )
v = th . Vector ( 1 , name = "v" ) # a manifold subclass of Variable for optim_vars
def error_fn ( optim_vars , aux_vars ): # returns y - v * exp(x)
x , y = aux_vars
return y . tensor - optim_vars [ 0 ]. tensor * torch . exp ( x . tensor )
objective = th . Objective ()
cost_function = th . AutoDiffCostFunction (
[ v ], error_fn , y_true . shape [ 1 ], aux_vars = [ x , y ],
cost_weight = th . ScaleCostWeight ( 1.0 ))
objective . add ( cost_function )
layer = th . TheseusLayer ( th . GaussNewton ( objective , max_iterations = 10 ))
phi = torch . nn . Parameter ( x_true + 0.1 * torch . ones_like ( x_true ))
outer_optimizer = torch . optim . Adam ([ phi ], lr = 0.001 )
for epoch in range ( 10 ):
solution , info = layer . forward (
input_tensors = { "x" : phi . clone (), "v" : torch . ones ( 1 , 1 )},
optimizer_kwargs = { "backward_mode" : "implicit" })
outer_loss = torch . nn . functional . mse_loss ( solution [ "v" ], v_true )
outer_loss . backward ()
outer_optimizer . step ()Siehe Tutorials sowie Beispiele für Robotik und Vision, um mehr über die API und Verwendung zu erfahren.
Wenn Sie Theseus in Ihrer Arbeit verwenden, zitieren Sie das Papier bitte mit dem Bibtex unten.
@article { pineda2022theseus ,
title = { {Theseus: A Library for Differentiable Nonlinear Optimization} } ,
author = { Luis Pineda and Taosha Fan and Maurizio Monge and Shobha Venkataraman and Paloma Sodhi and Ricky TQ Chen and Joseph Ortiz and Daniel DeTone and Austin Wang and Stuart Anderson and Jing Dong and Brandon Amos and Mustafa Mukadam } ,
journal = { Advances in Neural Information Processing Systems } ,
year = { 2022 }
}Theseus ist MIT lizenziert. Weitere Informationen finden Sie in der Lizenz.
Theseus wird von den folgenden Mitwirkenden ermöglicht:
Mit Beitragsröcken gemacht.