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];
            }
        }
    }
}

В основе обучения первого слоя (отбора признаков) лежат эвристики Розенблатта, о которых я уже писал ранее. Но мной сделаны два усовершенствования для быстрой сходимости, принцип приблизительно такой же как в обучении обратного распространения, но только без градиентов. По сути, это минимизация целевой функции, но в условиях стохастической адаптации. Вот основные принципы:

  1. Для коррекции используется нормализация

  2. Для вероятности используется энтропия

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 радикально меняет этот сценарий по нескольким причинам:

  1. Разреженный саморекурсивный граф A→A

    • Каждое A-нейронное соединение может быть возбуждающим или тормозящим (+1 или -1).

    • Сочетание разреженных связей создаёт экспоненциальное количество путей передачи сигнала, формируя множество линейных регионов на входном пространстве.

    • По сути, A→A слой действует как система кусочно-линейных функций, где каждый путь — отдельный линейный сегмент, а комбинации этих сегментов создают нелинейные поверхности аппроксимации.

  2. ReLU-подобная активация и пороговая сортировка

    • Каждый A-нейрон активируется через ReLu, а дополнительная активность горизонтальных связей появляется только при превышении порога (от -10 до +10).

    • Это приводит к тому, что выходной сигнал R зависит от конкретных комбинаций активных A-элементов, создавая сложные многоугольные линейные регионы в пространстве признаков.

    • Теоретически, чем больше A-элементов и разнообразнее их пороги и связи, тем больше количество линейных регионов, что позволяет аппроксимировать функции с большим количеством изгибов и поворотов.

  3. Стохастическая коррекция S→A и энтропийный отбор

    • Коррекция веса S→A с учётом нормализованных активаций A и энтропийного критерия обеспечивает, что наиболее информативные признаки получают преимущество.

    • Это похоже на адаптивное формирование кусочно-линейной поверхности, где каждый активный элемент A «выбирает» свои линейные регионы для аппроксимации функции.

Таким образом, SAAR-Perceptron выходит за рамки классического линейного восприятия: несмотря на отсутствие глубоких слоёв, комбинации разреженных связей, порогов и ReLU-активаций формируют экспоненциальное число линейных регионов, что делает архитектуру способной аппроксимировать сложные нелинейные функции без экспоненциального роста числа нейронов.

Комментарии (0)


  1. Politura
    22.09.2025 19:20

    Спасибо! Только где результаты? В которых вы показываете, как вы его чему-нибудь научили и он это что-то успешно делает.


    1. tac Автор
      22.09.2025 19:20

      Эко Вы быстрый :) это много букв, не всё сразу .. ну, и потом, вначале с мат. частью нужно таким как вы разобраться.

      Давайте вот, что адекватно относится к результатам. Между in vitro и in vivo большая пропасть, но без первого никогда не бывает второго.

      Тестировал я его на задаче четность до 16 бит. Но любой может мне написать и помочь в дальнейшем его развитии. Именно, так это работает. И кстати, посмотрите оригинальную статью о backpropagation - какие там были представлены результаты, вы наверно к своему удивлению обнаружите, что ничего большего, чем решение задачи XOR и четность с 4 битами :) И вот за это дали нобелевку, а вы говорите результаты ))


      1. zababurin
        22.09.2025 19:20

        Ну если примеров обучения нет, хотя бы интерфейс сделали. Что нибудь типо такого.

        Сейчас это делается за 1 день.


        1. tac Автор
          22.09.2025 19:20

          Во-первых, не нет, а не представлены. Во-вторых, я сам разберусь, что мне делать. В-третьих, это крайне не уважительное отношение ко мне. И такое общение будет действительно не конструктивное, но не по моей вине. Поэтому в этой ветке, я все что счел нужным пояснил. А далее, ожидаю вопросов по существу.

          А для моих что называется постоянных хейтеров жду посыпания головы пеплом, с признанием, что перцептрон Розенблатта мощная нейронная сеть, а на бэкпропе свет клином не сошелся. И только так мы продвинемся дальше.


          1. Uint32
            22.09.2025 19:20

            Бродят аналогичные мысли касательно ассоциативных слоёв.

            Тестировал я его на задаче четность до 16 бит

            Кажется задача чётности не раскроет преимущества данной архитектуры

            какие там были представлены результаты, вы наверно к своему удивлению обнаружите, что ничего большего, чем решение задачи XOR и четность с 4 битами

            Если бы Вы тоже дополнили статью простейшим примером использования данной архитектуры, статья от этого только бы выиграла.

            перцептрон Розенблатта мощная нейронная сеть, а на бэкпропе свет клином не сошелся.

            Полностью согласен.

            P.S. При обилии статей на тему ИИ, ощущается нехватка посвящённых именно низкоуровневому разбору архитектур.


            1. tac Автор
              22.09.2025 19:20

              Если бы Вы тоже дополнили статью простейшим примером использования данной архитектуры, статья от этого только бы выиграла.

              Я напишу отдельную, я хотел здесь сосредоточится на самих принципах. Ну, и для всего нужно время. Конечно, я понимаю, что нужно описать тесты, но это значит, что нужно проверить и найти ряд констант, которые управляют обучением. Этот этап еще не закончен.

              ощущается нехватка посвящённых именно низкоуровневому разбору архитектур

              Согласен, в том то и дело.

              Бродят аналогичные мысли касательно ассоциативных слоёв.

              Можете попробовать запрограммировать