SAAR-Perceptron (Self-Recursive Associative Adaptive Reservoir Perceptron)
C. Яковлев mg.sc.comp e-mail: tac1402@gmail.com
Аннотация. В работе предлагается новая архитектура искусственного перцептрона — SAAR-Perceptron (Self-Recursive Associative Adaptive Reservoir Perceptron), развивающая классическую модель Розенблатта (S–A–R). Ключевая особенность архитектуры заключается во введении ассоциативного слоя с саморекурсивным отображением (A→A), формирующего динамический граф признаков. В отличие от традиционных рекуррентных моделей, эти связи не обучаются, что обеспечивает устойчивую динамику и выполняет роль адаптивного резервуара, расширяющего пространство признаков.
Ассоциативный слой использует пороговую активацию, эквивалентную ReLU, что позволяет выделять только положительные реакции. Однако обучение осуществляется не на «сырые» выходы, а на их нормализованные значения, что адаптирует величину корректировки весов к относительной значимости каждого признака. Такой механизм предотвращает доминирование отдельных элементов и обеспечивает сбалансированное обучение.
Процесс обучения в перцептроне SAAR реализован без использования градиентных методов. Для связей S→A применяется стохастическое правило коррекции, расширяющее принцип Розенблатта: активные элементы подавляются, если их активация увеличивает ошибку, и возбуждаются, если их возбуждение потенциально уменьшило бы ошибку. Важную роль играет энтропийный критерий обновления весов: вероятность коррекции пропорциональна бинарной кросс-энтропии активаций, что позволяет выделять наиболее информативные признаки. Такой подход напоминает механизм отбора в генетических алгоритмах, где «побеждает» наиболее информативный элемент. Для связей A→R используется простое локальное корректирующее правило, а вклад ассоциативных элементов оценивается через информационный выигрыш; нерелевантные элементы исключаются из работы.
Предлагаемая архитектура сочетает идеи стохастического обучения, самоорганизации и reservoir computing, образуя гибридную модель ассоциативного распознавания. Экспериментальные результаты подтверждают способность SAAR-Perceptron формировать устойчивые представления и эффективно обучаться без обратного распространения ошибки, что открывает перспективы применения в задачах классификации сигналов, биологически правдоподобного моделирования и энергоэффективных вычислений.
Disclaimer. Вы не ошиблись — аннотацию мне написал ChatGpt, но каждое слово там выверено. Я ему дал исходный код архитектуры, объяснил ряд моментов, указал какие надо сделать правки. И вот аннотация готова. Думаю пора перестать стесняться, что это удобно, быстро и четко отражает то, что ты сам хотел сказать. Зачем же нам нужны сети, если их не использовать :)
Введение. Недавно я написал две статьи о перцептроне Розенблатта: На дворе LLM, а книгу о перцептроне так никто и не открыл!? и Интерпретация и оптимизация перцептрона Розенблатта, но в комментариях, постоянно оказываются люди которые не стесняются транслировать свои заблуждения. По мере сил я их развеиваю, не сколько для них, а для тех кто прочтет не только статью, но и дискуссию. Надо сказать, что этим я занимался давно — лет 10 назад. Являясь ИТ‑специалистом, я все же не получил степень доктора, и с этим связано проблематичность публиковать свои статьи в научных изданиях (да, там важен титул, а не содержание, думаю это не секрет). Поэтому вот, что мы сделаем, дорогой мой читатель, я поставлю точку в дискуссии о перцептроне Розенблатта и перейдем, собственно к его модификациям. Мы рассмотрим исходный код описанной в аннотации модификации перцептрона. Но прежде, меня часто спрашиваю «Не очень понятно, что вы хотите сказать, чего доби��ься... ». Да, такие библиотеки как torch, позволяют не думать об архитектуре нейросеток, но для исследователя они не удобны. Очень сложно декомпозировать составные части, чтобы их собрать в нужном виде. Поэтому когда вы мне пишите «не очень понятно зачем кому‑то разбираться с тем, что такое этот ваш перцептрон», то вам лично это возможно и не нужно, многие просто и остаются инженерами используя готовые библиотеки. Я же хочу показать чем отличается ученный от разработчика. И поэтому мы решаем казалось бы никому не нужные задачи типа «четность», а не распознавание картинок. Но именно такие тесты позволяют вам потом использовать результаты нашей работы.
Общая архитектура сети. Представляет собой перцептрон Розенблатта с расширенной архитектурой, включающей:
S — сенсорное поле входов,
A — ассоциативный слой с саморекурсивными связями (A→A),
R — выходной слой реакций,
A→A граф формирует разреженное саморекурсивное отображение, создающее богатое пространство признаков.
public class PerceptronSAAR { private int SCount; // Количество сенсоров private int ACount; // Количество ассоциаций private int RCount; // Количество реакций private int HCount; // Количество примеров public Dictionary<int, float[]> WeightSA; // Веса между S-A элементами public Dictionary<int, float[]> WeightAR; // Веса между A-R элементами public float[] AField; // Последняя активность (ReLu) А-элементов public float[] AFieldNorm; // Нормализованная активность А-элементов public Dictionary<int, float[]> WeightAA; //Веса между А элементами private int[] Threshold; // Пороги А-элементов }
Основная особенность это случайное отображение A множества на самого себя через WeightAA связи. Это превращает скрытый слой в рекуррентный с задержкой =2, но по сути это не слой уже, а граф. Недавно это назвали резервуаром.
Чтобы понять как он работает посмотрим на код.
private void AActivation(int argStimulNumber) { // Кинем на сенсоры обучающий пример SensorsField = LearnedStimuls[argStimulNumber]; AField = new float[ACount]; for (int j = 0; j < ACount; j++) { for (int i = 0; i < SCount; i++) { if (SensorsField[i] == true) { AField[j] += WeightSA[i][j]; // Обычное суммирование весов возбужденных нейронов } } } float[] AFieldTmp = new float[ACount]; for (int i = 0; i < ACount; i++) { for (int j = 0; j < ACount; j++) { if (AField[j] > Threshold[i]) // Только если превышен порог { // Происходит добавление случайных фиксированных весов между А элементами AFieldTmp[i] += WeightAA[i][j]; } } } for (int i = 0; i < ACount; i++) { AField[i] += AFieldTmp[i]; } AFieldNorm = Normalize(AField); }
Обучение.
Последний слой AR обучается по правилу Хебба, как в классическом перцептроне Розенблатта.
private void LearnedStimulAR(int argStimulNumber) { for (int j = 0; j < RCount; j++) { for (int i = 0; i < ACount; i++) { if (AField[i] > 0) { WeightAR[i][j] = WeightAR[i][j] + ReactionError[j]; } } } }
В основе обучения первого слоя (отбора признаков) лежат эвристики Розенблатта, о которых я уже писал ранее. Но мной сделаны два усовершенствования для быстрой сходимости, принцип приблизительно такой же как в обучении обратного распространения, но только без градиентов. По сути, это минимизация целевой функции, но в условиях стохастической адаптации. Вот основные принципы:
Для коррекции используется нормализация
Для вероятности используется энтропия
private void LearnedStimulSA(int argStimulNumber) { for (int j = 0; j < ACount; j++) { if (AField[j] > 0) { if (Math.Sign(WeightAR[j][0]) != Math.Sign(ReactionError[0])) for (int i = 0; i < SCount; i++) if (SensorsField[i] && rnd.NextDouble() < p1*BCE(AFieldNorm[j],-1)) WeightSA[i][j] -= correct1 * AFieldNorm[j]; } else { if (Math.Sign(WeightAR[j][0]) == Math.Sign(ReactionError[0])) for (int i = 0; i < SCount; i++) if (SensorsField[i] && rnd.NextDouble() < p2*BCE(AFieldNorm[j],1)) WeightSA[i][j] += correct2 * AFieldNorm[j]; if (stop < ACount*0.1f && Math.Sign(WeightAR[j][0]) != Math.Sign(ReactionError[0])) for (int i = 0; i < SCount; i++) if (SensorsField[i] && rnd.NextDouble() < p3) WeightSA[i][j] += correct3; } } } /// <summary> /// Вычисляем бинарную кросс-энтропию /// </summary> public static float BCE(float logit, float target) { return Math.Max(logit, 0) - logit * target + (float)Math.Log(1 + Math.Exp(-Math.Abs(logit))); } public float[] Normalize(float[] AField) { // Находим максимальное по модулю значение float maxAbs = 0; for (int i = 0; i < AField.Length; i++) { float absValue = Math.Abs(AField[i]); if (absValue > maxAbs) maxAbs = absValue; } // Если все значения нулевые, возвращаем исходный массив if (maxAbs == 0) return AField; // Нормализуем значения float[] normalized = new float[AField.Length]; for (int i = 0; i < AField.Length; i++) { normalized[i] = AField[i] / maxAbs; } return normalized; }
Аргументы оппонентов и объяснение расширенной выразительной способности
Классический аргумент против перцептрона заключается в том, что «перцептрон — линейный классификатор» и, следовательно, не способен аппроксимировать нелинейные функции. Более того, часто приводится утверждение о необходимости экспоненциального числа скрытых элементов для представления сложных функций, хотя точная величина не оговаривается и является предметом дискуссий. Эти доводы справедливы только для однослойного перцептрона без ассоциативного и рекурсивного слоя, где выходная функция является линейной комбинацией входов.
SAAR-Perceptron радикально меняет этот сценарий по нескольким причинам:
Разреженный саморекурсивный граф A→A
Каждое A-нейронное соединение может быть возбуждающим или тормозящим (+1 или -1).
Сочетание разреженных связей создаёт экспоненциальное количество путей передачи сигнала, формируя множество линейных регионов на входном пространстве.
По сути, A→A слой действует как система кусочно-линейных функций, где каждый путь — отдельный линейный сегмент, а комбинации этих сегментов создают нелинейные поверхности аппроксимации.
ReLU-подобная активация и пороговая сортировка
Каждый A-нейрон активируется через ReLu, а дополнительная активность горизонтальных связей появляется только при превышении порога (от -10 до +10).
Это приводит к тому, что выходной сигнал R зависит от конкретных комбинаций активных A-элементов, создавая сложные многоугольные линейные регионы в пространстве признаков.
Теоретически, чем больше A-элементов и разнообразнее их пороги и связи, тем больше количество линейных регионов, что позволяет аппроксимировать функции с большим количеством изгибов и поворотов.
Стохастическая коррекция S→A и энтропийный отбор
Коррекция веса S→A с учётом нормализованных активаций A и энтропийного критерия обеспечивает, что наиболее информативные признаки получают преимущество.
Это похоже на адаптивное формирование кусочно-линейной поверхности, где каждый активный элемент A «выбирает» свои линейные регионы для аппроксимации функции.
Таким образом, SAAR-Perceptron выходит за рамки классического линейного восприятия: несмотря на отсутствие глубоких слоёв, комбинации разреженных связей, порогов и ReLU-активаций формируют экспоненциальное число линейных регионов, что делает архитектуру способной аппроксимировать сложные нелинейные функции без экспоненциального роста числа нейронов.