Многослойная сеть: идея скрытых слоёв
Урок вводит архитектуру многослойной сети и объясняет роль скрытых слоёв.
Многослойный перцептрон (MLP) — это сеть из нескольких слоёв нейронов, где выход каждого слоя становится входом следующего.
Из чего состоит сеть
Типичная полносвязная сеть имеет три типа слоёв:
- Входной слой — это просто признаки примера (числа на входе). Своих весов у него нет.
- Скрытые слои — один или несколько слоёв нейронов между входом и выходом. Именно здесь происходит «магия»: сеть учится строить полезные промежуточные представления.
- Выходной слой — выдаёт итоговый ответ: одно число (регрессия), вероятность (бинарная классификация) или набор вероятностей по классам.
«Полносвязная» (fully connected, dense) означает, что каждый нейрон слоя соединён со всеми нейронами предыдущего слоя.
Зачем нужны скрытые слои
В прошлом уроке мы выяснили: один слой проводит только прямые границы. Скрытый слой снимает это ограничение. Каждый нейрон скрытого слоя проводит свою прямую, а следующий слой комбинирует эти прямые в сложную, изогнутую границу. Чем больше скрытых слоёв — тем более хитрые зависимости сеть способна выразить. Отсюда и слово глубокое в «глубоком обучении»: глубина — это число слоёв.
Иерархия признаков
Удобная интуиция: ранние слои улавливают простые признаки, а поздние собирают из них сложные. На картинках это особенно наглядно:
| Слой | Что распознаёт (для изображений) |
| 1-й скрытый | края и перепады яркости |
| 2-й скрытый | углы, дуги, простые формы |
| 3-й скрытый | части объектов: глаз, колесо, буква |
| выходной | объект целиком: кот, машина, цифра |
Никто не программирует эти признаки руками — сеть выводит их сама в процессе обучения. Это ключевое отличие глубокого обучения от классического подхода, где признаки придумывал инженер.
Схема прохода через сеть
Покажем структуру маленькой сети 2 → 2 → 1 (два входа, два нейрона в скрытом слое, один выход), просто посчитав, сколько в ней обучаемых параметров. Это поможет почувствовать масштаб.
def count_params(layers):
# layers — список размеров: [вход, скрытый1, ..., выход]
total = 0
for i in range(len(layers) - 1):
n_in = layers[i]
n_out = layers[i + 1]
weights = n_in * n_out # веса между слоями
biases = n_out # по смещению на нейрон
total += weights + biases
print(f"Слой {i+1}: {n_in}->{n_out}, весов {weights}, смещений {biases}")
return total
print("Сеть для XOR (2->2->1):")
print("Всего параметров:", count_params([2, 2, 1]))
print()
print("Сеть побольше (784->128->10):")
print("Всего параметров:", count_params([784, 128, 10]))
Вывод:
Сеть для XOR (2->2->1): Слой 1: 2->2, весов 4, смещений 2 Слой 2: 2->1, весов 2, смещений 1 Всего параметров: 9 Сеть побольше (784->128->10): Слой 1: 784->128, весов 100352, смещений 128 Слой 2: 128->10, весов 1280, смещений 10 Всего параметров: 101770
Крошечная сеть для XOR — всего 9 чисел. А сеть для распознавания рукописных цифр (вход 28×28=784 пикселя) — уже больше ста тысяч параметров. Современные модели исчисляют параметры миллиардами. Все они обучаются одним и тем же механизмом, который мы разберём дальше.
Итог
- MLP = входной слой + скрытые слои + выходной слой.
- Скрытые слои строят иерархию признаков от простых к сложным.
- Глубина (число слоёв) задаёт выразительную мощность сети.
- Число параметров быстро растёт с размером слоёв.