В этой статье узнаем:

  • Как работает обратное распространение
  • Почему автоматическая дифференциация лучше других методов дифференциации

Бонус: вы также найдете код для реализации обратного распространения с нуля :)

Хорошо! Лессго!!

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

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

W= W — 𝛂 * dE/dW

b = b — 𝛂 * dE/db

Здесь 𝛂 представляет собой скорость обучения, которая определяет, насколько быстро NN обучается и достигает оптимальных весов и смещений. Чем выше скорость обучения, тем больше изменение значений параметров. Более низкие скорости обучения вызывают лишь меньшие обновления параметров и, следовательно, требуют больше эпох обучения (требуется больше времени для обучения). Однако, если 𝛂 установлено слишком высокое значение, это может привести к нежелательному расхождению в функции потерь.

dE/dW(db) — это градиент функции потерь по отношению к весу (смещению).

Рассмотрим двухслойную нейронную сеть.

Градиент функции потерь (L) по отношению к W[1] можно рассчитать, только применяя цепное правило:

Обратите внимание, что для вычисления этого градиента требуется 4 якобиана. Но практически ни одна нейронная сеть не является такой простой. На практике нам требуются гораздо более глубокие нейронные сети и гораздо больше якобианов. И часто градиент не следует простому пути, как здесь. Нам нужно будет суммировать градиенты с разных путей. В таких случаях может потребоваться пересчет тех же якобианов. Так как же нам решить эти проблемы?

К счастью, на помощь приходит метод автоматического дифференцирования. «Как», спросите вы? Что ж, autodiff использует вычислительные графы (CG) и переформулирует всю CG в примитивные функции и операции.

Вычислительный граф для вышеупомянутой нейронной сети будет:

Вы можете понять, как создаются эти CG, по ссылке ниже:

#Обратный трансверсал в CG

Затем CG проходится в обратном порядке, и цепное правило присваивает каждому узлу соответствующий градиент (т.е. градиент последнего узла по отношению к текущему узлу). Последнему узлу назначается градиент, равный единице. Таким образом, каждому узлу назначается такой градиент, что:

Где vj – градиент узла, следующего за i узлом.

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

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

Подробную реализацию приведенного выше объяснения можно найти здесь:

#Микроград

Теперь, почему мы предпочитаем автоматическое дифференцирование другим методам, таким как символическое дифференцирование и конечное дифференцирование? Все упирается во временную и пространственную сложность. В случае методов конечных производных нам необходимо оценить частные производные нескольких частных производных. Мы в основном берем начальный вектор, вычисляем его значение потерь, а затем делаем небольшие смещения для каждой переменной по одному, чтобы оценить градиент по отношению к каждому параметру. Это означает, что нам нужно сделать прямой проход для каждой производной. Таким образом, метод конечных разностей потребует временной и пространственной сложности O (n).

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

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

Надеюсь, что теперь на оба ваших вопроса: почему и как, даны ответы :)

Источники: