Обучение и оценка RNN

Глубокое обучение на PyTorch: средний уровень

Michal Oleszak

Machine Learning Engineer

Среднеквадратичная ошибка (MSE)

  • Ошибка:

    $$prediction - target$$

  • Квадратичная ошибка:

    $$(prediction - target)^2$$

  • Среднеквадратичная ошибка:

    $$avg[(prediction - target)^2]$$

Возведение ошибки в квадрат:

  • Исключает взаимную компенсацию положительных и отрицательных ошибок
  • Сильнее штрафует за большие ошибки
  • В PyTorch:
      criterion = nn.MSELoss()
    
Глубокое обучение на PyTorch: средний уровень

Расширение тензоров

  • Рекуррентные слои ожидают входные данные формы (batch_size, seq_length, num_features)
  • Получаем (batch_size, seq_length)
  • Необходимо добавить одно измерение в конце
for seqs, labels in dataloader_train:
    print(seqs.shape)
torch.Size([32, 96])
seqs = seqs.view(32, 96, 1)
print(seqs.shape)
torch.Size([32, 96, 1])
Глубокое обучение на PyTorch: средний уровень

Сжатие тензоров

  • В цикле оценки нужно отменить преобразование формы, выполненное при обучении
  • Метки имеют форму (batch_size)

    for seqs, labels in test_loader:
      print(labels.shape)
    
    torch.Size([32])
    
  • Выходные данные модели имеют форму (batch_size, 1)

    out = net(seqs)
    
    torch.Size([32, 1])
    
  • Формы выходных данных модели и меток должны совпадать для функции потерь
  • Можно убрать последнее измерение из выходных данных модели

    out = net(seqs).squeeze()
    
    torch.Size([32])
    
Глубокое обучение на PyTorch: средний уровень

Цикл обучения

net = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(
  net.parameters(), lr=0.001
)


for epoch in range(num_epochs): for seqs, labels in dataloader_train:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()
  • Создание модели, определение функции потерь и оптимизатора
  • Итерация по эпохам и батчам данных
  • Изменение формы входной последовательности
  • Остальное: как обычно
Глубокое обучение на PyTorch: средний уровень

Цикл оценки

mse = torchmetrics.MeanSquaredError()


net.eval() with torch.no_grad(): for seqs, labels in test_loader:
seqs = seqs.view(32, 96, 1)
outputs = net(seqs).squeeze()
mse(outputs, labels)
print(f"Test MSE: {mse.compute()}")
Test MSE: 0.13292162120342255
  • Инициализация метрики MSE
  • Итерация по тестовым данным без градиентов
  • Изменение формы входных данных модели
  • Сжатие выходных данных модели
  • Обновление метрики
  • Вычисление итогового значения метрики
Глубокое обучение на PyTorch: средний уровень

LSTM vs. GRU

  • LSTM:
Test MSE: 0.13292162120342255
  • GRU:
Test MSE: 0.12187089771032333
  • GRU предпочтительнее: сопоставимые или лучшие результаты при меньших вычислительных затратах
Глубокое обучение на PyTorch: средний уровень

Давайте потренируемся!

Глубокое обучение на PyTorch: средний уровень

Preparing Video For Download...