Une bibliothèque pour une optimisation non linéaire différente
Papier • VIDÉO • Twitter • Page Web • Tutoriels
Thésée est une bibliothèque agnostique efficace pour la construction de couches d'optimisation non linéaire personnalisées à Pytorch pour soutenir la construction de divers problèmes de robotique et de vision en tant qu'architectures différenciables de bout en bout.
L'optimisation non linéaire différenciable fournit un schéma général pour coder les priors inductifs, car la fonction objectif peut être partiellement paramétrée par les modèles neuronaux et en partie avec des modèles de différenciation spécifiques au domaine expert. La capacité de calculer les gradients de bout en bout est conservée en différenciant l'optimiseur qui permet aux modèles neuronaux de s'entraîner sur la perte de tâche finale, tout en tirant parti des prieurs capturés par l'optimiseur.
Voir la liste des articles publiés à l'aide de Thésée pour des exemples dans divers domaines d'application.
Notre implémentation fournit une interface facile à utiliser pour créer des couches d'optimisation personnalisées et les brancher sur n'importe quelle architecture neuronale. Les fonctionnalités différentes suivantes sont actuellement disponibles:
Nous prenons en charge plusieurs fonctionnalités qui améliorent les temps de calcul et la consommation de mémoire:
torch . Pour installer pour votre configuration CPU / CUDA particulière, suivez les instructions du site Web de Pytorch.nvcc --version . Sinon, installez-le et assurez-vous que son emplacement est sur la variable $PATH de votre système.suitesparse , que vous pouvez installer via:sudo apt-get install libsuitesparse-dev (ubuntu).conda install -c conda-forge suitesparse (Mac).PYPI
pip install theseus-aiNous fournissons actuellement des roues avec nos extensions CUDA compilées à l'aide de CUDA 11.6 et Python 3.10. Pour d'autres versions CUDA, envisagez d'installer à partir de Source ou d'utiliser notre script de construction.
Notez que l'installation pypi n'inclut pas nos laboratoires expérimentaux cesUS. Pour cela, veuillez installer à partir de la source.
Le moyen le plus simple d'installer cesUS à partir de la source est de exécuter ce qui suit (voir plus loin ci-dessous pour inclure également Baspacho)
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .Si vous êtes intéressé à contribuer à Thésée, installez plutôt
pip install -e " .[dev] "
pre-commit installet suivre les instructions les plus détaillées dans la contribution.
Installation des extensions de Baspacho à partir de la source
Par défaut, l'installation à partir de Source n'inclut pas notre extension de solveur clairsemée baspacho. Pour cela, suivez ces étapes:
Compilez le baspacho à partir des instructions de source suivantes ici. Nous vous recommandons d'utiliser des drapeaux -DBLA_STATIC=ON -DBUILD_SHARED_LIBS=OFF .
Courir
git clone https://github.com/facebookresearch/theseus.git && cd theseus
BASPACHO_ROOT_DIR= < path/to/root/baspacho/dir > pip install -e . où le dir de la racine de Baspacho doit avoir les binaires dans la build du sous-répertoire.
dev ) python -m pytest tests Par défaut, les tests unitaires incluent des tests pour nos extensions CUDA. Vous pouvez ajouter l'option -m "not cudaext" pour les sauter lors de l'installation sans support CUDA. De plus, les tests pour le solveur clairsemé Baspacho sont automatiquement ignorés lorsque son extex n'est pas compilé.
Exemple simple. Cet exemple correspond à la courbe Objective avec un seul CostFunction qui calcule le résidu Objective et l'optimiseur GaussNewton sont encapsulés dans un TheseusLayer . Avec Adam et MSE Loss, TheseusLayer .
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 ()Voir les tutoriels, les exemples de robotique et de vision pour en savoir plus sur l'API et l'utilisation.
Si vous utilisez Thésée dans votre travail, veuillez citer le papier avec le bibtex ci-dessous.
@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 }
}Thésée est autorisé par le MIT. Voir la licence pour plus de détails.
Thésée est rendu possible par les contributeurs suivants:
Fait avec contribution.