惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Secure Thoughts
美团技术团队
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
月光博客
月光博客
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recorded Future
Recorded Future
I
Intezer
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
罗磊的独立博客
V
V2EX
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
A
About on SuperTechFans
Scott Helme
Scott Helme
Vercel News
Vercel News
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
C
CERT Recently Published Vulnerability Notes
G
Google Developers Blog
B
Blog
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Jina AI
Jina AI
IT之家
IT之家
C
Cybersecurity and Infrastructure Security Agency CISA
P
Palo Alto Networks Blog
小众软件
小众软件
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
AWS News Blog
AWS News Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Мой первый ИИ: Пишем нейросеть на Python с нуля
Коммунист Этичный Хакер · 2026-05-05 · via Все публикации подряд на Хабре

11 мин

15K

1. Введение: Что такое нейросеть?

Аналогия с мозгом Нейросеть — это математическая модель, имитирующая работу мозга. Как человек учится отличать «1» от «7» по визуальным шаблонам, так и алгоритм учится находить закономерности в данных, выделяя главные признаки и игнорируя шум.

Упрощенная модель Весь процесс работы делится на 3 этапа:

  1. Входные данные: то, что алгоритм «видит» (в нашем случае — пиксели картинки).

  2. Обработка (веса): математические вычисления. Входные данные проходят через формулы, где умножаются на веса — числовые коэффициенты. Веса определяют важность каждого сигнала. Обучение нейросети — это просто автоматический подбор правильных весов.

  3. Предсказание: итоговый ответ алгоритма (например, классификация: «это цифра 7»).

Наша цель Написать нейросеть на Python с абсолютного нуля (используя только базовую математику) и научить её распознавать рукописные цифры.

2. Подготовка инструментов

Почему именно Python? Python — абсолютный лидер в мире искусственного интеллекта. Его главное преимущество для нас — простой синтаксис, который читается почти как обычный английский текст. Это значит, что мы не будем отвлекаться на сложный код, а сосредоточимся на том, как мыслит наша нейросеть.

Наши главные инструменты (библиотеки) Мы немного схитрим и возьмем три готовых инструмента, которые упростят рутинную работу:

  • numpy Внутри нейросети постоянно происходят тысячи умножений и сложений. Обычный Python справляется с этим медленно. Библиотека NumPy создана для мгновенной работы с огромными таблицами чисел (матрицами). Она будет выполнять всю тяжелую математику под капотом, пока мы будем управлять логикой.

  • matplotlib Для компьютера любая картинка — это просто длинный список чисел. Чтобы мы, люди, могли посмотреть, какую именно цифру сейчас пытается угадать наш ИИ (и нарисовать красивые графики его обучения), нам нужен инструмент для визуализации.

  • sklearn Вообще, это мощная библиотека с уже готовыми алгоритмами машинного обучения. Но мы не будем использовать её «мозги», ведь мы пишем свои! Мы используем sklearn исключительно как кладовку — из неё мы всего одной строчкой кода достанем тот самый набор данных (датасет) с тысячами картинок рукописных цифр.

Как это будет выглядеть в коде:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

Инструменты готовы, дальше мы посмотрим, с какими именно данными нам предстоит работать.

3. Знакомство с данными (Dataset)

Где взять данные? Чтобы научить нашу сеть, ей нужно показать примеры. Мы загрузим встроенный набор данных digits из библиотеки sklearn. Это коллекция из почти 1800 картинок, где люди от руки написали разные цифры.

В коде это выглядит очень просто:

digits = datasets.load_digits()
images = digits.images # Сами картинки (входные данные)
labels = digits.target # Правильные ответы (чтобы сеть знала, где ошиблась)

Как видит компьютер? (Визуализация) Если мы выведем одну картинку на экран, то увидим размытую цифру размером всего 8 на 8 пикселей. Но для компьютера это не изображение. Компьютер видит матрицу — квадратную таблицу из 64 чисел. Каждое число означает яркость конкретного пикселя (например, 0 — это белый фон, а 16 — максимально черный след от ручки).

Преобразование (Flattening): Зачем ломать картинку? Здесь кроется важный секрет устройства базовых нейросетей. Наш входной слой не умеет смотреть на квадратную картинку целиком, как это делает человеческий глаз. Вспомните схему из первой части: у сети есть просто ряд независимых входов (кружочков).

Поэтому перед тем, как отдать картинку нейросети, нам нужно сделать Flattening (сплющивание). Мы берем наш квадрат 8x8 и «вытягиваем» его в одну длинную цепочку. Мы берем первую строчку пикселей, приклеиваем к ней вторую, затем третью и так далее.

В итоге вместо квадрата мы получаем длинный «поезд» из 64 вагонов-пикселей (вектор). Это и есть наши 64 сигнала (от x_1 до x_{64}), которые отправятся в нейросеть.

4. Архитектура нашей сети

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

1. Входной слой: Наши 64 пикселя Это зона приема данных. Здесь нет никакой математики, это просто 64 «датчика», каждый из которых принимает яркость одного конкретного пикселя нашей картинки. Если пиксель белый, датчик передает ноль. Если черный — передает число побольше. Можно представить, что это 64 провода, по которым бежит ток разной силы.

2. Скрытый слой Сигнал от датчиков идет дальше — в скрытый слой. Он называется «скрытым», потому что мы (пользователи) не видим его работу напрямую, он спрятан внутри программы. Здесь находятся внутренние нейроны. Вы можете создать их сколько угодно: 15, 64 или 100. Чем их больше, тем умнее может стать сеть, но тем дольше она будет думать. В этой «комнате» нейроны пытаются найти закономерности. Один нейрон может научиться реагировать на кружочки (важно для цифр 8, 9, 0), другой — на вертикальные палочки (важно для 1 или 4).

3. Выходной слой После того как скрытый слой поискал закономерности, он передает свои выводы на последний этаж. Здесь у нас строго 10 нейронов — ровно по количеству цифр (от 0 до 9). Каждый из этих десяти нейронов — это детектор одной конкретной цифры. Они работают как жюри на конкурсе. В конце вычислений каждый нейрон выдает свою оценку (уверенность). Если громче всех «кричит» нейрон под номером 7, значит, нейросеть решила, что на картинке нарисована семерка.

Что такое веса (W) и смещения (b)? Объясняем на пальцах

Как именно сигнал проходит от одного слоя к другому? По связям. И у каждой связи есть свои настройки.

  • Веса (W — Weights): Настройка важности. Представьте пульт звукорежиссера с кучей ползунков громкости. Вес (W) — это такой ползунок на каждом проводе между нейронами. Если черный пиксель в самом центре картинки очень важен для определения цифры «8», нейросеть в процессе обучения выкрутит этот ползунок на максимум (сделает вес большим). А если черный пиксель в самом углу обычно означает случайную кляксу и только мешает, нейросеть сделает этот вес нулевым (выключит звук), чтобы игнорировать этот пиксель.

  • Смещение (b — Bias): Базовый уровень. Иногда нейрону нужна дополнительная помощь, чтобы «включиться» или, наоборот, остаться выключенным. Смещение (b) — это внутреннее настроение нейрона. Представьте, что это дополнительный грузик на весах. Он позволяет нейросети сказать: «Даже если сигналы от пикселей слабоваты, я всё равно добавлю немного от себя, потому что я склонен верить, что это цифра 1».

Обучение нейросети — это, по сути, просто бесконечное кручение этих ползунков (W) и подбор грузиков (b) до тех пор, пока выходные нейроны не начнут выдавать правильные ответы!

5. Математика (Основные функции)

Внутри нейросети нет никакой магии — только умножение и сложение. Давайте посмотрим, как именно цифры бегут по проводам нашей фабрики.

Прямое распространение (Forward Propagation): От входа к выходу Это процесс, когда данные просто идут слева направо: от входных пикселей к финальному ответу. Представьте один нейрон. К нему по проводу приходит сигнал от пикселя (назовем его x). На проводе висит «вес» — настройка важности (w). Внутри самого нейрона есть базовое смещение (b).

Математика прямого распространения для одного сигнала выглядит так:

Сигнал нейрона = (x \cdot w) + b (Вход умножить на вес, плюс смещение)

Если в нейрон приходит сразу 64 сигнала от всех пикселей, он просто умножает каждый на свой вес и складывает их все вместе в одну большую кучу. Получается одно число.

Функция активации: Зачем нам «нелинейность»? Проблема в том, что число, которое получилось после сложения сигналов, может быть любым: 15, -500 или 1000000. С такими дикими цифрами сети будет сложно работать. Нам нужен «фейсконтроль» (или переключатель), который решит: пропускать этот сигнал дальше или нет. Это и есть функция активации.

В современных нейросетях чаще всего используют две:

  1. ReLU (Rectified Linear Unit) — Жесткий охранник: Работает элементарно: «Если число отрицательное — превращаем его в 0. Если положительное — оставляем как есть». Это убивает ненужные (отрицательные) сигналы и оставляет только важные. Именно ReLU обычно ставят в скрытых слоях.

  2. Sigmoid (Сигмоида) — Плавный сжиматель: Она берет любое число и плавно сжимает его в диапазон строго от 0 до 1. Это идеально подходит для выходного слоя, ведь мы хотим получить от сети уверенность в процентах (например, 0.95 — это уверенность 95\%, что перед нами цифра 7).

Функция потерь (Loss Function): Работа над ошибками Итак, сигнал прошел до конца. Нейросеть выдала ответ: «Я думаю, что это цифра 1 (уверенность 80%), а не цифра 7». Но мы-то знаем правильный ответ!

Здесь на сцену выходит Функция потерь. Это строгий учитель, который оценивает ошибку. Он берет предсказание сети (0.8 для единицы) и сравнивает с идеалом (должно быть 0.0, ведь это семерка!). Функция вычисляет математическую разницу — штрафной балл.

  • Если сеть угадала идеально — штраф равен 0.

  • Если сеть сильно ошиблась — штраф огромный.

6. Обучение: Обратное распространение (Backpropagation)

В прошлой части наша нейросеть сделала предсказание и получила от Функции потерь «штрафной балл» за ошибку. Теперь ей нужно сделать работу над ошибками и как-то подкрутить свои веса (настройки важности), чтобы в следующий раз ошибиться меньше.

Этот процесс называется Обратным распространением ошибки (Backpropagation). Сигнал об ошибке идет с самого конца (от ответа) обратно к началу (к пикселям), по пути меняя настройки каждого тумблера. Но как сеть понимает, в какую именно сторону нужно крутить каждый вес: увеличивать его или уменьшать?

Метод градиентного спуска: Спуск с горы в тумане

Чтобы понять, как это работает, представим классическую аналогию.

Представьте, что вы стоите на склоне горы с завязанными глазами (или в густом тумане). Ваша цель — спуститься в самый низ, в долину. Высота горы — это размер вашей ошибки (Функция потерь). Чем вы ниже, тем точнее работает ваша нейросеть. Самая нижняя точка долины — это идеальные настройки весов, при которых ошибка равна нулю.

Как вы будете спускаться, если ничего не видите?

  1. Вы нащупываете ногой землю вокруг себя.

  2. Вы понимаете, в какую сторону склон уходит круче всего вниз.

  3. Вы делаете один шаг в этом направлении.

  4. Снова нащупываете склон и делаете следующий шаг.

В математике этот «уклон» называется градиентом. Нейросеть с помощью производных (не пугайтесь, Python посчитает их за нас) вычисляет, куда направлен склон для каждого отдельного веса, и делает небольшой математический «шаг» вниз.

Обновление весов: Размер шага имеет значение

Этот шаг называется Скоростью обучения (Learning Rate). Это очень важная настройка:

  • Если вы будете делать слишком маленькие шаги, вы будете спускаться с горы целую вечность (программа будет обучаться слишком долго).

  • Если вы будете делать слишком огромные прыжки, вы можете случайно перепрыгнуть самую нижнюю точку долины и оказаться на другом склоне горы (нейросеть «сойдет с ума» и не сможет обучиться).

Эпохи обучения: Повторение — мать учения

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

С каждой новой эпохой веса становятся всё точнее, нейросеть спускается всё ближе к высокой точности, а её предсказания становятся всё более уверенными. В логах программы это обычно выглядит так:

Эпоха 1: Ошибка 4.5 … Точность 12% Эпоха 50: Ошибка 1.2 … Точность 65% Эпоха 200: Ошибка 0.1 … Точность 96%

7. Пишем код (Step-by-Step)

Пора надеть шляпу программиста. Вся наша теория, слои, математика и данные объединяются в один рабочий скрипт. Вам не нужно устанавливать тяжелые программы — этот код можно запустить в любой среде (например, PyCharm, VS Code или Google Colab).

В этом коде есть один очень важный секрет профессионалов: обратите внимание на строку, где мы создаем стартовые веса (W1 и W2). Мы умножаем случайные числа на 0.1. Зачем? Если стартовые веса будут слишком большими, наша функция активации (Сигмоида) «ослепнет», процесс обучения остановится, и точность навсегда зависнет на 20%. Это называется «затуханием градиента». Уменьшая стартовые веса, мы помогаем сети начать учиться бодро и без запинок!

Вот полный, готовый к запуску код нашей нейросети. Просто скопируйте его и нажмите «Run»:

import numpy as np
from sklearn import datasets

# ==========================================
# 1. ПОДГОТОВКА ДАННЫХ
# ==========================================
# Загружаем картинки и "сплющиваем" их в цепочки по 64 пикселя
digits = datasets.load_digits()
X = digits.images.reshape((len(digits.images), -1)) / 16.0 

# One-Hot Encoding: превращаем правильный ответ (например, "3") 
# в список детекторов [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
Y_true = digits.target
Y = np.zeros((len(Y_true), 10))
for i in range(len(Y_true)):
    Y[i, Y_true[i]] = 1

# ==========================================
# 2. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
# ==========================================
# Плавный переключатель (от 0 до 1)
def activation(x): 
    return 1 / (1 + np.exp(-x))

# Уклон нашей "горы" для шага назад
def derivative(x): 
    return x * (1 - x)

# ==========================================
# 3. НАСТРОЙКИ СЕТИ
# ==========================================
input_size = 64     # 64 пикселя на входе
hidden_size = 15    # 15 нейронов в "тайной комнате"
output_size = 10    # 10 детекторов цифр на выходе

np.random.seed(42)  # Фиксируем случайность для стабильности

# Инициализируем веса. Умножаем на 0.1, чтобы избежать "паралича" сети!
W1 = np.random.randn(input_size, hidden_size) * 0.1 
W2 = np.random.randn(hidden_size, output_size) * 0.1

learning_rate = 0.1 # Размер шага при спуске с горы
epochs = 200        # Количество полных циклов обучения

# ==========================================
# 4. ЦИКЛ ОБУЧЕНИЯ (TRAINING LOOP)
# ==========================================
print("🚀 Запускаем обучение нейросети...\n")

for epoch in range(epochs):
    
    # --- ШАГ 1: ПРЯМОЕ РАСПРОСТРАНЕНИЕ ---
    # Сигналы от картинок бегут вперед к финалу
    hidden_layer = activation(np.dot(X, W1)) 
    output_layer = activation(np.dot(hidden_layer, W2))
    
    # --- ШАГ 2: ОЦЕНКА ОШИБКИ ---
    # Насколько предсказание сети отличается от идеала
    error = Y - output_layer
    
    # --- ШАГ 3: ОБРАТНОЕ РАСПРОСТРАНЕНИЕ ---
    # 1. Считаем сигнал ошибки на самом выходе
    delta_output = error * derivative(output_layer)
    # 2. Считаем сигнал ошибки, который дошел обратно до скрытого слоя
    delta_hidden = delta_output.dot(W2.T) * derivative(hidden_layer)
    
    # 3. Вычисляем градиенты (в какую сторону крутить веса)
    d_W2 = hidden_layer.T.dot(delta_output)
    d_W1 = X.T.dot(delta_hidden)
    
    # --- ШАГ 4: ОБНОВЛЕНИЕ ВЕСОВ ---
    # Делаем шаг вниз по горе
    W2 += learning_rate * d_W2
    W1 += learning_rate * d_W1
    
    # --- ШАГ 5: ВЫВОД ЛОГОВ ---
    # Каждые 10 эпох смотрим, насколько поумнел наш ИИ
    if epoch % 10 == 0:
        # Сеть выбирает нейрон с самым сильным сигналом
        predictions = np.argmax(output_layer, axis=1)
        # Считаем процент правильных ответов
        accuracy = np.mean(predictions == Y_true) * 100
        print(f"Эпоха {epoch:3d}: точность {accuracy:.1f}%")

print("\n✅ Обучение завершено!")

Как это будет выглядеть на экране?

Когда вы запустите этот скрипт, вы буквально увидите, как программа становится умнее с каждой секундой. В вашей консоли появится примерно такой отчет:

🚀 Запускаем обучение нейросети...

Эпоха   0: точность 10.1%
Эпоха  10: точность 46.2%
Эпоха  20: точность 68.5%
...
Эпоха 100: точность 91.3%
Эпоха 190: точность 95.8%

✅ Обучение завершено!

Всего за 200 проходов наша самодельная математическая фабрика научилась распознавать почерк с точностью почти 96%!

8. Проверка результата (Экзамен для ИИ)

Когда на экране красуется точность 95%, велик соблазн решить, что задача выполнена. Но есть один нюанс: а что, если нейросеть просто «зазубрила» конкретные картинки из тренировочного набора, но так и не поняла, как на самом деле выглядят цифры?

В машинном обучении это называется переобучением (Overfitting). Чтобы проверить ИИ, мы должны устроить ему экзамен на данных, которые он никогда не видел.

Тестирование на новых данных В идеале мы делим наш датасет на две части: 80% — для учебы, 20% — для проверки. После завершения всех циклов обучения мы просим сеть предсказать цифры для «контрольной группы».

Если на учебных данных точность 99%, а на тестовых — 50%, значит, наш ИИ — зубрила. Если же показатели близки — поздравляю, вы создали настоящий интеллект!

Матрица ошибок (Confusion Matrix) Даже самый умный ИИ иногда ошибается. Но важно понимать — как именно. Для этого мы рисуем «Матрицу ошибок». Это таблица, где:

  • Строки — это то, что было нарисовано на самом деле.

  • Столбцы — это то, что предсказала нейросеть.

Если цифра «8» на пересечении со столбцом «3» имеет число больше нуля, значит, наш ИИ путает восьмерку с тройкой. Взгляните на них: обе цифры состоят из округлостей. ИИ «видит» их сходство, и его ошибка — логична. Это доказывает, что сеть действительно ищет закономерности, а не просто гадает.

Код для визуализации ошибок

Чтобы увидеть, где именно ваш ИИ «косячит», добавьте этот блок после цикла обучения:

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

# Получаем финальные предсказания
# output_layer - это результат работы нашей нейросети
final_predictions = np.argmax(output_layer, axis=1)

# Строим матрицу ошибок
cm = confusion_matrix(Y_true, final_predictions)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=range(10))

# Рисуем график
fig, ax = plt.subplots(figsize=(8, 8))
disp.plot(cmap='Blues', ax=ax)
plt.title("Где ошибается наш ИИ? (Confusion Matrix)")
plt.show()

На этом графике вы увидите яркую диагональ (правильные ответы) и редкие «пятнышки» ошибок вне её. Именно эти пятнышки — самая интересная часть для исследователя данных!

9. Заключение

Куда двигаться дальше?

То, что мы написали сегодня — это «начальная школа» искусственного интеллекта. Чтобы строить системы, которые рисуют картины или пишут дипломы, стоит изучить:

  • Deep Learning (Глубокое обучение): Это нейросети с десятками и сотнями слоев. Они умеют распознавать лица, голоса и сложные объекты.

  • PyTorch и TensorFlow: Это промышленные стандарты. В них не нужно писать производные вручную — они делают это за тебя, позволяя собирать нейросети как конструктор LEGO.

  • Сверточные сети (CNN): Если хочешь работать с видео и фото на серьезном уровне, это твой следующий шаг.

Анонсы новых статей, полезные материалы, а так же если в процессе у вас возникнут сложности, обсудить их или задать вопрос по этой статье можно в моём Telegram-сообществе. Смело заходите, если что-то пойдет не так, — постараемся разобраться вместе.