Оценка моделей с несколькими выходами и взвешивание функций потерь

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

Michal Oleszak

Machine Learning Engineer

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

acc_alpha = Accuracy(
    task="multiclass", num_classes=30
)
acc_char = Accuracy(
    task="multiclass", num_classes=964
)


net.eval() with torch.no_grad(): for images, labels_alpha, labels_char \ in dataloader_test: out_alpha, out_char = net(images)
_, pred_alpha = torch.max(out_alpha, 1) _, pred_char = torch.max(out_char, 1)
acc_alpha(pred_alpha, labels_alpha) acc_char(pred_char, labels_char)
  • Метрика для каждого выхода
  • Итерация по тестовому загрузчику и получение выходов
  • Вычисление предсказания для каждого выхода
  • Обновление метрик точности
  • Вычисление итоговых значений точности
print(f"Alphabet: {acc_alpha.compute()}")
print(f"Character: {acc_char.compute()}")
Alphabet: 0.3166305720806122
Character: 0.24064336717128754
Глубокое обучение на PyTorch: средний уровень

Цикл обучения модели с несколькими выходами: повторение

for epoch in range(10):
    for images, labels_alpha, labels_char \
    in dataloader_train:
        optimizer.zero_grad()
        outputs_alpha, outputs_char = net(images)
        loss_alpha = criterion(
          outputs_alpha, labels_alpha
        )
        loss_char = criterion(
          outputs_char, labels_char
        )
        loss = loss_alpha + loss_char
        loss.backward()
        optimizer.step()
  • Две функции потерь: для алфавитов и символов
  • Итоговая потеря — сумма потерь по алфавиту и символам: loss = loss_alpha + loss_char
  • Обе задачи классификации считаются равнозначными
Глубокое обучение на PyTorch: средний уровень

Разная важность задач

Классификация символов в 2 раза важнее классификации алфавитов

  • Подход 1: умножить более важную потерю на 2

    loss = loss_alpha + loss_char * 2
    
  • Подход 2: назначить веса с суммой 1

    loss = 0.33 * loss_alpha + 0.67 * loss_char
    
Глубокое обучение на PyTorch: средний уровень

Осторожно: потери на разных масштабах

  • Перед взвешиванием и суммированием потери должны быть на одном масштабе
  • Пример задач:

    • Предсказание цены дома → потеря MSE
    • Предсказание качества: низкое, среднее, высокое → потеря CrossEntropy
  • CrossEntropy обычно имеет однозначные значения

  • Потеря MSE может достигать десятков тысяч
  • Модель будет игнорировать задачу оценки качества
  • Решение: нормализовать обе потери перед взвешиванием и суммированием
    loss_price = loss_price / torch.max(loss_price)
    loss_quality = loss_quality / torch.max(loss_quality)
    loss = 0.7 * loss_price + 0.3 * loss_quality
    
Глубокое обучение на PyTorch: средний уровень

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

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

Preparing Video For Download...