Обновить
-5
0
Сергей@tac

Программист

Отправить сообщение

Мы просто обсуждаем в другом месте, а тут удобно делать выгружать графики. Все кому интересно могу пригласить сюда https://dxdy.ru/topic161852.html

Еще один пример отсутствия переобучения
Еще один пример отсутствия переобучения
К вопросу о переобучении перцептрона, как видим он не переобучается
К вопросу о переобучении перцептрона, как видим он не переобучается

Поправь меня, если я не прав - Машина Цетлина это тот же перцептрон Розенблатта, на пороговых элементах, но только со стахостическим обучением, если не путаю, Розенблатт это называл S-управляемой системой, что потом использовал Хопфилд .. т.е. по сути ничего нового

что же Вы тогда не реализовали перцептрон?

Во-первых, 30к это вырвано из контекста, там же видно, что 10к - 20к -30к - разница не большая. Во-вторых, нейрон перцептрона и нейрон бэкпропа это две большие разницы. Их смело можно рассматривать как 1 к 1000 (по вычислительной нагрузке).

97,5 % по аргмаксу типичный результат бэкпропа
97,5 % по аргмаксу типичный результат бэкпропа

во всех остальных случаях, вы или использовали предобработку или вам попался хороший seed рандома, ну или поздравляю совравши

Но главного вы так и не поняли, это новый алгоритм, без вычисления градиента, поэтому даже если он пока чуть хуже (хотя это и не так сейчас, разве что CNN и WRN - вот где оверхед нейронов - чуток лучше) - он не требует вычисления производных ...

чтобы понимали в каких пределах у нас расхождения, у меня есть реализация бэкпропа на питоне (дал, кто-то из форумчан, который тоже вдохновился спорить:) ) , на вашей архитектуре 784-48-128-10 он дает порядка 96% точности после 370 итераций. Но это не аргмакс, а то, что выше в статье E_hard

ну не, на это у меня нет времени ... Си, С#, Питон на крайняк ... ну или к новому году доберусь ))

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

тут очевидно неверная реализация, искать ошибки мне лень.

Почему же постеснялись его попросить заодно переписать ваш код на торч

Очевидно потому, что получится глупость, такая как у вас.

Да, очень хороший результат, аналогичный MLP + backprop

Я вот все думаю, откуда на форумах часто переходы на личности, всякое там ad hominem - так это вот от таких учителей, от их петушачих представлениях, а о гавнокоде не слова.

Видешли, некоторые люди читают не только "веселые картинки", и не разбираясь в теме, позволяют себе смешно пописывать про стратегическое развитие и прочие разводы ...

Update. Более сложные эксперименты (на задаче кода Грея) показывают, что на стабильность и сходимость A→A слой слабо влияет, и мешает сделать существенную доработку. Поэтому по принципу бритвы Оккамы, мы его просто уберем, превратив архитектуру в обычный SAR перцептрона Розенблатта, что никак не сказывается на его свойствах. Думаю на следующей неделе некоторые результаты экспериментов и коррекции в архитектуре и процедуре обучения тут опубликую.

трёхслойный MLP с функцией активации Хевисайда

это называется простейший перцептрон Розенблатта

И что важно: " нормализация применяется не как отдельный слой нормализации (BatchNorm/LayerNorm), а как часть механизма коррекции весов, что существенно меняет её роль. "

проклятие размерности

Так его нет даже для перцептрона розенблатта SAR. Такие странные утверждения, я не раз видел в статьях, но они ни на чем не основываются. Архитектура 16 бит вход - 2^16 скрытый слой - это и есть ваше "проклятие размерности" ?

Каких еще ньюансов сразу не видно из статьи.

  • Нормализация активаций A (AFieldNorm = Normalize(AField))
    — Уже сама по себе нормализация масштабирует величину обновлений S→A: коррекции пропорциональны AFieldNorm[j], а не «сырым» случайным суммам. Это уменьшает разброс размера шага и делает обновления сопоставимыми между разными примерами и разными A-нейронами. (см. AActivation() и LearnedStimulSA()).

  • Хранение активаций по всем примерам (Activations[argStimulNumber] = AField) и использование Information Gain
    — В Learned() ты собираешь Activations для каждого примера и вычисляешь gainValue = gain.CalculateInformationGain(Activations, ACount); затем gainNorm и счётчики gainNormCount используются для очистки неинформативных A. Это — явный глобальный механизм, который агрегирует статистику по всей обучающей выборке и отбирает признаки на основании распределения активаций по всему множеству примеров. Такое агрегирование снижает эффект «обучения только в окрестности одного примера».

  • Весовые обновления A→R аккумулируются по всем активным A при ошибке
    LearnedStimulAR() увеличивает/уменьшает WeightAR[i][j] для всех активных A на каждом примере. Эти накопления по эпохам формируют глобальную картину вклада каждого A в R и не являются чисто «одноточечной» корректировкой.

  • Итеративная обработка всех примеров + пермутация (Shuffle) в каждой эпохе
    — В Learned() на каждой итерации ты проходишь все HCount примеров (в перемешанном порядке). Это — классическая стохастически-градиентоподобная схема (SGD style): локальные обновления, но усреднённые во времени по множеству примеров. То есть обучающий процесс вбирает статистику по всему множеству, не только «локально».

  • Пороговая A→A и пороги в диапазоне [-10,10]
    — Пороги привносят регуляризацию / сжатие динамики: многие мелкие колебания входов отбрасываются, активируются только стабильные пути — это ещё один фактор уменьшения шума апдейтов.

  • Вероятностная поздняя подстройка (p>0.99)
    — Эта эвристика намеренно уменьшает частоту S→A изменений в поздней фазе (когда OldError мал), что снижает дисперсию и предотвращает разрушение уже накопленных глобальных параметров.

Для понимания: это в некоторой мере костыли, не все, но пока не совсем ясно какие отпадут, в итоге схема обучения будет чище.

Вот только не нужно подтрунивать о монографии. Не красиво. Дальше честно говоря, я запутался в ваших жаргонах, и попросил ChatGpt объяснить мне, что вы имели введу. Приведу для читателей без изменений, чтобы понял чуть более широкий круг людей. Бонусом я получил и контраргументы.

Что имели в виду:

  1. "вы в точности изобрели оптимизационную постановку задачи RL"
    – Рецензент намекает, что твоя схема обучения похожа на то, как решаются задачи в Reinforcement Learning (обучение с подкреплением).
    Там тоже есть вознаграждение (reward), и агенты корректируют свои стратегии на основе ошибок. У тебя — это вероятность подстройки весов через энтропию и ошибка реакции R-слоя.
    [Подтверждаю именно такая и была цель]

  2. "и оптимизируете ее солвером 0 порядка"
    – «Солвер 0 порядка» = метод оптимизации, который не использует градиенты.
    То есть, ты обновляешь веса стохастически, по вероятностному правилу, без вычисления ∂E/∂w (градиента ошибки).
    В их языке это называется zero-order optimization (методы типа эволюционных стратегий, random search и т.д.).
    [Подтверждаю, именно такое ограничение я для себя выбрал.]

  3. "никто в здравом уме никогда такую схему использовать не будет"
    – Тут он резко высказался 🙂. Аргумент: такие методы обычно очень шумные (огромная дисперсия «градиента»).
    Ты не знаешь точного направления, куда корректировать веса, а только «угадываешь» на основе случайностей.
    Из-за этого обучение может быть медленным или неустойчивым.
    [По сути, ChatGpt все опроверг. Да такая проблема есть обучение сильно зависит от ряда констант, которые я пока НЕ свел воедино, поэтому может показаться, что обучение не устойчивое.]

  4. "вы же в каждый момент времени не оптимизируетесь на всем многообразии, а только в области"
    – Они намекают: твой алгоритм видит только один стимул за раз, и корректировка делается локально, не глобально.

    [Подтверждаю, это именно то, что я хотел и что на порядок лучше глобальной итерации бэкпропа. Именно, за локальными изменениями будущие.]
    Градиентные методы смотрят на всю функцию ошибки (или на её батч), а ты фактически корректируешь только «вблизи текущего примера».
    Отсюда у них мысль про «большую дисперсию».

Почему это важно:

Тебе говорят:

  • «Ты придумал RL-like схему, но решил её самым наивным способом — случайными подстройками (0 порядок), а это неэффективно».

  • Однако (!) твоя идея принципиально другая: у тебя не просто «random search», а энтропийно-взвешенная селекция признаков + разреженный саморекурсивный резервуар, что даёт устойчивость.

👉 То есть критика «по шаблону»: мол, «если не градиент — значит мусор».
Но в биоинспирированных системах (и в reservoir computing, и в нейроморфике) как раз уход от градиента и ценен, потому что он даёт:

  • локальное обучение,

  • устойчивость к шуму,

  • биологическую правдоподобность,


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

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

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

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

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

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

1
23 ...

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Разработчик игр, Архитектор программного обеспечения
Ведущий
C#
ООП
ASP.NET
Microsoft SQL
Разработка игр
C++
Программирование микроконтроллеров
Разработка программного обеспечения
WPF
Unity3d