vault backup: 2026-05-24 15:03:28

This commit is contained in:
Dmitry
2026-05-24 15:03:28 +03:00
parent 6189cfdd1c
commit 7335ca7c23
705 changed files with 18360 additions and 154 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,101 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- clustering
- self-organizing-maps
created: 2026-05-07
updated: 2026-05-14
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 - наличие топологической карты: обновляется не только победитель, но и его соседи, поэтому карта сохраняет отношения близости между областями данных.
## Метод выпуклой комбинации
Случайная инициализация весов может ухудшить качество карты. Плотные классы могут слиться, а близкие образы одного класса - раздробиться на дополнительные подклассы.
Один из способов смягчить эту проблему - метод выпуклой комбинации. Идея в том, что нормализованные входные образы сначала искусственно сближаются между собой, а затем постепенно возвращаются к исходному виду.
Для этого используют коэффициент $\alpha(t)$, который в процессе обучения изменяется от $0$ до $1$. В начале обучения сеть видит почти одинаковые образы и формирует грубую структуру карты. Затем входы всё сильнее приближаются к исходным данным, и карта уточняет разделение классов.
Этот приём снижает риск того, что начальные случайные веса слишком рано закрепят неудачное разбиение данных.
## Связанные заметки
- [[Нейронная сеть Кохонена]]
- [[Нейронные сети]]
- [[Кластерный анализ]]
- [[Расстояние между объектами]]
- [[Итерационная классификация. Метод 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,87 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- clustering
- self-organizing-maps
created: 2026-05-07
updated: 2026-05-14
title: Нейронная сеть Кохонена
---
# Нейронная сеть Кохонена
**Нейронная сеть Кохонена** - класс нейронных сетей, основанный на самоорганизующихся картах (*Self-Organizing Maps*, SOM). Такие сети применяются для [[Кластерный анализ|кластеризации]] и проецирования многомерных данных на пространство меньшей размерности с сохранением топологической близости объектов.
Если два объекта близки в исходном пространстве признаков, после обучения они обычно попадают в близкие области карты. Поэтому сеть Кохонена удобна не только для разбиения данных на группы, но и для визуального анализа структуры выборки.
## Идея
Сеть Кохонена объединяет две задачи:
1. Выделение кластеров в многомерных данных.
2. Отображение многомерных объектов на двумерную или одномерную карту.
В отличие от многих сетей, обучающихся с учителем, сеть Кохонена обычно работает в режиме самообучения: ей предъявляют входные объекты, а сеть постепенно настраивает веса нейронов так, чтобы разные области карты отвечали за разные группы похожих объектов.
Интуитивно идею можно описать так: за каждым классом или группой похожих объектов закрепляется один нейрон либо группа близких нейронов. Нейрон хранит вектор весов, который постепенно становится представителем своего класса объектов.
![[Pasted image 20260507230701.png]]
Если один и тот же нейрон слишком часто становится победителем, его иногда временно исключают из рассмотрения или тормозят. Это помогает "уравнять права" нейронов выходного слоя и не дать одному прототипу забрать на себя слишком много объектов. Простейший вариант такого механизма - торможение только что выигравшего нейрона.
## Архитектура
Сеть состоит из двух основных слоев:
- **входной слой** - принимает вектор признаков объекта;
- **выходной слой** - содержит нейроны топологической карты.
Каждый нейрон выходного слоя связан со всеми входными признаками и имеет собственный вектор весов. Количество нейронов выходного слоя связано с желаемой детализацией карты и числом обнаруживаемых областей данных.
Выходной слой можно рассматривать как упорядоченную структуру радиальных нейронов. В контексте классификации без учителя число нейронов или областей карты связано с ожидаемым числом классов $K$, но это не жёсткое число заранее известных меток: карта может показать более тонкую структуру данных.
![[Pasted image 20260507222244.png|500]]
## Обучение
Обучение сети Кохонена сводится к последовательной подстройке весов. На каждом шаге сети предъявляется входной объект, после чего выбирается нейрон-победитель - нейрон, чей вектор весов ближе всего к входному вектору.
После выбора победителя корректируются:
- веса самого нейрона-победителя;
- веса нейронов, лежащих в его окрестности на карте.
Размер окрестности $R$ и скорость обучения обычно задаются как функции времени: на первых итерациях они велики, а затем постепенно уменьшаются. В начале обучения может обновляться большая часть карты, поэтому формируется грубая структура кластеров. Ближе к концу обучения $R$ стремится к нулю, и карта уточняет границы между группами объектов.
Подробная процедура вынесена в [[Алгоритм обучения сети Кохонена]].
## Связь с кластеризацией
По смыслу сеть Кохонена близка к итерационным методам кластеризации: веса нейронов играют роль прототипов групп, а входные объекты притягивают ближайшие прототипы к себе. Поэтому рядом полезно держать заметки про [[Кластерный анализ]], [[Классификация]] и [[Итерационная классификация. Метод K-средних (K-means)]].
## Применение
Сети Кохонена особенно полезны для разведочного анализа данных: они помогают увидеть сгущения объектов, близость классов и потенциальные аномалии на двумерной карте.
Типичные применения:
- кластеризация без учителя;
- визуализация многомерных данных;
- поиск закономерностей в больших массивах данных;
- выявление независимых или слабо связанных признаков;
- сжатие информации;
- моделирование и прогнозирование;
- обнаружение новых явлений и нетипичных объектов.
Если после обучения кластеры разметить вручную, карту можно использовать и для классификации новых объектов. Если новый объект не похож ни на один из известных кластеров, это может быть сигналом новизны или аномалии.
## Связанные заметки
- [[Нейронные сети]]
- [[Алгоритм обучения сети Кохонена]]
- [[Кластерный анализ]]
- [[Классификация]]
- [[Итерационная классификация. Метод K-средних (K-means)]]
@@ -0,0 +1,284 @@
---
status: processing
type: concept
tags:
- machine-learning
- neural-networks
created: 2025-12-17
updated: 2026-05-14
source: "[[МИАД_Л5_нейронки.pdf]]"
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$.
## Ассоциативная память
Отдельный класс составляют сети ассоциативной памяти, например [[Сеть Хопфилда]] и [[Сеть Хэмминга]]. Они ориентированы на хранение эталонных образов и распознавание входного сигнала по близости к этим эталонам.
Их особенность в том, что весовые коэффициенты рассчитываются один раз перед началом функционирования сети. После задания весов они обычно не корректируются: сеть не обучается итеративно в привычном смысле, а хранит набор эталонов и сопоставляет с ними входной образ.
Пусть известен набор эталонных образов: изображений, звуков, бинарных векторов или других сигналов. Сеть должна по входному, возможно искажённому, сигналу восстановить соответствующий эталонный образ, указать номер наиболее близкого эталона или показать, что подходящего эталона нет.
По смыслу входной образ работает как ключ, по которому сеть "вспоминает" ближайший сохранённый образ.
| Сеть | Что выдаёт | Когда удобна |
|---|---|---|
| [[Сеть Хопфилда]] | восстановленный образ | когда нужно получить полный эталон |
| [[Сеть Хэмминга]] | номер ближайшего эталона | когда достаточно классифицировать вход |
Обе сети относятся к моделям ассоциативной памяти, но решают задачу на разном уровне: сеть Хопфилда восстанавливает состояние, а сеть Хэмминга выбирает ближайший сохранённый образ.
## Переобучение и обобщение
**Обобщение** — способность сети делать точный прогноз на данных, не входивших в обучающую выборку.
**Переобучение** возникает, если алгоритм обучения работает слишком долго или сеть слишком сложна для объёма данных: сеть "запоминает" обучающие примеры вместо того, чтобы выявить общую зависимость. Симптом: ошибка на обучающей выборке продолжает убывать, а ошибка на тестовой — перестаёт убывать или растёт.
Сети с большим числом весов моделируют более сложные функции и сильнее склонны к переобучению. Сети с малым числом весов могут оказаться недостаточно гибкими.
**Способы борьбы**:
- **Кросс-проверка** — часть обучающей выборки резервируется как тестовая и не участвует в обучении. Если тестовая ошибка перестаёт убывать, обучение останавливают.
- Уменьшение числа скрытых нейронов и/или слоёв.
- Ограничение числа эпох обучения.
**Эмпирическое правило** для выбора размера сети и объёма данных:
$$
2 \cdot (I + H + O) \le F \le 10 \cdot (I + H + O)
$$
$$
\frac{F}{10} - I - O \le H \le \frac{F}{2} - I - O
$$
где $I$ — число входов, $H$ — число скрытых нейронов, $O$ — число выходов, $F$ — число обучающих примеров.
## Этапы решения практических задач
1. **Формализация задачи** — определить, какой смысл вкладывается в компоненты входного вектора $X$ и выходного вектора $Y$.
2. **Подготовка данных** — собрать или сгенерировать обучающую выборку.
3. **Предобработка данных** — нормировка, кодирование нечисловых переменных, проверка коррелируемости, анализ периодичности. Подробнее: [[Предобработка данных для нейронных сетей]].
4. **Задание структуры сети** — выбор числа слоёв, числа нейронов в каждом слое и вида функций активации.
5. **Обучение сети** — настройка весов, контроль переобучения, возможное включение шумов в обучающий процесс.
6. **Использование сети** — применение обученной модели к новым данным.
## Формализация задач
Многослойный перцептрон вычисляет отображение $X \to Y$. Поэтому любая задача для НС сводится к выбору смысла входного и выходного векторов. Жёстких рецептов нет — это экспертная задача.
### Классификация
Вход $X$ — вектор признаков объекта. Выход — вектор вероятностей принадлежности к $M$ классам:
$$
C = (c_1, c_2, \dots, c_M), \quad 0 \le c_m \le 1, \quad \sum_{m=1}^M c_m = 1
$$
Кодировать номер класса одним выходом — некорректно: сеть интерполирует между числами классов и может относить объект к классу с промежуточным номером.
### Прогнозирование временного ряда
Для прогнозирования функции $f(t)$ используется **метод окон**: скользящее окно $W_i$ размера $n$ формирует входной вектор из исторических значений, а окно $W_o$ размера $m$ — целевой вектор (значения через интервал прогнозирования $\delta_0$).
$$
X = \bigl(f(t_0),\, f(t_0 - \delta_1),\, \dots,\, f(t_0 - \delta_1 - \dots - \delta_n)\bigr) \to Y = f(t_0 + \delta_0)
$$
### Аппроксимация многомерной функции
Для функции $Y = f(X)$ с $N_I$ входами и $N_O$ выходами строится сеть с $N_I$ входами и $N_O$ выходами. Сеть обучается на известных значениях функции.
## Обучение с учителем
Процесс обучения с учителем:
$$
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 для многослойной нейронной сети]].
## Персептрон
Базовая однослойная модель классификации вынесена в отдельную заметку [[Персептрон]]. Она показывает, как нейронная сеть может разделять пространство признаков гиперплоскостью и почему линейная разделимость является важным ограничением простых моделей.
## Связанные заметки
- [[Обратное распространение ошибки]]
- [[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 для многослойной нейронной сети]]
- [[Нейронные сети]]
- [[Линейные модели]]
@@ -0,0 +1,65 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- unsupervised-learning
- hebb
created: 2026-05-14
updated: 2026-05-14
title: Обучение без учителя. Алгоритм Хебба
---
# Обучение без учителя. Алгоритм Хебба
Обучение без учителя — режим, при котором [[Нейронные сети|нейронной сети]] не предъявляют желаемых выходных сигналов. Сеть сама формирует выходы, а веса изменяются по алгоритму, учитывающему только входные сигналы и текущее состояние нейронов.
Подстройка весов при обучении без учителя опирается исключительно на информацию, доступную внутри нейрона: его текущее состояние и уже имеющиеся весовые коэффициенты.
## Сигнальный метод Хебба
Правило обновления весов:
$$
w_{ij}(t) = w_{ij}(t-1) + \alpha \cdot y_i^{(n-1)} \cdot y_j^{(n)}
$$
где:
- $y_i^{(n-1)}$ — выходное значение нейрона $i$ слоя $(n-1)$;
- $y_j^{(n)}$ — выходное значение нейрона $j$ слоя $n$;
- $\alpha$ — скорость обучения;
- $w_{ij}(t)$, $w_{ij}(t-1)$ — вес синапса на итерациях $t$ и $t-1$.
Смысл: если оба нейрона активны одновременно, синаптическая связь между ними усиливается.
## Дифференциальный метод Хебба
Правило обновления весов:
$$
w_{ij}(t) = w_{ij}(t-1) + \alpha \cdot \bigl[y_i^{(n-1)}(t) -$$
$$- y_i^{(n-1)}(t-1)\bigr] \cdot \bigl[y_j^{(n)}(t) - y_j^{(n)}(t-1)\bigr]
$$
Сильнее обучаются синапсы, соединяющие те нейроны, выходы которых наиболее динамично изменились в сторону увеличения.
## Алгоритм обучения
1. Инициализировать все веса небольшими случайными значениями.
2. Подать входной образ; распространить сигналы по сети согласно принципам прямопоточных (*feedforward*) сетей — вычислить взвешенную сумму для каждого нейрона и применить функцию активации.
3. По формуле (1) или (2) скорректировать веса.
4. Повторять с шага 2, пока выходные значения сети не стабилизируются с заданной точностью.
Критерий остановки отличается от обратного распространения: не минимизация ошибки, а стабилизация выходов, поскольку целевые значения неизвестны.
## Применение
Обучение по Хеббу используется в сетях, где нет явного учителя, в частности в [[Нейронная сеть Кохонена|сети Кохонена]]. Там нейрон-победитель обновляет свои веса, притягивая их к входному образу, — это вариант сигнального метода.
## Связанные заметки
- [[Нейронные сети]]
- [[Нейронная сеть Кохонена]]
- [[Алгоритм обучения сети Кохонена]]
- [[Обратное распространение ошибки]]
@@ -0,0 +1,76 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- linear-models
- classification
created: 2026-05-14
updated: 2026-05-14
title: Персептрон
---
# Персептрон
**Персептрон**, или **перцептрон**, - ранняя модель [[Нейронные сети|нейронной сети]], предложенная Фрэнком Розенблаттом в 1957 году и реализованная в машине "Марк-1" в 1960 году. По смыслу это однослойная модель классификации, которая принимает вектор признаков и относит объект к классу по линейному правилу.
Персептрон близок к [[Линейные модели|линейным моделям]]: решение строится через взвешенную сумму входных признаков и пороговую функцию активации.
## Идея
Персептрон состоит из одного слоя искусственных нейронов, соединённых с входами через весовые коэффициенты. На вход подаётся вектор признаков:
$$
X=(x_1,x_2,\dots,x_n)
$$
Каждый нейрон вычисляет линейную комбинацию входов:
$$
S_k=\sum\limits_{i=1}^{n}x_iw_{ik}
$$
и сравнивает её с порогом:
$$
S_k=T_k,\quad k=1,\dots,m
$$
где:
- $x_i$ - значение входного признака;
- $w_{ik}$ - вес связи между входом $i$ и выходом $k$;
- $T_k$ - порог для выходного нейрона;
- $m$ - число выходов сети.
## Геометрический смысл
С математической точки зрения персептрон разбивает пространство признаков гиперплоскостями. В трёхмерном случае плоскость задаётся уравнением:
$$
A X + B Y + C Z + D = 0
$$
Точки по одну сторону плоскости удовлетворяют неравенству:
$$
A X + B Y + C Z + D > 0
$$
Веса персептрона задают положение такой плоскости в пространстве признаков. Поэтому классификация сводится к проверке, по какую сторону разделяющей гиперплоскости находится объект.
Для сети персептронного типа с $m$ выходами число областей классификации не превышает $2^m$.
## Ограничение
Однослойный персептрон решает задачи, которые можно свести к линейной разделимости. Если классы нельзя разделить одной гиперплоскостью или набором линейных порогов в исходном пространстве признаков, нужен переход к другим признакам или многослойной сети.
Поэтому персептрон полезен как базовая модель для понимания [[Нейронные сети|нейронных сетей]], но не заменяет многослойные архитектуры и [[Обратное распространение ошибки|обратное распространение ошибки]].
## Связанные заметки
- [[Нейронные сети]]
- [[Линейные модели]]
- [[Классификация]]
- [[Обратное распространение ошибки]]
@@ -0,0 +1,82 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- preprocessing
- normalization
created: 2026-05-14
updated: 2026-05-14
title: Предобработка данных для нейронных сетей
---
# Предобработка данных для нейронных сетей
Перед обучением [[Нейронные сети|нейронной сети]] данные необходимо привести к виду, пригодному для входных нейронов. "Сырые" данные приводят к неустойчивому обучению и большой ошибке выхода. После правильной предобработки сеть зачастую обучается быстрее и достигает меньшей ошибки.
## Принцип максимизации энтропии
Общий принцип предобработки: **максимизировать энтропию входных и выходных значений**.
Если значения переменной сосредоточены в узком диапазоне, информационное содержание каждого примера мало. Если значения равномерно распределены по единичному интервалу — информация максимальна. Значит, кодирование и нормировка должны стремиться к равномерному распределению закодированных примеров.
## Нормировка числовых переменных
Все входные и выходные значения необходимо привести к единому масштабу — нейросеть не должна зависеть от единиц измерения.
### Линейная нормировка
$$
\tilde{x}_i = \frac{x_i - x_{i,\min}}{x_{i,\max} - x_{i,\min}}
$$
Результат лежит в $[0, 1]$. Оптимальна, когда значения плотно заполняют некоторый интервал без резких выбросов. При наличии выбросов весь основной массив данных сожмётся в окрестность нуля.
### Нормировка по статистике
$$
\tilde{x}_i = \frac{x_i - \bar{x}_i}{\sigma_i}, \quad \bar{x}_i = \frac{1}{P}\sum_{\alpha=1}^{P}x_i^\alpha, \quad \sigma_i^2 = \frac{1}{P-1}\sum_{\alpha=1}^{P}(x_i^\alpha - \bar{x}_i)^2
$$
Нормированные значения не гарантированно лежат в $[0, 1]$. Если выходные нейроны используют сигмоиду, диапазон выходов ограничен — нужно дополнительно ограничить диапазон нормированных меток. Естественный выход: применить к нормированным данным ту же функцию активации, что и у выходных нейронов:
$$
\tilde{x}_i = f\!\left(\frac{x_i - \bar{x}_i}{\sigma_i}\right), \quad f(a) = \frac{1}{1+e^{-a}}
$$
## Кодирование нечисловых переменных
Нейронная сеть работает с числами, поэтому нечисловые переменные необходимо закодировать. Два основных типа:
- **Ординальные** — упорядоченные категории, которые можно ранжировать: *плохо — хорошо — отлично*.
- **Категориальные** — неупорядоченные классы: *красный, синий, зелёный*.
### Ординальные переменные
Единичный отрезок $[0, 1]$ разбивается на $n$ частей (по числу классов) пропорционально числу примеров каждого класса в обучающей выборке:
$$
\Delta x_k = \frac{P_k}{P}
$$
где $P_k$ — число примеров класса $k$, $P$ — общее число примеров. Числовым значением класса становится центр соответствующего отрезка.
Такой способ обеспечивает равномерное распределение закодированных значений, то есть максимальную энтропию.
### Категориальные переменные
Навязывать несуществующий порядок нельзя — это искажает структуру данных. Используется **двоичное кодирование**: $n$ категорий кодируются $n$ бинарными нейронами.
- первая категория: $(1, 0, \dots, 0)$
- вторая категория: $(0, 1, \dots, 0)$
-
- $n$-я категория: $(0, \dots, 0, 1)$
Можно использовать **биполярную кодировку**, заменяя нули на $-1$. При этом расстояния между всеми парами векторов-категорий одинаковы.
## Связанные заметки
- [[Нейронные сети]]
- [[Обратное распространение ошибки]]
- [[Нейронная сеть Кохонена]]
@@ -0,0 +1,126 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- associative-memory
created: 2025-12-17
updated: 2026-05-15
title: Сеть Хопфилда
---
# Сеть Хопфилда
**Сеть Хопфилда** - однослойная рекуррентная [[Нейронные сети|нейронная сеть]], используемая как ассоциативная память. Она получает входной, возможно искажённый, образ и постепенно приводит состояние сети к одному из сохранённых эталонов.
В отличие от [[Сеть Хэмминга|сети Хэмминга]], сеть Хопфилда выдаёт не номер ближайшего образа, а сам восстановленный образ.
## Идея
Сеть хранит набор эталонных образов как устойчивые состояния. При подаче входного сигнала значения выходов нейронов инициализируются этим сигналом, после чего сеть итеративно пересчитывает состояния. Если вход близок к одному из эталонов, динамика сети должна сойтись к нему.
По смыслу входной образ работает как ключ: сеть "вспоминает" наиболее близкий сохранённый образ.
В общем случае входной сигнал описывается биполярным вектором:
$$
X=(x_1,\dots,x_n),\quad x_i \in \{-1,1\}
$$
Эталонный образ $k$ можно обозначить как:
$$
X^k=(x_1^k,\dots,x_n^k),\quad k=1,\dots,m
$$
Если сеть успешно распознаёт образ, её выход совпадает с одним из эталонов:
$$
Y=X^k
$$
Если выходной вектор не совпал ни с одним эталоном, сеть пришла к ложному или неинтерпретируемому состоянию.
## Архитектура
Основные свойства сети Хопфилда:
- каждый нейрон связан с другими нейронами;
- выходы нейронов возвращаются на входы сети;
- связь нейрона с самим собой обычно исключается;
- веса задаются заранее по эталонным образам;
- состояние сети изменяется до стабилизации.
![[Pasted image 20260515090401.png]]
Инициализация сети задаёт начальные выходы нейронов. При функционировании сеть изменяет состояние до тех пор, пока не придёт к устойчивому образу. Если входной сигнал близок к одному из сохранённых эталонов, сеть восстанавливает этот эталон.
Для сети Хопфилда часто используется бинарная функция активации, описанная в [[Нейронные сети]].
## Инициализация весов
Веса задаются по эталонным образам один раз перед началом работы сети:
$$
w_{ij}=\sum\limits_{k=1}^{m}x_i^k x_j^k,\quad i\neq j
$$
Обычно связь нейрона с самим собой исключают:
$$
w_{ii}=0
$$
После такой инициализации сеть не дообучается на входных примерах, а использует уже записанные в матрицу связей эталоны.
## Алгоритм функционирования
1. На вход подаётся неизвестный сигнал. Фактически ввод выполняется установкой начальных значений аксонов:
$$
y_i(0)=x_i,\quad i=0,\dots,n-1
$$
Ноль в скобках обозначает нулевую итерацию работы сети.
2. Рассчитывается новое состояние нейронов:
$$
s_j(p+1)=\sum\limits_{i=1}^{n-1}w_{ij}y_i(p),\quad j=0,\dots,n-1
$$
После этого вычисляются новые значения аксонов:
$$
y_j(p+1)=f[s_j(p+1)]
$$
где $f$ - функция активации в виде скачка.
![[Pasted image 20260514115340.png|300]]
3. Проверяется, изменились ли выходные значения за последнюю итерацию. Если изменились, сеть возвращается к пересчёту состояний. Если выходы стабилизировались, работа завершается.
Итоговый выходной вектор считается образом, который лучше всего соответствует входным данным.
## Ограничения
Сеть Хопфилда может не распознать образ корректно и выдать несуществующий эталон. Это связано с ограниченной ёмкостью ассоциативной памяти.
Для сети Хопфилда число запоминаемых образов обычно не должно превышать:
$$
m \approx 0.15n
$$
где $n$ - число нейронов.
Если два эталона слишком похожи, возможны перекрёстные ассоциации: предъявление первого образа может привести к восстановлению второго, и наоборот.
Сеть Хопфилда хорошо подходит для восстановления или завершения образа, но не предназначена для явного сопоставления образа с номером класса. Для такой задачи удобнее [[Сеть Хэмминга]].
## Связанные заметки
- [[Сеть Хэмминга]]
- [[Нейронные сети]]
@@ -0,0 +1,117 @@
---
status: seed
type: concept
tags:
- machine-learning
- neural-networks
- associative-memory
created: 2025-12-17
updated: 2026-05-15
title: Сеть Хэмминга
---
# Сеть Хэмминга
**Сеть Хэмминга** - нейронная сеть ассоциативной памяти, которая выбирает ближайший эталонный образ по входному сигналу. Она удобна, когда не нужно восстанавливать образ явно, а достаточно получить номер или класс ближайшего эталона.
По сравнению с [[Сеть Хопфилда|сетью Хопфилда]], сеть Хэмминга обычно требует меньше памяти и вычислений.
## Идея
Сеть сравнивает неизвестный входной образ со всеми сохранёнными эталонами. Для бинарных векторов близость связана с расстоянием Хэмминга: числом отличающихся битов в двух бинарных векторах.
Сеть должна выбрать эталон с минимальным расстоянием до входного сигнала. В результате активным остаётся один выходной нейрон, соответствующий выбранному образу.
В отличие от [[Сеть Хопфилда|сети Хопфилда]], сеть Хэмминга не пытается восстановить полный эталонный образ. Её цель - выбрать номер или класс ближайшего образца.
![[Pasted image 20260514120654.png]]
## Архитектура
Сеть состоит из двух слоёв:
- первый слой вычисляет близость входного вектора к каждому эталону;
- второй слой реализует конкуренцию между эталонами.
Количество нейронов во втором слое равно количеству эталонных образов. Победить должен один нейрон - тот, который соответствует ближайшему эталону.
Первый и второй слои имеют по $m$ нейронов, где $m$ - число эталонных образов. Нейроны первого слоя имеют по $n$ синапсов, соединённых со входами сети. Эти входы можно рассматривать как фиксированный нулевой слой.
Нейроны второго слоя связаны между собой ингибиторными обратными связями:
- связь нейрона с самим собой имеет вес $+1$;
- связи с другими нейронами имеют отрицательный вес $-\varepsilon$.
Параметр $\varepsilon$ выбирают так, чтобы:
$$
0 < \varepsilon < \frac{1}{m}
$$
Ингибиторные связи постепенно подавляют менее подходящие эталоны, пока активным не останется один победивший нейрон.
Первый слой нужен для начального сравнения входа со всеми эталонами. Второй слой превращает эти оценки близости в результат классификации: за счёт взаимного торможения слабые кандидаты подавляются, а сильнейший остаётся активным.
## Алгоритм функционирования
На стадии инициализации весовым коэффициентам первого слоя и порогам функции активации присваиваются значения:
$$
w_{ik}=\frac{x_i^k}{2},\quad i=0,\dots,n-1,\quad k=0,\dots,m-1
$$
$$
T_k=\frac{n}{2},\quad k=0,\dots,m-1
$$
где $x_i^k$ - $i$-й элемент $k$-го эталонного образа.
Порог $T_k$ сдвигает диапазон выхода: скалярное произведение $\sum w_{ik}x_i$ при весах $x_i^k/2$ даёт значение от $0$ до $n/2$. После прибавления $T_k = n/2$ итоговое значение $y_k^{(1)}$ попадает в диапазон $[0, n]$, где $n$ соответствует полному совпадению с эталоном, а $0$ — полному несовпадению.
Весовые коэффициенты тормозящих синапсов второго слоя берут равными небольшой величине $\varepsilon$. Синапс нейрона, связанный с его же аксоном, имеет вес $+1$.
1. На входы сети подаётся неизвестный вектор:
$$
X=\{x_i:i=0,\dots,n-1\}
$$
После этого рассчитываются состояния нейронов первого слоя:
$$
y_j^{(1)}=s_j^{(1)}=\sum\limits_{i=1}^{n-1}w_{ij}x_i+T_j
$$
Полученными значениями инициализируются значения аксонов второго слоя:
$$
y_j^{(2)}=y_j^{(1)},\quad j=0,\dots,m-1
$$
2. Вычисляются новые состояния нейронов второго слоя:
$$
s_j^{(2)}(p+1)=y_j^{(2)}(p)-\varepsilon\sum\limits_{\substack{k=0\\k\neq j}}^{m-1}y_k^{(2)}(p),\quad j=0,\dots,m-1
$$
Затем вычисляются значения их аксонов:
$$
y_j^{(2)}(p+1)=f[s_j^{(2)}(p+1)]
$$
3. Проверяется, изменились ли выходы нейронов второго слоя за последнюю итерацию. Если изменились, сеть возвращается к шагу 2. Если нет, работа завершается.
Функция активации $f$ используется как пороговая функция. Порог должен быть выбран так, чтобы возможные значения аргумента не приводили к нежелательному насыщению.
## Замечание о первом слое
Роль первого слоя условна: после вычисления начальных значений сеть больше к нему не обращается. Поэтому первый слой можно заменить матрицей весовых коэффициентов.
Это подчёркивает практический смысл сети Хэмминга: первая часть вычисляет расстояния или меры похожести, а вторая выбирает победителя.
## Связанные заметки
- [[Сеть Хопфилда]]
- [[Расстояние между объектами]]
- [[Нейронные сети]]