Я пытаюсь понять функцию grad () в python, я знаю о обратном распространении, но у меня есть некоторые сомнения в результате функции .grad ().
Так что, если у меня очень простая сеть, скажем, с одним входоми один единственный вес:
import torch
from torch.autograd import Variable
from torch import FloatTensor
a_tensor=Variable(FloatTensor([1]))
weight=Variable(FloatTensor([1]),requires_grad=True)
Теперь я запускаю это в ячейке ipython:
net_out=a_tensor*weight
loss=5-net_out
loss.backward()
print("atensor",a_tensor)
print('weight',weight)
print('net_out',net_out)
print('loss',loss)
print(weight.grad)
Во время первого запуска возвращается:
atensor tensor([ 1.])
weight tensor([ 1.])
net_out tensor([ 1.])
loss tensor([ 4.])
tensor([-1.])
Что правильнопотому что если я прав, то вычисление уравнения градиента будет здесь:
Теперь netout / w будет (w * a) по отношению к w ==> 1 * a
И убыток / netout (5-netout) по отношению к netout ==> (0-1)
Что было бы 1 * a * -1 ==> -1
Но проблема в том, что если я снова нажму ту же ячейку, ничего не меняя, то получу град -2, -3, -4... и т. д.
atensor tensor([ 1.])
weight tensor([ 1.])
net_out tensor([ 1.])
loss tensor([ 4.])
tensor([-2.])
следующий запуск:
atensor tensor([ 1.])
weight tensor([ 1.])
net_out tensor([ 1.])
loss tensor([ 4.])
tensor([-3.])
и т. д.
Я не понимаю, что там происходит, почему и как значение gradувеличение