Perpustakaan untuk optimasi nonlinier yang dapat dibedakan
Kertas • Video • Twitter • Halaman web • Tutorial
Theseus adalah perpustakaan aplikasi-agnostik yang efisien untuk membangun lapisan optimisasi nonlinier khusus di Pytorch untuk mendukung pembangunan berbagai masalah dalam robotika dan visi sebagai arsitektur yang dapat diferensiasi dari ujung ke ujung.
Optimalisasi nonlinier yang dapat dibedakan memberikan skema umum untuk menyandikan prior induktif, karena fungsi objektif sebagian dapat diparameterisasi oleh model saraf dan sebagian dengan model yang dapat dibedakan dengan domain-domain ahli. Kemampuan untuk menghitung gradien end-to-end dipertahankan dengan membedakan melalui pengoptimal yang memungkinkan model saraf untuk melatih kehilangan tugas akhir, sementara juga mengambil keuntungan dari prior yang ditangkap oleh pengoptimal.
Lihat daftar makalah yang diterbitkan menggunakan Theseus untuk contoh di berbagai domain aplikasi.
Implementasi kami menyediakan antarmuka yang mudah digunakan untuk membangun lapisan optimasi khusus dan mencolokkannya ke arsitektur saraf apa pun. Fitur -fitur yang dapat dibedakan saat ini tersedia:
Kami mendukung beberapa fitur yang meningkatkan waktu perhitungan dan konsumsi memori:
torch . Untuk menginstal konfigurasi CPU/CUDA khusus Anda, ikuti instruksi di situs web Pytorch.nvcc --version . Jika tidak, instal dan pastikan lokasinya ada di variabel $PATH sistem Anda.suitesparse , yang dapat Anda instal melalui:sudo apt-get install libsuitesparse-dev (ubuntu).conda install -c conda-forge suitesparse (mac).pypi
pip install theseus-aiKami saat ini menyediakan roda ekstensi CUDA kami yang dikompilasi menggunakan CUDA 11.6 dan Python 3.10. Untuk versi CUDA lainnya, pertimbangkan untuk menginstal dari sumber atau menggunakan skrip build kami.
Perhatikan bahwa instalasi pypi tidak termasuk laboratorium eksperimental kami. Untuk ini, silakan instal dari sumber.
Cara paling sederhana untuk menginstal Theseus dari sumber adalah dengan menjalankan yang berikut (lihat lebih lanjut di bawah ini juga termasuk Baspacho)
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .Jika Anda tertarik untuk berkontribusi pada Theseus, alih -alih instal
pip install -e " .[dev] "
pre-commit installdan ikuti instruksi yang lebih rinci dalam berkontribusi.
Memasang ekstensi baspacho dari sumber
Secara default, menginstal dari sumber tidak termasuk ekstensi pemecah jarang baspacho kami. Untuk ini, ikuti langkah -langkah ini:
Kompilasi Baspacho dari sumber berikut instruksi di sini. Kami merekomendasikan menggunakan bendera -DBLA_STATIC=ON -DBUILD_SHARED_LIBS=OFF .
Berlari
git clone https://github.com/facebookresearch/theseus.git && cd theseus
BASPACHO_ROOT_DIR= < path/to/root/baspacho/dir > pip install -e . Di mana Dir Root Baspacho harus memiliki binari dalam build subdirektori.
dev ) python -m pytest tests Secara default, tes unit termasuk tes untuk ekstensi CUDA kami. Anda dapat menambahkan opsi -m "not cudaext" untuk melewatkannya saat menginstal tanpa dukungan CUDA. Selain itu, tes untuk pemecah jarang baspacho secara otomatis dilewati ketika extlibnya tidak dikompilasi.
Contoh sederhana. Contoh ini sesuai dengan kurva Objective dengan CostFunction tunggal yang menghitung residu Objective dan pengoptimal GaussNewton dienkapsulasi ke dalam wayer TheseusLayer . Dengan kerugian Adam dan MSE, 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 ()Lihat tutorial, dan contoh robotika dan visi untuk mempelajari tentang API dan penggunaan.
Jika Anda menggunakan Theseus dalam pekerjaan Anda, silakan kutip kertas dengan Bibtex di bawah ini.
@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 berlisensi MIT. Lihat lisensi untuk detailnya.
Theseus dimungkinkan oleh kontributor berikut:
Dibuat dengan contrib.rocks.