Можно ли использовать кросс-энтропию для двух классов и почему это не рекомендуется
Что проверяют
Вопрос с подвохом: интервьюер смотрит, согласитесь ли вы с ложной посылкой. Бинарная кросс-энтропия (log loss) это стандартная функция потерь для двух классов, и «не рекомендуется» здесь неверно. Следом обычно спрашивают про дисбаланс классов и численную устойчивость.
Как отвечать
Начните с того, что посылку не принимаете, и объясните почему:
- формула:
L = -[y·log(p) + (1-y)·log(1-p)], где p это вероятность положительного класса. Это отрицательное логарифмическое правдоподобие распределения Бернулли, поэтому модель учится выдавать вероятности. Логистическая регрессия минимизирует ровно эту функцию; - два варианта реализации: один выход и
BCEWithLogitsLossв PyTorch (илиBinaryCrossentropy(from_logits=True)в Keras) либо два выхода с softmax иCrossEntropyLoss. Математически они эквивалентны, у второго просто лишние параметры; - численная устойчивость: подавать в функцию потерь логиты, а не вероятности. Версии «with logits» считают через log-sum-exp и не ломаются на
log(0); - дисбаланс: сама кросс-энтропия от него не портится, но редкий класс даёт малый вклад в сумму. Лечат весом
pos_weight, весами классов, focal loss (понижает вес лёгких примеров), пересэмплированием; - метрики: log loss для обучения, а качество смотрят по ROC-AUC, PR-AUC и F1 при выбранном пороге.
Если хочется показать глубину, скажите, где кросс-энтропию действительно заменяют: hinge loss в SVM, когда вероятности не нужны, или специальные потери для ранжирования. Но это выбор под задачу, а не запрет.
Где спотыкаются
Соглашаются с вопросом и начинают придумывать недостатки. Это ровно тот ответ, которого ждут от неподготовленного кандидата.
Применяют sigmoid к выходу и потом подают результат в BCEWithLogitsLoss. Сигмоида срабатывает дважды, модель учится, но хуже, и ошибку долго не находят.
Говорят, что hinge loss лучше подходит для несбалансированных классов. Это не так: hinge тоже приходится взвешивать, а вероятностей он не даёт вовсе.