Перцептрон SAAR (Само-рекурсивный ассоциативно адаптивный резервуар). исскуственный интеллект.. исскуственный интеллект. исследование.. исскуственный интеллект. исследование. перцептрон.

SAAR-Perceptron (Self-Recursive Associative Adaptive Reservoir Perceptron)

C. Яковлев mg.sc. 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];
    //float[] Summa = 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-активаций формируют экспоненциальное число линейных регионов, что делает архитектуру способной аппроксимировать сложные нелинейные функции без экспоненциального роста числа нейронов.

Автор: tac

Источник

Rambler's Top100