Оптимизаторы, обучение и оценка

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

Michal Oleszak

Machine Learning Engineer

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

import torch.nn as nn
import torch.optim as optim

criterion = nn.BCELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)


for epoch in range(1000): for features, labels in dataloader_train:
optimizer.zero_grad()
outputs = net(features)
loss = criterion( outputs, labels.view(-1, 1) )
loss.backward()
optimizer.step()
  • Определить функцию потерь и оптимизатор
    • BCELoss для бинарной классификации
    • Оптимизатор SGD
  • Перебрать эпохи и обучающие батчи
  • Обнулить градиенты
  • Прямой проход: получить выходы модели
  • Вычислить потери
  • Вычислить градиенты
  • Шаг оптимизатора: обновить параметры
Глубокое обучение на PyTorch: средний уровень

Как работает оптимизатор

 

Два вектора длины два: один со значениями параметров (1 и 0,5), другой с градиентами (0,9 и -0,2).

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

Как работает оптимизатор

 

Стрелки показывают, как два вектора с параметрами и градиентами передаются в оптимизатор, изображённый в виде мишени.

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

Как работает оптимизатор

 

Стрелка от оптимизатора указывает на вектор с двумя обновлениями параметров: -0,5 и 0,5.

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

Как работает оптимизатор

 

Стрелка от обновлений параметров указывает на обновлённые значения параметров: 0,5 и 1,0.

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

Как работает оптимизатор

 

Стрелка от обновлений параметров указывает на обновлённые значения параметров: 0,5 и 1,0.

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

Стохастический градиентный спуск (SGD)

optimizer = optim.SGD(net.parameters(), lr=0.01)
  • Обновление зависит от скорости обучения
  • Простой и эффективный — для базовых моделей
  • На практике используется редко
Глубокое обучение на PyTorch: средний уровень

Адаптивный градиент (Adagrad)

optimizer = optim.Adagrad(net.parameters(), lr=0.01)
  • Адаптирует скорость обучения для каждого параметра
  • Хорошо работает с разреженными данными
  • Может слишком быстро снижать скорость обучения
Глубокое обучение на PyTorch: средний уровень

Среднеквадратичное распространение (RMSprop)

optimizer = optim.RMSprop(net.parameters(), lr=0.01)
  • Обновление каждого параметра зависит от величины его предыдущих градиентов
Глубокое обучение на PyTorch: средний уровень

Адаптивная оценка моментов (Adam)

optimizer = optim.Adam(net.parameters(), lr=0.01)
  • Пожалуй, наиболее универсальный и широко используемый
  • RMSprop + импульс градиента
  • Часто выбирается как оптимизатор по умолчанию
Глубокое обучение на PyTorch: средний уровень

Оценка модели

from torchmetrics import Accuracy

acc = Accuracy(task="binary")


net.eval() with torch.no_grad(): for features, labels in dataloader_test:
outputs = net(features)
preds = (outputs >= 0.5).float()
acc(preds, labels.view(-1, 1))
accuracy = acc.compute() print(f"Accuracy: {accuracy}")
Accuracy: 0.6759443283081055
  • Настроить метрику точности
  • Перевести модель в режим оценки и перебрать батчи тестовых данных без вычисления градиентов
  • Передать данные в модель для получения предсказанных вероятностей
  • Вычислить предсказанные метки
  • Обновить метрику точности
Глубокое обучение на PyTorch: средний уровень

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

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

Preparing Video For Download...