Метод zero_grad()
потрібно викликати під час навчання. Але документація не дуже корисна
| zero_grad(self)
| Sets gradients of all model parameters to zero.
Чому нам потрібно викликати цей метод?
Метод zero_grad()
потрібно викликати під час навчання. Але документація не дуже корисна
| zero_grad(self)
| Sets gradients of all model parameters to zero.
Чому нам потрібно викликати цей метод?
Відповіді:
У PyTorch
, нам потрібно встановити градієнти на нуль, перш ніж починати робити зворотне розповсюдження, оскільки PyTorch накопичує градієнти при наступних зворотних проходах. Це зручно під час навчання RNN. Отже, типовою дією є накопичення (тобто підсумовування) градієнтів кожного loss.backward()
виклику.
Через це, починаючи цикл тренувань, в ідеалі ви повинні zero out the gradients
зробити так, щоб правильно виконувати оновлення параметрів. В іншому випадку градієнт вказував би в іншому напрямку, крім передбачуваного, до мінімуму (або максимуму , у разі цілей максимізації).
Ось простий приклад:
import torch
from torch.autograd import Variable
import torch.optim as optim
def linear_model(x, W, b):
return torch.matmul(x, W) + b
data, targets = ...
W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)
optimizer = optim.Adam([W, b])
for sample, target in zip(data, targets):
# clear out the gradients of all Variables
# in this optimizer (i.e. W, b)
optimizer.zero_grad()
output = linear_model(sample, W, b)
loss = (output - target) ** 2
loss.backward()
optimizer.step()
Як варіант, якщо ви робите ванільний градієнтний спуск , тоді:
W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)
for sample, target in zip(data, targets):
# clear out the gradients of Variables
# (i.e. W, b)
W.grad.data.zero_()
b.grad.data.zero_()
output = linear_model(sample, W, b)
loss = (output - target) ** 2
loss.backward()
W -= learning_rate * W.grad.data
b -= learning_rate * b.grad.data
Примітка : Накопичення (тобто сума ) градієнтів відбувається, коли .backward()
його викликають на loss
тензор .
zero_grad () - це перезапуск циклу без втрат з останнього кроку, якщо ви використовуєте метод градієнта для зменшення помилки (або втрат)
якщо ви не використовуєте zero_grad (), втрата буде зменшуватися, а не збільшуватись відповідно до вимог
наприклад, якщо ви використовуєте zero_grad (), ви знайдете такий результат:
model training loss is 1.5
model training loss is 1.4
model training loss is 1.3
model training loss is 1.2
якщо ви не використовуєте zero_grad (), ви знайдете такий результат:
model training loss is 1.4
model training loss is 1.9
model training loss is 2
model training loss is 2.8
model training loss is 3.5