自動微分(多次元の場合)
多次元テンソルの場合にも勾配を求めることができる。ただし、ルートはスカラ値(次元数は問わない)、すなわちただ1つの値である必要がある。
$ {\mathbf v} = \left[\begin{array}{cc}a & b \end{array} \right] のとき、$ q(a, b) = \mathbf{v}\mathbf{v}^\top = a^2 + b^2である。
このとき、$ qの$ aと$ bに対する偏導関数は
$ \frac{\partial q}{\partial a} = 2a, ~~ \frac{\partial q}{\partial b} = 2b
よって、$ a=1, b=2とすると、
$ \left. \frac{\partial q}{\partial a}\right|_{a=1, b=2} = \left. 2a\right|_{a=1, b=2} = 2
$ \left. \frac{\partial q}{\partial b}\right|_{a=1, b=2} = \left. 2b\right|_{a=1, b=2} = 4
となる。プログラムで確認してみよう。
code:tensor_grad15.py
import torch as pt
v = pt.tensor(
1, 2,
dtype=pt.float,
requires_grad=True
)
q = v@v.T
print('q:', q)
q.backward()
print('v:', v)
print('v.grad:', v.grad)
code:(結果).py
$ python3 -i torch_grad15.py
q: tensor(5., grad_fn=<MmBackward0>) <---2次元だが構成要素は1個
v: tensor(1., 2., requires_grad=True)
v.grad: tensor(2., 4.) <--- qに対するvの勾配
https://scrapbox.io/files/65334a42e7ac63001c007ad0.svg
ノード内の丸括弧の値は、変数の形状である。
PermuteBackward:おそらくv.Tの転置操作
MmBackward:おそらく@の行列積の演算操作
注意点:
tensor_grad15.pyのテンソルqは2次元であるが、構成要素は1つである。このように、backwardメソッドはスカラ値(1つの値)から構成されたテンソルにのみ適用できる。
code:実行できない.py
v.backward()
先の例において、vの形状は2つの要素から構成されているため、backwardメソッドを呼び出すことはできない。
/icons/hr.icon
※ ブラウザのバックボタンで戻る