Разработка собственной нейронной сети

Направление подготовки: 09.03.04 Программная инженерия
Профиль: "Системное и прикладное программное обеспечение"
Руководитель практики: В. М. Димитров
Сроки прохождения: 27.05.2026 - 09.06.2026
Объем отчета: не менее 7 страниц (без учета титульного листа и содержания)

Цель и задачи практики

Цель практики: применение программных инструментов и технологий для разработки программного обеспечения на примере создания и обучения нейронной сети без использования высокоуровневых фреймворков (TensorFlow, PyTorch, Keras). Допускается использование библиотеки NumPy для матричных операций.

Задача 1. Изучение математической теории
Освоение линейной алгебры, матричных операций, градиентного спуска, цепного правила, производных функций активации.
Задача 2. Реализация нейросети
Разработка полносвязных слоев, алгоритма обратного распространения ошибки, оптимизатора, механизмов регуляризации.
Задача 3. Проведение экспериментов
Обучение на эталонных задачах (XOR, make_moons, MNIST), сравнение с эталонными реализациями, анализ влияния гиперпараметров.

Спецификация нейросети

Каждый студент разрабатывает полносвязную нейронную сеть (многослойный перцептрон) с возможностью настройки количества слоев и нейронов. Разрешен только NumPy (для матричных операций), запрещены готовые фреймворки глубокого обучения.

Этап I

Архитектура нейронной сети

Сеть должна иметь следующую структуру:

1. Матричные операции и прямое распространение

Прямое распространение (forward pass) — вычисление выходного сигнала сети по входным данным. Для каждого слоя выполняется:

2. Функции активации и их производные

Для реализации обратного распространения необходимо уметь вычислять производные функций активации.

2.2 Sigmoid (логистическая функция)

2.3 Softmax (для многоклассовой классификации)

3. Функции потерь (Loss Functions)

Функция потерь измеряет ошибку предсказания сети и служит целью оптимизации.

3.1 Среднеквадратичная ошибка (MSE) — для регрессии

3.2 Бинарная кросс-энтропия (Binary Cross-Entropy) — для бинарной классификации

3.3 Категориальная кросс-энтропия (Categorical Cross-Entropy) — для многоклассовой классификации

4. Обратное распространение ошибки (Backpropagation)

Алгоритм вычисления градиентов функции потерь по всем параметрам сети на основе цепного правила.

4.1 Общая схема

Для выходного слоя градиент ошибки вычисляется непосредственно из производной функции потерь. Для каждого предыдущего слоя градиент распространяется назад:

4.2 Последовательность вычислений при обучении

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

5. Оптимизатор: стохастический градиентный спуск (SGD)

Стандартный алгоритм оптимизации, обновляющий параметры в направлении, противоположном градиенту.

6. Инициализация весов

Правильная инициализация критически важна для сходимости градиентного спуска.

6.1 Случайная инициализация с малыми значениями

6.2 Инициализация Xavier/Glorot (рекомендуется)

6.3 Инициализация He (для ReLU)

7. Процесс обучения (Training Loop)

Основной цикл обучения, объединяющий все компоненты.

Экспериментальная часть

8.1 Эксперимент 1: Задача XOR

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

8.2 Эксперимент 2: Датасет make_moons

Двумерный датасет с двумя классами, образующими "луны". Требует нелинейной разделяющей границы.

8.3 Сравнение с эталонной реализацией

Для проверки корректности необходимо сравнить результаты с реализацией из библиотеки scikit-learn.

Визуализация результатов

Каждый эксперимент должен сопровождаться наглядными графиками.

9.1 График функции потерь

9.2 Визуализация предсказаний (для двумерных данных)

Этап II

1. Ранняя остановка (early stopping)

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

Технические требования к реализации:

Экспериментальная проверка:

2. Регуляризация L2 или Dropout

Регуляризация — это методы, снижающие переобучение путем ограничения сложности модели. Можно выбрать один из двух вариантов (оба приветствуются, но минимально необходим один).

2.1 Регуляризация L2 (weight decay)

Добавляет штраф к функции потерь за большие значения весов: L = L_original + λ · Σ(w²). Градиент весов изменяется: ∂L/∂w = ∂L_original/∂w + 2λ·w. При обновлении весов это эквивалентно умножению весов на коэффициент (1 - 2λ·lr).

2.2 Dropout

Во время обучения случайным образом "выключает" долю нейронов в слое с вероятностью p. Это заставляет сеть учиться более робастным признакам. Реализация включает:

Экспериментальная проверка регуляризации:

3. Сохранение и загрузка весов

Возможность сохранять обученную модель на диск и загружать обратно без необходимости повторного обучения. Это важный инженерный компонент.

Требования:

Экспериментальная проверка:

4. Оптимизатор с моментом (Momentum) или Adam

Более сложные оптимизаторы, чем стандартный SGD, ускоряют сходимость и помогают преодолевать локальные минимумы. Можно реализовать один из двух вариантов.

4.1 SGD с моментом (Momentum)

Накопляет историю градиентов: v = momentum·v - learning_rate·grad, затем w = w + v. Параметр momentum обычно 0.9.

4.2 Optimizer Adam (рекомендуемый для уровня 2)

Adam сочетает momentum и адаптивную скорость обучения для каждого параметра. Формулы обновления:

Экспериментальная проверка:

5. Пакетная нормализация (Batch Normalization)

Batch Norm нормализует выходы слоя по мини-батчу, что стабилизирует обучение и позволяет использовать более высокие learning rates. Реализуется как отдельный слой.

Требования к реализации:

Экспериментальная проверка:

6. Эксперимент с набором данных MNIST

Классический датасет рукописных цифр (28×28 пикселей, 10 классов). Эксперимент демонстрирует способность сети работать с реальными данными.

Требования к проведению эксперимента:

Анализ результатов:

7. Визуализация границ решений или весов первого слоя

Визуализация помогает понять, что именно выучила нейронная сеть.

7.1 Визуализация границ решений (для двумерных данных)

7.2 Визуализация весов первого слоя (для MNIST или изображений)

8. Модульные тесты градиентов (численная проверка)

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

Реализация:

Включение в отчет:

Обязательные разделы отчета

Отчет

Источники и справочные материалы

Ниже приведены ссылки, которые помогут в освоении теории и практической реализации. Поощряется изучение дополнительных источников.