hessianによるヘッセ行列の計算【torch】
hessian(arg1, arg2)
arg1 ... ヘッセ行列を求める関数、こことは戻り値はスカラとする
arg2 ... ヘッセ行列を求める座標
引数が複数個の場合
各引数に対応する勾配を要素に持つタプルが返される。
code:p1.py
import torch as pt
from torch.autograd.functional import jacobian
def himmelblau(x, y):
return (x**2 + y - 11)**2 + (x + y**2 - 7)**2
x = pt.tensor(0, dtype=pt.float)
y = pt.tensor(0, dtype=pt.float)
jac = jacobian(himmelblau, (x, y))
print(jac)
'''
((tensor(-42.), tensor(0.)), (tensor(0.), tensor(-26.)))
'''
引数の数に対応した値を要素に持つタプルが返される。引数2個なので、タプルの長さ2。
$ \left(\left(\begin{array}{c} {\partial^2 f}/{\partial x^2} \\ {\partial^2 f}/{\partial y \partial x} \end{array} \right) ~ , ~ \left(\begin{array}{cc} {\partial^2 f}/{\partial x\partial y} \\ {\partial^2 f}/{\partial y^2} \end{array}\right) \right)
引数が1つの場合
引数の数が1個の場合、1個の戻り値が返される。
code:p.py
import torch as pt
from torch.autograd.functional import hessian
def himmelblau(x):
return (x0**2 + x1 - 11)**2 + (x0 + x1**2 - 7)**2 x = pt.tensor(0, 0, dtype=pt.float) hes = hessian(himmelblau, x)
print(hes)
'''
'''
戻り値は
$ \left(\begin{array}{cc} {\partial^2 f}/{\partial x^2} & {\partial^2 f}/{\partial x\partial y} \\ {\partial^2 f}/{\partial y \partial x} & {\partial^2 f}/{\partial y^2} \end{array}\right)