Что должно содержаться в обучающем датасете для обучения с кросс-энтропией
Что проверяют
Понимаете ли вы, что кросс-энтропия сравнивает два распределения, и потому предъявляет к разметке жёсткие требования. Вопрос быстро отделяет тех, кто собирал набор данных руками, от тех, кто запускал чужой ноутбук с готовыми метками.
Как отвечать
Нужны пары «объект, метка», где метка задаёт целевое распределение по классам:
- полный, закрытый и взаимоисключающий список классов, каждый объект принадлежит ровно одному. Если на объекте классы могут совмещаться, это не многоклассовая задача, а многометочная, и там сигмоида с бинарной кросс-энтропией;
- метки в том представлении, которого ждёт конкретная функция потерь: целые индексы классов либо векторы
one-hot. Перепутать их значит получить ошибку размерности или молча неверный результат; - каждый класс присутствует в обучающей части, иначе предсказать его модель не сможет в принципе;
- честное разделение на обучение и валидацию, без пересечений и дубликатов между ними;
- метки без шума: кросс-энтропия штрафует уверенное неверное предсказание логарифмически, поэтому редкая грязная разметка стоит дороже, чем кажется.
Про дисбаланс классов скажите сами: веса классов в функции потерь или изменение выборки, плюс метрика, которая не сводится к доле верных ответов.
Где спотыкаются
Подают в функцию потерь вероятности после softmax. Типовые реализации ждут сырые логиты и применяют логарифм от softmax внутри, так что преобразование выполняется дважды: градиенты слабеют, обучение идёт вяло, ошибок в логе при этом нет.
Путают one-hot и индексы классов. Либо расчёт падает сразу на несовпадении размерностей, либо индекс выходит за число классов и роняет вычисление на видеокарте с невнятным сообщением.
Борются с дисбалансом дублированием строк, а делят выборку уже после этого. Одинаковые записи расходятся между обучением и валидацией, метрика взлетает, на новых данных модель не работает. Балансируется только обучающая часть, и всегда после разделения.