Есть ли разница между несколькими значениями loss.backward () и loss.backward () после умножения потерь на n в Pytorch? - PullRequest
1 голос
/ 27 мая 2020

Есть ли разница между этими двумя кодами?

1

Loss.backward(retain_graph=True)
Loss.backward(retain_graph=True)
Loss.backward()
optimizer.step

2

Loss = 3 * Loss
Loss.backward()
optimizer.step

Когда я проверял градиент параметра после последнего обратного (), между двумя кодами не было разницы. Однако после тренировки точность тестов немного отличается.

Я знаю, что это не частый случай, но это связано с исследованиями, которые я проводил.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

В варианте 1 каждый раз, когда вы вызываете .backward(), вычисляются градиенты. После 3 вызовов, когда вы выполняете optimizer.step, градиенты добавляются, а затем веса обновляются соответственно.

В варианте 2 вы умножаете потери на константу, поэтому градиенты будут умножаться и на эту константу.

Итак, добавив значение градиента 3 раза и умножив значение градиента на 3 приведет к тому же обновлению параметров.

Обратите внимание, я предполагаю, что нет потерь из-за точности с плавающей запятой (как указано в комментариях).

0 голосов
/ 27 мая 2020

Для меня это выглядит совсем иначе.

Трехкратное вычисление потерь ничего не даст (первый фрагмент кода). Вы просто держитесь за градиент, который вы рассчитали ранее. (Проверьте на своих листовых тензорах значение атрибута .grad ()).

Однако второй фрагмент кода просто умножает градиенты на три, тем самым ускоряя градиентный спуск. Для стандартного оптимизатора градиентного спуска это было бы похоже на увеличение скорости обучения на 3.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...