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