116 lines
5.2 KiB
Markdown
116 lines
5.2 KiB
Markdown
---
|
|
status: stable
|
|
type: concept
|
|
tags:
|
|
- machine-learning
|
|
- neural-networks
|
|
- backpropagation
|
|
- gradient-descent
|
|
created: 2025-12-17
|
|
updated: 2026-05-07
|
|
aliases:
|
|
- Обратное распространение ошибки
|
|
---
|
|
# Обратное распространение ошибки
|
|
|
|
**Обратное распространение ошибки** (*backpropagation*) - алгоритм вычисления градиентов функции ошибки по весам многослойной [[Нейронные сети|нейронной сети]]. Само обновление весов выполняет градиентный спуск или его модификации, а backpropagation отвечает за эффективный расчёт производных.
|
|
|
|
Главная идея: сначала сеть выполняет прямой проход и получает предсказание, затем ошибка распространяется от выходного слоя назад к предыдущим слоям. Для каждого веса считается, как изменение этого веса повлияло бы на итоговую ошибку.
|
|
|
|
## Как выглядит
|
|
|
|
![[Pasted image 20260507214813.png]]
|
|
|
|
## Где используется
|
|
|
|
Backpropagation нужен при обучении сетей с учителем:
|
|
|
|
$$
|
|
X^{(p)} \rightarrow Y^{(p)} \approx D^{(p)}
|
|
$$
|
|
|
|
где:
|
|
|
|
- $X^{(p)}$ - входной объект;
|
|
- $Y^{(p)}$ - выход сети;
|
|
- $D^{(p)}$ - целевой ответ;
|
|
- $p$ - номер обучающего примера.
|
|
|
|
Алгоритм применим к многослойным сетям, если функции активации дифференцируемы или хотя бы имеют используемую на практике производную почти всюду.
|
|
|
|
## Базовый цикл
|
|
|
|
1. Подать входной вектор $X$ на вход сети.
|
|
2. Выполнить прямой проход и получить выходы всех слоёв.
|
|
3. Посчитать ошибку $E$ между предсказанием $Y$ и целевым ответом $D$.
|
|
4. Посчитать локальную ошибку выходного слоя.
|
|
5. Распространить ошибку назад и посчитать локальные ошибки скрытых слоёв.
|
|
6. Найти градиенты по весам.
|
|
7. Обновить веса в направлении антиградиента.
|
|
8. Повторять до выполнения условия остановки: лимит эпох, малая ошибка, малая норма градиента или отсутствие улучшения.
|
|
|
|
## Ключевые формулы
|
|
|
|
Для квадратичной ошибки:
|
|
|
|
$$
|
|
E=\frac{1}{2}\sum\limits_{l=1}^{m}(y_l-d_l)^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}}$ - производная ошибки по весу.
|
|
|
|
## Локальная ошибка
|
|
|
|
Для выходного слоя:
|
|
|
|
$$
|
|
\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)}
|
|
$$
|
|
|
|
Смысл $\delta$: на выходном слое она показывает ошибку нейрона с учётом производной активации, а на скрытом слое собирает вклад ошибок следующего слоя, взвешенный связями.
|
|
|
|
## Что вынесено отдельно
|
|
|
|
- [[Backpropagation для однослойного перцептрона]] - подробный математический вывод через правило цепочки.
|
|
- [[Backpropagation для многослойной нейронной сети]] - общий алгоритм для произвольного числа слоёв.
|
|
|
|
## Интуиция
|
|
|
|
Backpropagation - это не отдельный способ оптимизации, а способ быстро вычислить градиенты. Оптимизацию делает градиентный спуск или его модификации: SGD, Momentum, Adam и т.д.
|
|
|
|
Градиент веса получается как локальная ошибка нейрона, в который входит вес, умноженная на вход этого веса. Поэтому после обратного прохода обновление всех весов становится локальной операцией.
|
|
|
|
## Иллюстрации
|
|
|
|
![[Pasted image 20260417105754.png|536]]
|
|
|
|
![[Pasted image 20260417105833.png|540]]
|
|
|
|
## Связанные заметки
|
|
|
|
- [[Backpropagation для однослойного перцептрона]]
|
|
- [[Backpropagation для многослойной нейронной сети]]
|
|
- [[Нейронные сети]]
|
|
- [[Линейные модели]]
|