Как пайторх вычисляет градиенты для простой линейной регрессионной модели?


Я использую 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 4

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)
loss.backward()

Вычисляет градиенты и сохраняет их в параметрах. И вы проходите в пареметры, которые необходимо настроить здесь:

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)