可微分非线性优化的库
纸张•视频•Twitter•网页•教程
Theseus是一个有效的应用程序库,用于在Pytorch中构建自定义非线性优化层,以支持在机器人技术和视觉中构建各种问题作为端到端可区分体系结构。
可区分的非线性优化提供了一个通用方案来编码归纳先验,因为目标函数可以通过神经模型部分地参数化,部分可以与专家领域特定的可区分模型进行部分参数。通过通过优化器进行区分来计算梯度端到端的能力可以保留,该优化器使神经模型可以训练最终的任务损失,同时还利用优化器捕获的先验。
请参阅使用Theseus发表的论文列表,以获取各种应用程序域中的示例。
我们的实现提供了易于使用的接口来构建自定义优化层并将其插入任何神经体系结构。当前可用以下可微分功能:
我们支持一些改善计算时间和内存消耗的功能:
torch安装。要安装您的特定CPU/CUDA配置,请按照Pytorch网站中的说明进行操作。nvcc --version匹配。如果不是,请安装并确保其位置在系统的$PATH变量上。suitesparse ,您可以通过以下方式安装:sudo apt-get install libsuitesparse-dev (ubuntu)。conda install -c conda-forge suitesparse (Mac)。PYPI
pip install theseus-ai目前,我们使用CUDA 11.6和Python 3.10提供了轮子的CUDA扩展名。对于其他CUDA版本,请考虑从源安装或使用我们的构建脚本。
请注意, pypi安装不包括我们的实验性Theseus实验室。为此,请从源安装。
从源安装Theseus的最简单方法是运行以下内容(请参见下面的进一步,还包括Baspacho)
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .如果您有兴趣为Thues贡献,请安装
pip install -e " .[dev] "
pre-commit install并遵循更详细的贡献说明。
从源安装baspacho扩展
默认情况下,从源安装不包括我们的baspacho稀疏求解器扩展名。为此,请按照以下步骤:
从源汇编的baspacho此处按照说明进行编译。我们建议使用flags -DBLA_STATIC=ON -DBUILD_SHARED_LIBS=OFF 。
跑步
git clone https://github.com/facebookresearch/theseus.git && cd theseus
BASPACHO_ROOT_DIR= < path/to/root/baspacho/dir > pip install -e . baspacho root dir必须在子目录build中具有二进制文件。
dev ) python -m pytest tests默认情况下,单位测试包括我们CUDA扩展的测试。您可以在没有CUDA支持的情况下添加选项-m "not cudaext"以跳过它们。此外,当未编译extlib时,稀疏求解器baspacho的测试会自动跳过。
简单示例。此示例适合曲线CostFunction来计算残差的单个成本函数的Objective Objective和GaussNewton优化器被封装到TheseusLayer中。随着Adam和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 ()请参阅教程,机器人和远见示例,以了解API和用法。
如果您在工作中使用Theseus,请在下面的Bibtex引用纸张。
@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已获得麻省理工学院的许可。有关详细信息,请参见许可证。
以下贡献者使Thusus成为可能:
用贡献制成。