Слои и матричная форма

Урок показывает, как целый слой нейронов сворачивается в одну операцию — умножение матрицы на вектор.

Прямое распространение (forward pass) — это процесс прогона входных данных через все слои сети для получения выхода.

От нейрона к слою

Слой — это набор нейронов, которые получают один и тот же вход, но имеют свои веса. Если в прошлом разделе мы считали один нейрон, то теперь нужно посчитать сразу несколько. Удобно собрать их веса в матрицу: одна строка — веса одного нейрона.

Для слоя из m нейронов с n входами получаем матрицу W размера m × n и вектор смещений b длины m. Выход слоя словами: выход = активация(W · x + b), где W · x — матрично-векторное произведение, то есть для каждого нейрона своя взвешенная сумма.

Зачем матричная форма

Запись через матрицы — не просто красивая нотация. Реальные библиотеки (numpy, PyTorch) выполняют такое умножение на видеокарте за один присест, обрабатывая тысячи нейронов параллельно. Понимать форму важно: ошибка в размерностях матриц — самая частая ошибка новичка. Мы же реализуем умножение вручную циклами, чтобы увидеть, что внутри.

Реализуем dense-слой

import math

def sigmoid(x):
    return 1.0 / (1.0 + math.exp(-x))

def dense(inputs, weights, biases, activation):
    # weights — список строк, по строке на нейрон
    outputs = []
    for w_row, b in zip(weights, biases):
        s = sum(w * x for w, x in zip(w_row, inputs)) + b
        outputs.append(activation(s))
    return outputs

x  = [1.0, 0.5]
W1 = [[0.2, 0.8], [-0.5, 0.3], [0.7, -0.1]]   # 3 нейрона, по 2 входа
b1 = [0.0, 0.1, -0.2]

h = dense(x, W1, b1, sigmoid)
print("Скрытый слой (3 нейрона):", [round(v, 3) for v in h])

W2 = [[0.5, -0.4, 0.9]]    # 1 выходной нейрон, по 3 входа
b2 = [0.0]
y = dense(h, W2, b2, sigmoid)
print("Выход:", [round(v, 3) for v in y])

Вывод:

Скрытый слой (3 нейрона): [0.646, 0.438, 0.611]
Выход: [0.668]

Функция dense универсальна: она работает с любым числом входов и нейронов. Чтобы построить всю сеть, мы просто вызываем её слой за слоем, передавая выход одного слоя на вход следующего. Это и есть forward pass.

Размерности должны сходиться

ОбъектРазмер
вход xn чисел
матрица Wm строк × n столбцов
смещения bm чисел
выход слояm чисел

Число столбцов W обязано совпадать с длиной входа, иначе умножение не определено. Выход слоя длиной m становится входом следующего слоя — и его матрица должна иметь m столбцов.

Итог

  • Слой = матрица весов W + вектор смещений b + активация.
  • Forward pass — последовательный вызов слоёв: выход одного идёт на вход следующего.
  • Размерности матриц должны согласовываться, иначе сеть не соберётся.
Проверьте себя
1. Что означает строка матрицы весов W слоя?
AОдин обучающий пример
BВеса одного нейрона этого слоя
CОдну эпоху обучения
DВектор смещений
2. Чему равна длина выхода dense-слоя из m нейронов?
AДлине входа
Bm
Cm умножить на n
DВсегда 1
3. Зачем матричная форма нужна на практике?
AОна единственный способ записать слой
BПозволяет считать весь слой одной параллельной операцией на GPU
CУменьшает число весов
DЗаменяет функцию активации
Поддержать проект