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

Нейронные сети могут выполнять несколько задач: от прогнозирования непрерывных значений, таких как ежемесячные расходы, до классификации дискретных классов, таких как кошки и собаки. Для каждой отдельной задачи потребуются разные типы потерь, поскольку выходной формат будет отличаться. Для очень специализированных задач нам решать, как мы хотим определить потерю.

С очень упрощенной точки зрения функция потерь (J) может быть определена как функция, которая принимает два параметра:

  1. Прогнозируемый результат
  2. Истинный выход

Эта функция по сути вычислит, насколько плохо наша модель, сравнивая то, что модель прогнозирует, с фактическим значением, которое она должна выдать. Если Y_pred очень далеко от Y, значение потерь будет очень высоким. Однако, если оба значения почти одинаковы, значение потерь будет очень низким. Следовательно, нам необходимо сохранить функцию потерь, которая может эффективно наказывать модель, пока она обучается на наборе данных.

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

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

Теперь давайте рассмотрим классификацию как задачу и поймем, как в этом случае работают функции потерь.

Классификационные потери

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

Количество узлов выходного слоя будет зависеть от количества классов, присутствующих в данных. Каждый узел будет представлять один класс. Значение каждого выходного узла по существу представляет вероятность того, что этот класс является правильным классом.

Pr(Class 1) = Probability of Class 1 being the correct class

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

Бинарная классификация

В двоичной классификации на выходном слое будет только один узел, даже если мы будем делать прогноз между двумя классами. Чтобы получить результат в формате вероятности, нам нужно применить функцию активации. Поскольку для вероятности требуется значение от 0 до 1, мы будем использовать сигмовидную функцию, которая может сжать любое реальное значение до значения от 0 до 1.

По мере того, как вход на сигмоиде становится больше и стремится к плюсовой бесконечности, выходной сигнал сигмоида будет стремиться к 1. А по мере того, как входной сигнал становится меньше и стремится к отрицательной бесконечности, выход будет стремиться к 0. Теперь мы гарантированно всегда получаем значение от 0 до 1, и это именно то, что нам нужно, поскольку нам нужны вероятности.

Если результат выше 0,5 (вероятность 50%), мы будем считать, что он попадает в положительный класс, а если он ниже 0,5, мы будем считать, что он попадает в отрицательный класс. . Например, если мы обучаем сеть для классификации кошек и собак, мы можем назначить собакам положительный класс, и выходное значение в наборе данных для собак будет 1, аналогично кошки будут назначен отрицательный класс, а выходным значением для кошек будет 0.

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

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

Loss = -log(Y_pred)

И когда нам нужно предсказать отрицательный класс (Y = 0), мы будем использовать

Loss = -log(1-Y_pred)

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

Мы можем математически представить всю функцию потерь в одно уравнение следующим образом:

Эта функция потерь также называется Log Loss. Так устроена функция потерь для нейронной сети с двоичной классификацией. Теперь давайте посмотрим, как определяется потеря для мультиклассовой классификационной сети.

Мультиклассовая классификация

Мультиклассовая классификация подходит, когда нам нужно, чтобы наша модель каждый раз предсказывала один возможный выход класса. Теперь, поскольку мы все еще имеем дело с вероятностями, может иметь смысл просто применить сигмоид ко всем выходным узлам, чтобы мы получали значения от 0 до 1 для всех выходов, но с этим есть проблема. Когда мы рассматриваем вероятности для нескольких классов, нам необходимо убедиться, что сумма всех индивидуальных вероятностей равна единице, поскольку именно так определяется вероятность. Применение сигмоида не гарантирует, что сумма всегда равна единице, поэтому нам нужно использовать другую функцию активации.

В данном случае мы используем функцию активации softmax. Эта функция гарантирует, что все выходные узлы имеют значения от 0 до 1, а сумма всех значений выходных узлов всегда равна 1. Формула для softmax следующая:

Давайте представим это на примере:

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

Так почему мы должны передавать каждое значение через экспоненту перед их нормализацией? Почему мы не можем просто нормализовать сами ценности? Это связано с тем, что цель softmax - убедиться, что одно значение очень высокое (близко к 1), а все другие значения очень низкие (близко к 0). Softmax использует экспоненту, чтобы убедиться, что это произойдет. А затем мы нормализуем, потому что нам нужны вероятности.

Теперь, когда наши выходные данные имеют правильный формат, давайте посмотрим, как мы настраиваем для этого функцию потерь. Хорошо то, что функция потерь по сути такая же, как у двоичной классификации. Мы просто применим потерю журнала к каждому узлу вывода по отношению к его соответствующему целевому значению, а затем найдем его сумму по всем узлам вывода.

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

Классификация по нескольким этикеткам

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

Для этого мы не можем использовать softmax, потому что softmax всегда заставляет только один класс становиться 1, а другие классы становиться 0. Таким образом, вместо этого мы можем просто сохранить сигмоид на всех значениях выходных узлов, поскольку мы пытаемся предсказать каждый класс индивидуальная вероятность.

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

Теперь, когда мы рассмотрели классификацию, перейдем к регрессии.

Потеря регрессии

В регрессии наша модель пытается предсказать непрерывное значение. Вот некоторые примеры регрессионных моделей:

  • Прогноз цен на жилье
  • Прогнозирование возраста человека

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

Самая популярная функция потерь, которую мы используем для регрессионных моделей, - это функция потерь среднеквадратичной ошибки. Здесь мы просто вычисляем квадрат разницы между Y и Y_pred и усредняем его по всем данным. Предположим, есть n точек данных:

Здесь Y_i и Y_pred_i относятся к i-му значению Y в наборе данных и соответствующему Y_pred из нейронной сети для тех же данных.

На этом статья завершается. Надеюсь, теперь у вас есть более глубокое понимание того, как настраиваются функции потерь для различных задач в глубоком обучении. Спасибо за чтение!

Прочтите больше статей о глубоком обучении на https://deeplearningdemystified.com