Pytorch 為什么每一輪batch需要設(shè)置optimizer.zero_grad
根據(jù)pytorch中的backward()函數(shù)的計算,當(dāng)網(wǎng)絡(luò)參量進(jìn)行反饋時,梯度是被積累的而不是被替換掉;但是在每一個batch時毫無疑問并不需要將兩個batch的梯度混合起來累積,因此這里就需要每個batch設(shè)置一遍zero_grad 了。 其實(shí)這里還可以補(bǔ)充的一點(diǎn)是,如果不是每一個batch就清除掉原有的梯度,而是比如說兩個batch再清除掉梯度,這是一種變相提高batch_size的方法,對于計算機(jī)硬件不行,但是batch_size可能需要設(shè)高的領(lǐng)域比較適合,比如目標(biāo)檢測模型的訓(xùn)練。 關(guān)于這一點(diǎn)可以參考:https://discuss.pytorch.org/t/why-do-we-need-to-set-the-gradients-manually-to-zero-in-pytorch/4903/3 關(guān)于backward()的計算可以參考:https://discuss.pytorch.org/t/how-to-use-the-backward-functions-for-multiple-losses/1826/5 |
|