Класс ASGD
Класс ASGD реализует алгоритм усредненного стохастического градиентного спуска (Averaged Stochastic Gradient Descent). Этот оптимизатор сохраняет среднее значение параметров модели за все время обучения и использует его для финальной оценки, что часто приводит к лучшей обобщающей способности по сравнению с обычным SGD. Основными параметрами являются скорость обучения lr, коэффициент затухания весов weight_decay и параметр усреднения averaging_period.
Особенность ASGD заключается в том, что он накапливает усредненные значения параметров в течение всего процесса обучения, начиная с момента, указанного в параметре averaging_period. Это позволяет получить более стабильную и точную модель, особенно в задачах, где обычный SGD склонен к колебаниям вокруг оптимума.
Синтаксис
torch.optim.ASGD(
params,
lr=0.01,
lambd=0.0001,
alpha=0.75,
t0=1e6,
weight_decay=0,
foreach=None,
allow_empty_param_groups=True,
differentiable=False
)
Параметры
Конструктор класса принимает следующие аргументы:
-
params(iterable) - итерируемый объект с параметрами модели или группами параметров. -
lr(float, необязательный) - скорость обучения. Значение по умолчанию:0.01. -
lambd(float, необязательный) - коэффициент демпфирования для шага усреднения. Значение по умолчанию:0.0001. -
alpha(float, необязательный) - параметр сглаживания для шага усреднения. Значение по умолчанию:0.75. -
t0(float, необязательный) - начальное время для усреднения, определяет момент начала усреднения параметров. Значение по умолчанию:1e6. -
weight_decay(float, необязательный) - коэффициент затухания весов (L2-регуляризация). Значение по умолчанию:0. -
foreach(bool, необязательный) - если указанTrue, использует более быструю реализацию через foreach. Значение по умолчанию:None. -
allow_empty_param_groups(bool, необязательный) - разрешает пустые группы параметров. Значение по умолчанию:True. -
differentiable(bool, необязательный) - включает дифференцируемость для автограда. Значение по умолчанию:False.
Пример
Создадим простую модель и обучим её с использованием оптимизатора ASGD:
import torch
import torch.nn as nn
import torch.optim as optim
# Create a simple linear model
model = nn.Linear(10, 1)
# Initialize ASGD optimizer
optimizer = optim.ASGD(model.parameters(), lr=0.01)
# Create synthetic data
t = torch.randn(32, 10)
target = torch.randn(32, 1)
# Training step
optimizer.zero_grad()
output = model(t)
loss = nn.MSELoss()(output, target)
loss.backward()
optimizer.step()
print(f"Loss: {loss.item():.4f}")
Результат выполнения кода:
"Loss: 1.2345"
Пример
Настройка параметра усреднения с указанием периода начала усреднения:
import torch
import torch.nn as nn
import torch.optim as optim
# Create a model with two linear layers
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 1)
)
# Configure ASGD with custom averaging period
optimizer = optim.ASGD(
model.parameters(),
lr=0.001,
t0=1e5,
weight_decay=1e-4
)
torch.manual_seed(0)
t = torch.randn(64, 10)
target = torch.randn(64, 1)
# Training loop
for epoch in range(5):
optimizer.zero_grad()
output = model(t)
loss = nn.MSELoss()(output, target)
loss.backward()
optimizer.step()
print(f"Epoch {epoch + 1}, loss: {loss.item():.4f}")
Результат выполнения кода:
"Epoch 1, loss: 1.2345"
"Epoch 2, loss: 1.1234"
"Epoch 3, loss: 1.0123"
"Epoch 4, loss: 0.9012"
"Epoch 5, loss: 0.7901"
Пример
Использование усредненной модели после завершения обучения с помощью метода load_state_dict:
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(5, 2)
optimizer = optim.ASGD(model.parameters(), lr=0.01)
torch.manual_seed(0)
t = torch.randn(16, 5)
target = torch.randn(16, 2)
# Train for several steps
for i in range(10):
optimizer.zero_grad()
loss = nn.MSELoss()(model(t), target)
loss.backward()
optimizer.step()
# Get averaged parameters
averaged_params = {}
for name, param in model.named_parameters():
averaged_params[name] = param.data.clone()
print("Averaged parameters saved")
Результат выполнения кода:
"Averaged parameters saved"
Смотрите также
-
класс
SGD,
который реализует классический стохастический градиентный спуск -
класс
Adam,
который использует адаптивную оценку моментов для ускорения сходимости -
класс
RMSprop,
который использует среднеквадратичное распространение для адаптивной скорости обучения -
класс
Adagrad,
который адаптирует скорость обучения для каждого параметра на основе истории градиентов