Нейросеть — это не мозг: как числа превращаются в предсказание

Когда говорят, что нейросеть «научилась» распознавать лица или писать тексты, в этой фразе незаметно проскальзывает олицетворение: будто внутри программы появилось что-то похожее на понимание. На деле там происходит куда более скучная и куда более проверяемая вещь — набор чисел много раз подстраивается так, чтобы уменьшить ошибку предсказания. Ни смысла, ни намерения, ни интуиции в этом процессе нет — есть арифметика, повторённая тысячи раз. Разобраться, из каких шагов она состоит и где заканчивается её объяснительная сила, полезно именно потому, что учебные примеры вроде «нейросеть решает XOR за пять минут кода» слишком легко превращаются в аргумент «значит, современный ИИ работает так же просто».

Схема нейросети с входными числами, весами и градиентным спуском, показывающая, как фокус_keyword работает как числовая модель, а не мозг

Сначала — просто числа

Любая нейросеть начинает работу не с текста, изображения или звука, а с массива чисел. Если сеть должна оценить, сдаст ли студент экзамен, входом могут стать часы подготовки, число решённых задач и предыдущий балл — три числа, ничего больше. Сеть не «знает», что первое число — это часы, а второе — задачи; для неё это просто позиции в массиве. Смысл входных данных существует только в голове человека, который их подготовил и подписал; сама модель работает с координатами точки в числовом пространстве.

Каждое число на входе умножается на свой вес и складывается с остальными, а к сумме добавляется ещё одно число — смещение (bias). Вес — это что-то вроде регулятора громкости: чем он больше по модулю, тем сильнее конкретный вход влияет на результат нейрона, а близкий к нулю вес фактически «выключает» вход из расчёта. Смещение сдвигает точку отсчёта, давая нейрону дополнительную гибкость, не связанную напрямую ни с одним входом. Результат этой взвешенной суммы — просто одно число, и само по себе оно ещё не решает никакой задачи.

Зачем нужен скрытый слой

Если бы нейросеть состояла только из одной такой суммы на входе и одной на выходе, она могла бы описывать лишь линейные зависимости — то есть проводить прямые линии (или плоскости в многомерном случае) между классами данных. Многие реальные закономерности так не устроены, и самый наглядный пример этого — логическая операция «исключающее ИЛИ» (XOR): результат равен единице, только если ровно один из двух входов равен единице. Точки, которые нужно разделить, расположены так, что никакая одна прямая линия не отделяет «единицы» от «нулей» — фигура требует изгиба.

Именно для такого изгиба и нужен скрытый слой вместе с нелинейной функцией активации. После взвешенной суммы к результату применяется функция вроде гиперболического тангенса (tanh) или ReLU, которая нелинейно искажает значение. Без этой нелинейности несколько слоёв математически схлопываются в один — сложение линейных операций всё равно даёт линейную операцию. С нелинейностью же сеть получает возможность строить составные, изогнутые границы решений, и именно это отличает «сеть с одним слоем» от «сети, способной решить XOR».

Полный цикл — от входных чисел до обновления весов — удобно представить одной последовательностью:

flowchart TD
A[Входные числа] --> B[Взвешенная сумма + смещение]
B --> C[Нелинейная активация]
C --> D[Предсказание]
D --> E[Функция потерь: сравнение с ответом]
E --> F[Градиенты через backprop]
F --> G[Обновление весов]
G --> B

Эта схема и есть вся механика обучения: сеть не «думает» на каждом шаге, а прогоняет числа через фиксированную последовательность операций и корректирует параметры по результату сравнения с правильным ответом.

Как измеряется ошибка и куда «падает» градиент

Функция потерь — это просто число, показывающее, насколько предсказание разошлось с правильным ответом: чем ближе прогноз к цели, тем меньше значение. Для задач классификации часто используют бинарную кросс-энтропию, для более простых иллюстраций — квадратичную ошибку; выбор конкретной функции влияет на то, как именно будут вычисляться градиенты, но не меняет общей идеи: обучение — это минимизация числа.

Дальше встаёт практический вопрос: если в сети тысячи или миллионы весов, как понять, какой из них и насколько виноват в ошибке? Ответ — обратное распространение ошибки (backpropagation). Оно применяет цепное правило дифференцирования, двигаясь от выхода сети обратно ко входу, и для каждого веса вычисляет, в какую сторону и насколько его нужно изменить. Ручной вывод такой производной даже для одного нейрона с сигмоидой и квадратичной ошибкой занимает несколько шагов дифференцирования — и это стоит проделать хотя бы раз, чтобы увидеть, что «магии» в автоматическом дифференцировании фреймворков вроде PyTorch нет, есть просто автоматизация той же цепочки вычислений.

Полученный градиент показывает направление скорейшего роста ошибки, поэтому вес корректируют в противоположную сторону — эта процедура называется градиентным спуском. Величина шага задаётся гиперпараметром — скоростью обучения (learning rate): слишком маленькая скорость делает обучение мучительно медленным, слишком большая — приводит к тому, что потери начинают скакать или расходиться вместо того, чтобы плавно снижаться. Между этими крайностями нет универсального «правильного» числа — оно подбирается экспериментально для конкретной задачи и архитектуры, и заявления вида «эта модель обучается быстрее той» без указания скорости обучения, данных и условий эксперимента почти ничего не говорят о реальном превосходстве одной архитектуры над другой.

Что доказывает XOR, а что — нет

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

Что показывает XOR-пример Что из него нельзя заключить
Один линейный слой не может разделить точки XOR Что любая реальная задача решается добавлением одного скрытого слоя
Нелинейная активация даёт сети гибкость строить изогнутые границы Что тот же принцип одинаково легко масштабируется на миллионы параметров
Обучение на четырёх примерах без шума и пропусков сходится за разумное число эпох Как сеть поведёт себя на зашумлённых, неполных или смещённых реальных данных
Ручная реализация на NumPy воспроизводит весь цикл обучения Что такая реализация без регуляризации и подбора гиперпараметров годится для продакшена
Итоговая точность на четырёх заранее известных ответах близка к идеальной Что подобные числа точности переносятся на задачи с тысячами непредсказуемых случаев

Разница между «мы показали механику» и «мы решили практическую задачу» тут принципиальна. Обучающий набор XOR состоит из четырёх строк с заранее известными правильными ответами — в нём нет шума измерений, пропущенных значений, несбалансированных классов и смещений в данных, с которыми приходится бороться в любой реальной системе. Устойчивость такой ручной реализации к подобным осложнениям источники не проверяют, и переносить выводы из игрушечного примера на промышленные модели без дополнительных инженерных приёмов — регуляризации, нормализации, подбора архитектуры под конкретные данные — преждевременно.

Где заканчивается простая аналогия

Современные большие языковые модели работают на том же фундаменте — входы, веса, функция потерь, градиентный спуск, — но масштаб меняет практически всё остальное. Вместо четырёх строк данных — терабайты текста, вместо восьми весов — миллиарды параметров, вместо ручного подбора архитектуры — годы инженерных экспериментов над тем, как устроены слои, как данные подаются в сеть и как контролируется процесс обучения на распределённых вычислительных кластерах. То, что маленькая сеть на NumPy обучается решать XOR за несколько тысяч эпох на обычном ноутбуке, не объясняет, почему языковая модель генерирует связный текст — это как объяснять полёт самолёта на примере бумажного самолётика: аэродинамический принцип общий, но масштаб задачи и инженерная сложность несопоставимы.

Отсюда и главная ловушка популярных объяснений: показывая, что скрытый слой «понимает» XOR, легко создать впечатление, будто сеть вообще что-то понимает — в человеческом смысле слова. На деле она подбирает числа, минимизирующие ошибку на конкретных примерах, и ничего не знает о значении этих чисел за пределами обучающего набора.

Что с этим делать читателю

Полезная привычка при столкновении с громкими заявлениями об ИИ — спрашивать не «работает ли здесь тот же принцип», а «какие данные, какая архитектура и какая функция ошибки стоят за конкретным результатом». Учебный пример с XOR по-прежнему остаётся хорошим способом увидеть механику обучения своими глазами — веса, смещения, активации, градиенты, — но это демонстрация принципа, а не доказательство того, что тот же код в том же виде решит задачу с реальными, шумными и непредсказуемыми данными. Понимание нейросети как настраиваемой числовой схемы, а не «ума в коробке», — именно то, что позволяет отличать инженерный результат от маркетингового обещания.

Источники

  1. Neural Networks Explained: What They Are and How to Build One in Python
  2. Backpropagation & Gradient Descent: Complete Tutorial
Поделиться:
Telegram Facebook X VK
Scroll to Top