vault backup: 2026-05-14 10:49:10

This commit is contained in:
Dmitry
2026-05-14 10:49:10 +03:00
parent 4bbc91d147
commit 7f34f1d9f5
217 changed files with 62 additions and 62 deletions
@@ -0,0 +1,184 @@
---
status: stable
type: concept
tags:
- machine-learning
- neural-networks
- backpropagation
- gradient-descent
created: 2025-12-17
updated: 2026-05-07
title: Backpropagation для многослойной нейронной сети
---
# Backpropagation для многослойной нейронной сети
Эта заметка обобщает [[Обратное распространение ошибки]] на [[Нейронные сети|нейронную сеть]] с произвольным числом слоёв. Подробный вывод для сети с одним скрытым слоем: [[Backpropagation для однослойного перцептрона]].
## Обозначения
Пусть сеть имеет $N$ слоёв с обучаемыми весами.
- $r$ - номер слоя, $r=1,\dots,N$;
- $i$ - номер нейрона в предыдущем слое;
- $j$ - номер нейрона в текущем слое;
- $y_i^{(r)}$ - выход нейрона $i$ слоя $r$;
- $s_j^{(r)}$ - взвешенная сумма на входе нейрона $j$ слоя $r$;
- $w_{ij}^{(r)}$ - вес от нейрона $i$ слоя $r-1$ к нейрону $j$ слоя $r$;
- $\delta_j^{(r)}$ - локальная ошибка нейрона $j$ слоя $r$;
- $\eta$ - скорость обучения (*learning rate*);
- $d_j$ - целевое значение для выходного нейрона $j$.
Для входного слоя можно считать:
$$
y_i^{(0)}=x_i
$$
## Шаг 1. Прямой проход
На вход сети подаётся один обучающий пример. Сигналы распространяются от входного слоя к выходному.
Для каждого слоя:
$$
s_j^{(r)}=\sum_i w_{ij}^{(r)}y_i^{(r-1)}
$$
$$
y_j^{(r)}=F(s_j^{(r)})
$$
На выходе получаем предсказание сети:
$$
y_j^{(N)}
$$
## Шаг 2. Локальная ошибка выходного слоя
Для квадратичной ошибки:
$$
E=\frac{1}{2}\sum_j(y_j^{(N)}-d_j)^2
$$
Локальная ошибка выходного слоя:
$$
\delta_j^{(N)}
=
(y_j^{(N)}-d_j)F'(s_j^{(N)})
$$
Если в конспекте уже используется запись $y_j'$, то это то же самое:
$$
y_j'=F'(s_j^{(N)})
$$
Тогда:
$$
\delta_j^{(N)}=(y_j^{(N)}-d_j)y_j'
$$
## Шаг 3. Локальная ошибка скрытых слоёв
Для всех скрытых слоёв ошибка считается справа налево:
$$
r=N-1,N-2,\dots,1
$$
Формула:
$$
\delta_i^{(r)}
=
F'(s_i^{(r)})
\sum_j
\delta_j^{(r+1)}w_{ij}^{(r+1)}
$$
Смысл: ошибка нейрона слоя $r$ складывается из ошибок следующего слоя, взвешенных весами связей, и умножается на производную активации текущего нейрона.
## Шаг 4. Градиенты по весам
Градиент веса слоя $r$:
$$
\frac{\partial E}{\partial w_{ij}^{(r)}}
=
\delta_j^{(r)}y_i^{(r-1)}
$$
То есть градиент веса равен локальной ошибке нейрона, в который входит вес, умноженной на выход предыдущего нейрона.
## Шаг 5. Изменение весов
Изменение веса:
$$
\Delta w_{ij}^{(r)}
=
-\eta\delta_j^{(r)}y_i^{(r-1)}
$$
Обновление веса:
$$
w_{ij}^{(r)}(t+1)
=
w_{ij}^{(r)}(t)
+
\Delta w_{ij}^{(r)}(t)
$$
Или сразу через градиентный спуск:
$$
w_{ij}^{(r)}(t+1)
=
w_{ij}^{(r)}(t)
-
\eta
\frac{\partial E}{\partial w_{ij}^{(r)}}
$$
## Шаг 6. Проверка сходимости
После обновления весов алгоритм повторяется для следующих обучающих примеров.
Типовые условия остановки:
- достигнут лимит эпох;
- ошибка стала меньше заданного порога;
- ошибка перестала заметно уменьшаться;
- норма градиента стала достаточно малой.
## Короткая схема
1. Прямой проход: посчитать все $s^{(r)}$ и $y^{(r)}$.
2. Посчитать $\delta^{(N)}$ для выходного слоя.
3. Для $r=N-1,\dots,1$ посчитать $\delta^{(r)}$.
4. Для каждого слоя найти $\frac{\partial E}{\partial w_{ij}^{(r)}}=\delta_j^{(r)}y_i^{(r-1)}$.
5. Обновить веса.
6. Повторять до остановки.
## Интерпретация
Ошибка течёт от выхода к входу. На каждом слое она:
- проходит назад через веса следующего слоя;
- суммируется по всем путям влияния;
- умножается на производную функции активации текущего нейрона.
Так для каждого слоя получается своя локальная ошибка $\delta^{(r)}$, а дальше градиент каждого веса считается локально: ошибка принимающего нейрона умножается на выход отправляющего нейрона.
## Связанные заметки
- [[Обратное распространение ошибки]]
- [[Backpropagation для однослойного перцептрона]]
- [[Нейронные сети]]
- [[Линейные модели]]
@@ -0,0 +1,242 @@
---
status: stable
type: concept
tags:
- machine-learning
- neural-networks
- backpropagation
created: 2025-12-17
updated: 2026-05-08
title: Backpropagation для однослойного перцептрона
---
# Backpropagation для однослойного перцептрона
Эта заметка фиксирует математический вывод градиентов для алгоритма [[Обратное распространение ошибки]] на примере сети с одним скрытым слоем. Общая схема для произвольного числа слоёв вынесена в [[Backpropagation для многослойной нейронной сети]].
Bias для краткости не записан: его градиент считается так же, как градиент веса при входе, равном $1$.
## Обозначения
> [!note] Обозначения
> $x_j$ - $j$-й вход
> $w_{ij}^{(1)}$ - вес от входа $j$ к скрытому нейрону $i$
> $w_{li}^{(2)}$ - вес от скрытого нейрона $i$ к выходу $l$
> $S_i^{(1)}$ - взвешенная сумма на входе нейрона $i$ в первом слое
> $u_i$ - выход нейрона $i$ первого слоя после активации
> $S_l^{(2)}$ - взвешенная сумма на входе нейрона $l$ во втором слое
> $y_l$ - выход нейрона $l$ второго слоя
> $d_l$ - истинное значение
> $F$ - функция активации
> $\delta$ - локальная ошибка нейрона
## Прямой проход
$$
\begin{align*}
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)}) \\
E &= \frac{1}{2}\sum\limits_{l=1}^{m}(y_l-d_l)^2
\end{align*}
$$
## Обратный проход для выходного слоя
Для веса $w_{li}^{(2)}$ используется правило цепочки:
$$
\frac{\partial E}{\partial w_{li}^{(2)}} =
\frac{\partial E}{\partial y_l}
\cdot
\frac{\partial y_l}{\partial S_l^{(2)}}
\cdot
\frac{\partial S_l^{(2)}}{\partial w_{li}^{(2)}}
$$
Компоненты производной:
$$
\frac{\partial E}{\partial y_l}=y_l-d_l
$$
$$
\frac{\partial y_l}{\partial S_l^{(2)}}=F'(S_l^{(2)})
$$
$$
\frac{\partial S_l^{(2)}}{\partial w_{li}^{(2)}}=u_i
$$
Итог:
$$
\frac{\partial E}{\partial w_{li}^{(2)}}=(y_l-d_l)*F'(S_l^{(2)})*u_i
$$
Введём локальную ошибку выходного нейрона:
$$
\delta_l^{(2)}=(y_l-d_l)*F'(S_l^{(2)})
$$
Тогда:
$$
\frac{\partial E}{\partial w_{li}^{(2)}}=\delta_l^{(2)}u_i
$$
## Обратный проход для скрытого слоя
Теперь нужна производная ошибки по весу первого слоя:
$$
\frac{\partial E}{\partial w_{ij}^{(1)}}
$$
Вес $w_{ij}^{(1)}$ влияет на $E$ не напрямую, а через все выходные нейроны:
$$
w_{ij}^{(1)} \rightarrow u_i \rightarrow y_l \rightarrow E
$$
По правилу цепочки нужно просуммировать вклады всех путей от скрытого нейрона $i$ к выходным нейронам:
$$
\frac{\partial E}{\partial w_{ij}^{(1)}} =
\sum\limits_{l=1}^{m}
\frac{\partial E}{\partial y_l}
\cdot
\frac{\partial y_l}{\partial u_i}
\cdot
\frac{\partial u_i}{\partial w_{ij}^{(1)}}
$$
Первый множитель:
$$
\frac{\partial E}{\partial y_l}=y_l-d_l
$$
Производная выхода $y_l$ по выходу скрытого нейрона $u_i$:
$$
\frac{\partial y_l}{\partial u_i}
=
\frac{\partial y_l}{\partial S_l^{(2)}}
\cdot
\frac{\partial S_l^{(2)}}{\partial u_i}
$$
Так как:
$$
S_l^{(2)}=\sum\limits_{i=1}^{k}w_{li}^{(2)}u_i
$$
то:
$$
\frac{\partial y_l}{\partial u_i}
=
F'(S_l^{(2)})*w_{li}^{(2)}
$$
Производная выхода скрытого нейрона $u_i$ по весу $w_{ij}^{(1)}$:
$$
\frac{\partial u_i}{\partial w_{ij}^{(1)}}
=
\frac{\partial u_i}{\partial S_i^{(1)}}
\cdot
\frac{\partial S_i^{(1)}}{\partial w_{ij}^{(1)}}
$$
Так как:
$$
S_i^{(1)}=\sum\limits_{j=1}^{n}w_{ij}^{(1)}x_j
$$
то:
$$
\frac{\partial u_i}{\partial w_{ij}^{(1)}}
=
F'(S_i^{(1)})*x_j
$$
Собираем:
$$
\frac{\partial E}{\partial w_{ij}^{(1)}} =
\sum\limits_{l=1}^{m}
(y_l-d_l)*
F'(S_l^{(2)})*
w_{li}^{(2)}*
F'(S_i^{(1)})*
x_j
$$
Вводим локальную ошибку скрытого нейрона:
$$
\delta_i^{(1)}
=
\sum\limits_{l=1}^{m}
(y_l-d_l)*
F'(S_l^{(2)})*
w_{li}^{(2)}*
F'(S_i^{(1)})
$$
Или через ошибку выходного слоя $\delta_l^{(2)}$:
$$
\delta_i^{(1)}
=
F'(S_i^{(1)})*
\sum\limits_{l=1}^{m}
\delta_l^{(2)}*
w_{li}^{(2)}
$$
Тогда:
$$
\frac{\partial E}{\partial w_{ij}^{(1)}}=\delta_i^{(1)}x_j
$$
## Итоговые формулы
Для слоя $r$ общий шаблон такой:
$$
\frac{\partial E}{\partial w_{ij}^{(r)}}=\delta_i^{(r)}a_j^{(r-1)}
$$
где $a_j^{(r-1)}$ - выход предыдущего слоя. Для первого слоя $a_j^{(0)}=x_j$, для второго слоя $a_i^{(1)}=u_i$.
Для выходного слоя:
$$
\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 для многослойной нейронной сети]]
- [[Нейронные сети]]
- [[Линейные модели]]
@@ -0,0 +1,91 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- clustering
- self-organizing-maps
created: 2026-05-07
updated: 2026-05-07
title: Алгоритм обучения сети Кохонена
---
# Алгоритм обучения сети Кохонена
**Алгоритм обучения сети Кохонена** - процедура самообучения, при которой нейроны топологической карты постепенно становятся прототипами групп похожих входных объектов. Алгоритм относится к [[Нейронная сеть Кохонена|сетям Кохонена]] и связан с задачами [[Кластерный анализ|кластеризации]].
## Общая схема
1. Инициализировать веса нейронов небольшими случайными значениями.
2. Подать на вход очередной обучающий объект.
3. Найти нейрон-победитель, чей вектор весов лучше всего соответствует входному вектору.
4. Скорректировать веса нейрона-победителя и, в классической SOM, нейронов из его окрестности.
5. Повторять предъявление объектов до стабилизации карты или достижения заданного числа эпох.
Базовая формула корректировки веса:
$$
w_{ij}(t)=w_{ij}(t-1)+\alpha(x_i-w_{ij}(t-1))
$$
где:
- $w_{ij}$ - вес связи между входом $i$ и нейроном $j$;
- $x_i$ - значение входного признака;
- $\alpha$ - скорость обучения;
- $t$ - номер шага обучения.
## Выбор нейрона-победителя
Нейрон-победитель можно выбирать через меру близости входного вектора и вектора весов нейрона.
### Через скалярное произведение
Если векторы нормализованы, близость можно оценивать скалярным произведением:
$$
S_j=\sum\limits_{i=1}^{m}x_iw_{ij}=||x||\cdot||w^j||\cdot cos(\phi)
$$
Побеждает нейрон с максимальным значением $S_j$.
### Через евклидово расстояние
Чаще победителем считают нейрон с минимальным расстоянием до входного объекта:
$$
D_j=\sqrt{\sum\limits_{i=1}^{m}(x_i-w_{ij})^2}
$$
где $j$ - индекс нейрона, $i$ - индекс входного признака, $m$ - размерность входного вектора.
Такой способ напрямую связан с заметкой [[Расстояние между объектами]].
## Нормализация
Перед обучением часто нормализуют входные данные и начальные веса, чтобы признаки с крупным масштабом не доминировали при выборе победителя.
Нормализация входного вектора:
$$
x_j=\frac{x_j}{\sqrt{\sum\limits_{l=1}^{m}x_l^2}}
$$
Нормализация весов:
$$
w_{ij}=\frac{w_{ij}}{\sqrt{\sum\limits_{l=1}^{k}w_{lj}^2}}
$$
## Отличие от K-means
Алгоритм похож на [[Итерационная классификация. Метод K-средних (K-means)|K-means]] тем, что объект влияет на ближайший прототип. Главное отличие SOM - наличие топологической карты: обновляется не только победитель, но и его соседи, поэтому карта сохраняет отношения близости между областями данных.
## Связанные заметки
- [[Нейронная сеть Кохонена]]
- [[Нейронные сети]]
- [[Кластерный анализ]]
- [[Расстояние между объектами]]
- [[Итерационная классификация. Метод K-средних (K-means)]]
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,69 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- clustering
- self-organizing-maps
created: 2026-05-07
updated: 2026-05-07
title: Нейронная сеть Кохонена
---
# Нейронная сеть Кохонена
**Нейронная сеть Кохонена** - класс нейронных сетей, основанный на самоорганизующихся картах (*Self-Organizing Maps*, SOM). Такие сети применяются для [[Кластерный анализ|кластеризации]] и проецирования многомерных данных на пространство меньшей размерности с сохранением топологической близости объектов.
Если два объекта близки в исходном пространстве признаков, после обучения они обычно попадают в близкие области карты. Поэтому сеть Кохонена удобна не только для разбиения данных на группы, но и для визуального анализа структуры выборки.
## Идея
Сеть Кохонена объединяет две задачи:
1. Выделение кластеров в многомерных данных.
2. Отображение многомерных объектов на двумерную или одномерную карту.
В отличие от многих сетей, обучающихся с учителем, сеть Кохонена обычно работает в режиме самообучения: ей предъявляют входные объекты, а сеть постепенно настраивает веса нейронов так, чтобы разные области карты отвечали за разные группы похожих объектов.
Интуитивно идею можно описать так: за каждым классом или группой похожих объектов закрепляется один нейрон либо группа близких нейронов. Нейрон хранит вектор весов, который постепенно становится представителем своего класса объектов.
![[Pasted image 20260507230701.png]]
Если один и тот же нейрон слишком часто становится победителем, его иногда временно исключают из рассмотрения или тормозят. Это помогает "уравнять права" нейронов выходного слоя и не дать одному прототипу забрать на себя слишком много объектов. Простейший вариант такого механизма - торможение только что выигравшего нейрона.
## Архитектура
Сеть состоит из двух основных слоев:
- **входной слой** - принимает вектор признаков объекта;
- **выходной слой** - содержит нейроны топологической карты.
Каждый нейрон выходного слоя связан со всеми входными признаками и имеет собственный вектор весов. Количество нейронов выходного слоя связано с желаемой детализацией карты и числом обнаруживаемых областей данных.
![[Pasted image 20260507222244.png|500]]
## Обучение
Обучение сети Кохонена сводится к последовательной подстройке весов. На каждом шаге сети предъявляется входной объект, после чего выбирается нейрон-победитель - нейрон, чей вектор весов ближе всего к входному вектору.
После выбора победителя корректируются:
- веса самого нейрона-победителя;
- веса нейронов, лежащих в его окрестности на карте.
Размер окрестности $R$ и скорость обучения обычно задаются как функции времени: на первых итерациях они велики, а затем постепенно уменьшаются. В начале обучения может обновляться большая часть карты, поэтому формируется грубая структура кластеров. Ближе к концу обучения $R$ стремится к нулю, и карта уточняет границы между группами объектов.
Подробная процедура вынесена в [[Алгоритм обучения сети Кохонена]].
## Связь с кластеризацией
По смыслу сеть Кохонена близка к итерационным методам кластеризации: веса нейронов играют роль прототипов групп, а входные объекты притягивают ближайшие прототипы к себе. Поэтому рядом полезно держать заметки про [[Кластерный анализ]], [[Классификация]] и [[Итерационная классификация. Метод K-средних (K-means)]].
## Связанные заметки
- [[Нейронные сети]]
- [[Алгоритм обучения сети Кохонена]]
- [[Кластерный анализ]]
- [[Классификация]]
- [[Итерационная классификация. Метод K-средних (K-means)]]
@@ -0,0 +1,204 @@
---
status: processing
type: concept
tags:
- machine-learning
- neural-networks
created: 2025-12-17
updated: 2026-05-07
title: Нейронные сети
---
# Нейронные сети
Нейронные сети - модели машинного обучения, вдохновлённые принципами работы биологических нейронов. Их основа - набор связанных искусственных нейронов, которые преобразуют входной вектор $X$ в выходной вектор $Y$.
## Два направления в ИИ
В исследованиях искусственного интеллекта можно выделить два направления:
1. **Моделирование результатов естественного мышления**
- важен результат;
- внутренние механизмы не обязательны;
- цель - получить поведение, похожее на поведение естественных интеллектуальных систем.
Примеры: системы нечёткого вывода, экспертные системы, построенные по принципу баз знаний.
2. **Моделирование механизмов естественного мышления**
- важны нейрофизиологические и психологические механизмы;
- цель - воспроизвести эти механизмы техническими средствами.
Нейронные сети относятся ко второму направлению.
## Биологический нейрон
![[Pasted image 20260410103922.png]]
Входные сигналы дендритного дерева взвешиваются и суммируются на пути к аксону, где генерируется выходной импульс. Выходной сигнал проходит по ветвям аксона и достигает синапсов, соединяющих аксоны с дендритами других нейронов.
Типы нейронов:
1. **Рецепторные** - вводят в мозг сенсорную информацию от органов чувств.
2. **Промежуточные** - трансформируют сигналы от рецепторных нейронов и передают их дальше.
3. **Эффекторные** - формируют необходимое действие.
В 1957 году Фрэнк Розенблатт предложил модель персептрона. С 1970-х годов нейросетевое направление начало активно развиваться.
Одна из классических задач нейронных сетей - распознавание образов: букв, лиц, объектов и т.д.
## Искусственный нейрон
Искусственный нейрон состоит из трёх основных элементов:
- умножители, или синапсы;
- сумматор;
- нелинейный преобразователь, или функция активации.
![[Pasted image 20260410105854.png]]
Функцию активации часто называют блоком нелинейного преобразования.
![[Pasted image 20260410110002.png]]
Взвешенная сумма входов:
$$
S=\sum\limits_{i=1}^{n}\omega_i x_i+b
$$
где:
- $x_i$ - входной сигнал;
- $\omega_i$ - вес входа;
- $b$ - смещение (*bias*).
Смещение можно интерпретировать как порог срабатывания нейрона.
## Функции активации
Функция активации добавляет нелинейность. Без неё многослойная сеть сводилась бы к одному линейному преобразованию, а значит не могла бы эффективно моделировать сложные зависимости.
### Сигмоида
Функцией активации нейрона часто является сигмоида.
![[Pasted image 20260410110555.png]]
Для логистической функции:
$$
f'(x)=a f(x)(1-f(x))
$$
Если $a=1$, то:
$$
y'=y(1-y)
$$
То есть производную можно вычислить через уже полученное значение функции. Это удобно для [[Обратное распространение ошибки|обратного распространения ошибки]].
![[Pasted image 20260413130714.png]]
### Гиперболический тангенс
В качестве функции активации также используется гиперболический тангенс:
$$
\operatorname{th}(x)
=
\frac{\operatorname{sh}(x)}{\operatorname{ch}(x)}
=
\frac{e^x-e^{-x}}{e^x+e^{-x}}
=
\frac{e^{2x}-1}{e^{2x}+1}
$$
Как и логистическая функция, гиперболический тангенс является S-образной функцией, но он симметричен относительно начала координат. В точке $0$ его значение равно $0$.
### Бинарная функция
Для сети Хопфилда может использоваться бинарная функция активации:
$$
y_i =
\begin{cases}
1, \\
-1
\end{cases}
$$
![[Pasted image 20260413131243.png]]
В другом варианте бинарная функция возвращает:
$$
y =
\begin{cases}
1, & S \ge \theta \\
0, & S < \theta
\end{cases}
$$
где $\theta$ - порог.
## Модели нейронных сетей
Любая нейронная сеть выполняет нелинейное преобразование:
$$
Y=F(X)
$$
Сеть преобразует входной вектор:
$$
X=(x_1,x_2,\dots,x_n)
$$
в выходной вектор:
$$
Y=(y_1,y_2,\dots,y_m)
$$
Конкретный вид преобразования зависит от архитектуры сети, весов и функций активации.
Преимущество нейронных сетей - обучаемость. Веса сети можно представить как набор матриц. Суть обучения сводится к настройке этих весов так, чтобы для входного объекта $X$ сеть выдавала выход $Y$, близкий к правильному ответу $D$.
## Обучение с учителем
Процесс обучения с учителем:
$$
X^{(1)} \rightarrow D^{(1)} \approx Y^{(1)}
$$
$$
X^{(2)} \rightarrow D^{(2)} \approx Y^{(2)}
$$
$$
\vdots
$$
$$
X^{(p)} \rightarrow D^{(p)} \approx Y^{(p)}
$$
Нейронные сети применяются для задач классификации, прогнозирования, распознавания образов и других задач приближения сложных функций.
Для многослойных сетей основной алгоритм вычисления градиентов - [[Обратное распространение ошибки]]. Для сети с произвольным числом слоёв схема вынесена в [[Backpropagation для многослойной нейронной сети]].
## Персептрон
**Персептрон**, или **перцептрон**, - математическая модель восприятия информации, предложенная Фрэнком Розенблаттом в 1957 году и реализованная в машине «Марк-1» в 1960 году.
Персептрон - один слой искусственных нейронов. Он решает задачу линейной разделимости: разделяет пространство признаков гиперплоскостью.
По смыслу это близко к [[Линейные модели|линейным моделям]], потому что решение строится через линейную комбинацию входных признаков и весов.
## Связанные заметки
- [[Обратное распространение ошибки]]
- [[Backpropagation для многослойной нейронной сети]]
- [[Линейные модели]]
@@ -0,0 +1,115 @@
---
status: stable
type: concept
tags:
- machine-learning
- neural-networks
- backpropagation
- gradient-descent
created: 2025-12-17
updated: 2026-05-07
title: Обратное распространение ошибки
---
# Обратное распространение ошибки
**Обратное распространение ошибки** (*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 для многослойной нейронной сети]]
- [[Нейронные сети]]
- [[Линейные модели]]