Pytorch: Как работает SGD с импульсом, когда оптимизатор должен вызывать zero_grad (), чтобы помочь накоплению градиентов? - PullRequest
0 голосов
/ 31 декабря 2018

В pytorch функция backward () накапливает градиенты, и мы должны сбрасывать его каждый мини-пакет, вызывая optimizer.zero_grad ().В этом случае, как работает SGD с импульсом, когда на самом деле SGD импульса обновляет веса, используя экспоненциальное среднее некоторых прошлых мини-партий.

Для новичка в Pytorch я запутался.Не требует ли иметь прошлых градиентов для выполнения обновлений.

1 Ответ

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

При использовании импульса необходимо хранить историю из одного элемента для каждого параметра, для других решателей (например, ADAM) требуется еще больше.Оптимизатор знает, как хранить данные истории и накапливать новые градиенты упорядоченным образом.Вам не нужно об этом беспокоиться.

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

Дополнительную информацию о градиентах и ​​оптимизаторе в pytorch можно найти здесь и здесь .

...