Uma biblioteca para otimização não linear diferenciável
Papel • Vídeo • Twitter • Página da Web • Tutoriais
Teseu é uma biblioteca eficiente-agnóstico de aplicativos para criar camadas de otimização não linear personalizadas em Pytorch para apoiar a construção de vários problemas na robótica e na visão como arquiteturas diferenciáveis de ponta a ponta.
A otimização não linear diferenciável fornece um esquema geral para codificar anteriores indutivos, pois a função objetiva pode ser parcialmente parametrizada por modelos neurais e em parte com modelos diferenciáveis específicos de domínio especializados. A capacidade de calcular gradientes de ponta a ponta é mantida diferenciando o otimizador, o que permite que os modelos neurais treinem a perda final de tarefas, além de aproveitar os anteriores capturados pelo otimizador.
Consulte a lista de artigos publicados usando OSEUs para obter exemplos em vários domínios de aplicativos.
Nossa implementação fornece uma interface fácil de usar para criar camadas de otimização personalizada e conectá -las a qualquer arquitetura neural. A seguir, recursos diferenciáveis estão disponíveis no momento:
Apoiamos vários recursos que melhoram os tempos de computação e o consumo de memória:
torch . Para instalar para sua configuração específica de CPU/CUDA, siga as instruções no site da Pytorch.nvcc --version . Caso contrário, instale -o e verifique se sua localização está na variável $PATH do seu sistema.suitesparse , que você pode instalar via:sudo apt-get install libsuitesparse-dev (Ubuntu).conda install -c conda-forge suitesparse (MAC).Pypi
pip install theseus-aiAtualmente, fornecemos rodas com nossas extensões CUDA compiladas usando o CUDA 11.6 e o Python 3.10. Para outras versões do CUDA, considere instalar a partir da fonte ou usar nosso script de construção.
Observe que a instalação pypi não inclui nossos laboratórios experimentais de Teseu. Para isso, instale a partir da fonte.
A maneira mais simples de instalar Teseu da fonte é executando o seguinte (veja mais abaixo para incluir o Baspacho)
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .Se você estiver interessado em contribuir para Teseu, instale
pip install -e " .[dev] "
pre-commit installe siga as instruções mais detalhadas para contribuir.
Instalando extensões de Baspacho da fonte
Por padrão, a instalação da fonte não inclui nossa extensão de solucionador esparso do Baspacho. Para isso, siga estas etapas:
Compile Baspacho a partir da fonte seguindo as instruções aqui. Recomendamos o uso de sinalizadores -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 . onde o diretor da raiz do Baspacho deve ter os binários na build do subdiretório.
dev ) python -m pytest tests Por padrão, os testes de unidade incluem testes para nossas extensões CUDA. Você pode adicionar a opção -m "not cudaext" para pular ao instalar sem suporte do CUDA. Além disso, os testes para o solucionador esparso Baspacho são ignorados automaticamente quando seu extlib não é compilado.
Exemplo simples. Este exemplo está ajustando a curva Objective com uma única CostFunction que calcula o residual Objective e o otimizador GaussNewton são encapsulados em um TheseusLayer . Com Adam e 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 ()Veja tutoriais e exemplos de robótica e visão para aprender sobre a API e o uso.
Se você usa Teseu em seu trabalho, cite o papel com o Bibtex abaixo.
@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 }
}Teseu é licenciado pelo MIT. Veja a licença para obter detalhes.
Teseu é possível pelos seguintes colaboradores:
Feito com contrib.rocks.