diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 42bc9ab..b8701a9 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,13 +13,13 @@ "state": { "type": "markdown", "state": { - "file": "01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md", + "file": "01 Library/11 Machine Learning/Обратное распространение ошибки.md", "mode": "preview", "source": false, "backlinks": false }, "icon": "lucide-file", - "title": "Обратное распространение ошибки - вывод" + "title": "Обратное распространение ошибки" } }, { @@ -180,13 +180,13 @@ "state": { "type": "outline", "state": { - "file": "01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md", + "file": "01 Library/11 Machine Learning/Обратное распространение ошибки.md", "followCursor": false, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "Outline of Обратное распространение ошибки - вывод" + "title": "Outline of Обратное распространение ошибки" } }, { @@ -257,6 +257,9 @@ }, "active": "cb9f1037ae0492db", "lastOpenFiles": [ + "01 Library/11 Machine Learning/Backpropagation для сети с одним скрытым слоем.md", + "01 Library/11 Machine Learning/Backpropagation для многослойной нейронной сети.md", + "01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md", "01 Library/11 Machine Learning/Алгоритм обучения сети Кохонена.md", "01 Library/11 Machine Learning/Нейронная сеть Кохонена.md", "99 System/Archive/Алгоритм обучения сети Кохонена.md", @@ -272,7 +275,6 @@ "01 Library/02 DevOps/Основные команды git.md", "01 Library/11 Machine Learning/Метрические алгоритмы.md", "01 Library/11 Machine Learning/Обратное распространение ошибки для произвольного числа слоев НС.md", - "01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md", "00 Inbox/Алгоритм обратного распространения ошибки для произвольного числа слоев НС.md", "99 System/Archive/Алгоритм обратного распространения ошибки для произвольного числа слоев НС.md", "00 Inbox/Hello.md", @@ -284,8 +286,6 @@ "02 Projects/Наука/Статьи/Статья с Виноградовой.md", "CLAUDE.md", "01 Library/07 HomeLab/Проблемы дистрибутивов.md", - "01 Library/02 DevOps/Контейнеризация/Docker/Docker - Дополнительные знания.md", - "01 Library/02 DevOps/Контейнеризация/Docker/Основы - Docker.md", "00 Inbox/Archive", "01 Library/03 Math/Теория нечетких множеств/Теория нечетких множеств.md.tmp.254945.1777751883191", "01 Library/02 DevOps/Ansible/Ansible - основы.md.tmp.254945.1777751876503", diff --git a/01 Library/11 Machine Learning/Обратное распространение ошибки для произвольного числа слоев НС.md b/01 Library/11 Machine Learning/Backpropagation для многослойной нейронной сети.md similarity index 92% rename from 01 Library/11 Machine Learning/Обратное распространение ошибки для произвольного числа слоев НС.md rename to 01 Library/11 Machine Learning/Backpropagation для многослойной нейронной сети.md index 62ad953..f942f37 100644 --- a/01 Library/11 Machine Learning/Обратное распространение ошибки для произвольного числа слоев НС.md +++ b/01 Library/11 Machine Learning/Backpropagation для многослойной нейронной сети.md @@ -8,12 +8,12 @@ tags: - gradient-descent created: 2025-12-17 updated: 2026-05-07 -title: Обратное распространение ошибки для произвольного числа слоев НС +title: Backpropagation для многослойной нейронной сети --- -# Обратное распространение ошибки для произвольного числа слоев НС +# Backpropagation для многослойной нейронной сети -Эта заметка обобщает [[Обратное распространение ошибки]] на [[Нейронные сети|нейронную сеть]] с произвольным числом слоёв. Подробный вывод для сети с одним скрытым слоем: [[Обратное распространение ошибки - вывод]]. +Эта заметка обобщает [[Обратное распространение ошибки]] на [[Нейронные сети|нейронную сеть]] с произвольным числом слоёв. Подробный вывод для сети с одним скрытым слоем: [[Backpropagation для сети с одним скрытым слоем]]. ## Обозначения @@ -179,6 +179,6 @@ $$ ## Связанные заметки - [[Обратное распространение ошибки]] -- [[Обратное распространение ошибки - вывод]] +- [[Backpropagation для сети с одним скрытым слоем]] - [[Нейронные сети]] - [[Линейные модели]] diff --git a/01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md b/01 Library/11 Machine Learning/Backpropagation для сети с одним скрытым слоем.md similarity index 62% rename from 01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md rename to 01 Library/11 Machine Learning/Backpropagation для сети с одним скрытым слоем.md index d54ea2b..953f1ac 100644 --- a/01 Library/11 Machine Learning/Обратное распространение ошибки - вывод.md +++ b/01 Library/11 Machine Learning/Backpropagation для сети с одним скрытым слоем.md @@ -7,38 +7,38 @@ tags: - backpropagation created: 2025-12-17 updated: 2026-05-07 -title: Обратное распространение ошибки - вывод +title: Backpropagation для сети с одним скрытым слоем --- -# Обратное распространение ошибки - вывод +# Backpropagation для сети с одним скрытым слоем -Эта заметка фиксирует математический вывод градиентов для алгоритма [[Обратное распространение ошибки]]. Общий контекст нейронных сетей находится в [[Нейронные сети]]. +Эта заметка фиксирует математический вывод градиентов для алгоритма [[Обратное распространение ошибки]] на примере сети с одним скрытым слоем. Общая схема для произвольного числа слоёв вынесена в [[Backpropagation для многослойной нейронной сети]]. -Рассматривается сеть с одним скрытым слоем. Bias для краткости не записан: его градиент считается так же, как градиент веса при входе, равном $1$. +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$ — локальная ошибка нейрона +> $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_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} +y_l &= F(S_l^{(2)}) \\ +E &= \frac{1}{2}\sum\limits_{l=1}^{m}(y_l-d_l)^2 \end{align*} $$ @@ -47,14 +47,12 @@ $$ Для веса $w_{li}^{(2)}$ используется правило цепочки: $$ -\begin{align*} -\frac{\partial E}{\partial w_{li}^{(2)}} &= -\frac{\partial E}{\partial y_{l}} +\frac{\partial E}{\partial w_{li}^{(2)}} = +\frac{\partial E}{\partial y_l} \cdot -\frac{\partial y_{l}}{\partial S_{l}^{(2)}} +\frac{\partial y_l}{\partial S_l^{(2)}} \cdot -\frac{\partial S_{l}^{(2)}}{\partial w_{li}^{(2)}} -\end{align*} +\frac{\partial S_l^{(2)}}{\partial w_{li}^{(2)}} $$ Компоненты производной: @@ -74,7 +72,7 @@ $$ Итог: $$ -\frac{\partial E}{\partial w_{li}^{(2)}}=(y_l-d_l)F'(S_l^{(2)})u_i +\frac{\partial E}{\partial w_{li}^{(2)}}=(y_l-d_l)*F'(S_l^{(2)})*u_i $$ Введём локальную ошибку выходного нейрона: @@ -137,7 +135,7 @@ $$ S_l^{(2)}=\sum\limits_{i=1}^{k}w_{li}^{(2)}u_i $$ -То: +то: $$ \frac{\partial y_l}{\partial u_i} @@ -161,7 +159,7 @@ $$ S_i^{(1)}=\sum\limits_{j=1}^{n}w_{ij}^{(1)}x_j $$ -То: +то: $$ \frac{\partial u_i}{\partial w_{ij}^{(1)}} @@ -207,13 +205,9 @@ $$ Тогда: $$ -\frac{\partial E}{\partial w_{ij}^{(1)}} -= -\delta_i^{(1)}x_j +\frac{\partial E}{\partial w_{ij}^{(1)}}=\delta_i^{(1)}x_j $$ -Ошибка выходного слоя $\delta_l^{(2)}$ проходит назад через вес $w_{li}^{(2)}$, суммируется по всем выходным нейронам и умножается на крутизну активации скрытого слоя. Так получается локальная ошибка $\delta_i^{(1)}$ для каждого скрытого нейрона. - ## Итоговые формулы Для слоя $r$ общий шаблон такой: @@ -243,6 +237,6 @@ $$ ## Связанные заметки - [[Обратное распространение ошибки]] -- [[Обратное распространение ошибки для произвольного числа слоев НС]] +- [[Backpropagation для многослойной нейронной сети]] - [[Нейронные сети]] - [[Линейные модели]] diff --git a/01 Library/11 Machine Learning/Нейронные сети.md b/01 Library/11 Machine Learning/Нейронные сети.md index 55a0706..e34814b 100644 --- a/01 Library/11 Machine Learning/Нейронные сети.md +++ b/01 Library/11 Machine Learning/Нейронные сети.md @@ -187,7 +187,7 @@ $$ Нейронные сети применяются для задач классификации, прогнозирования, распознавания образов и других задач приближения сложных функций. -Для многослойных сетей основной алгоритм вычисления градиентов - [[Обратное распространение ошибки]]. Для сети с произвольным числом слоёв схема вынесена в [[Обратное распространение ошибки для произвольного числа слоев НС]]. +Для многослойных сетей основной алгоритм вычисления градиентов - [[Обратное распространение ошибки]]. Для сети с произвольным числом слоёв схема вынесена в [[Backpropagation для многослойной нейронной сети]]. ## Персептрон @@ -200,5 +200,5 @@ $$ ## Связанные заметки - [[Обратное распространение ошибки]] -- [[Обратное распространение ошибки для произвольного числа слоев НС]] +- [[Backpropagation для многослойной нейронной сети]] - [[Линейные модели]] diff --git a/01 Library/11 Machine Learning/Обратное распространение ошибки.md b/01 Library/11 Machine Learning/Обратное распространение ошибки.md index 63f209f..3281f91 100644 --- a/01 Library/11 Machine Learning/Обратное распространение ошибки.md +++ b/01 Library/11 Machine Learning/Обратное распространение ошибки.md @@ -13,11 +13,12 @@ title: Обратное распространение ошибки # Обратное распространение ошибки -**Обратное распространение ошибки** (*backpropagation*) - алгоритм вычисления градиентов функции ошибки по весам многослойной [[Нейронные сети|нейронной сети]]. После вычисления градиентов веса обновляются методом градиентного спуска. +**Обратное распространение ошибки** (*backpropagation*) - алгоритм вычисления градиентов функции ошибки по весам многослойной [[Нейронные сети|нейронной сети]]. Само обновление весов выполняет градиентный спуск или его модификации, а backpropagation отвечает за эффективный расчёт производных. -Главная идея: сначала сеть делает прямой проход и получает предсказание, затем ошибка распространяется от выходного слоя назад к предыдущим слоям. Для каждого веса считается, насколько изменение этого веса повлияло на итоговую ошибку. +Главная идея: сначала сеть выполняет прямой проход и получает предсказание, затем ошибка распространяется от выходного слоя назад к предыдущим слоям. Для каждого веса считается, как изменение этого веса повлияло бы на итоговую ошибку. ## Как выглядит + ![[Pasted image 20260507214813.png]] ## Где используется @@ -29,6 +30,7 @@ X^{(p)} \rightarrow Y^{(p)} \approx D^{(p)} $$ где: + - $X^{(p)}$ - входной объект; - $Y^{(p)}$ - выход сети; - $D^{(p)}$ - целевой ответ; @@ -36,79 +38,39 @@ $$ Алгоритм применим к многослойным сетям, если функции активации дифференцируемы или хотя бы имеют используемую на практике производную почти всюду. -## Прямой проход +## Базовый цикл -Для сети с одним скрытым слоем: +1. Подать входной вектор $X$ на вход сети. +2. Выполнить прямой проход и получить выходы всех слоёв. +3. Посчитать ошибку $E$ между предсказанием $Y$ и целевым ответом $D$. +4. Посчитать локальную ошибку выходного слоя. +5. Распространить ошибку назад и посчитать локальные ошибки скрытых слоёв. +6. Найти градиенты по весам. +7. Обновить веса в направлении антиградиента. +8. Повторять до выполнения условия остановки: лимит эпох, малая ошибка, малая норма градиента или отсутствие улучшения. -$$ -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. Повторять до выполнения условия остановки: лимит эпох, малая ошибка, малая норма градиента или отсутствие улучшения. - -## Локальная ошибка слоя +## Локальная ошибка Для выходного слоя: @@ -126,16 +88,18 @@ F'(S_i^{(1)}) \delta_l^{(2)}w_{li}^{(2)} $$ -То есть ошибка скрытого нейрона - это сумма ошибок следующего слоя, взвешенная связями с этим слоем, умноженная на производную активации скрытого нейрона. +Смысл $\delta$: на выходном слое она показывает ошибку нейрона с учётом производной активации, а на скрытом слое собирает вклад ошибок следующего слоя, взвешенный связями. + +## Что вынесено отдельно + +- [[Backpropagation для сети с одним скрытым слоем]] - подробный математический вывод через правило цепочки. +- [[Backpropagation для многослойной нейронной сети]] - общий алгоритм для произвольного числа слоёв. ## Интуиция -Backpropagation - это не отдельный способ оптимизации, а эффективный способ вычислить градиенты. Оптимизацию делает градиентный спуск или его модификации: SGD, Momentum, Adam и т.д. +Backpropagation - это не отдельный способ оптимизации, а способ быстро вычислить градиенты. Оптимизацию делает градиентный спуск или его модификации: SGD, Momentum, Adam и т.д. -Смысл $\delta$: -- на выходном слое $\delta$ показывает, насколько нейрон ошибся с учётом производной активации; -- на скрытом слое прямого целевого ответа нет, поэтому ошибка собирается из всех нейронов следующего слоя; -- градиент веса получается как локальная ошибка нейрона, в который входит вес, умноженная на вход этого веса. +Градиент веса получается как локальная ошибка нейрона, в который входит вес, умноженная на вход этого веса. Поэтому после обратного прохода обновление всех весов становится локальной операцией. ## Иллюстрации @@ -145,7 +109,7 @@ Backpropagation - это не отдельный способ оптимизац ## Связанные заметки -- [[Обратное распространение ошибки - вывод]] -- [[Обратное распространение ошибки для произвольного числа слоев НС]] +- [[Backpropagation для сети с одним скрытым слоем]] +- [[Backpropagation для многослойной нейронной сети]] - [[Нейронные сети]] - [[Линейные модели]]