--- status: stable type: concept tags: - machine-learning - neural-networks - backpropagation - gradient-descent created: 2025-12-17 updated: 2026-05-07 title: Обратное распространение ошибки --- # Обратное распространение ошибки **Обратное распространение ошибки** (*backpropagation*) - алгоритм вычисления градиентов функции ошибки по весам многослойной [[Нейронные сети|нейронной сети]]. После вычисления градиентов веса обновляются методом градиентного спуска. Главная идея: сначала сеть делает прямой проход и получает предсказание, затем ошибка распространяется от выходного слоя назад к предыдущим слоям. Для каждого веса считается, насколько изменение этого веса повлияло на итоговую ошибку. ## Как выглядит ![[Pasted image 20260507214813.png]] ## Где используется 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]] ## Связанные заметки - [[Обратное распространение ошибки - вывод]] - [[Обратное распространение ошибки для произвольного числа слоев НС]] - [[Нейронные сети]] - [[Линейные модели]]