Когда вы вызываете backward
(в качестве функции или метода для тензора), градиенты операндов с requires_grad == True
вычисляются относительно тензора, который вы назвали backward
. Эти градиенты накапливаются в свойстве .grad
этих операндов. Если один и тот же операнд A
появляется в выражении несколько раз, вы можете концептуально обрабатывать их как отдельные сущности A1
, A2
... для алгоритма обратного распространения и просто в конце суммировать их градиенты так, чтобы A.grad = A1.grad + A2.grad + ...
.
Теперь, собственно говоря, ответ на ваш вопрос
Я хочу знать, что происходит с middle_linear весом при каждом обратном
это: ничего. backward
не меняет веса, только вычисляет градиент. Для изменения весов вы должны выполнить шаг оптимизации, возможно, используя один из оптимизаторов в torch.optim
. Затем веса обновляются в соответствии с их свойством .grad
, поэтому, если ваш операнд использовался несколько раз, он будет обновляться в соответствии с суммой градиентов при каждом использовании.
Другими словами, если ваш матричный элемент x
имеет положительный градиент при первом применении и отрицательный при использовании во второй раз, может случиться так, что чистые эффекты отменится и останется как есть (или изменится только немного). Если оба приложения требуют, чтобы x
было выше, оно повысится больше, чем если бы оно использовалось только один раз и т. Д.