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

Модель логистической регрессии выдаёт число yˆ (ŷ) — предсказание, «насколько это кот» на шкале от 0 до 1 (подробный вывод yˆ=σ(wTx+b) — в статье «Бинарная классификация», но для этой статьи достаточно и этого). Есть и правильный ответ y (y) — 0 или 1. Модель хороша, если yˆ близко к y на всех примерах сразу. Вопрос этой статьи: как превратить «близко или не близко» в одно число, которое можно уменьшать?

Штраф за один пример

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

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

Почему не квадрат разницы

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

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

Квадрат разницы, если его посадить поверх сигмоиды (σ) yˆ=σ(z), как раз и создаёт такую волнистую гряду вместо одной чаши: сигмоида (σ) сама по себе нелинейно сжимает числа, и когда квадрат разницы применяется к её результату, итоговая поверхность штрафа перестаёт быть гладкой чашей и обзаводится лишними ямами. Спуск, о котором пойдёт речь в следующей статье, может застрять в одной из них — далеко от лучшего возможного набора весов (w).

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

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

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

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

L(yˆ,y)=−[ylog⁡(yˆ)+(1−y)log⁡(1−yˆ)]

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

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

L=−log⁡(yˆ)

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

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

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

L=−log⁡(0.99)=0.0101

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

L=−log⁡(0.01)=4.6052

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

Случай y=0 (правильный ответ (y) — «нет»). Теперь исчезает первое слагаемое (ylog⁡(yˆ)=0⋅log⁡(yˆ)=0):

L=−log⁡(1−yˆ)

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

L=−log⁡(1−0.1)=−log⁡(0.9)=0.1054

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

L=−log⁡(1−0.99)=−log⁡(0.01)=4.6052

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

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

Ответ

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

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

От штрафа к функции стоимости

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

J(w,b)=1m∑i=1mL(yˆ(i),y(i))

Расшифровка по частям. m — количество обучающих примеров. Верхний индекс в скобках, (i), — номер примера (не степень: yˆ(2) значит «предсказание для второго примера», а не «предсказание в квадрате»). Σ (сигма) — компактная запись «сложить»: взять 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 минимальна.

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

L(0.7,1)=−log⁡(0.7)=0.357,L(0.7,0)=−log⁡(0.3)=1.204,L(0.7,1)=0.357

J=0.357+1.204+0.3573=1.9183=0.639

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

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

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

Ответ

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

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

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

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

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

Ответ

Исправление четвёртого снижает 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 раз больше. Даже небольшое улучшение самой уверенной ошибки весит намного больше, чем полное исправление аккуратного примера.

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

Полный числовой пример: четыре примера, у трёх модель угадывает прилично (yˆ=0.9,0.85,0.8, все y=1), а четвёртый — уверенная ошибка (y=1, но yˆ=0.05). Loss на каждом (−log⁡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, близкое к худшему примеру

Замени четвёртый пример на такую же по силе, но правильно направленную уверенность (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 действительно уменьшалось. Это тема следующей статьи — «Градиентный спуск».