Как выглядит формула бинарной кросс-энтропии?

«Как выглядит формула бинарной кросс-энтропии?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Формула бинарной кросс-энтропии (log loss) для одного примера:

L = -[y * log(p) + (1 - y) * log(1 - p)]

Где:

  • y — истинная метка (0 или 1).
  • p — предсказанная моделью вероятность принадлежности к классу 1 (0 ≤ p ≤ 1).

Для всей выборки из N примеров используется усредненная кросс-энтропия: L = -1/N * Σ [y_i * log(p_i) + (1 - y_i) * log(1 - p_i)]

Почему используется логарифм? Логарифмическое преобразование сильно штрафует модель за уверенные, но неверные предсказания (например, когда p близко к 1 для y=0). Это заставляет алгоритм обучения быстрее корректировать ошибочные веса.

Пример расчета на Python с NumPy:

import numpy as np

def binary_crossentropy(y_true, y_pred):
    # Добавление эпсилона для численной стабильности (избегаем log(0))
    epsilon = 1e-15
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# Пример данных
y_true = np.array([1, 0, 1, 1])
y_pred = np.array([0.9, 0.1, 0.8, 0.4]) # Модель уверена в первых трех случаях, неуверена в последнем
loss = binary_crossentropy(y_true, y_pred)
print(f"Binary Cross-Entropy Loss: {loss:.4f}")  # ~0.164

Эта функция потерь является стандартной для задач бинарной классификации в нейронных сетях и градиентном бустинге (например, в model.compile(loss='binary_crossentropy') в Keras).