は完全にそれがどのようにBackpropまたは、より根本的に、chain rule作品の詳細を中心に発展し、やや長い説明が必要だろう、あなたの質問に答えるために。
短いプログラム的な答えは、Variable
の後方機能は、そのVariable
に接続された計算グラフのすべての変数の勾配を計算することです。 (具体的には、a = b + c
がある場合は、計算グラフ(再帰的に)はb
、次にc
、次にそれらの計算方法などを示し、これらの変数の.grad
属性にこれらの勾配を累積的に格納します。その後、opt.step()
と呼び出すと、オプティマイザのステップで、この勾配の一部がこれらの変数の値に追加されます。
それは概念的に見ると2つの答えがあります。機械学習モデルを訓練する場合、通常、ある損失機能に関して勾配を持たせたいと思っています。この場合、計算された勾配は、ステップ関数を適用するときに全体の損失(スカラー値)が減少するようなものになります。この特殊なケースでは、勾配を特定の値、つまり単位長さのステップ(つまり、学習率が必要な勾配の割合を計算するように)で計算します。つまり、損失関数があり、loss.backward()
を呼び出すと、loss.backward(torch.FloatTensor([1.]))
と同じ計算になります。
これはDNPのバックプロップの一般的な使用例ですが、機能の一般的な区別の特殊なケースに過ぎません。より一般的には、シンボルグラフ(この場合、autogradはpytorchの一部として)は、任意のサブグラフのルートにあるグラデーションに関する計算グラフの初期部分のグラジエントを計算するために使用できます。これは、キーワードの引数gradient
が便利な場合です。非スカラ関数の場合でも、この "ルートレベル"グラデーションをそこに与えることができるからです!説明するために
は、ここで小さな例です:
a = nn.Parameter(torch.FloatTensor([[1, 1], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.sum(a - b)
c.backward(None) # could be c.backward(torch.FloatTensor([1.])) for the same result
print(a.grad, b.grad)
プリント:
Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]
Variable containing:
-1 -1
-1 -1
[torch.FloatTensor of size 2x2]
a = nn.Parameter(torch.FloatTensor([[1, 1], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.sum(a - b)
c.backward(torch.FloatTensor([[1, 2], [3, 4]]))
print(a.grad, b.grad)
ながらプリント:
Variable containing:
1 2
3 4
[torch.FloatTensor of size 2x2]
Variable containing:
-1 -2
-3 -4
[torch.FloatTensor of size 2x2]
と
a = nn.Parameter(torch.FloatTensor([[0, 0], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.matmul(a, b)
c.backward(torch.FloatTensor([[1, 1], [1, 1]])) # we compute w.r.t. a non-scalar variable, so the gradient supplied cannot be scalar, either!
print(a.grad, b.grad)
プリント
Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]
Variable containing:
2 2
2 2
[torch.FloatTensor of size 2x2]
と
a = nn.Parameter(torch.FloatTensor([[0, 0], [2, 2]]))
b = nn.Parameter(torch.FloatTensor([[1, 2], [1, 2]]))
c = torch.matmul(a, b)
c.backward(torch.FloatTensor([[1, 2], [3, 4]])) # we compute w.r.t. a non-scalar variable, so the gradient supplied cannot be scalar, either!
print(a.grad, b.grad)
プリント:
Variable containing:
5 5
11 11
[torch.FloatTensor of size 2x2]
Variable containing:
6 8
6 8
[torch.FloatTensor of size 2x2]
[Pytorch、勾配引数が何であるか]の可能な重複(HTTPS:/ /stackoverflow.com/questions/43451125/ Pytorch-What-The-The-gradient-Arguments) – jdhao