ソースコードの実行

Google Colaboratory

目次

Torchはただ行列を格納しているだけではない

行列の中身を見てみる。

import torch
import numpy as np
A=np.ones((2,3))
B=torch.ones((2,3),requires_grad=True)
print(A)
print(B)
> [[1. 1. 1.]
> [1. 1. 1.]]
>tensor([[1., 1., 1.],
>        [1., 1., 1.]], requires_grad=True)

行列以外の情報も入っている。(下線部)

計算結果を同様に出力してみる。

x1=torch.ones(3,3,requires_grad=True)
x2=torch.eye(3,3,requires_grad=True)
y=x1+x2
print(y)
tensor([[2., 1., 1.],
        [1., 2., 1.],
        [1., 1., 2.]], grad_fn=<AddBackward0>)

偏微分した関数が格納されていることがわかる。

計算結果から計算前の数値にもアクセスできる。

D.grad_fn.next_functions
>((<AccumulateGrad at 0x7fb8e783ba90>, 0),
> (<AccumulateGrad at 0x7fb8df891050>, 0))

D.grad_fn.next_functions[0][0].variable
>tensor([[1., 1., 1.],
>        [1., 1., 1.],
>        [1., 1., 1.]], requires_grad=True)

D.grad_fn.next_functions[1][0].variable
>tensor([[1., 0., 0.],
>        [0., 1., 0.],
>        [0., 0., 1.]], requires_grad=True)

つまり、演算するたびに、計算の入力と出力が接続されていることがわかる。

graph TD
  x1-->plus((+))
	x2-->plus((+))
	plus((+))-->y

重要:PyTorchは行列演算と並行して、計算グラフの構築を行なっている

💡 Tip: 計算グラフはいつ構築すべきか?

PyTorchは関数の実行時に構築するため、モデル学習時は各forward実行時に毎回グラフの構築が走る。

一方で、モデル学習直前に一度グラフを構築して、train中はそれを使い回せば、処理が早くなると考えられる。前者の考え方をdefine-by-run (グラフ構築と同時に実行) 後者の考え方をdefine-and-run(グラフ構築後実行)といい、ver1.0のことのtensorflowがそれに対応する。ただ、define-and-runはPythonらしい書き方ではなくなるため、少し書くのが難しいなどあった。