Использует ли pytorch среднее значение обучающих примеров при расчете SGD?

Мне сложно понять результат градиента в простой линейной модели.

Рассмотрим две точки X = [1,2] и y=[1,2]. Рассмотрим простую линейную модель, где pred = w * x + b

Потери равны 1/2 * ((w * 1 + b - 1) ^ 2 + (w * 2 + b - 2) ^ 2) = 2,5 И производные:

  • d потеря / db = (w * 1 + b - 1) + (w * 2 + b - 2)
  • d потеря / dw = (w * 1 + b - 1) * 1 + (w * 2 + b - 2) * 2

Теперь предположим, что мы инициализируем смещение и вес равными 0. У нас есть

  • d потеря / db = - 1-2 = -3
  • d потеря / dw = - 1 * 1-2 * 2 = -5

Однако в pytorch потери d / dw кажутся равными -4,5. После быстрых вычислений я заметил, что если я заменю * 1 и * 2 на * (1 + 2) / 2, в dloss / dw, я получу тот же результат. Отсюда мой вопрос.

Чтобы воспроизвести поведение, у меня есть следующий код:

import torch
import torch.nn as nn

X = torch.tensor([[1],[2.]])
y = torch.tensor([1,2.])
model = nn.Linear(in_features=1, out_features=1)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),lr = 0.1)
model.weight.data.fill_(0)
model.bias.data.fill_(0)
loss = criterion(model(X), y)
optimizer.zero_grad()
loss.backward()
print("loss", loss.item())
print("bias gradient", model.bias.grad) 
print("weight gradient",model.weight.grad) 

Я получаю следующий результат:

loss 2.5
bias gradient tensor([-3.])
weight gradient tensor([[-4.5000]])

0 ответов

Другие вопросы по тегам