梯度是如何累积的
How gradients are accumulated in real
'Gradient will not be updated but accumulated, and updated every N rounds.' 我有一个问题,在下面的代码片段中梯度是如何累积的:在下面的每一轮循环中,我都可以看到一个新的梯度是由 loss.backward() 计算出来的,应该存储在内部,但是这个内部存储的梯度会在下一轮刷新吗?梯度是如何求和的,以后每N轮应用一次?
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()
第一次向后调用时,模型参数的 .grad
属性将从 None
更新为梯度。如果您不将梯度重置为零,以后对 .backward()
的调用会将梯度累积(即添加)到属性中(参见 the docs)。
当您调用 model.zero_grad()
时,您正在进行重置。
'Gradient will not be updated but accumulated, and updated every N rounds.' 我有一个问题,在下面的代码片段中梯度是如何累积的:在下面的每一轮循环中,我都可以看到一个新的梯度是由 loss.backward() 计算出来的,应该存储在内部,但是这个内部存储的梯度会在下一轮刷新吗?梯度是如何求和的,以后每N轮应用一次?
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()
第一次向后调用时,模型参数的 .grad
属性将从 None
更新为梯度。如果您不将梯度重置为零,以后对 .backward()
的调用会将梯度累积(即添加)到属性中(参见 the docs)。
当您调用 model.zero_grad()
时,您正在进行重置。