Градиентный спуск в PyTorch
Класс SGD обновляет веса
по градиентам параметров модуля.
При создании ему передают
настраиваемые величины модели
и скорость шага. Дальше объект
сам знает, какие поля сдвигать
после обратного прохода.
Возьмём модель с одним линейным слоем, критерий среднего квадрата и один шаг спуска. Сначала очистим поля градиента у параметров, затем прогон, ошибка, обратный проход и обновление весов. Выведем число ошибки:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(1, 1)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(
model.parameters(), lr=0.1
)
x = torch.tensor([[1.0], [2.0]])
y = torch.tensor([[2.0], [4.0]])
for p in model.parameters():
p.grad = None
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
print(loss) # выведет tensor(7.1321, grad_fn=<MseLossBackward0>)
Соберите модель с линейным слоем
на один вход и один выход,
критерий регрессии и объект
спуска со скоростью 0.05.
Подайте столбец [[1.0], [3.0]]
и эталон [[2.0], [6.0]].
Очистите градиенты параметров,
выполните прогон, найдите
расхождение, обратный проход
и одно обновление весов.
Выведите число ошибки.
Опишите линейный слой
2 на 1, критерий
среднего квадрата и спуск
со скоростью 0.2
для параметров слоя.
Для таблицы [[0.0, 1.0]]
и эталона [[1.0]]
сделайте полный цикл из одного
шага без накопления старого
градиента. Выведите ошибку.
Создайте преобразование
1 на 1, критерий
для дробных эталонов и объект
обновления со скоростью
0.01. По паре
[[4.0]] и [[8.0]]
после очистки градиентов
выполните прогон, подсчёт
ошибки, обратный проход
и сдвиг весов. Выведите
получившееся расхождение.