--- status: stable type: concept tags: - machine-learning - neural-networks - backpropagation - gradient-descent created: 2025-12-17 updated: 2026-05-07 aliases: - 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 для однослойного перцептрона]] - [[Нейронные сети]] - [[Линейные модели]]