Понимать наиболее распространенные функции потерь и когда использовать каждую из них.
Функции потерь играют важную роль в машинном обучении, поскольку они определяют процесс обучения модели и определяют ее цель.
Существует большое количество доступных функций потерь, и выбор правильной имеет решающее значение для обучения точной модели. Различные варианты функции потерь могут привести к различным моделям классификации или регрессии.
В этой статье мы обсудим наиболее часто используемые функции потерь, как они работают, их плюсы и минусы и когда использовать каждую из них.
Что такое функция потерь?
Напомним, что в задачах машинного обучения с учителем нам дается обучающий набор из n помеченных образцов: D = {(x₁, у₁), (x₂, y₂), … , (xₙ, уₙ)}, где xᵢ представляет функции образца i и yᵢ представляет метку этого образца. Наша цель — построить модель, предсказания которой максимально приближены к истинным меткам.
Функция потерь измеряет ошибку предсказания модели для данной выборки, т. е. разницу между предсказанным значением модели и истинным значением для этой выборки. Он принимает два параметра: истинную метку выборки y и прогноз модели ŷ:
В процессе обучения модели мы настраиваем ее параметры так, чтобы минимизировать функцию потерь на заданных обучающих выборках.
Обратите внимание, что функция потерьвычисляет ошибку для выборки, а функция стоимости вычисляет ошибку для всего набора данных (хотя эти два термина иногда используются взаимозаменяемо).
Желаемые свойства функции потерь
В идеале мы хотели бы, чтобы функция потерь обладала следующими свойствами:
- Функция потерь должна отражать цель, которую пытается достичь модель. Например, в задачах регрессии наша цель — свести к минимуму различия между прогнозами и целевыми значениями, а в классификации наша цель — свести к минимуму количество ошибок неправильной классификации.
- Непрерывный и дифференцируемый всюду. Большинство алгоритмов оптимизации, таких как градиентный спуск, требуют, чтобы функция потерь была дифференцируемой.
- Выпуклый. Выпуклая функция имеет только одну глобальную точку минимума, поэтому такие методы оптимизации, как градиентный спуск, гарантированно возвращают глобально оптимальное решение. На практике это свойство труднодостижимо, и большинство функций потерь невыпуклы (т. е. имеют несколько локальных минимумов).
- Симметричный, т. е. ошибка выше цели должна вызывать те же потери, что и та же ошибка ниже цели.
- Быстро вычислять
Функции потерь и максимальное правдоподобие
Многие функции потерь, используемые в машинном обучении, могут быть получены из принципа максимального правдоподобия (см. мою предыдущую статью для объяснения максимального правдоподобия).
При оценке максимального правдоподобия (MLE) мы пытаемся найти модель с параметрами θ, которая максимизирует вероятность наблюдаемых данных с учетом модели: P(D|θ). Чтобы упростить функцию правдоподобия, мы обычно логарифмируем ее, а затем пытаемся максимизировать логарифмическую вероятность: log P(D|θ) .
Следовательно, мы можем определить функцию потерь для данной выборки (x, y) как отрицательную логарифмическую вероятность наблюдения ее истинной метки с учетом предсказания нашей модели:
Поскольку отрицательный логарифм является монотонно убывающей функцией, максимизация правдоподобия эквивалентна минимизации потерь.
Обратите внимание: чтобы использовать этот метод для определения функций потерь, нам нужно предположить, что набор данных генерируется из некоторого известного распределения вероятностей.
В следующих разделах мы обсудим наиболее распространенные функции потерь, используемые в различных типах задач (регрессия, бинарная классификация и мультиклассовая классификация).
Проблемы регрессии
В задаче регрессии и целевая метка, и прогноз модели принимают непрерывные значения. Три наиболее часто используемые функции потерь в задачах регрессии: квадрат потери, абсолютная потеря и потеря Хубера.
Квадратная потеря
Квадратная потеря определяется как квадрат разницы между целевой меткой и ее прогнозируемым значением:
Эта функция потерь используется в обычном методе наименьших квадратов (OLS), который является наиболее распространенным методом решения задач линейной регрессии.
Плюсы:
- Непрерывный и дифференцируемый всюду
- Выпуклая (имеет только один глобальный минимум)
- Легко вычислить
- В предположении, что метки имеют гауссовский шум, квадрат потерь представляет собой отрицательное максимальное правдоподобие модели с учетом данных. Доказательство этого утверждения вы можете найти в моей предыдущей статье.
Минусы:
- Чувствителен к выбросам из-за возведения ошибок в квадрат. Небольшое количество отсчетов, удаленных от других отсчетов, может привести к большим изменениям в модели (как будет продемонстрировано позже).
Абсолютная потеря
Абсолютная потеря определяется как абсолютная разница между истинной меткой и прогнозом модели:
Плюсы:
- Не слишком подвержен выбросам
- Легко вычислить
Минусы:
- Недифференцируемый в 0, что затрудняет использование методов оптимизации, таких как градиентный спуск.
- Не имеет интерпретации максимального правдоподобия
Хубер Лосс
Убыток Хубера представляет собой комбинацию квадрата убытка и абсолютного убытка. Для значений потерь, которые меньше предопределенного параметра с именем δ, используется квадрат ошибки, а для значений больше δ — абсолютная ошибка.
Математическое определение потери Хубера:
δ обычно имеет значение 1.
Потеря Хубера обычно используется в глубоком обучении, где она помогает избежать проблемы взрывающегося градиента из-за ее нечувствительности к большим ошибкам.
Плюсы:
- Непрерывный и дифференцируемый всюду
- Менее чувствителен к выбросам, чем квадрат потери
Минусы:
- Медленнее вычислять
- Требуется настройка гиперпараметра δ
- Не имеет интерпретации максимального правдоподобия
На следующем графике показаны три функции регрессионных потерь:
Пример Scikit-Learn
Класс SGDRegressor подбирает модель линейной регрессии к заданному набору данных, используя стохастический градиентный спуск (SGD). Его параметр loss можно использовать для выбора функции потерь для оптимизации. Возможные варианты этого параметра:
- squared_error(квадрат потери). Это опция по умолчанию.
- Хубер(Потеря Хубера)
- epsilon_intensive (функция потерь, используемая в регрессии опорных векторов)
Давайте сравним квадратичные функции потерь и функции потерь Хьюбера на примере набора данных, который содержит выброс.
Сначала мы определяем наш набор данных:
x = np.array([0.5, 1.8, 2.4, 3.5, 4.2, 4.8, 5.8, 6.1, 7.2, 8.7, 10]) y = np.array([0.1, 0.2, 0.3, 0.4, 0.7, 1, 0.9, 1.2, 1.4, 1.8, 10])
Давайте построим точки данных:
def plot_data(x, y): plt.scatter(x, y) plt.xlabel('$x$') plt.ylabel('$y$') plt.grid() plot_data(x, y)
Ясно, что точка (10, 10) является выбросом.
Затем мы подгоняем к этому набору данных две модели SGDRegressor: одну с функцией квадратичных потерь, а другую с потерями Хубера.
from sklearn.linear_model import SGDRegressor X = x.reshape(-1, 1) # Convert x to a matrix with one column reg = SGDRegressor(loss='squared_error') reg.fit(X, y) reg2 = SGDRegressor(loss='huber') reg2.fit(X, y)
Давайте построим две линии регрессии, найденные этими моделями:
def plot_regression_line(x, y, w0, w1, color, label): p_x = np.array([x.min(), x.max()]) p_y = w0 + w1 * p_x plt.plot(p_x, p_y, color, label=label) plot_data(x, y) plot_regression_line(x, y, reg.intercept_, reg.coef_[0], 'r', label='Squared loss') plot_regression_line(x, y, reg2.intercept_, reg2.coef_[0], 'm', label='Huber loss') plt.legend()
Совершенно очевидно, что на модель, обученную с квадратичными потерями, гораздо больше повлиял выброс, чем на модель, обученную с потерями Хьюбера.
Проблемы бинарной классификации
В задачах бинарной классификации основные метки истинности являются бинарными (1/0 или 1/-1). Прогнозируемое значение модели может быть либо бинарным (жесткая метка), либо оценкой вероятности того, что данная выборка принадлежит к положительному классу (мягкая метка).
Примеры моделей классификации, которые предоставляют только жесткие метки, включают машины опорных векторов (SVM) и K-ближайших соседей (KNN), а такие модели, как логистическая регрессия и нейронные сети (с сигмовидным выходом), также обеспечивают оценку вероятности.
0–1 поражение
Простейшей функцией потерь является функция потерь с нулевым значением единицы (также называемая ошибкой неправильной классификации):
I – это индикаторная функция, которая возвращает 1, если входные данные верны, и 0 в противном случае.
Для каждой выборки, которую классификатор делает неправильно (неправильно классифицирует), возникает потеря 1, тогда как правильно классифицированные выборки приводят к 0 потерям.
Функция потерь 0–1 часто используется для оценки классификаторов, но бесполезна для руководства оптимизацией, поскольку она не дифференцируема и не непрерывна.
Потеря журнала
Логарифмическая потеря (также называемая логистической потерейили бинарной кросс-энтропийной потерей) используется для обучения моделей, которые предоставляют оценки вероятности класса, такие как логистическая регрессия.
Обозначим заданную моделью оценку вероятности принадлежности выборки к положительному классу через p:
Тогда потери журнала определяются как:
Как мы пришли к этой функции потерь? Мы снова воспользуемся принципом максимального правдоподобия. Более конкретно, мы покажем, что логарифмическая потеря представляет собой отрицательную логарифмическую вероятность в предположении, что метки имеют распределение Бернулли (распределение вероятностей бинарной случайной величины, которое принимает 1 с вероятностью p и 0 с вероятностью 1 - p). Математически это можно записать следующим образом:
Доказательство:
Учитывая модель данных (меток) в виде распределения Бернулли с параметром p, вероятность того, что образец принадлежит к положительному классу, равна просто p, т. е.
Точно так же вероятность того, что образец принадлежит к отрицательному классу, равна:
Мы можем записать эти два уравнения более компактно следующим образом:
Объяснение: когда y = 1, pʸ = p и (1 - p)¹⁻ʸ= 1, поэтому P(y|p) = p. Точно так же, когда y = 0, pʸ = 1 и (1 - p)¹⁻ʸ = 1 - p, поэтому P(y|p) = 1 - p.
Следовательно, логарифмическая вероятность данных равна:
Потеря журнала - это как раз минус этой функции!
Функция логарифмических потерь дифференцируема и выпукла, т. е. имеет единственный глобальный минимум.
Потеря шарнира
Потеря шарнира используется для обучения машин опорных векторов (SVM), где цель состоит в том, чтобы максимизировать запас области, которая разделяет два класса, при минимизации нарушений поля.
Потеря шарнира определяется следующим образом:
Обратите внимание, что ŷ здесь — исходный результат функции принятия решения классификатора, т. е. ŷ = wᵗx (SVM не дает оценок вероятности).
Когда y и ŷ имеют одинаковый знак (т. е. модель предсказывает правильный класс) и |ŷ| ≥ 1, потеря шарнира равна 0. Это означает, что правильно классифицированные образцы, находящиеся за пределами поля, не вносят вклада в потери (решение будет таким же, если эти образцы удалены). Однако для выборок, которые находятся внутри полей (|ŷ| ‹ 1), даже если прогноз модели верен, все равно будут небольшие потери. Когда y и ŷ имеют противоположные знаки, потери шарнира растут линейно с ŷ.
Более подробно методы опорных векторов будут рассмотрены в следующей статье.
На следующем графике показаны три функции потерь при классификации:
И логарифмические потери, и потери на петлях можно рассматривать как непрерывные приближения к потерям 0–1.
Проблемы многоклассовой классификации
В задачах классификации с несколькими классами целевой меткой является 1 из k классов. Метка обычно закодирована с использованием прямого кодирования, т. е. в виде двоичного k-мерного вектора y = (y₁, …, yₖ)ᵗ, где yᵢ = 1 для истинного класса i и 0 в других местах.
Вероятностный классификатор выводит для каждой выборки k-мерный вектор с вероятностными оценками каждого класса: p = (p₁, …, pₖ)ᵗ. Сумма этих вероятностей равна 1, т. е. p₁ + … + pₖ = 1.
Кросс-энтропийные потери
Функция потерь, используемая для обучения такого классификатора, называется кросс-энтропийной потерей, что является расширением потери журнала для случая с несколькими классами. Он определяется следующим образом:
Например, предположим, что у нас есть проблема с тремя классами, истинный класс нашей выборки — это класс 2 (т. е. y = [0, 1, 0]), а предсказание нашей модели — p = [0,3, 0,6, 0,1]. Тогда кросс-энтропийные потери, вызванные этим образцом, равны:
Чтобы увидеть, как потери кросс-энтропии обобщают потери журнала, обратите внимание, что в двоичном случае p₁ = 1 - p₀ и y₁ = 1 - y₀, поэтому получаем:
что в точности соответствует потере журнала для p = p₀ и y = y₀.
Подобно логарифмической потере, мы можем показать, что кросс-энтропийная потеря является отрицательным значением логарифмического правдоподобия модели в предположении, что метки выбираются из категориального распределения (обобщение распределения Бернулли на k возможные результаты).
Доказательство:
Учитывая модель данных (меток) в виде категориального распределения с вероятностями p = (p₁, …, pₖ), вероятность то, что данный образец принадлежит классу i, равно pᵢ:
Следовательно, вероятность того, что истинной меткой выборки является y, равна:
Объяснение: если правильным классом данной выборки является i, то yᵢ = 1, и для всех j ≠ i yⱼ = 0. Следовательно, P(y|p) = pᵢ, то есть вероятность того, что образец принадлежит к классу i. .
Следовательно, логарифмическая вероятность нашей модели:
Потеря кросс-энтропии — это как раз отрицательная величина этой функции!
Ключевые выводы
- В этой статье мы обсудили различные функции потерь и показали, как они выводятся из основных принципов, таких как максимальная вероятность.
- В задачах регрессии квадрат потерь является наиболее распространенной функцией потерь. Однако, если вы подозреваете, что ваш набор данных содержит выбросы, использование потерь Хубера может быть лучшим выбором.
- В задачах бинарной классификации выбор другой функции потерь приводит к другому классификатору (логистическая регрессия использует логарифмическую потерю, а SVM использует потерю шарнира).
- В задачах классификации с несколькими классами кросс-энтропийные потери являются наиболее распространенной функцией потерь и являются расширением логарифмических потерь на случай с несколькими классами.
Заключительные примечания
Все изображения, если не указано иное, принадлежат автору.
Примеры кода этой статьи можно найти на моем github: https://github.com/roiyeho/medium/tree/main/loss_functions
Спасибо за прочтение!