概要
Pytorch の公式チュートリアル DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ の AUTOGRAD: AUTOMATIC DIFFERENTIATION ではわかりやすいチュートリアルが提供されています。
基本的にはわかりやすいのですが、一部解釈が難しかったり、普段使わない記法が使われている場面があります。
本記事では上記のチュートリアル内で出てくる .backward() に引数を持たせる意図とその挙動について解説します。
具体的には以下のように書いたときの挙動です。
import torch
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
.backward() の使い方
.backward() は基本的にスカラー値である Tensor に対してしか使えません。
従って、ベクトルや行列である Tensor に対して .backward() を実行するとエラーとなります。
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward()
# RuntimeError: grad can be implicitly created only for scalar outputs のエラーが出る
これを防ぐため、チュートリアルでは適切なサイズ(今回はyのサイズと等しいサイズ)のベクトルを backward() の引数に持たせています。
今回の場合は、v を引数に持たせると、y と v の内積が内部的に計算されてスカラー値が得られるので勾配の計算ができるようになります。(vは逆伝播の重みである、と解釈しても良いかもしれません。)
一方で、基本的にモデルを作るときは何らかのLoss関数(例えば torch.nn.MSELoss() など)を最後に利用することが多いと思います。
そして、Pytorch のLoss関数を計算するメソッドを使用すると、大抵の場合は出力がスカラーとなります。
従って、実際にモデルを実装する際には、backward() の引数に Tensor を持たせる機会は少ないでしょう。
コメント