Лекция 12. Нейронные сети и обратное распространение ошибки

Цель лекции. Изучить устройство искусственных нейронных сетей, назначение слоёв и функций активации, механизм прямого распространения сигнала и алгоритм обратного распространения ошибки. Рассмотреть процесс обучения многослойного перцептрона и его реализацию на Python.

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

1. Основы искусственных нейронных сетей

Искусственная нейронная сеть (Artificial Neural Network, ANN) — модель машинного обучения, состоящая из связанных вычислительных элементов — искусственных нейронов. Нейроны организованы в слои, а параметры связей изменяются в ходе обучения.

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

Нейрон получает входные значения, умножает их на веса, добавляет смещение и применяет функцию активации:

Здесь  — входные признаки,  — веса,  — смещение,  — функция активации,  — выход нейрона.

Если убрать нелинейные функции активации, последовательность полносвязных линейных слоёв сведётся к одному линейному преобразованию. Именно нелинейность позволяет сети описывать более сложные зависимости.

2. Слои и функции активации

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

Здесь  — номер слоя,  — матрица весов,  — вектор смещений,  — выход предыдущего слоя.

Функция активации определяет нелинейное преобразование результата нейрона. Наиболее распространённые варианты:

Сигмоида:

Гиперболический тангенс:

ReLU:

Функция

Диапазон значений

Типичное применение

Sigmoid

От 0 до 1

Выход бинарного классификатора

Tanh

От −1 до 1

Скрытые слои отдельных архитектур

ReLU

От 0 до бесконечности

Скрытые слои глубоких сетей

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

Здесь  — количество классов. Сумма полученных вероятностей равна единице.

3. Прямое распространение и функция потерь

Прямое распространение (Forward Propagation) — последовательное вычисление выходов слоёв от входных признаков до итогового прогноза.

Для двухслойной сети с одним скрытым слоем:

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

Для регрессии часто используется среднеквадратичная ошибка:

Для бинарной классификации применяется бинарная кросс-энтропия:

Задача обучения — подобрать параметры сети так, чтобы уменьшить значение функции потерь на обучающих данных и обеспечить хорошее качество на новых примерах.

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

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

Если результат зависит от промежуточной переменной, цепное правило позволяет разложить производную:

Для выходного слоя вычисляется сигнал ошибки, затем он передаётся назад к предыдущим слоям. Для полносвязной сети один из стандартных вариантов записи:

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

Градиенты весов и смещений слоя вычисляются как:

Эти выражения относятся к одному примеру; для пакета наблюдений градиенты агрегируются в соответствии с определением функции потерь.

После вычисления градиентов параметры можно обновить методом градиентного спуска:

где  — скорость обучения (learning rate). Аналогично обновляются смещения.

5. Организация обучения и основные трудности

Обучение нейронной сети обычно состоит из повторяющихся этапов: прямое распространение, вычисление потерь, обратное распространение и обновление параметров.

Эпоха (Epoch) — один проход по обучающему набору данных. Пакет (Mini-batch) — часть обучающих примеров, по которой вычисляют очередное обновление параметров.

На результат влияют несколько важных настроек:

•             Скорость обучения: слишком большая может вызывать нестабильность, слишком маленькая — замедлять обучение.

•             Число слоёв и нейронов: определяет ёмкость модели, но увеличение сложности повышает риск переобучения.

•             Размер пакета: влияет на стоимость вычислений и шум градиентных оценок.

•             Регуляризация: ограничивает переобучение; используются, например, штрафы на веса и ранняя остановка.

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

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

6. Практическая реализация на Python

Рассмотрим многослойный перцептрон для классификации рукописных цифр из набора digits. В scikit-learn класс MLPClassifier реализует нейронную сеть с полносвязными слоями и обучением на основе обратного распространения ошибки.

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, classification_report

X, y = load_digits(return_X_y=True)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

model = make_pipeline(
    StandardScaler(),
    MLPClassifier(
        hidden_layer_sizes=(64, 32),
        activation="relu",
        solver="adam",
        max_iter=500,
        early_stopping=True,
        random_state=42
    )
)

model.fit(X_train, y_train)
predictions = model.predict(X_test)

print("Accuracy:", accuracy_score(y_test, predictions))
print(classification_report(y_test, predictions))

В примере используются изображения цифр размером 8 × 8 пикселей, представленные векторами из 64 признаков. Сеть имеет два скрытых слоя по 64 и 32 нейрона. Стандартизация выполняется внутри Pipeline, чтобы избежать утечки информации из тестовой выборки.

Параметр early_stopping=True позволяет прекратить обучение, когда качество на внутренней валидационной части перестаёт улучшаться. Алгоритм adam автоматически адаптирует шаги обновления параметров.

Эксперимент с архитектурой

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

from sklearn.model_selection import cross_val_score

for layers in [(32,), (64, 32)]:
    candidate = make_pipeline(
        StandardScaler(),
        MLPClassifier(
            hidden_layer_sizes=layers,
            max_iter=500,
            early_stopping=True,
            random_state=42
        )
    )
    scores = cross_val_score(
        candidate, X_train, y_train,
        cv=3, scoring="accuracy"
    )
    print(layers, "Средняя Accuracy:", round(scores.mean(), 3))

После выбора архитектуры обучите итоговую модель на обучающих данных и оцените её на независимой тестовой выборке. Результаты могут немного различаться в зависимости от начальной инициализации весов и разделения данных.

7. Практическое значение и выводы

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

Их сильная сторона — способность обучать нелинейные представления данных. При этом обучение требует настройки архитектуры, гиперпараметров, контроля переобучения и достаточного объёма качественных данных.

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