РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
524 of 769 menu

Класс 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

Смотрите также

  • класс Adam,
    который сочетает идеи RMSprop и импульса
  • класс SGD,
    который реализует стохастический градиентный спуск
  • класс Adagrad,
    который адаптирует скорость обучения на основе истории градиентов
  • класс Adadelta,
    который является расширением Adagrad с адаптивной скоростью обучения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить