Дело в том, что в вашем рабочем коде вы изменяете существующую переменную с атрибутом grad
, а в случае non-working
вы создаете новую переменную.
Как новая w1
/ * Переменная 1006 * создана, у нее нет атрибута градиента, поскольку вы не вызывали backward()
для нее, но для «исходной» переменной.
Сначала давайте проверим, так ли это на самом деле:
print(id(w1)) # Some id returned here
w1 = w1 - learning_rate * w1.grad
# In case below w1 address doesn't change
# w1 -= learning_rate * w1.grad
print(id(w1)) # Another id here
Теперь вы можете скопировать его на месте и не затормозить, но нет смысла это делать, и ваш рабочий случай намного понятнее, но для потомков:
w1.copy_(w1 - learning_rate * w1.grad)