Что такое обратное распространение в нейронных сетях в чисто математическом смысле?

Ребенок:

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

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

Старшеклассник:

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

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

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

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

Выпускник:

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

Https://en.wikipedia.org/wiki/Backpropagation

В машинном обучении обратное распространение отправляет обратную связь в нейронную сеть.

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

Простой пример для понимания исчисления: яблоки против апельсинов

Допустим, в простом примере мы обучаем простой линейный классификатор, который рисует `y = mx + c`. Цель классификатора - определить правильные значения m и c, которые выполняют двоичную классификацию яблок и апельсинов, учитывая радиус плода (ось x) и значение rgb (ось y). Таким образом, классификатор должен провести прямую линию в плоскости x-y, чтобы разделить ее на две части: одну для яблок и одну для апельсинов.

Градиент будет d / dx (mx + c) = ›m, что является частной производной от dy / dx, в данном случае наклона прямой.

Затем мы вычисляем потери для некоторой функции, которую мы должны оптимизировать, скажем, RMS prop (среднеквадратичное значение правильных значений по сравнению с прогнозируемыми значениями), в которой мы применяем данные к нашим прогнозируемым значениям градиента, подставляя реальные точки, например (x1, y1), (x2, y2),… (xn, yn) в уравнение.

loss = RMS prop (guess_m, guess_c) (данные, правильные_ответы).

Причина этого проигрыша заключается в том, что он дает нам ошибку между предположением и правильными ответами. Убыток рассчитывается с использованием расчетов функции оптимизации RMS prop.

Это даст нам «дельту», на которую должны измениться наши текущие значения m и c.

Шаг обратного распространения - это когда мы вычисляем эту «дельту» и используем ее для обновления значений m и c.

Теперь в более сложном сценарии, скажем, нейронная сеть

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

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

Функция оптимизации Adam имеет значение RMS prop и функцию импульса, которую она получает от AdaGrad. Ради обратного распространения, я предполагаю, что вы знакомы с градиентным спуском, который будет лучше объяснен во многих других местах.

Https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Adam

Шаг обратного распространения ошибки отправит обратно «дельту» значений, указанных в ссылке в Википедии.

куда

m = импульс,

v = скорость

Итак, вес (t + 1) = вес (t) - дельта.

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

Итак, еще немного о

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

Допустим, вы тренируете модель 100 раз на y = mx + c

Итак, на итерации 1:

m1 = m0 (случайная инициализация) + дельта (уравнение среднеквадратичных потерь), где дельта получается путем частичного дифференцирования уравнения среднеквадратичных потерь для m

c1 = c0 (случайная инициализация) + дельта (уравнение среднеквадратичных потерь), где дельта получается путем частичного дифференцирования уравнения среднеквадратичных потерь для c

На итерации 2:

m2 = m1 + delta (уравнение среднеквадратичных потерь)

c2 = c1 + delta (уравнение среднеквадратичных потерь)

В итерациях с 1 по 100:

m100 = m0 + суммирование (delta_from 1 до 100 (уравнение RMS prop))

который совпадает с

m100 = m0 + интеграция (delta_from 1 до 100 (уравнение RMS prop)), что хорошо работает для наших простых яблок и апельсинов, за исключением случаев, когда сеть глубокая, вы не сможете сделать это за один идти, но слой за слоем.

Итак, теперь, когда вы понимаете этот простой процесс, который также будет работать на одном узле с весом 128 x 64, мы должны обсудить, как применить его к сети таких узлов в нейронной сети. Чтобы быстро освежить в памяти частные производные и то, как вычисляется часть исчисления, ознакомьтесь с Обратным распространением за 5 минут, который вы теперь лучше понимаете.

Если мы сможем применить обратное распространение к более сложным нейронным сетям, подобным описанным в Обратное распространение во времени, используемым в LSTM, RNN или GRU, мы сможем выполнять перевод текста, создание музыки и т. Д.

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

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

Таким образом, дельта будет вычисляться для каждого слоя в обратном порядке, и сеть будет обучаться, как показано ниже. Если сеть имеет 5 уровней, чтобы вычислить ошибку обратного распространения для уровня 1, нам нужно будет выполнить прямое распространение от уровня 1 = ›слоя 2 =›… = ›слоя 5 =› активация вывода, а затем выполнить обратное распространение. из output Activation = ›layer 5 =› layer 4… = ›layer 1, а затем с помощью этой дельты зафиксируйте веса каждого узла в слое 1.

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

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

ReLU = ›

y = x, if x>0

= 0, if x<0

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

или сигмоида = ›y = 1 / (1 + pow (e, -x))

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

И еще более сложным сценарием было бы обратное распространение глубокой сети, которая обучается пакетно или с обратным распространением во времени (как в RNN, LSTM или GRU).

Эти рекуррентные нейронные сети или RNN имеют так называемое «пропускаемое соединение», которое позволяет им легко распространять изменения в очень глубоких сетях. Также закрытые рекуррентные блоки или ГРУ имеют «ворота памяти», которые отслеживают некоторый «контекст» в данных, и «ворота забывания», чтобы отмечать, где контекст не имеет значения. LSTM также имеют дополнительный «выходной шлюз» к шлюзам ГРУ и намного лучше работают с большими наборами данных.

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

Https://en.wikipedia.org/wiki/Long_short-term_memory

TL; DR

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

Также посмотрите это видео: Обратное распространение за 5 минут

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

Аспирантура и докторская степень:

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

Вот бумага для Адама.

Вот - это видео Backpropagation от Йошуа Бенджио, который на протяжении десятилетий много поддерживал обратное распространение.

Вот статья о том, почему Джеффри Хинтон считает, что нам следует отказаться от обратного распространения ошибки и найти лучший метод.

Цви Ахлер, доктор медицинских наук / доктор вычислительной нейробиологии и неврологии, Иллинойсский университет в Урбана-Шампейн (2006)

Обновлено 3 окт.2017 г.

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

Https://towardsdatascience.com/why-we-need-a-better-learning-algorithm-than-backpropagation-in-deep-learning-2faa0e81f6b

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

Если вы изучаете курс Эндрю Нг по глубокому обучению, он заставляет вас реализовать обратное распространение кода в коде для различных уравнений, моя любимая функция потерь -

L (y ’, y) = - (y * log (y’) + (1-y) * log (1-y ’))

потому что он используется во многих алгоритмах машинного обучения как:

  • если y = 1 == ›L(y',1) = -log(y') ==› мы хотим, чтобы y' был наибольшим == ›y 'наибольшее значение равно 1
  • if y = 0 == ›L(y',0) = -log(1-y') ==› мы хотим, чтобы 1-y' был самым большим == ›y' был как можно меньше, потому что он может иметь только 1 значение.

а затем мы выполняем дифференцирование на L (y ’, y), чтобы получить градиенты.

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

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

1. https://medium.freecodecamp.org/build-a-f flexible-neural-network-with-backpropagation-in-python-acffeb7846d0

2. https://ayearofai.com/rohan-lenny-1-neural-networks-the-backpropagation-algorithm-explained-abf4609d4f9d

или некоторые статьи, объясняющие интуицию градиентного спуска, например https://medium.com/datathings/neural-networks-and-backpropagation-explained-in-a-simple-way-f540a3611f5e

Вот и все, ребята!