Я хочу накопить градиенты, прежде чем сделать обратный проход. Так интересно, как правильно это сделать. Согласно этой статье
это:
model.zero_grad() # Reset gradients tensors
for i, (inputs, labels) in enumerate(training_set):
predictions = model(inputs) # Forward pass
loss = loss_function(predictions, labels) # Compute loss function
loss = loss / accumulation_steps # Normalize our loss (if averaged)
loss.backward() # Backward pass
if (i+1) % accumulation_steps == 0: # Wait for several backward steps
optimizer.step() # Now we can do an optimizer step
model.zero_grad()
тогда как я ожидал, что это будет:
model.zero_grad() # Reset gradients tensors
loss = 0
for i, (inputs, labels) in enumerate(training_set):
predictions = model(inputs) # Forward pass
loss += loss_function(predictions, labels) # Compute loss function
if (i+1) % accumulation_steps == 0: # Wait for several backward steps
loss = loss / accumulation_steps # Normalize our loss (if averaged)
loss.backward() # Backward pass
optimizer.step() # Now we can do an optimizer step
model.zero_grad()
loss = 0
где я накапливаю потери, а затем делю на шаги накопления, чтобы усреднить их.
Вторичный вопрос, если я прав, ожидаете ли вы, что мой метод будет быстрее, учитывая, что я только делаю обратный проход через все этапы накопления?