Как определить класс «безразличия» (не учитываемый класс) в классификации временных рядов в PyTorch?
Краткое содержание
Это теоретический вопрос. Постановка задачи: У меня есть задача классификации временных рядов, в которой нужно выдавать классификацию трёх классов для каждого временного шага. Все данные размечены покадрово. Проблема: В датасете больше трех классов (которые также несбалансированы). Моя сеть должна видеть все образцы последовательно, поскольку она использует эту последовательность для получения исторической информации. Таким образом, я не могу просто исключить все нерелевантные классы на этапе предобработки. В случае предсказания на кадре, который помечен иначе, чем эти три класса, результат мне неважен. Мои мысли: Сеть будет делать прогнозирование для трёх классов. Обучение сети (градиентный спуск назад) должно происходить только для валидных классов, а для остальных классов потери вообще не вычисляются. Вопросы: - Это правильный подход для обработки классов типа “безразличие” в задаче классификации? - Как рассчитать потерю только для релевантных классов в PyTorch? - Нужно ли применять нормализацию внутри батча или изменить слои пакетной нормализации, если количество образцов в каждом батче переменно? - Я использую `nn.CrossEntropyLoss()` в качестве критерия потерь.
Полный текст
Это теоретический вопрос.
Постановка задачи
У меня есть задача классификации временных рядов, в которой нужно выводить классификацию трёх классов для каждого временного шага. Все данные помечены покадрово.
Проблема
В наборе данных больше трех классов (которые также несбалансированы). Моя сеть должна видеть все выборки последовательно, поскольку она использует эту информацию для исторического контекста. Следовательно, я не могу просто исключить все нерелевантные классы на этапе предобработки.
В случае прогнозирования кадра, который помечен иначе, чем эти три класса, результат мне неважен.
Мои мысли
Сеть будет предсказывать для трех классов
Сеть будет учиться (пропускать градиент назад) только для валидных классов и просто не вычислять потерю для остальных классов.
Вопросы
Это правильный подход для реализации классов «безразличия» в задаче классификации?
Как рассчитать потери только для релевантных классов в PyTorch?
Нужно ли применять нормализацию по батчам или изменять слои BatchNorm, если количество образцов в батче переменно?
Использую `nn.CrossEntropyLoss()` в качестве критерия, который поддерживает только режимы уменьшения потерь — среднее (`mean`) или сумма (`sum`). Мне нужно замаскировать батч таким образом, чтобы уменьшение применялось только для тех образцов, метки которых являются действительными. Я мог бы использовать параметр `reduction='none'`, делать это вручную или сделать маску до расчета потерь и оставить `reduction='mean'`. Есть ли какой-то встроенный способ реализовать это средствами PyTorch? Возможно, это можно сделать на этапе загрузки данных каким-либо образом? Ищу стандартное, простое решение этой проблемы. Чем проще, тем лучше.
Знаю, что здесь задано несколько вопросов, но они неразделимы, так как решение скорее всего будет единым.
---
**Глубокое обучение**, **Классификация**, **Долгая краткосрочная память**, **Временной ряд**, **Нормализация**
---
### Ответ
Классы «безразличия» нежелательны, потому что отсутствие закономерности в классе «безразличия» может непреднамеренно повредить вашей модели.
Вы можете присвоить веса классам. У функции `CrossEntropyLoss` есть аргумент `weight`.
Слои нормализации батчей можно оставить неизменёнными, так как нормализация должна происходить на основе всех данных, а не только части данных.
---
### Вопросы и комментарии
— Значит вес равный нулю нельзя использовать? Как тогда решить проблему?
— Добавление фиктивного класса было бы плохо. Никогда не говорил про вес, попробуйте установить нулевой или очень низкий вес, проверьте оба варианта.
— Пожалуйста, поясните, почему вес ноль отличается от фиктивной метки?
— Фиктивная переменная добавляет дополнительный класс, в то время как веса классов работают внутри уже существующих меток. Присваивая меньший вес классу, вы уменьшаете влияние данного класса на расчет потерь. Если добавить фиктивный класс, появится новый класс, и потеря будет рассчитываться относительно `(число_классов + 1)` классов. Так как ваш фиктивный класс не имеет частотных паттернов, он лишь запутает вашу модель во время минимизации потерь. Использование весов классов легко реализуется. Или же вы можете попробовать оба подхода и посмотреть результаты.
Извини, не понял. Объясни, пожалуйста, подробнее, как использование весов математически отличается от предложенного мной метода — предсказания только трех классов и отсутствия обратного распространения ошибки для других классов. Что произойдет, если разрешить сети предсказывать пять классов?