jacobianによるヤコビ行列の計算【torch】
ベクトル値関数をベクトルで偏微分すると、ヤコビ行列が求められる。
jacobian(arg1, arg2)
arg1 ... ヤコビ行列を求める関数、ここでは戻り値はベクトルとする
arg2 ... ヤコビ行列を求める座標、requires_grad=True は不要、int型はダメ、pt.float型推奨
次式を考える。
$ {\mathbf f} = \left(\begin{array}{cc}0&1\\-1&-2\end{array}\right)\left(\begin{array}{c}x\\y\end{array}\right) = \left(\begin{array}{c}x\\-x-2y\end{array}\right)
$ \frac{\partial {\mathbf f}}{\partial x}= \left(\begin{array}{c}0 \\ -1 \end{array}\right), \frac{\partial {\mathbf f}}{\partial y}= \left(\begin{array}{c} 1 \\ -2 \end{array}\right)
一般的な使い方
ベクトル値関数の計算結果をベクトルで偏微分
偏微分値を求める座標を1つのベクトルで与える
code:p.py
import torch as pt
from torch.autograd.functional import jacobian
def func(x):
A = pt.tensor(0, 1], [-1, -2, dtype=pt.float)
return A@x
x = pt.tensor(1, 2, dtype=pt.float) jac = jacobian(func, x)
print(jac)
'''
'''
結果は1つのテンソルで返される。
$ \left(\frac{\partial f}{\partial {x}} ~ \right| \left. \frac{\partial f}{\partial {y}} \right)
引数が2つの場合
引数を複数に分割してみよう。2つのテンソルで座標を指定する。
code:p.py
import torch as pt
from torch.autograd.functional import jacobian
def func(x, y):
A = pt.tensor(0, 1], [-1, -2, dtype=pt.float)
return A@z
x = pt.tensor(1, dtype=pt.float)
y = pt.tensor(2, dtype=pt.float)
jac = jacobian(func, (x, y))
print(jac)
'''
'''
戻り値も2つのテンソルで返される。
$ \left( \frac{\partial f}{\partial {x}} \right), \left( \frac{\partial f}{\partial {y}} \right)