Класс Adagrad
Класс Adagrad реализует адаптивный градиентный алгоритм оптимизации,
который накапливает квадраты градиентов для каждого параметра и использует
их для индивидуальной настройки скорости обучения. Это позволяет эффективно
обучать модели с разреженными данными и автоматически уменьшать скорость
обучения для часто обновляемых параметров. При создании объекта класса
первым параметром передаются параметры модели, вторым - скорость обучения.
Синтаксис
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)
Основные параметры конструктора:
-
params- итерируемый объект с параметрами модели (например,model.parameters) -
lr- скорость обучения (по умолчанию0.01) -
lr_decay- коэффициент затухания скорости обучения (по умолчанию0) -
weight_decay- коэффициент регуляризации L2 (по умолчанию0) -
initial_accumulator_value- начальное значение аккумулятора квадратов градиентов (по умолчанию0) -
eps- небольшое число для численной стабильности (по умолчанию1e-10)
Пример
Создадим простую линейную модель и обучим её с помощью оптимизатора Adagrad:
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 1)
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
print(optimizer)
Результат выполнения кода:
Adagrad (
Parameter Group 0
dampening: 0
eps: 1e-10
foreach: None
fused: False
initial_accumulator_value: 0
lr: 0.01
lr_decay: 0
maximize: False
weight_decay: 0
)
Пример
Используем оптимизатор для обучения модели на синтетических данных:
import torch
import torch.nn as nn
import torch.optim as optim
torch.manual_seed(0)
model = nn.Linear(1, 1)
optimizer = optim.Adagrad(model.parameters(), lr=0.1)
criterion = nn.MSELoss()
X = torch.randn(100, 1)
y = 2 * X + 1 + 0.1 * torch.randn(100, 1)
for epoch in range(10):
optimizer.zero_grad()
predictions = model(X)
loss = criterion(predictions, y)
loss.backward()
optimizer.step()
if epoch % 3 == 0:
print(f"Epoch {epoch}, Loss: {loss.item():.4f}")
Результат выполнения кода:
Epoch 0, Loss: 2.1982
Epoch 3, Loss: 0.6827
Epoch 6, Loss: 0.2045
Epoch 9, Loss: 0.0612
Пример
Настройка оптимизатора с использованием затухания скорости обучения и регуляризации:
import torch
import torch.nn as nn
import torch.optim as optim
torch.manual_seed(0)
model = nn.Sequential(
nn.Linear(20, 50),
nn.ReLU(),
nn.Linear(50, 1)
)
optimizer = optim.Adagrad(
model.parameters(),
lr=0.05,
lr_decay=1e-4,
weight_decay=1e-5,
initial_accumulator_value=0.1,
eps=1e-8
)
print(f"Learning rate: {optimizer.param_groups[0]['lr']}")
print(f"Learning rate decay: {optimizer.param_groups[0]['lr_decay']}")
print(f"Weight decay: {optimizer.param_groups[0]['weight_decay']}")
Результат выполнения кода:
Learning rate: 0.05
Learning rate decay: 0.0001
Weight decay: 1e-05
Пример
Пример обновления параметров оптимизатора после создания:
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 5)
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
print(f"Initial learning rate: {optimizer.param_groups[0]['lr']}")
for param_group in optimizer.param_groups:
param_group['lr'] = 0.001
print(f"Updated learning rate: {optimizer.param_groups[0]['lr']}")
optimizer.add_param_group({
'params': list(model.parameters()),
'lr': 0.005
})
print(f"Number of parameter groups: {len(optimizer.param_groups)}")
Результат выполнения кода:
Initial learning rate: 0.01
Updated learning rate: 0.001
Number of parameter groups: 2
Смотрите также
-
класс
Adam,
который сочетает идеи адаптивного градиента и импульса -
класс
RMSprop,
который использует скользящее среднее квадратов градиентов -
класс
Adadelta,
который является развитием Adagrad без необходимости задавать скорость обучения -
класс
SGD,
который реализует классический стохастический градиентный спуск