В чем разница между логлоссом и кросс-энтропией
Что проверяют
Знаете ли вы, что это по сути одно и то же, и можете ли показать это формулой, а не общими словами. Следом обычно просят реализовать функцию руками и спрашивают, что будет, если модель дала верному классу вероятность 0.
Как отвечать
Кросс-энтропия это мера между двумя распределениями: H(p, q) = -Σ p(x) · log q(x), где p истинное распределение, q предсказанное. Логлосс это та же кросс-энтропия, усреднённая по выборке, где p это one-hot метка объекта, а q вероятности модели. Из суммы по классам остаётся одно слагаемое: минус логарифм вероятности верного класса.
- бинарный случай:
-(y · log p + (1 - y) · log(1 - p)), среднее по объектам. В PyTorch этоBCELossи более устойчиваяBCEWithLogitsLoss; - многоклассовый:
-log q_y, в PyTorchCrossEntropyLoss, которая принимает логиты и сама делает log-softmax; - sklearn:
sklearn.metrics.log_lossсчитает и бинарный, и многоклассовый вариант, так что деление «логлосс для двух классов, кросс-энтропия для многих» неверно; - правдоподобие: минимизировать логлосс значит максимизировать логарифм правдоподобия, поэтому это функция потерь логистической регрессии.
В коде обязательно покажите защиту от log(0): обрезку через np.clip(p, eps, 1 - eps) или работу в логитах через log-sum-exp. Полезно добавить, что метрика чувствительна к калибровке: модель с той же accuracy, но с уверенными ошибками получит заметно больший логлосс.
Где спотыкаются
Называют это двумя разными метриками для разных задач. Различаются только название и контекст: в метриках чаще говорят «логлосс», в функциях потерь «кросс-энтропия».
Считают в лоб log(softmax(x)) и получают inf или nan на больших логитах. Правильно брать log_softmax или готовую функцию потерь, которая объединяет оба шага.
Подают в CrossEntropyLoss вероятности после softmax. Функция применит его второй раз, обучение пойдёт, но градиенты станут хуже, и такую ошибку долго не замечают.