Когда я впервые решил написать нейросеть на Python с нуля, я честно готовился к трехнедельному погружению в математику. На деле все оказалось проще: базовые операции нейрона объясняются за десять минут, а работающий код занимает меньше полусотни строк. Сегодня покажу, из чего состоит нейросеть и как за пару часов получить свою первую модель, которая обучается и делает предсказания.
Главное: для обучения нейросети не нужны тяжелые фреймворки вроде TensorFlow или PyTorch. Достаточно Python 3 и библиотеки numpy. А все остальное это аккуратные матричные умножения и немного производных.
Что происходит внутри нейрона
Нейросеть собирается из нейронов. У каждого нейрона есть несколько входов. На вход подаются числа, внутри нейрона происходят три операции: умножение входов на веса, сложение результатов с порогом (смещением) и пропускание суммы через функцию активации. На выходе получается одно число.
Представь нейрон с двумя входами. Значения x1 и x2 умножаются на веса w1 и w2, потом складываются, прибавляется смещение b. Полученная сумма проходит через сигмоиду, функцию, которая превращает любое число в диапазон от 0 до 1. Именно сигмоида дает нейросети способность моделировать нелинейные зависимости.

Функция активации нужна не для красоты. Без нее нейросеть выродится в линейную регрессию, какой бы глубокой она ни была. Нелинейность позволяет приближать почти любую функцию. В современных сетях чаще используют ReLU, но для первой реализации сигмоида удобнее, ведь ее производная вычисляется элементарно.
Пишем нейрон на Python
Для работы нужен только numpy. Он позволяет не заморачиваться с циклами и умножать матрицы в одну строку. Функция сигмоиды выглядит так: 1 / (1 + np.exp(-x)). Теперь сам нейрон.
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
class Neuron:
def __init__(self, weights, bias):
self.weights = np.array(weights)
self.bias = bias
def forward(self, inputs):
total = np.dot(self.weights, inputs) + self.bias
return sigmoid(total)Вот и все. Входы умножаются на веса, прибавляется смещение, результат сжимается сигмоидой. Один такой нейрон умеет различать только линейно разделимые классы. Например, он легко отличит низкого и легкого человека от высокого и тяжелого, но не справится с более сложной закономерностью.
Почему XOR твой главный тест
В мире нейросетей есть классическая задача, XOR. Это операция "исключающее или": на вход подаются два бита, на выходе 1, если биты разные, и 0, если одинаковые. Представь дверь с двумя выключателями: свет горит, когда переключатели в разных положениях. Так вот, один нейрон не может решить XOR. Как ни подбирай веса, линейная граница не разделит четыре точки на плоскости. На Reddit в обучающих ветках XOR называют лакмусовой бумажкой для первой сети. XOR доказывает необходимость скрытых слоев и делает задачу идеальным тестом для твоей первой многослойной сети.
Архитектура сети 2-2-1 и прямой проход
Чтобы обойти ограничение одного нейрона, добавляем скрытый слой. Схема будет такая: два входа, два нейрона в скрытом слое, один выход. Этого достаточно для XOR. Веса теперь хранятся в матрицах.
Прямой проход (forward pass) в матричном виде выглядит убийственно коротко:
h = sigmoid(X @ W1 + b1)
out = sigmoid(h @ W2 + b2)Здесь X это матрица входных примеров, W1 и b1 веса и смещение скрытого слоя, W2 и b2 выходного слоя. Символ @ означает матричное умножение в Python 3. Сначала мы получаем выход скрытого слоя h, потом из него выход сети out. Все примеры обрабатываются одновременно, без циклов.
Функция потерь и градиентный спуск
Когда сеть выдала предсказание, нужно понять, насколько она ошиблась. Для этого используется функция потерь. Простейший вариант: средняя квадратичная ошибка: mean((y_true - y_pred)**2). Наша цель минимизировать эту ошибку, подбирая веса и смещения.
Алгоритм называется градиентный спуск. Интуитивно мы смотрим, в какую сторону нужно сдвинуть каждый вес, чтобы ошибка уменьшилась. Это делается через частные производные. Есть пакетный градиентный спуск, когда считаем по всему набору, и стохастический, когда берем одно наблюдение за раз. В нашем коде будет стохастический: на каждой итерации мы выбираем один пример, считаем градиенты и обновляем параметры.
Производная говорит, насколько сильно изменится ошибка при маленьком изменении веса. Мы идем в сторону, противоположную градиенту, шаг за шагом приближаясь к минимуму. Размер шага называется learning rate. Если сделать его слишком большим, алгоритм разойдется, слишком маленьким, будет долго сходиться. В коде ниже используем 0.5, для XOR это работает хорошо.
Реализация обучения
Обучение это цикл из четырех шагов: прямой проход, подсчет ошибки, обратное распространение ошибки (backpropagation) и обновление весов. Для простой сети из двух слоев формулы можно вывести вручную, но я приведу код, который копируется и работает.
Вот полный скрипт для решения XOR. Я взял его из практики и немного упростил комментарии. Числа меньше 0.5 считаем нулем, больше 0.5 единицей. Запускай на Python 3 с установленным numpy. Кстати, на Reddit в подобных примерах почти всегда ставят np.random.seed(1), чтобы результаты были воспроизводимыми. Делаем так же.
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_deriv(x):
return x * (1 - x)
# Данные XOR
X = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
y = np.array([[0],
[1],
[1],
[0]])
np.random.seed(1)
# Веса для сети 2-2-1
W1 = np.random.randn(2, 2)
b1 = np.zeros((1, 2))
W2 = np.random.randn(2, 1)
b2 = np.zeros((1, 1))
lr = 0.5
for epoch in range(10000):
# Forward
h = sigmoid(X @ W1 + b1)
out = sigmoid(h @ W2 + b2)
# Loss
loss = np.mean((y - out) ** 2)
# Backprop
d_out = (out - y) * sigmoid_deriv(out)
d_W2 = h.T @ d_out
d_b2 = np.sum(d_out, axis=0, keepdims=True)
d_h = d_out @ W2.T * sigmoid_deriv(h)
d_W1 = X.T @ d_h
d_b1 = np.sum(d_h, axis=0, keepdims=True)
# Update
W2 -= lr * d_W2
b2 -= lr * d_b2
W1 -= lr * d_W1
b1 -= lr * d_b1
if epoch % 1000 == 0:
print(f'epoch {epoch}, loss {loss:.4f}')
print('Predictions:')
print(out)Обрати внимание на sigmoid_deriv. Производная сигмоиды вычисляется через сам выход сигмоиды, это удобно. Если все сделано верно, ошибка упадет с примерно 0.27 до 0.0001, а предсказания будут близки к [0, 1, 1, 0].
Проверяем себя: классификация пола
После XOR самое время решить задачу посложнее: определить пол по весу и росту. Возьмем данные из хорошего туториала. Метки: 0 (мужчина), 1 (женщина). Сдвинем признаки, чтобы числа стали маленькими: вес минус 135, рост минус 66. Вот таблица:
ИмяВес (минус 135)Рост (минус 66)ПолАлиса-2-11Боб2560Чарли1740Диана-15-61Скорми эти данные той же сети с одним скрытым слоем и посмотри, как изменятся веса. Хорошая тренировка перед написанием собственных проектов. Если захочешь, можешь добавить нормализацию данных, обычно сдвиг на среднее и деление на стандартное отклонение дают более стабильное обучение.
Когда не нужно писать с нуля
Написать нейросеть с нуля полезно, чтобы понять магию внутри. Но в реальной работе я почти никогда не пишу свои сети. Зачем, если есть готовые флагманские модели, которые решают 90% задач быстрее и точнее? Похоже на изучение устройства двигателя, а потом поездку на автобусе.
Мой выбор: сервис 3GPT от 3SELLER. Он дает прямой доступ из России к последним моделям: Chat GPT 6, Claude Fable 5, Claude Opus 5.5 и другим. Да, это именно те модели, о которых все говорят в контексте реального ИИ. И оплата решается проще некуда: российская карта, СБП или крипта. Без иностранных платежных систем и танцев с бубном. Подписка на флагманские модели вроде Chat GPT 6 и Claude Fable 5 стоит от 149 рублей в месяц.
Можно закрывать прикладные задачи: создавать продающие тексты, сайты, обрабатывать изображения, генерировать видео и голос. Внутри 3GPT есть готовые ИИ-агенты под конкретные задачи. Выбираешь агента, общаешься, и не нужно думать, какую модель дернуть. А если хочешь, модель меняется прямо в чате. Отдельно радует возможность генерировать изображения через Nano Banana и создавать реалистичные видеоролики.

Мой совет такой. Напиши свою первую нейросеть на Python с нуля один раз, чтобы почувствовать, как работают веса и градиенты. А для реальных задач подключай готовые API и не трать вечера на отладку backprop. Попробуй 3GPT, доступ ко всем флагманским моделям из России открывается на официальном сайте.
Получить доступ ко всем флагманским моделям нейросетей из России можно на официальном сайте 3GPT: https://3seller.com/3gpt. Пополнить баланс можно российской картой, через СБП или криптой.
А если захочешь еще быстрее стартовать, там же есть готовые ИИ-агенты, просто выбери нужного и общайся: https://3seller.com/ai/agents.
Запусти код, поменяй learning rate с 0.5 на 1.5 и посмотри, как сеть разойдется. Такие ошибки дают больше понимания, чем любая теория. Когда почувствуешь, как работают веса, вспомни, что для рабочих задач не нужно писать свои сети: готовые модели в 3GPT решают их быстрее.