2017-06-24 19 views
8

Tại sao chúng ta cần phải làm không gradients một cách rõ ràng trong pytorch. Tại sao không thể tô đậm độ dốc khi gọi loss.backward(). Kịch bản nào được phân phát bằng cách giữ cho các gradient trên biểu đồ và yêu cầu người dùng rõ ràng là không có các gradient?Tại sao chúng ta cần gọi zero_grad() trên trình tối ưu hóa một cách rõ ràng?

Tôi đang tìm kiếm giải thích tốt.

Trả lời

9

Ý kiến ​​của tôi là sau loss.backward(), chúng tôi cần sử dụng optimizer.step() để tiến hành độ dốc gốc, do đó, độ dốc được dành riêng khi 2 thao tác được tách riêng.

Ngoài ra, một số lần chúng ta cần phải tích lũy gradient giữa một số lô, chúng tôi có thể đơn giản lạc hậu nhiều lần và tối ưu hóa một lần.

+0

tôi không nhận được phần đầu tiên của câu trả lời của bạn! là bạn đang cố gắng để nói nếu gradients được zeroed ra trong loss.backward() gọi, sau đó optimizer.step() sẽ không nhận được gradient được cập nhật? –

+0

@WasiAhmad hi, 'optimizer.step()' được tách biệt với 'loss.backward()', nếu chúng ta lấy 0 gradient ở phía sau, chúng ta có thể lấy gradient như thế nào? – danche

+0

Tôi hiểu rằng, đó là lý do tại sao yêu cầu bạn xác nhận vì câu trả lời của bạn rất ngắn. khi bạn trả lời câu hỏi, hãy cố gắng ngắn gọn để giúp người khác trong tương lai. –

1

Tôi có trường hợp sử dụng cho thiết lập hiện tại trong PyTorch. Nếu một người đang sử dụng mạng nơron tái diễn đang đưa ra các dự đoán ở mọi bước, người ta có thể muốn có một tham số cho phép người ta tích lũy lại gradient theo thời gian. Không làm zero các gradient ở mọi bước thời gian cho phép người ta sử dụng Back propagating qua thời gian (bptt) theo những cách thú vị và mới lạ. Nếu bạn muốn biết thêm thông tin về mạng nơron bptt hoặc mạng neural tái phát, hãy xem Back prop hoặc RNN

+0

Câu trả lời này cần phải rõ ràng hơn. Có thể một ví dụ sẽ giúp ích. – Chazadanga

+0

Dưới đây là giải thích từ các ví dụ + # gradient cho các biến nó sẽ cập nhật (có thể học được + # trọng số của mô hình). Điều này là do theo mặc định, các gradient là + # được tích lũy trong bộ đệm (tức là, không ghi đè) bất cứ khi nào .backward() + # được gọi. Tài liệu Checkout của torch.autograd.backward để biết thêm chi tiết. optimizer.zero_grad() –

Các vấn đề liên quan