При использовании импульса необходимо хранить историю из одного элемента для каждого параметра, для других решателей (например, ADAM) требуется еще больше.Оптимизатор знает, как хранить данные истории и накапливать новые градиенты упорядоченным образом.Вам не нужно об этом беспокоиться.
Так почему zero_grad()
, вы, вероятно, спросите себя?
ну, иногда, целый мини-пакет не помещается в память GPU, и вы хотите разделить его обработку на несколько«мини» -минибатчи, но без уменьшения эффективного размера пакета, используемого для вычисления градиентов и обновлений веса.
В этом случае вы вызываете zero_grad()
один раз, делаете forward
и backward
для всех мини-минибатчей итолько затем вызовите optimizer.step()
- этот шаг усредняет градиенты из всех мини-мини-пакетов, и вы получаете эффективное обновление, как если бы вы запустили одну мини-пакет.См. эту тему для более подробной информации.
Дополнительную информацию о градиентах и оптимизаторе в pytorch можно найти здесь и здесь .