Реализация нейронной сети с нуля на Python с обучением методом обратного распространения ошибки. Сеть демонстрирует обучение базовым логическим операциям: AND, OR, Implication и XOR.
Сеть состоит из трёх типов слоёв:
Входной слой → Скрытый слой(и) → Выходной слой
(2 нейрона) (3 нейрона) (1 нейрон)
- Функция активации: Сигмоида —
σ(x) = 1 / (1 + e^(-x)) - Обучение: Градиентный спуск + обратное распространение ошибки
- Скорость обучения:
0.5(настраивается) - Веса: Инициализируются случайными значениями в диапазоне
[0.0, 1.0]
├── main.py # Точка входа: датасеты и запуск обучения
└── neural_network/
└── neural_network.py # Классы NeuronNetwork, Layer, Neuron, Input
pip install numpy matplotlibpython main.pyВ main.py определены четыре датасета для логических операций:
| Операция | [0,0] |
[0,1] |
[1,0] |
[1,1] |
|---|---|---|---|---|
| AND | 0 | 0 | 0 | 1 |
| OR | 0 | 1 | 1 | 1 |
| IMP (→) | 1 | 1 | 0 | 1 |
| XOR | 0 | 1 | 1 | 0 |
⚠️ Важно: XOR не является линейно разделимой функцией. Для корректного обучения XOR необходим хотя бы один скрытый слой.
from neural_network.neural_network import NeuronNetwork
# Создать сеть: 2 входа, 1 выход
nn = NeuronNetwork(input_l_size=2, output_l_size=1)
# Обучить на датасете
dataset_xor = [[[0, 0], 0], [[0, 1], 1], [[1, 0], 1], [[1, 1], 0]]
nn.train(dataset_xor, iters=10000)
# Протестировать
nn.test([[0, 0], [0, 1], [1, 0], [1, 1]], 'XOR')| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
input_l_size |
int |
— | Количество входных нейронов |
output_l_size |
int |
— | Количество выходных нейронов |
hidden_layer_size |
int |
1 |
Количество скрытых слоёв |
learning_rate |
float |
0.5 |
Скорость обучения |
Главный класс сети. Управляет слоями, запускает обучение и тестирование.
train(dataset, iters)— обучение сети на заданном датасетеtest(data, op_name)— вывод предсказаний для тестовых примеровget_prediction()— возвращает выходные значения сети
Слой нейронов. Хранит список объектов Neuron и ссылку на предыдущий слой.
Отдельный нейрон. Хранит входные связи (Input), вычисляет взвешенную сумму и значение активации, а также распространяет ошибку назад через метод set_error.
Связь между нейронами. Хранит ссылку на нейрон предыдущего слоя и вес связи.
Начало обучения(10000 итераций)...
Обучение завершено!
0 XOR 0 ~ 0.04
0 XOR 1 ~ 0.96
1 XOR 0 ~ 0.96
1 XOR 1 ~ 0.05
На графике показано изменение бинарной кросс-энтропии в процессе обучения. Уменьшение значения loss означает, что сеть постепенно подбирает веса так, чтобы ее ответы становились ближе к правильным значениям.
Вывод: в ходе обучения значение функции потерь уменьшается, что говорит о сходимости модели на выбранном наборе данных.
На графике сравниваются целевые значения логической функции и ответы нейронной сети после обучения. Пунктирная линия показывает порог классификации 0.5: значения выше порога относятся к классу 1, ниже порога - к классу 0.
Вывод: после обучения предсказания сети находятся близко к ожидаемым значениям для всех входных комбинаций.
На графике показано, как сеть разделяет пространство двух входных признаков. Светлая линия соответствует порогу 0.5, то есть границе между классами.
Вывод: для XOR требуется нелинейная граница, поэтому наличие скрытого слоя позволяет сети приблизить нужное разделение.
Гистограмма показывает, какие значения приняли веса связей после обучения. Такой график удобно использовать для анализа того, насколько сильно изменилась структура сети.
Вывод: веса после обучения принимают разные значения, что показывает адаптацию связей сети под обучающую выборку.
На графике сравнивается обучение при разных значениях learning_rate. Более крутое снижение loss означает более быструю сходимость, однако слишком большая скорость обучения может приводить к нестабильности.
Вывод: скорость обучения влияет на темп сходимости. При слишком маленьком значении обучение идет медленнее, а при слишком большом может стать менее устойчивым.
- Размер скрытого слоя вычисляется автоматически по формуле:
min(2n − 1, ⌈2n/3 + m⌉), гдеn— число входов,m— число выходов. - Веса обновляются по правилу градиентного спуска непосредственно во время прохода по датасету (онлайн-обучение).
- Для повышения стабильности можно уменьшить
learning_rateи увеличить количество итераций.




