pytorch - связь между loss.backward () и optimizer.step () - PullRequest
0 голосов
/ 30 декабря 2018

Где явная связь между optimizer и loss?

Как оптимизатор узнает, где можно получить градиенты потерь без звонка, как это optimizer.step(loss)?

-Больше контекста-

Когда я минимизирую потери,Мне не нужно было передавать градиенты оптимизатору.

loss.backward() # Back Propagation
optimizer.step() # Gardient Descent

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Когда вы вызываете loss.backward(), все, что он делает, это вычисляет градиент потерь со всеми параметрами потерь, которые имеют requires_grad = True, и сохраняет их в атрибуте parameter.grad для каждого параметра.

optimizer.step()обновляет все параметры на основе parameter.grad

0 голосов
/ 30 декабря 2018

Не углубляясь слишком глубоко во внутренности pytorch, я могу предложить упрощенный ответ:

Напомним, что при инициализации optimizer вы явно указываете ему, какие параметры (тензоры) модели следует обновить.Градиенты «сохраняются» самими тензорами (они имеют атрибуты grad и requires_grad) после того, как вы вызовете backward() для потери.После вычисления градиентов для всех тензоров в модели вызов optimizer.step() заставляет оптимизатор перебирать все параметры (тензоры), которые он должен обновлять, и использовать их внутренне хранимые grad для обновления их значений.

...