Искусственные нейронные сети (ИНС) — это мощный инструмент в арсенале машинного обучения, способный распознавать образы, делать прогнозы и классифицировать данные. Но для того, чтобы сеть могла выполнять эти задачи, ее необходимо обучить. Процесс обучения — это, по сути, настройка внутренних параметров сети (весов и смещений) таким образом, чтобы она выдавала максимально точные результаты.
Основным и наиболее популярным методом обучения многослойных ИНС прямого распространения является алгоритм обратного распространения ошибки, или Backpropagation.
1. Суть алгоритма Backpropagation
Backpropagation — это эффективный метод для вычисления градиента функции потерь (ошибки) относительно весов сети. Зная градиент, можно применить оптимизационный метод, чаще всего градиентный спуск (или его модификации), чтобы скорректировать веса и минимизировать ошибку.
Процесс обучения состоит из двух основных фаз, повторяющихся в течение множества эпох (полных циклов прохода по всему обучающему набору данных):
1.1. Прямой проход (Forward Pass)
Подача данных: Входные данные подаются на входной слой.
Расчет активаций: Сигнал проходит через все слои сети, от входа к выходу. Каждый нейрон рассчитывает свой взвешенный вход, применяет функцию активации и передает результат нейронам следующего слоя.
Получение результата: Сеть выдает свой текущий прогноз (\hat{y}).
Расчет ошибки (Loss Function): Сравнивается полученный прогноз (\hat{y}) с желаемым (целевым) выходом (y). Рассчитывается значение функции потерь (например, среднеквадратичная ошибка — MSE). Это и есть та ошибка, которую нужно минимизировать.
1.2. Обратный проход (Backward Pass)
Это ключевой этап, давший название алгоритму:
Распространение ошибки: Ошибка, рассчитанная на выходном слое, распространяется обратно через сеть, слой за слоем, от выходного к входному.
Расчет градиента: Для каждого веса и смещения в сети вычисляется его вклад в общую ошибку с использованием цепного правила (chain rule) из дифференциального исчисления. Это позволяет узнать, в каком направлении и насколько сильно нужно изменить вес, чтобы уменьшить ошибку.
Корректировка весов: Веса (w) и смещения (b) корректируются в направлении, противоположном градиенту, с учетом скорости обучения (\eta) (learning rate): w_{новый} = w_{старый} - \eta \cdot \frac{\partial E}{\partial w} Где E — ошибка (Loss), а \frac{\partial E}{\partial w} — градиент ошибки по весу.
Этот цикл повторяется до тех пор, пока ошибка сети не станет достаточно малой или пока не будет достигнуто заданное количество эпох.
2. Пример реализации в MATLAB
MATLAB (с помощью Neural Network Toolbox) предоставляет удобные инструменты для быстрого создания и обучения нейронных сетей с использованием Backpropagation (часто в его модификациях, таких как Левенберг-Марквардта или Байесовская регуляризация, которые более эффективны).
Рассмотрим пример создания и обучения простой двухслойной сети для аппроксимации функции (восстановления зависимости).
Шаг 1: Подготовка данных
Зададим входные данные (P) и желаемые целевые выходы (T).
% Входные данные (P)
P = [0 1 2 3 4 5 6 7 8];
% Желаемые выходы (T) - значения аппроксимируемой функции
T = [0 0.44 0.88 0.11 -0.66 -0.95 -0.45 0.18 0.92];
% Визуализация исходной функции
plot(P, T, 'o', 'MarkerSize', 8, 'LineWidth', 2);
title('Исходная функция для аппроксимации');
xlabel('Вход P');
ylabel('Выход T');
grid on;
Шаг 2: Создание нейронной сети
Создадим двухслойную сеть прямого распространения:
1-й слой (скрытый): 10 нейронов с нелинейной сигмоидальной функцией активации (tansig).
2-й слой (выходной): 1 нейрон с линейной функцией активации (purelin) — это типично для задач регрессии/аппроксимации.
<!-- end list -->
% Создание сети (New feed-forward network)
% [10] - количество нейронов в скрытом слое
% {'tansig', 'purelin'} - функции активации для слоев 1 и 2
net = newff(minmax(P), [10 1], {'tansig', 'purelin'}, 'trainlm');
% 'trainlm' - это алгоритм обучения Левенберга-Марквардта,
% который является высокоэффективной модификацией Backpropagation.
Шаг 3: Настройка параметров обучения
Установим некоторые параметры обучения, например, количество эпох.
% Установка параметров обучения
net.trainParam.epochs = 1000; % Максимальное количество эпох
net.trainParam.goal = 1e-5; % Целевое значение ошибки
net.trainParam.show = 10; % Показывать прогресс каждые 10 эпох
Шаг 4: Обучение сети
Запустим процесс обучения с использованием созданных данных и настроенной сети.
% Обучение сети
[net, tr] = train(net, P, T);
% net - обученная сеть
% tr - информация о процессе обучения
Шаг 5: Проверка и визуализация результата
Проверим, как обученная сеть аппроксимирует исходную функцию.
% Получение выходных данных после обучения
Y = sim(net, P);
% Визуализация результатов
figure;
plot(P, T, 'o', 'MarkerSize', 8, 'DisplayName', 'Исходные данные'); % Исходные данные
hold on;
plot(P, Y, 'r-', 'LineWidth', 2, 'DisplayName', 'Прогноз сети'); % Прогноз сети
title('Аппроксимация функции нейронной сетью');
xlabel('Вход P');
ylabel('Выход');
legend('show');
grid on;
Результат: После выполнения этих шагов, обученная нейронная сеть (net) сможет выдать выходные значения Y, которые будут очень близки к желаемым целевым значениям T, что свидетельствует об успешном обучении с помощью алгоритма обратного распространения ошибки.