# Функция стоимости логистической регрессии

Модель логистической регрессии выдаёт число $\hat{y}$ (ŷ) — предсказание, «насколько это кот» на шкале от 0 до 1 (подробный вывод $\hat{y} = \sigma(w^T x + b)$ — в статье [«Бинарная классификация»](/notes/binary-classification/), но для этой статьи достаточно и этого). Есть и правильный ответ $y$ (y) — 0 или 1. Модель хороша, если $\hat{y}$ близко к $y$ на всех примерах сразу. Вопрос этой статьи: как превратить «близко или не близко» в одно число, которое можно уменьшать?

## Оглавление

- [Штраф за один пример](#штраф-за-один-пример)
- [Почему не квадрат разницы](#почему-не-квадрат)
- [Кросс-энтропия: штраф по частям](#кросс-энтропия)
- [От штрафа к функции стоимости](#функция-стоимости)
- [Числовой пример: четверо друзей](#четверо-друзей)
- [Что дальше](#что-дальше)

## Штраф за один пример {#штраф-за-один-пример}

Возьмём один обучающий пример: модель дала предсказание $\hat{y}$, известен правильный ответ (y) $y$. Нужна функция, которая берёт эти два числа и возвращает **одно число-штраф**: маленькое, если $\hat{y}$ близко к $y$, и большое, если модель уверенно ошиблась. Такую функцию называют **функцией ошибки** (L) или **loss function**, обозначают $L(\hat{y}, y)$.

Если можешь пересказать: loss (L) — штраф за один пример, маленький при верном ответе и большой при уверенной ошибке, — двигаемся дальше.

## Почему не квадрат разницы {#почему-не-квадрат}

Самый естественный кандидат на роль штрафа — квадрат разницы, тот же, что и в школьной алгебре: $L = (\hat{y} - y)^2$. Чем дальше $\hat{y}$ от $y$, тем больше штраф, всё логично. Для многих задач (предсказать цену квартиры, например) это и правда рабочий выбор. Но для логистической регрессии он ломается — и вот почему.

Представь себе поверхность штрафа как рельеф холмов: по осям — веса модели (w) $w, b$, а высота — средний штраф на всех примерах. Обучение — это шарик, скатывающийся по этому рельефу в самую низкую точку. Если рельеф — это одна гладкая чаша (как суповая тарелка), шарик докатится до дна откуда угодно. Если рельеф — это горная гряда с несколькими ямами и холмами, шарик может провалиться в мелкую яму на полпути и там застрять — а настоящее дно, самая низкая точка, будет совсем в другом месте.

Квадрат разницы, если его посадить поверх сигмоиды (σ) $\hat{y} = \sigma(z)$, как раз и создаёт такую волнистую гряду вместо одной чаши: сигмоида (σ) сама по себе нелинейно сжимает числа, и когда квадрат разницы применяется к её результату, итоговая поверхность штрафа перестаёт быть гладкой чашей и обзаводится лишними ямами. Спуск, о котором пойдёт речь в [следующей статье](/notes/gradient-descent-intro/), может застрять в одной из них — далеко от лучшего возможного набора весов (w).

Нужна другая функция — такая, чтобы поверхность среднего штрафа осталась одной чашей. Эта функция — кросс-энтропия.

Если можешь пересказать: квадрат разницы поверх сигмоиды (σ) даёт волнистый рельеф с ложными ямами вместо одной чаши, — листай дальше.

## Кросс-энтропия: штраф по частям {#кросс-энтропия}

**Кросс-энтропия** — стандартный loss (L) для логистической регрессии:

$$L(\hat{y}, y) = -\big[\, y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \,\big]$$

Выглядит громоздко, но правильный ответ (y) $y$ всегда либо 0, либо 1 — и в каждом из двух случаев одно из слагаемых обнуляется. Разберём по отдельности.

**Случай $y = 1$** (правильный ответ (y) — «да»). Второе слагаемое умножается на $(1 - 1) = 0$ и исчезает целиком:

$$L = -\log(\hat{y})$$

Логарифм здесь ($\log$ — натуральный, через число $e \approx 2.718$) отвечает на вопрос «в какую степень возвести $e$, чтобы получить число в скобках». Важное для интуиции свойство: чем ближе $\hat{y}$ к единице, тем ближе $\log(\hat{y})$ к нулю, а чем ближе $\hat{y}$ к нулю, тем сильнее $\log(\hat{y})$ улетает в минус бесконечность. Минус спереди переворачивает знак — штраф положительный и растёт без границ при уверенной ошибке.

Прежде чем считать: как думаешь, при $y=1$ и $\hat{y} = 0.99$ (модель почти уверена в правильном ответе) штраф будет ближе к 0 или к 1?

Проверим числом: $y = 1$, $\hat{y} = 0.99$ (модель почти угадала):

$$L = -\log(0.99) = 0.0101$$

Штраф крошечный, как и ожидалось. А если модель уверенно ошиблась — $y = 1$, но $\hat{y} = 0.01$:

$$L = -\log(0.01) = 4.6052$$

Штраф в 450 раз больше — хотя расстояние от предсказания до правильного ответа изменилось всего с $0.01$ до $0.99$, то есть выросло «всего» в сто раз, а не в 450. Это и есть смысл логарифма в формуле: он делает уверенную ошибку непропорционально дорогой, а не просто пропорционально далёкой.

**Случай $y = 0$** (правильный ответ (y) — «нет»). Теперь исчезает первое слагаемое ($y \log(\hat{y}) = 0 \cdot \log(\hat{y}) = 0$):

$$L = -\log(1 - \hat{y})$$

Логика зеркальная: если модель уверенно говорит «нет» ($\hat{y}$ близко к нулю), $1 - \hat{y}$ близко к единице, $\log(1-\hat{y})$ близко к нулю — штраф маленький. Числом: $y = 0$, $\hat{y} = 0.1$ (модель почти уверена, что ответ «нет», и права):

$$L = -\log(1 - 0.1) = -\log(0.9) = 0.1054$$

А если модель уверенно ошиблась в другую сторону — $y = 0$, но $\hat{y} = 0.99$:

$$L = -\log(1 - 0.99) = -\log(0.01) = 4.6052$$

Ровно тот же огромный штраф, что и в зеркальном случае выше — формула симметрична относительно того, какой ответ (y) правильный.

Мини-квиз: пусть $y = 1$, а модель совсем не уверена и дала $\hat{y} = 0.5$. Чему равен штраф?

<details>
<summary>Ответ</summary>

$L = -\log(0.5) = 0.6931$. Число не крошечное и не огромное — ровно посередине между «уверенно прав» ($\approx 0$) и «уверенно неправ» (уходит в бесконечность). Модель, которая всегда отвечает 0.5, получает одинаковый штраф $0.6931$ на любом примере независимо от $y$ — она ничего не «знает» об ответе, и формула это честно отражает.

</details>

Если можешь пересказать: при $y=1$ штраф (L) — это $-\log(\hat{y})$, при $y=0$ — это $-\log(1-\hat{y})$; в обоих случаях уверенный правильный ответ почти бесплатен, уверенная ошибка стремится к бесконечности, — листай дальше.

## От штрафа к функции стоимости {#функция-стоимости}

Loss $L(\hat{y}, y)$ (L) измеряет ошибку **одного** примера. Но обучающих примеров обычно тысячи, и модель должна быть хороша на всех сразу, а не на одном. Естественный способ свести много чисел в одно — усреднить:

$$J(w, b) = \frac{1}{m} \sum_{i=1}^{m} L(\hat{y}^{(i)}, y^{(i)})$$

Расшифровка по частям. $m$ — количество обучающих примеров. Верхний индекс в скобках, $(i)$, — номер примера (не степень: $\hat{y}^{(2)}$ значит «предсказание для второго примера», а не «предсказание в квадрате»). $\Sigma$ (сигма) — компактная запись «сложить»: взять loss первого примера, прибавить loss второго, … прибавить loss $m$-го. Всю эту сумму делим на $m$ — получаем среднее арифметическое всех штрафов, ровно так же, как считают средний балл по оценкам за много контрольных.

$J(w, b)$ называют **функцией стоимости** (J) (cost function) — в отличие от loss (L), который штрафует один пример, cost (J) штрафует всю модель целиком, при её текущих весах $w$ (w) и $b$ (b). Разница терминов простая: **loss** (L) — «как плохо на этой картинке», **cost** (J) — «как плохо в среднем на всём наборе». Обучение — это поиск таких $w, b$, при которых $J$ минимальна.

Числовой пример. Три примера, модель на всех дала $\hat{y} = 0.7$, а правильные ответы — $y = 1,\; 0,\; 1$:

$$L(0.7, 1) = -\log(0.7) = 0.357, \quad L(0.7, 0) = -\log(0.3) = 1.204, \quad L(0.7, 1) = 0.357$$

$$J = \frac{0.357 + 1.204 + 0.357}{3} = \frac{1.918}{3} = 0.639$$

Средний штраф — $0.639$. Именно это число обучение и пытается уменьшить, подбирая $w$ (w) и $b$ (b).

Если можешь пересказать: J — среднее loss'ов (L) по всем m примерам, loss про один пример, cost про весь набор, — листай дальше.

**Мини-квиз:** в чём разница между функцией затрат (cost) и функцией потерь (loss) для логистической регрессии?

<details>
<summary>Ответ</summary>

Функция потерь (loss, $L$) вычисляет ошибку для **одного** обучающего примера; функция затрат (cost, $J$) — это **среднее** значение функции потерь по всему обучающему набору ($J = \frac{1}{m}\sum_i L^{(i)}$). Это не два случайных синонима и не одна и та же функция под разными именами — они относятся к разным масштабам: loss смотрит на одну картинку, cost — на весь датасет сразу.

</details>

## Числовой пример: четверо друзей {#четверо-друзей}

Представь четверых друзей, которые гадают, пойдёт ли дождь. Трое отвечают осторожно и почти угадывают. Четвёртый уверенно говорит «дождя не будет» — и дождь идёт. Средний «штраф за неправоту» всей четвёрки взлетает не из-за троих аккуратных, а из-за одного уверенного и неправого. Это и есть механика $J$: она реагирует на худший случай сильнее, чем кажется на глаз.

Прежде чем читать дальше: как думаешь, если исправить одного из троих аккуратных друзей до идеального ответа, или чуть подправить уверенно неправого четвёртого — что сильнее снизит средний штраф $J$? Прикинь на глаз, а потом проверь на числах ниже.

Мини-проверка: пусть loss на трёх примерах — $0.1$, $0.15$, $0.2$, а на четвёртом (уверенная ошибка) — $3.0$. Что сильнее снизит $J$: исправить третий пример до loss $0.1$, или исправить четвёртый до loss $2.0$?

<details>
<summary>Ответ</summary>

Исправление четвёртого снижает $J$ сильнее. У третьего примера loss падает с $0.2$ до $0.1$ — разница $0.1$, вклад в $J$ равен $0.1 / 4 = 0.025$. У четвёртого loss падает с $3.0$ до $2.0$ — разница $1.0$, вклад в $J$ равен $1.0 / 4 = 0.25$, в 10 раз больше. Даже небольшое улучшение самой уверенной ошибки весит намного больше, чем полное исправление аккуратного примера.

</details>

Твоя очередь: возьми любое число от $0.01$ до $0.1$, подставь его как loss третьего примера вместо $0.2$, и пересчитай $J$ для четырёх примеров ($0.1$, $0.15$, твоё число, $3.0$).

Полный числовой пример: четыре примера, у трёх модель угадывает прилично ($\hat{y} = 0.9,\; 0.85,\; 0.8$, все $y=1$), а четвёртый — уверенная ошибка ($y=1$, но $\hat{y} = 0.05$). Loss на каждом ($-\log \hat{y}$, поскольку везде $y=1$): $-\log 0.9 = 0.1054$, $-\log 0.85 = 0.1625$, $-\log 0.8 = 0.2231$, $-\log 0.05 = 2.9957$. Сумма — $3.4868$, делим на 4 примера: $J = 0.8717$.

![Столбцы loss четырёх примеров: три низких (0.1054, 0.1625, 0.2231 при ŷ=0.9, 0.85, 0.8), один резко выше (2.9957 при ŷ=0.05); пунктирная линия — среднее J=0.8717, близкое к худшему примеру](/notes/cost-function/loss-bars.png)

Замени четвёртый пример на такую же по силе, но правильно направленную уверенность ($\hat{y} = 0.8$, loss $= 0.2231$, как у третьего). Новая сумма — $0.7142$, делим на 4: $J = 0.1785$. Одна замена — и $J$ снижается почти в 5 раз, хотя три остальных примера вообще не изменились.

Практический вывод: следить за одним числом $J$ мало — стоит проверять и худшие ошибки отдельно, иначе одна уверенная ошибка маскируется под приемлемым средним.

Если можешь пересказать: один уверенно неправый пример сдвигает среднее J гораздо сильнее, чем несколько аккуратных ошибок, — значит, тема усвоена.

## Что дальше {#что-дальше}

Мы разобрали, откуда берётся число $J$ (J), которое обучение пытается уменьшить: loss на каждом примере через кросс-энтропию, затем усреднение по всем $m$ примерам. Осталось решить главный вопрос — как именно менять веса $w, b$ (w, b), чтобы $J$ действительно уменьшалось. Это тема следующей статьи — [«Градиентный спуск»](/notes/gradient-descent-intro/).
