Что такое функции потерь?

После публикации о функциях активации мы перейдем ко второй части, функции потери или target для нейронных сетей

Блокнот, содержащий весь код, доступен здесь: GitHub вы найдете код для создания различных типов наборов данных и нейронных сетей для проверки функций потерь.

Чтобы понять, что такое функция потерь, вот цитата о процессе обучения:

Способ измерить, хорошо ли выполняет алгоритм - это необходимо для определения расстояния между текущим выходом алгоритма и его ожидаемым выходом. Измерение используется в качестве сигнала обратной связи для настройки работы алгоритма. Этот шаг корректировки мы называем обучением.
Франсуа Шоле, Глубокое обучение с помощью Python (2017), Мэннинг, глава 1, стр. 6

Функция потерь - это функция, которая вычисляет расстояние между текущим выходом алгоритма и ожидаемым выходом. Это метод оценки того, как ваш алгоритм моделирует данные. Его можно разделить на две группы. Один для классификации (дискретные значения, 0,1,2…), а другой для регрессии (непрерывные значения).

Какие функции потерь обычно используются для обучения нейронной сети?

Содержание

  • Кросс-энтропия
  • Потеря журнала
  • Экспоненциальный убыток
  • Потеря шарнира
  • Потеря дивергенции Кульбака-Лейблера
  • Среднеквадратичная ошибка (MSE - L2)
  • Средняя абсолютная ошибка (MAE - L1)
  • Huber Loss

Эти пакеты необходимы:

%matplotlib inline
import keras.backend as K
import numpy as np
import matplotlib.pyplot as plt

Классификация

Кросс-энтропия

Эта функция пришла из теории информации, цель которой состоит в том, чтобы измерить разницу между двумя средними значениями количества битов распределения информации. Кросс-энтропия как функция логических потерь (не одно и то же, но они измеряют одно и то же) вычисляет разницу между двумя функциями распределения вероятностей.

Энтропия - это количество битов, необходимых для передачи случайно выбранного события из распределения вероятностей. Асимметричное распределение имеет низкую энтропию, тогда как распределение, в котором события имеют равную вероятность, имеет большую энтропию.

В теории информации нам нравится описывать «неожиданность» события. События с низкой вероятностью более удивительны, поэтому содержат больший объем информации. Тогда как распределения вероятностей, в которых события равновероятны, более удивительны и имеют большую энтропию.

- Неправильное распределение вероятностей (неудивительно): низкая энтропия.

- Сбалансированное распределение вероятностей (удивительно): высокая энтропия.

Кросс-энтропия - это класс функции потерь, наиболее часто используемый в машинном обучении, потому что это приводит к лучшим моделям обобщения и более быстрому обучению.

Перекрестная энтропия может использоваться с задачами бинарной и мультиклассовой классификации (многие классы с одной меткой, отличные от многих классов с множественными метками, называемыми многоуровневой классификацией).

Типы кросс-энтропии:

  • Бинарная кросс-энтропия: для задачи бинарной классификации
  • Категориальная кросс-энтропия: двоичная и мультиклассовая проблема, метка должна быть закодирована как категориальное представление с горячим кодированием (для 3 классов: [0, 1, 0], [1,0,0]…)
  • Разреженная кросс-энтропия: бинарная и мультиклассовая проблема (метка представляет собой целое число - 0 или 1 или… n, зависит от количества меток)

Диапазон значений для этого класса функции потерь:

  • 0,00: идеальные вероятности.
  • ‹0,02: большая вероятность
  • ‹0,05: в хорошем смысле
  • ‹0,20: отлично
  • ›0,30: неплохо.
  • 1,00: ад
  • ›2,00 Что-то не работает

Потеря журнала

Log-Loss - это двоичная кросс-энтропия с точностью до коэффициента 1 / log (2). Эта функция потерь является выпуклой и линейно растет для отрицательных значений (менее чувствительна к выбросам). Распространенным алгоритмом, использующим логарифмическую потерю, является логистическая регрессия.

Отрицательное логарифмическое правдоподобие для задач двоичной классификации часто сокращается до просто «логарифмической потери» как функции потерь, полученной для логистической регрессии.

- логарифм потери = отрицательная логарифм правдоподобия согласно распределению вероятностей Бернулли

Для задач классификации «потеря журнала», «перекрестная энтропия» и «отрицательная логарифм правдоподобия» используются взаимозаменяемо.

В более общем смысле термины «перекрестная энтропия» и «отрицательная логарифмическая вероятность» взаимозаменяемы в контексте функций потерь для моделей классификации.

Экспоненциальный убыток

Экспоненциальная потеря была разработана в начале алгоритма Adaboost, который жадно оптимизировал его. Математическая форма:
exp_loss = 1 / m * sum (exp (-y * f (x)))

И можно закодировать так:

def exponential_loss(y_pred, y_true):
    return np.mean(np.exp(- y_pred * y_true))

Результат можно увидеть ниже:

Потеря шарнира

Функция потерь шарнира была разработана для корректировки гиперплоскости алгоритма SVM в задаче классификации. Цель состоит в том, чтобы наложить различные штрафы в точке, которая неправильно спрогнозирована или слишком закрыта от гиперплоскости.

Математическая формула: Hinge = max (0, 1-y * f (x)) и соответствующий код:

def Hinge(y_pred, y_true):
    return np.max([0., 1. - y_pred * y_true])

Результат этого уравнения выпуклый, но недифференцируемый, для его оптимизации требуется алгоритм субградиента.

Результат показан ниже:

Потеря дивергенции Кульбака-Лейблера

Дивергенция KL - это оценка двух различных функций распределения вероятностей. Разница KL между PDF для q (x) и PDF для p (x) отмечена KL (Q || P), где || означает дивергенцию (это не симметричный KL (P || Q)! = KL (Q || P)).

KL (Q || P) = -сумма (q (x) * log (p (x) / q (x)) или сумма (q (x) * log (q (x) / p (x))

Сумма для дискретного случая и интеграла для непрерывного. Это означает, что расхождение увеличивается, если PDF для q (x) велик, а PDF для p (x) мала для тех же данных. В машинном обучении это можно представить как разницу между предсказанием и истиной.

В приведенном ниже коде показано, как использовать расхождение KL с предсказаниями и достоверностью:

def kl_divergence(y_true, y_pred):
    return y_true * np.log(y_true / y_pred)

Здесь можно показать простую визуализацию:

По существу, KL-дивергенция часто называется «относительной энтропией».

- Кросс-энтропия: среднее количество общих битов для представления события из Q вместо P.

- Относительная энтропия (расхождение KL): среднее количество дополнительных битов для представления события из Q вместо P.

Регрессия

Потеря среднеквадратичной ошибки (также называемая регуляризацией L2)

Это квадратная разница между текущим выходом y_pred и ожидаемым выходом y_true, деленная на количество выходных данных. Функция MSE очень чувствительна к выбросам потому что разница - это квадрат, который придает большее значение выбросам. Если бы нам нужно было предсказать одно значение для всех целей, прогноз должен быть средним.

Это выражается так:

def mean_square_error(y_true, y_pred):
    return K.mean(K.square(y_true-y_pred), axis=-1)

Мы можем визуализировать поведение функции MSE, сравнивая диапазон значений (здесь от -10000 до 10000) с постоянным значением (здесь 100):

Поведение представляет собой квадратичную кривую, особенно полезную для алгоритма градиентного спуска. К минимуму градиент будет меньше. MSE очень полезен, если выбросы важны для проблемы, если выбросы представляют собой шумные или неверные данные или неверные меры, вам следует использовать функцию потерь MAE.

Средняя абсолютная потеря ошибки (также называемая регуляризацией L1)

В отличие от предыдущей функции потерь квадрат заменяется абсолютным значением. Эта разница имеет большое влияние на поведение функции потерь, которая имеет V-образную форму. Градиент одинаков в каждой точке, даже когда значения близки к минимумам (может создать скачок). Ему необходимо динамически изменять скорость обучения, чтобы уменьшить шаг до минимума. Функция MAE более устойчива к выбросам, потому что она основана на абсолютном значении по сравнению с квадратом MSE. Это как медиана: выбросы не могут повлиять на ее поведение.

Вы можете легко реализовать это так:

def mean_square_error(y_true, y_pred):
    return K.mean(K.abs(y_true-y_pred), axis=-1)

Мы можем визуализировать поведение функции MAE, сравнивая диапазон значений (здесь от -10000 до 10000) с постоянным значением (здесь 100):

Среднеквадратичная логарифмическая ошибка

Huber Loss

Huber Loss - это комбинация MAE и MSE (L1-L2), но она зависит от дельты вызова дополнительного параметра, которая влияет на форму функции потерь. Этот параметр требует точной настройки алгоритма. Когда значения большие (далеко от минимумов), функция имеет поведение MAE, близкое к минимумам, функция ведет себя как MSE. Таким образом, параметр дельта - это ваша чувствительность к выбросам. Математическая форма потери Хубера:

Мы можем реализовать эту функцию двумя способами. Здесь я представляю функцию, в которой все блоки являются явными.

# custom huber loss function 
def huber_loss_error(y_true, y_pred, delta=0.1):
    res = []
    for i in zip(y_true, y_pred):
        if abs(i[0]-i[1])<=delta:
            res.append(0.5*((i[0]-i[1])**2))
        else:
            res.append(delta*((abs(i[0]-i[1]) )-0.5*(delta**2)))
 # can also be write as:
 # np.where(np.abs(y_true-y_pred) < delta, 0.5*(y_true-y_pred)**2 , delta*(np.abs(y_true-y_pred)-0.5*delta))
    return res # np.sum(res)

Мы можем визуализировать поведение функции потерь Хубера, сравнивая диапазон значений (здесь от -10 до 10) с постоянным значением (здесь 0):

Потери Хубера позволяют иметь большой градиент для больших чисел, но убывающий градиент, когда значения становятся меньше. Но эта функция требует точной настройки дельты, но требует больших вычислительных ресурсов. Чтобы избежать этого, вы можете использовать Log-Cosh Loss (не объясняется в этой статье, но вы можете увидеть разницу между ними на следующем графике).

Использованная литература: