Класс Adam
Класс Adam реализует один из самых популярных оптимизаторов в глубоком обучении. Он вычисляет индивидуальные скорости обучения для каждого параметра на основе оценок первого и второго моментов градиентов. Это позволяет ему эффективно работать с разреженными градиентами, нестационарными целевыми функциями и очень зашумлёнными данными. Класс наследуется от torch.optim.Optimizer и принимает на вход список параметров модели, а также гиперпараметры: скорость обучения (lr), коэффициенты затухания для моментов (betas), эпсилон (eps) для численной стабильности и коэффициент L2-регуляризации (weight_decay).
Синтаксис
torch.optim.Adam(
params,
lr=0.001,
betas=(0.9, 0.999),
eps=1e-08,
weight_decay=0,
amsgrad=False
)
Пример
Создадим простую линейную модель и обучим её на синтетических данных, используя оптимизатор Adam:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(5, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
criterion = nn.MSELoss()
x = torch.randn(10, 5)
y = torch.randn(10, 1)
for epoch in range(100):
optimizer.zero_grad()
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
print(loss.item())
Результат выполнения кода:
0.6428570747375488
Пример
Используем оптимизатор Adam с параметром weight_decay для L2-регуляризации:
import torch
import torch.nn as nn
torch.manual_seed(1)
model = nn.Linear(5, 1)
optimizer = torch.optim.Adam(
model.parameters(),
lr=0.01,
weight_decay=0.001
)
criterion = nn.MSELoss()
x = torch.randn(10, 5)
y = torch.randn(10, 1)
for epoch in range(100):
optimizer.zero_grad()
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
print(loss.item())
Результат выполнения кода:
0.6558964252471924
Пример
Включим флаг amsgrad для использования максимума квадратов градиентов вместо скользящего среднего:
import torch
import torch.nn as nn
torch.manual_seed(2)
model = nn.Linear(5, 1)
optimizer = torch.optim.Adam(
model.parameters(),
lr=0.01,
amsgrad=True
)
criterion = nn.MSELoss()
x = torch.randn(10, 5)
y = torch.randn(10, 1)
for epoch in range(100):
optimizer.zero_grad()
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
print(loss.item())
Результат выполнения кода:
0.7163512706756592