Trong PyTorch, đối với mỗi lô nhỏ trong giai đoạn huấn luyện, chúng ta thường muốn đặt rõ ràng các gradient thành 0 trước khi bắt đầu thực hiện backpropragation (tức là cập nhật Trọng số và bias) vì PyTorch tích lũy các gradient trong các lần chuyền ngược tiếp theo. Hành vi tích lũy này thuận tiện trong khi huấn luyện RNN hoặc khi chúng ta muốn tính toán độ dốc của loss được tổng hợp qua nhiều lô nhỏ.
Vì vậy, hành động mặc định đã được đặt để tích lũy (tức là tổng) các gradient trên mỗi lệnh gọi loss.backward()
.
Bởi vì điều này, khi bạn bắt đầu vòng lặp đào tạo của mình, lý tưởng nhất là bạn nên loại bỏ các gradient để bạn thực hiện cập nhật tham số một cách chính xác. Nếu không, gradient sẽ là sự kết hợp của gradient cũ mà bạn đã sử dụng để cập nhật các thông số mô hình của mình và gradient mới được tính toán.
Đó là lý do optimizer.zero_grad()
được thêm vào trong ngữ cảnh của đoạn code dưới đây. đoạn code từ hướng dẫn mạng nơ ron của mình ở đây
loss_function = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr = 0.01)
epochs = 10000
final_loss = []
for i in range(epochs):
i = i + 1
y_pred = model.forward(X_train)
loss = loss_function(y_pred, y_train)
final_loss.append(loss)
## after eveery 10 epochs print this
if i % 10 == 1:
print('Epoch number: {} and the loss: {}'.format(i, loss.item()))
optimizer.zero_grad()
loss.backward()
optimizer.step()