Как пайторх вычисляет градиенты для простой линейной регрессионной модели?
Я использую pytorch и пытаюсь понять, как работает простая линейная регрессионная модель.
Я использую простой класс LinearRegressionModel:
class LinearRegressionModel(nn.Module):
def __init__(self, input_dim, output_dim):
super(LinearRegressionModel, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, x):
out = self.linear(x)
return out
model = LinearRegressionModel(1, 1)
Далее я создаю экземпляр критерия потерь и оптимизатора
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
Наконец, для обучения модели я использую следующий код:
for epoch in range(epochs):
if torch.cuda.is_available():
inputs = Variable(torch.from_numpy(x_train).cuda())
if torch.cuda.is_available():
labels = Variable(torch.from_numpy(y_train).cuda())
# Clear gradients w.r.t. parameters
optimizer.zero_grad()
# Forward to get output
outputs = model(inputs)
# Calculate Loss
loss = criterion(outputs, labels)
# Getting gradients w.r.t. parameters
loss.backward()
# Updating parameters
optimizer.step()
Мой вопрос в том, как оптимизатор получает градиент потерь, вычисленный по loss.backward()
, чтобы обновить параметры с помощью метода step()
? Как работают модель, критерий потерь и оптимизатор, связанный вместе?
2 ответа:
У Пайторха есть такое понятие тензоров и переменных. Когда вы используете nn.Линейная функция создает 2 переменные а именно W и b.In переменная pytorch-это оболочка, которая инкапсулирует тензор, его градиент и информацию о его функции create. вы можете получить прямой доступ к градиентам с помощью
w.grad
Когда вы пробуете его перед вызовом потери.backward() вы не получите ничего. Как только вы назовете потерю.backward () теперь будет содержать градиенты. Теперь вы можете обновить эти градиенты вручную с помощью приведенного ниже простой шаг.
w.data -= learning_rate * w.grad.data
Когда у вас есть сложная сеть ,описанный выше простой шаг может стать сложным. Поэтому оптимизаторы, такие как SGD, Адам заботятся об этом. При создании объекта для этих оптимизаторов мы передаем параметры нашей модели. nn.Модуль содержит функцию parameters (), которая возвращает оптимизатору все изучаемые параметры. Что можно сделать, используя следующий шаг.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)