Использует ли 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]])