Gradient Accumulation
Una tecnica utile quando le risorse GPU sono limitate.
num_accum = 2optimizer.zero_grad()for epoch in range(10): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data outputs = net(inputs)
loss = criterion(outputs, labels) / num_accum loss.backward()
if i % num_accum == 0: optimizer.step() optimizer.zero_grad()- I parametri del modello vengono aggiornati solo dopo num_accum iterazioni.
- L’output del criterio viene diviso per num_accum per la normalizzazione.
- La mia ipotesi: dato che la loss accumulata su num_accum step viene applicata in un singolo step, dividere per num_accum dà a ogni singola loss un peso uguale, producendo un effetto di normalizzazione.