Files
SecondBrain/01 Library/11 Machine Learning/Обратное распространение ошибки.md
T
2026-05-07 15:32:13 +03:00

148 lines
5.9 KiB
Markdown

---
status: stable
type: concept
tags:
- machine-learning
- neural-networks
- backpropagation
- gradient-descent
created: 2025-12-17
updated: 2026-05-07
title: Обратное распространение ошибки
---
# Обратное распространение ошибки
**Обратное распространение ошибки** (*backpropagation*) - алгоритм вычисления градиентов функции ошибки по весам многослойной [[Нейронные сети|нейронной сети]]. После вычисления градиентов веса обновляются методом градиентного спуска.
Главная идея: сначала сеть делает прямой проход и получает предсказание, затем ошибка распространяется от выходного слоя назад к предыдущим слоям. Для каждого веса считается, насколько изменение этого веса повлияло на итоговую ошибку.
## Где используется
Backpropagation нужен при обучении сетей с учителем:
$$
X^{(p)} \rightarrow Y^{(p)} \approx D^{(p)}
$$
где:
- $X^{(p)}$ - входной объект;
- $Y^{(p)}$ - выход сети;
- $D^{(p)}$ - целевой ответ;
- $p$ - номер обучающего примера.
Алгоритм применим к многослойным сетям, если функции активации дифференцируемы или хотя бы имеют используемую на практике производную почти всюду.
## Прямой проход
Для сети с одним скрытым слоем:
$$
S_i^{(1)}=\sum\limits_{j=1}^{n}w_{ij}^{(1)}x_j
$$
$$
u_i=F(S_i^{(1)})
$$
$$
S_l^{(2)}=\sum\limits_{i=1}^{k}w_{li}^{(2)}u_i
$$
$$
y_l=F(S_l^{(2)})
$$
В развёрнутом виде:
$$
y_l=
F\left(
\sum\limits_{i=1}^{k}
w_{li}^{(2)}
F\left(
\sum\limits_{j=1}^{n}
w_{ij}^{(1)}x_j
\right)
\right),
\quad l=\overline{1,m}
$$
## Функция ошибки
Для одного обучающего примера часто используют квадратичную ошибку:
$$
E=\frac{1}{2}\sum\limits_{l=1}^{m}(y_l-d_l)^2
$$
Коэффициент $\frac{1}{2}$ нужен только для удобства производной: при дифференцировании квадрат даёт множитель $2$, который сокращается.
## Обновление весов
Минимизация ошибки происходит через градиентный спуск:
$$
w_{ij}(t+1)=w_{ij}(t)-\alpha\frac{\partial E}{\partial w_{ij}(t)}
$$
где:
- $w_{ij}$ - вес связи;
- $t$ - номер шага обучения;
- $\alpha$ - скорость обучения (*learning rate*);
- $\frac{\partial E}{\partial w_{ij}}$ - производная ошибки по весу.
Если производная положительная, увеличение веса увеличивает ошибку, поэтому вес уменьшается. Если производная отрицательная, вес увеличивается.
## Алгоритм
1. Подать входной вектор $X$ на вход сети.
2. Выполнить прямой проход и получить выходы всех слоёв.
3. Посчитать ошибку $E$ между предсказанием $Y$ и целевым ответом $D$.
4. Посчитать ошибку выходного слоя $\delta^{(2)}$.
5. Распространить ошибку назад и посчитать ошибки скрытых слоёв $\delta^{(1)}$.
6. Найти градиенты по весам.
7. Обновить веса в направлении антиградиента.
8. Повторять до выполнения условия остановки: лимит эпох, малая ошибка, малая норма градиента или отсутствие улучшения.
## Локальная ошибка слоя
Для выходного слоя:
$$
\delta_l^{(2)}=(y_l-d_l)F'(S_l^{(2)})
$$
Для скрытого слоя:
$$
\delta_i^{(1)}
=
F'(S_i^{(1)})
\sum\limits_{l=1}^{m}
\delta_l^{(2)}w_{li}^{(2)}
$$
То есть ошибка скрытого нейрона - это сумма ошибок следующего слоя, взвешенная связями с этим слоем, умноженная на производную активации скрытого нейрона.
## Интуиция
Backpropagation - это не отдельный способ оптимизации, а эффективный способ вычислить градиенты. Оптимизацию делает градиентный спуск или его модификации: SGD, Momentum, Adam и т.д.
Смысл $\delta$:
- на выходном слое $\delta$ показывает, насколько нейрон ошибся с учётом производной активации;
- на скрытом слое прямого целевого ответа нет, поэтому ошибка собирается из всех нейронов следующего слоя;
- градиент веса получается как локальная ошибка нейрона, в который входит вес, умноженная на вход этого веса.
## Иллюстрации
![[Pasted image 20260417105754.png|536]]
![[Pasted image 20260417105833.png|540]]
## Связанные заметки
- [[Обратное распространение ошибки - вывод]]
- [[Нейронные сети]]
- [[Линейные модели]]