Почему для бинарной классификации используют сигмоиду, а не софтмакс
Что проверяют
Понимаете ли вы, что это одна и та же модель в двух параметризациях, и можете ли объяснить, почему выбирают именно одну. Вопрос отделяет тех, кто разбирал формулы, от тех, кто запомнил правило «два класса, значит сигмоида».
Как отвечать
Сигмоида на одном логите даёт вероятность положительного класса, вероятность второго получается как дополнение до единицы. Софтмакс на двух логитах задаёт то же самое распределение: разделите числитель и знаменатель на экспоненту первого логита, и останется сигмоида от разности логитов.
Отсюда и ответ: софтмакс на двух выходах переопределён. Прибавьте к обоим логитам любую константу, и распределение не изменится, значит есть целое направление в пространстве параметров, вдоль которого функция потерь плоская. Практические следствия:
- лишний набор весов в последнем слое без выигрыша в выразительности;
- сигмоида даёт один скаляр, с которым удобно двигать порог решения, строить ROC-кривую и считать площадь под ней;
- такая голова естественно обобщается на разметку, где классы не исключают друг друга: несколько независимых сигмоид, а софтмакс тут уже неприменим.
Добавьте про численную устойчивость: потери считают от логитов, а не от вероятностей, иначе логарифм нуля и переполнение экспоненты. В PyTorch это BCEWithLogitsLoss, а не BCELoss поверх sigmoid.
Где спотыкаются
Говорят, что софтмакс на двух классах даёт неверный результат. Даёт верный и обучается нормально, вопрос в избыточной параметризации и в удобстве работы с порогом, а не в правильности.
Второе: аргументируют вычислительной стоимостью. Лишняя экспонента на объект не значит ничего на фоне остальной сети, и такой довод показывает, что суть человек не ухватил.
Третье: путают выход сигмоиды с калиброванной вероятностью. Число от нуля до единицы не обязано совпадать с реальной частотой класса: при дисбалансе и переобучении модель уверена сильнее, чем следует, поэтому калибровку делают отдельно, методом Платта или изотонической регрессией.