2025.7.11 ヘッセ行列
ヘッセ行列は多変数スカラ値関数に対して定義される行列である。
戻り値について
code:p1.py
import torch as pt
from torch.autograd.functional import hessian
def func(x):
# return x # NG ... リストを返してはならない
# return x.item() # NG ... itemメソッドはテンソルの中からfloatを取り出すので×
return x
x = pt.tensor(1) # NG ... 引数はfloatでなければならない、これはintを渡しているので×
hess = hessian(func, x)
関数 hessain はヘッセ行列を戻り値に返す。
戻り値は要素数が1つのテンソル型が求められる。何次元のものでもよい。
引数はfloat型を渡す。後々自動微分などと組み合わせることを考えるとpt.float(32ビット)がよいだろう。
引数について
$ n個のテンソルを渡すと、対応するヘッセ行列を要素とする$ n個のタプルが返される。
code:p1.py
import torch as pt
from torch.autograd.functional import hessian
def func(a, b):
return (a + b).sum()
x = pt.tensor(1, 1, dtype=pt.float)
y = pt.tensor(1, dtype=pt.float)
# z = pt.tensor(1, dtype=pt.float)
hess = hessian(func, (x, y))
for i, h in enumerate(hess):
print('#', i)
for j in h:
print(j)
code:res.sh
# 0
tensor([0., 0.,
0., 0.])
tensor([0.,
0.])
# 1
tensor(0., 0.)
tensor(0.)
渡したのは(2, ) と(1, )のテンソル。返されたのは
0回目:(2, 2)と(2,1)
1回目:(1, 2)と(1,1)
四次元ベクトルの内積を求める関数
$ f({\bf u}) = u_1^2 + u_2^2 + u_3^2 + u_4^2
とすると、
$ \frac{\partial^2 f}{\partial u_1^2} = 2, ...なので
$ H=\left[\begin{array}{cccc}2 & & & \\ & 2& & \\ & & 2& \\ & & & 2\\ \end{array} \right]
code:p.py
import torch as pt
from torch.autograd.functional import hessian
def func(a):
return a@a
x = pt.tensor(1, 2, 3, 4, dtype=pt.float)
hess = hessian(func, x)
print(hess)
'''
tensor([2., 0., 0., 0.,
0., 2., 0., 0.,
0., 0., 2., 0.,
0., 0., 0., 2.])
'''
ここで、