Слои и матричная форма
Урок показывает, как целый слой нейронов сворачивается в одну операцию — умножение матрицы на вектор.
Прямое распространение (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.
Размерности должны сходиться
| Объект | Размер |
вход x | n чисел |
матрица W | m строк × n столбцов |
смещения b | m чисел |
| выход слоя | m чисел |
Число столбцов W обязано совпадать с длиной входа, иначе умножение не определено. Выход слоя длиной m становится входом следующего слоя — и его матрица должна иметь m столбцов.
Итог
- Слой = матрица весов
W+ вектор смещенийb+ активация. - Forward pass — последовательный вызов слоёв: выход одного идёт на вход следующего.
- Размерности матриц должны согласовываться, иначе сеть не соберётся.