微分可能な非線形最適化のライブラリ
論文•ビデオ•Twitter•Webページ•チュートリアル
Thatusは、Pytorchにカスタム非線形最適化層を構築するための効率的なアプリケーションに依存しないライブラリであり、エンドツーエンドの微分アーキテクチャとしてロボット工学と視力のさまざまな問題の構築をサポートしています。
目的関数は神経モデルによって部分的にパラメーター化され、部分的には専門家ドメイン固有の微分可能モデルでパラメーター化できるため、微分可能な非線形最適化は、誘導前エンダクティブ前エンカーをエンコードする一般的なスキームを提供します。エンドツーエンドの勾配を計算する機能は、オプティマーモデルが最終的なタスク損失でトレーニングできるようにしながら、オプティマーによってキャプチャされたプライアーを利用できるようにするオプティマイザーを介して区別することによって保持されます。
さまざまなアプリケーションドメインの例については、テセウスを使用して公開された論文のリストを参照してください。
実装は、カスタム最適化レイヤーを構築し、ニューラルアーキテクチャに接続するための使いやすいインターフェイスを提供します。現在、微分可能な機能を使用できます。
計算時間とメモリ消費を改善するいくつかの機能をサポートしています。
torch設置が必要です。特定のCPU/CUDA構成にインストールするには、Pytorch Webサイトの指示に従ってください。nvcc --versionでコンパイルするために使用されるバージョンと一致することを確認してください。そうでない場合は、インストールして、その場所がシステムの$PATH変数にあることを確認してください。suitesparseも必要です。これを介してインストールできます。sudo apt-get install libsuitesparse-dev (ubuntu)。conda install -c conda-forge suitesparse (Mac)。ピピ
pip install theseus-ai現在、CUDA 11.6およびPython 3.10を使用してコンパイルされたCUDA拡張機能をホイールで提供しています。他のCUDAバージョンについては、ソースからインストールするか、ビルドスクリプトを使用することを検討してください。
pypiインストールには、実験的なTheus Labsが含まれていないことに注意してください。この場合、ソースからインストールしてください。
ソースからテセウスをインストールする最も簡単な方法は、以下を実行することを実行することです(以下を参照して、Baspachoも含めます)
git clone https://github.com/facebookresearch/theseus.git && cd theseus
pip install -e .テセウスに貢献することに興味がある場合は、代わりにインストールしてください
pip install -e " .[dev] "
pre-commit install貢献のより詳細な指示に従ってください。
ソースからBaspacho拡張機能をインストールします
デフォルトでは、Sourceからのインストールには、Baspacho Sparse Solver Extensionが含まれていません。これについては、次の手順に従ってください。
こちらの説明に従ってソースから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ルートディレクトは、サブディレクトリbuildにバイナリを持っている必要があります。
devインストールが必要) python -m pytest testsデフォルトでは、単体テストには、CUDA拡張機能のテストが含まれます。 cudaサポートなしでインストールするときにそれらをスキップするには、オプション-m "not cudaext"を追加することができます。さらに、Sparse Solver Baspachoのテストは、extlibがコンパイルされていないときに自動的にスキップされます。
簡単な例。この例は、曲線に適合することです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と使用状況について学びます。
作品でテセウスを使用している場合は、以下の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 }
}ThatusはMITライセンスを取得しています。詳細については、ライセンスを参照してください。
テセウスは、次の貢献者によって可能になります。
contrib.rocksで作られています。