Введение в графы DataFlow как основу глубоких нейронных сетей

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

Цель этого сообщения в блоге - ...

объяснять с нуля математику графов потоков данных как основу нейронных сетей.

Целевая аудитория ...

Любой, у кого есть следующие предпосылки:

  1. Вы знаете, как вычислять частные производные функции.

А теперь дорожная карта… .. 🚵

Этап №1: Понимание графов DataFlow как основы нейронных сетей

Этап №2: Прямое распространение графа потока данных

Этап № 3: Обратное распространение графа DataFlow

Этап №4: Прямое и обратное распространение в графике потока данных с числовыми значениями

Этап № 5: Запачкайте руки парой других функций

Этап №6: И, наконец, заключительные замечания… ..

ВРЕМЯ ОКАЗАТЬСЯ!

Этап №1: понимание графов DataFlow как основы нейронных сетей

Мы начнем с того, что такое «График DataFlow»? Ну, это просто причудливое слово для графа, состоящего из узлов и ребер.

  1. Каждый узел представляет собой математическую единицу вычисления.
  2. Ребра, с другой стороны, представляют входы / выходы математических единиц / узлов.

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

Создание простого графа DataFlow

Давайте построим граф потока данных квадратного уравнения

  1. Выясните, сколько у вас рабочих узлов - разбейте все уравнение на отдельные операции следующим образом:

Получается, что есть 4 узла операций.

2. Просто установите 4 рабочих узла и подключите их входы следующим образом:

Веха № 2: Распространение графика потока данных в прямом направлении

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

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

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

Веха № 3: распространение графа DataFlow в обратном направлении

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

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

Вам может быть интересно, почему мы добавили дополнительную «1», которая находится ниже окончательного результата? В этом нет необходимости, но для целей кодирования это просто соглашение: изначально вводить 1 в сеть в качестве отправной точки для обратного распространения, поскольку умножение любого значения на 1 не меняет его значения. Так что никакой ракетостроения - просто ради программирования!

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

Хотите знать, зачем нужно знать обратное распространение, если платформы XYZ автоматически вычисляют его за вас?

Вот то, что у меня есть для вас, от Андрея Карпати (Директора по ИИ в Tesla, Исследователя в OpenAI и аспирант в Стэнфорде)

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

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

Этап №4: прямое и обратное распространение в графике потока данных с числовыми значениями

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

Предположим, что у нас есть значения 3,2,1 и 4 для входных узлов x, a, b и c. Просто вычислите значения для выходных данных (квадраты над краями) и частных производных (квадраты под краями), как показано ниже:

Производная операции «+» всегда равна 1. Это также видно на приведенном выше потоковом графике.

Производная операции «X» всегда является переключением между входами - см. Частные производные двух узлов умножения на приведенном выше графике.

Этап № 5: испачкайте руки парой других функций

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

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

  1. Сигмовидная функция - сигмоид (x) = 1 / (1 + exp (-x))
  2. Квадратичная формула

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

Этап №6: И, наконец, заключительные замечания….

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

Если у вас есть какие-либо мысли, комментарии или вопросы, не стесняйтесь оставлять комментарии ниже или связываться 📞 со мной в LinkedIn