Один из наиболее частых вопросов, задаваемых во время собеседований по вопросам глубокого обучения: « Почему мы не можем использовать квадратичную функцию стоимости для обучения нейронной сети?» ». В этой статье мы обсудим ответ на этот вопрос. Будет много математики, но ничего сумасшедшего! Я буду делать все просто и точно.
Начнем с рассмотрения общей архитектуры нейронной сети.
У нас есть ряд входных данных, образующих «входной слой», ряд нейронов в «скрытом слое» и один нейрон, образующий «выходной слой» для задачи бинарной классификации. В этом вопросе мы предположим, что имеем дело с двоичным классификатором, поэтому у нас есть только одно выходное значение из сети.
Теперь посмотрите на следующий рисунок, где мы выделили входной слой зеленым, выходной нейрон красным и один нейрон скрытого слоя оранжевым. От всего зеленого до оранжевого мы видим, что все входы подключены к оранжевому нейрону. Другими словами, «активация» оранжевого нейрона происходит за счет «агрегации» всех зеленых нейронов входного слоя. Этот процесс повторяется по всем нейронам всех слоев, пока мы не достигнем последнего красного выходного нейрона.
Что, если мы заменим оранжевый нейрон красным нейроном, т. е. удалим скрытый слой и соединим красный нейрон с зелеными нейронами напрямую?
Мы получим следующее:
В этом вопросе мы предположим вышеупомянутую «упрощенную архитектуру», и результат также можно обобщить на полную архитектуру.
Теперь давайте шаг за шагом познакомимся с математикой.
То, что мы видим выше, — это базовое уравнение «обновления веса» для нейронной сети. Я удалил дополнительные гиперпараметры, такие как коэффициент обучения и подвыборка (минимальная партия) и т. д. w_k — это вектор весов, а веса — это «параметры» нашей модели нейронной сети. w_k содержит отдельные веса, собранные в вектор-столбец. Эти веса связаны с входными данными модели (то есть зелеными нейронами в нашей архитектуре). У нас есть функция стоимости C_i, где от i = 1 до n — количество экземпляров данных в нашей выборке. Функция стоимости C — это «ошибка» между фактическим выходом y и выходом нейронной сети (красный нейрон). Каждый экземпляр данных будет выдавать прогнозируемый результат, а не фактический результат, поэтому для каждого экземпляра данных будут возникать затраты или ошибки. Цель модели — минимизировать эту функцию стоимости в среднем по всему набору данных. А как мы знаем, шаг минимизации предполагает взятие производной по параметрам модели (весам). Мы делаем это, используя частную производную вектора w_k. Все это означает, что стоимость C будет выражением/агрегацией весов от w_1 до w_q, и мы будем дифференцировать каждый вес w и собирать его в вектор. Это называется отрицательным «вектором градиента». Он используется для обновления весового вектора с k-й итерации до (k+1)-й итерации. Методология — стохастический градиентный спуск, но в этой статье мы оставим это в стороне.
Короче говоря, нейронная сеть обучается путем обновления весов с помощью вектора отрицательного градиента, усредненного по всем выборкам и рассчитанного для w_k. Это помогает нам перейти к минимизации функции стоимости и помогает сети учиться и повышать свою точность. Очевидно, что если обновления весов не происходят, поскольку отрицательный градиент приближается к нулю, обучение прекращается. Это не обязательно означает, что мы достигли минимума! Потому что наша функция стоимости очень сложна, и нам нужно найти минимум в многомерном пространстве. Следовательно, может быть много локальных минимумов, где градиент равен нулю и сеть перестает обучаться. В любом случае, нам не нужно беспокоиться об этом в связи с этой проблемой.
Давайте посмотрим на следующее выражение:
Это выражение определяет z_i как взвешенную сумму входных данных x_ji. Обратите внимание, что эти входы являются зелеными нейронами в нашей архитектуре. Поскольку у нас нет скрытого слоя, мы объединяем входные данные x_ji и веса w_j и добавляем член смещения, чтобы получить z_i, который представлен соединительными стрелками от зеленых нейронов к красному нейрону в нашей архитектуре. Поскольку у нас есть q входов, у нас есть x_j и w_j, где от j = 1 до q.
Но мы не передаем z_i красному нейрону. Мы применяем к нему «функцию активации». Эта функция активации может быть разной для разных нейронных сетей. Для целей этой задачи мы предполагаем, что функция активации является «сигмовидной» или «логистической». Здесь я буду предполагать, что читатель осведомлен об этой функции и двигаться дальше.
Далее следует постановка нашей основной проблемы: как определить функцию стоимости (C)? Хорошо известно, что для двоичной классификации функцией стоимости является «перекрестная энтропия», но здесь возникает вопрос, почему она не может быть «квадратичной».
Определим выражения обеих функций стоимости:
Квадратичная функция стоимости – Функция стоимости перекрестной энтропии –
Хотя квадратичная функция стоимости проста (подумайте о минимизации методом наименьших квадратов между фактическим выходом y_i и прогнозируемым выходом a_i), мы можем предложить некоторое объяснение функции стоимости перекрестной энтропии. Это похоже на отрицательную логарифмическую вероятность в наших регрессионных моделях. Обратите внимание, что за пределами скобок стоит отрицательный знак, который используется для сохранения положительной стоимости (поскольку a_i будет между 0 и 1 - выход сигмоида, поэтому термин внутри скобок всегда будет отрицательным). Также обратите внимание, что когда a_i приближается к y_i, стоимость становится очень близкой к нулю. Это связано с тем, что когда y_i = 1 и a_i ~ 1, ln(a_i) будет примерно 0. Аналогично, когда y_i= 0 и a_i ~ 0, ln(1-a_i) будет примерно 0. Таким образом, эта функция сохраняет затраты положительны и минимальны, если модель дает хорошие прогнозы. Однако то же самое можно сказать и о квадратичной функции стоимости. Но мы этим не пользуемся. Почему? Вот объяснение
Мы возвращаемся к основному уравнению обновления веса, которое мы видели ранее, и вводим в него квадратичную функцию стоимости. Мы получаем следующее
Теперь для простоты мы будем рассматривать только одну точку данных, то есть i=1 и n=1. И мы частично дифференцируем для каждого веса w_j. Мы получаем следующее:
Напомним, что поскольку i = 1, имеем
Подставив значение z, получим
То есть наш вектор градиента, который отвечает за обновление весов сети, будет иметь производную сигмовидной функции, когда мы используем квадратичную функцию стоимости.
Теперь посмотрим на поведение производной сигмовидной функции:
Из приведенного выше графика ясно, что производная, представляющая наклон сигмовидной функции, приближается к 0, как только входное значение z становится большим! Что это значит? Это означает, что вектор градиента будет равен нулю, когда вход активации z велик. Следовательно, сеть прекратит обучение, поскольку веса не будут обновляться. Напомним, что это не означает, что мы достигли минимума. Это означает, что мы застряли в нежелательной точке и в пространстве функций, значение которых может быть далеко от минимального. Это известно как «замедление обучения». Однако этого НЕ происходит с функцией стоимости перекрестной энтропии.
Мы выполняем ту же замену, используя функцию стоимости перекрестной энтропии, и получаем следующее:
Интересно отметить, что этот термин:
происходит также в градиенте квадратичной стоимости. Однако есть трюк, который мы воспользуемся, чтобы упростить его. Градиент сигмовидной функции можно выразить следующим образом:
Подставляем это в исходное выражение и получаем следующее:
То есть наш вектор градиента, который отвечает за обновление весов сети, не имеет производной сигмовидной функции, когда мы используем функцию стоимости перекрестной энтропии. Следовательно, при использовании этой функции стоимости замедления обучения не происходит.
Мы снова сопоставляем градиенты для лучшего вида:
Это отвечает на наш первоначальный вопрос — мы не используем квадратичную функцию стоимости, поскольку она приводит к замедлению обучения.
Обратите внимание, что приведенный выше анализ был выполнен только на выходном слое (одного нейрона), однако его можно обобщить и на общую нейронную сеть!