Una biblioteca para optimización no lineal diferenciable
Documento • Video • Twitter • Página web • Tutoriales
Teseo es una biblioteca eficiente de la aplicación-agnóstica para construir capas de optimización no lineal personalizadas en Pytorch para respaldar la construcción de diversos problemas en robótica y visión como arquitecturas diferenciables de extremo a extremo.
La optimización no lineal diferenciable proporciona un esquema general para codificar previos inductivos, ya que la función objetivo puede ser parametrizada en parte por modelos neuronales y en parte con modelos diferenciables específicos de dominio expertos. La capacidad de calcular los gradientes de extremo a extremo se conserva diferenciando a través del optimizador que permite a los modelos neuronales entrenar en la pérdida de tareas final, al tiempo que aprovecha los antecedentes capturados por el optimizador.
Consulte la lista de artículos publicados utilizando Teseo para ejemplos en varios dominios de aplicaciones.
Nuestra implementación proporciona una interfaz fácil de usar para crear capas de optimización personalizadas y conectarlas a cualquier arquitectura neuronal. Las siguientes características diferenciables están actualmente disponibles:
Apoyamos varias características que mejoran los tiempos de cálculo y el consumo de memoria:
torch . Para instalar para su configuración particular de CPU/CUDA, siga las instrucciones en el sitio web de Pytorch.nvcc --version . Si no, instálelo y asegúrese de que su ubicación esté en la variable $PATH de su sistema.suitesparse , que puede instalar a través de:sudo apt-get install libsuitesparse-dev (ubuntu).conda install -c conda-forge suitesparse (Mac).pypi
pip install theseus-aiActualmente proporcionamos ruedas con nuestras extensiones CUDA compiladas con CUDA 11.6 y Python 3.10. Para otras versiones CUDA, considere instalar desde la fuente o usar nuestro script de compilación.
Tenga en cuenta que la instalación pypi no incluye nuestros laboratorios experimentales de Teseo. Para esto, instale desde la fuente.
La forma más sencilla de instalar a Teseo desde la fuente es ejecutar lo siguiente (ver más adelante para incluir también baspacho)
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .Si está interesado en contribuir a Teseo, instale
pip install -e " .[dev] "
pre-commit instally siga las instrucciones más detalladas para contribuir.
Instalación de extensiones Baspacho desde la fuente
De forma predeterminada, la instalación desde la fuente no incluye nuestra extensión de solucionador disperso baspacho. Para esto, siga estos pasos:
Compile baspacho de la fuente siguientes instrucciones aquí. Recomendamos usar flags -DBLA_STATIC=ON -DBUILD_SHARED_LIBS=OFF .
Correr
git clone https://github.com/facebookresearch/theseus.git && cd theseus
BASPACHO_ROOT_DIR= < path/to/root/baspacho/dir > pip install -e . donde el directorio de la raíz baspacho debe tener los binarios en la build del subdirectorio.
dev ) python -m pytest tests Por defecto, las pruebas unitarias incluyen pruebas para nuestras extensiones CUDA. Puede agregar la opción -m "not cudaext" para omitirlos al instalar sin soporte CUDA. Además, las pruebas para el baspacho del solucionador escaso se omiten automáticamente cuando no se compila su extlib.
Ejemplo simple. Este ejemplo es ajustar la curva Objective con una sola CostFunction que calcula el residuo Objective y el optimizador GaussNewton están encapsulados en un TheseusLayer . Con Adam y MSE PEDRA, 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 ()Consulte tutoriales y ejemplos de robótica y visión para aprender sobre la API y el uso.
Si usa Teseo en su trabajo, cita el papel con el Bibtex a continuación.
@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 }
}Teseo tiene licencia MIT. Vea la licencia para más detalles.
Teseo es posible gracias a los siguientes contribuyentes:
Hecho con contribuciones.