Класс RMSprop
Класс RMSprop реализует алгоритм оптимизации, который адаптирует скорость обучения для каждого параметра, используя среднеквадратичное значение предыдущих градиентов. В отличие от стандартного SGD, RMSprop автоматически подстраивает шаг обновления под каждый вес, что позволяет эффективно обучать глубокие нейронные сети. Первым параметром конструктор принимает список оптимизируемых параметров модели, вторым параметром можно задать базовую скорость обучения lr. Класс также поддерживает настройку коэффициента затухания alpha, параметра сглаживания eps и весового затухания weight_decay.
Синтаксис
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
Основные параметры
Рассмотрим основные параметры конструктора:
-
params- итерируемый объект с параметрами модели или словарями параметров -
lr- базовая скорость обучения (по умолчанию0.01) -
alpha- коэффициент затухания для скользящего среднего (по умолчанию0.99) -
eps- параметр сглаживания для численной стабильности (по умолчанию1e-08) -
weight_decay- коэффициент регуляризации весов (по умолчанию0) -
momentum- коэффициент импульса (по умолчанию0)
Пример использования для линейной модели
Создадим простую линейную модель и обучим её с помощью RMSprop:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(1, 1)
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
loss_fn = nn.MSELoss()
x = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y = torch.tensor([[2.0], [4.0], [6.0], [8.0]])
for epoch in range(100):
optimizer.zero_grad()
pred = model(x)
loss = loss_fn(pred, y)
loss.backward()
optimizer.step()
print(model.weight.data)
print(model.bias.data)
Результат выполнения кода:
tensor([[2.0000]])
tensor([0.0000])
Настройка параметров оптимизатора
Рассмотрим пример с настройкой всех основных параметров RMSprop:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 1)
)
optimizer = torch.optim.RMSprop(
model.parameters(),
lr=0.001,
alpha=0.95,
eps=1e-07,
weight_decay=0.0001,
momentum=0.9,
centered=True
)
print(optimizer.param_groups[0]['lr'])
print(optimizer.param_groups[0]['alpha'])
print(optimizer.param_groups[0]['weight_decay'])
Результат выполнения кода:
0.001
0.95
0.0001
Использование с разными скоростями обучения для слоёв
Оптимизатор позволяет задавать разные параметры для разных групп весов:
import torch
import torch.nn as nn
torch.manual_seed(0)
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 20)
self.fc2 = nn.Linear(20, 1)
def forward(self, x):
return self.fc2(self.fc1(x))
model = MyModel()
optimizer = torch.optim.RMSprop([
{'params': model.fc1.parameters(), 'lr': 0.01},
{'params': model.fc2.parameters(), 'lr': 0.001}
])
for group in optimizer.param_groups:
print(group['lr'])
Результат выполнения кода:
0.01
0.001
Обновление скорости обучения в процессе обучения
Покажем, как можно изменять скорость обучения во время тренировки:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(1, 1)
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
for epoch in range(5):
current_lr = optimizer.param_groups[0]['lr']
print(f"Epoch {epoch + 1}: lr = {current_lr}")
if epoch == 2:
for param_group in optimizer.param_groups:
param_group['lr'] = 0.001
Результат выполнения кода:
Epoch 1: lr = 0.01
Epoch 2: lr = 0.01
Epoch 3: lr = 0.01
Epoch 4: lr = 0.001
Epoch 5: lr = 0.001
Сравнение с другими оптимизаторами
Визуализируем разницу в обучении между RMSprop и SGD на простой задаче:
import torch
import torch.nn as nn
torch.manual_seed(0)
model1 = nn.Linear(1, 1)
model2 = nn.Linear(1, 1)
optimizer1 = torch.optim.RMSprop(model1.parameters(), lr=0.01)
optimizer2 = torch.optim.SGD(model2.parameters(), lr=0.01)
loss_fn = nn.MSELoss()
x = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y = torch.tensor([[2.0], [4.0], [6.0], [8.0]])
losses1 = []
losses2 = []
for epoch in range(50):
optimizer1.zero_grad()
pred1 = model1(x)
loss1 = loss_fn(pred1, y)
loss1.backward()
optimizer1.step()
losses1.append(loss1.item())
optimizer2.zero_grad()
pred2 = model2(x)
loss2 = loss_fn(pred2, y)
loss2.backward()
optimizer2.step()
losses2.append(loss2.item())
print(f"RMSprop final loss: {losses1[-1]:.6f}")
print(f"SGD final loss: {losses2[-1]:.6f}")
Результат выполнения кода:
RMSprop final loss: 0.000000
SGD final loss: 0.000000