На этом шаге мы обобщим рассмотренные на предыдущем шаге вопросы.
Посмотрим, что произойдет, если заменить буквы словами, имеющими более непосредственное отношение к нашей нейронной сети. На приведенной ниже иллюстрации вторая матрица имеет размерность 2x1, но матричная алгебра остается прежней.
Иначе как магией это никак не назовешь!
Первая матрица содержит весовые коэффициенты для связей между узлами двух слоев, вторая - сигналы первого, входного слоя. Результатом умножения этих двух матриц является объединенный сглаженный сигнал, поступающий на узлы второго слоя. Присмотритесь повнимательнее, и вы это поймете. На первый узел поступает сумма двух сигналов - сигнала input_l, умноженного на весовой коэффициент w1,1, и сигнала input_2, умноженного на весовой коэффициент w2,1. Это значения х до применения к ним функции активации.
Представим все это в более наглядной форме с помощью иллюстрации.
Описанный подход чрезвычайно полезен.
Почему? Потому что в его рамках все вычисления, которые необходимы для расчета входных сигналов, поступающих на каждый из узлов второго слоя, могут быть выражены с использованием матричного умножения, обеспечивающего чрезвычайно компактную форму записи соответствующих операций:
X = W ⋅ I
Здесь W - матрица весов, I - матрица входных сигналов, а X - результирующая матрица комбинированных сглаженных сигналов, поступающих в слой 2. Символы матриц часто записывают с использованием полужирного шрифта, чтобы подчеркнуть, что данные символы представляют матрицы, а не просто одиночные числа.
Теперь нам не нужно заботиться о том, сколько узлов входит в каждый слой. Увеличение количества слоев приводит лишь к увеличению размера матриц. Но количество символов в записи при этом не увеличивается. Она остается по-прежнему компактной, и мы просто записываем произведение матриц в виде W ⋅ I, независимо от количества элементов в каждой из них, будь это 2 или же 200!
Если используемый язык программирования распознает матричную нотацию, то компьютер выполнит все трудоемкие расчеты, связанные с вычислением выражения X = W ⋅ I, без предоставления ему отдельных инструкций для каждого узла в каждом слое.
Это просто фантастика! Затратив немного времени на то, чтобы понять суть матричного умножения, мы получили в свое распоряжение мощнейший инструмент для реализации нейронных сетей без каких-либо особых усилий с нашей стороны.
А что насчет функции активации? Здесь все просто и не требует применения матричной алгебры. Все, что нам нужно сделать, - это применить сигмоиду
1 y = --------- 1 + e-x
Это звучит слишком просто, но так оно и есть, поскольку нам не приходится комбинировать сигналы от разных узлов: это уже сделано, и вся необходимая информация уже содержится в X. Как мы уже видели, роль функции активации заключается в применении пороговых значений и подавлении ненужных сигналов с целью имитации поведения биологических нейронов. Поэтому результирующий выходной сигнал второго слоя можно записать в таком виде:
О = сигмоида(X)
Выражение X = W ⋅ I применяется для вычисления сигналов, проходящих от одного слоя к следующему слою. Например, при наличии трех слоев мы просто вновь выполним операцию умножения матриц, использовав выходные сигналы второго слоя в качестве входных для третьего, но, разумеется, предварительно скомбинировав их и сгладив с помощью дополнительных весовых коэффициентов.
На данном этапе мы закончили с теорией и теперь должны посмотреть, как она работает, обратившись к конкретному примеру, который на этот раз будет представлять нейронную сеть несколько большего размера, с тремя слоями по три узла.
Резюме
На следующем шаге мы рассмотрим пример использования матричного умножения.