Взвешивание данных перед функцией активации

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

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

Таким образом, логический поток исходит из этого:

…к этому:

Двигаясь дальше, я уберу +” в обозначениях x и w, и мы просто будем считать, что если вы не видите, что погрешность учитывается в расчетах, она была поглощена расчетом. данные и веса.

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

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

Теперь, как любил говорить Боб Китчин, мой профессор физики в колледже: отсюда все просто подключи и пыхти!

Применение весов

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

Мы начинаем с нашего первого случайно выбранного значения веса, w1, которое равно (1,4, -2,1, 3,1). Нам нужно вычислить внутренний продукт между этим весом и нашими значениями x, начиная с первого наблюдения в x. Помните, однако, что способ работы внутренних продуктов заключается в том, что первая матрица (веса) будет оцениваться по строкам, а вторая (данные) будет оцениваться по столбцам. Поэтому, чтобы правильно применить веса ко всему в первом наблюдении, нам нужно транспонировать наши данные и превратить наши строки в столбцы. Чуть позже мы увидим, как это сделать в коде.

Тогда значения x, которые будут учитываться для первого результата, равны (1, -1, 1). Внутренний продукт дает 1,4 + 2,1 + 3,1 = 6,6. Это первое значение в нашей матрице ответов, которое передается нашему узлу активации в первом нейроне.

На нижнем нейроне мы повторяем этот процесс со вторым набором весов w3, который равен (1,8, 0, -1,6). Это дает нам 1,8 + 0 + -1,6, или 0,2, что является первым значением в нашей матрице ответов, которое gest передал нашему узлу активации во втором нейроне.

Вся математика за один шаг?

УЗНАЙТЕ возможности использования матричного умножения для упрощения этого. И когда я говорю «упрощать», мои сестры, небинарные и братья, я всегда имею в виду упрощать.

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

Начнем с создания наших данных в виде матрицы NumPy:

Затем давайте создадим второй массив, используя наши случайно сгенерированные веса для w1 и w3:

Теперь мы можем просто взять внутреннее произведение w13 и x и получить следующий результат:

Обратите внимание, что каждая строка в нашем массиве соответствует результату, который мы бы собрали вручную, если бы выполняли вычисления по отдельности (6,6 — первое значение в первом нейроне, 0,2 — первое значение во втором нейроне…). весь первый слой вычислений с одним умножением матриц.

А вот и умопомрачительная часть: этот подход с одним расчетом будет верным **независимо от количества наблюдений, признаков и нейронов в нейронной сети**. Если у вас есть 10 000 наблюдений, 2000 функций и нейронной сети шириной 500 нейронов, весь вывод для первого шага процесса нейронной сети будет представлен одним матричным умножением.

Мой. Разум. Взорван. Ты?

Далее: что, черт возьми, такое функция активации и как она вообще работает? Веселье только начинается!