Взвешивание данных перед функцией активации
В этом посте мы собираемся сделать первый шаг к тому, чтобы сделать нашу математику реальной, и посмотреть, что происходит, когда вы применяете рандомизированные веса и значения смещения к нашим данным перед отправкой их в функцию активации.
Вспомните, что мы немного упростили математику нашей нейронной сети, используя матричное умножение и поглотив наш расчет смещения, добавив измерение к нашим данным и весовому вектору.
Таким образом, логический поток исходит из этого:
…к этому:
Двигаясь дальше, я уберу +” в обозначениях 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 нейронов, весь вывод для первого шага процесса нейронной сети будет представлен одним матричным умножением.
Мой. Разум. Взорван. Ты?
Далее: что, черт возьми, такое функция активации и как она вообще работает? Веселье только начинается!