Pytorch で backward() に引数を持たせた時の挙動

AI

概要

Pytorch の公式チュートリアル DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZAUTOGRAD: 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 を持たせる機会は少ないでしょう。

コメント

タイトルとURLをコピーしました