2017-06-24 52 views

回答

9

我的意見是在loss.backward()之後,我們需要使用optimizer.step()來進行梯度下降,所以梯度被保留,因爲2個操作是分開的。

另外,有些時候我們需要在一些批次間累積梯度,我們可以簡單地向後多次並優化一次。

+0

我沒有得到您的答案的第一部分!你是否試圖說如果梯度在loss.backward()調用中被清零,那麼optimizer.step()將不會獲得更新的梯度? –

+0

@WasiAhmad嗨,'optimizer.step()'是用'loss.backward()'分隔的,如果我們將梯度向後歸零,我們如何得到梯度? – danche

+0

我明白這一點,這就是爲什麼要求你確認,因爲你的答案很短。當你回答一個問題時,請儘量簡短,以便將來也能幫助他人。 –

1

我有一個用於PyTorch當前安裝的用例。如果有人使用在每一步都進行預測的循環神經網絡,那麼可能需要一個超參數,它允許人們在時間上累積漸變。在每個時間步不對零點進行歸零允許人們以有趣和新穎的方式使用後向傳播時間(bptt)。如果您想了解更多有關bptt或經常性神經網絡的信息,請參閱Back propRNN

+0

這個答案需要更清楚。也許一個例子會有所幫助。 – Chazadanga

+0

以下是關於它將更新的變量(這是可學習的 +#模型的權重)的示例+#梯度的解釋。這是因爲默認情況下,每當調用.backward() +#時,梯度爲 +#在緩衝區中累積(即,不會被覆蓋)。查看torch.autograd.backward的文檔以獲取更多詳細信息。 optimizer.zero_grad() –

相關問題