Обновить
55
0.1
Илья@proxy3d

нейробиология, нейронные сети, AR/VR

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

Самую лучшую термопасту можно сделать следующим образом:

  • Правильно подобрать сплав галлия - индий - олово - висмут

  • Добавляем нанотрубки в нужных пропорциях

https://vc.ru/tribuna/466947-stoit-li-sozdavat-v-rossii-novye-tehnologii-nash-opyt-razrabotki-tyanusheisya-elektroniki-gflex

В свое время разрабатывал под грант оборудование для производства тянущихся электронных плат. Там одно из исследований было связано с теплопроводностью. При добавлении нанотрубок в нужных пропорциях теплопроводность улучшалась в ~20 раз.

Из минусов:

  • Нельзя наносить на алюминий

  • Стоимость, так как нанотрубки не дешёвые

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

Я правильно понимаю, что профессора математики и физики, который прекрасно умеет абстрагировать, при большой выборке покажут ниже IQ, чем депутаты? При условии, что мы возьмём большую выборку. Так как жизненный успех первых будет гораздо ниже, чем у вторых.

Но по IQ тестам уже миллион раз делали разборы и тесты. Более того, забросим вас в Африку, где племя Массаев покажет больше жизненного успеха и решения проблем в Африке, чем вы. Значит ли это, что IQ при смене территории перетекает между людьми? Или нам нужен тогда новый тест IQ? И какой считать правильным?

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

Ранее приводил пример как это делается через скрытые микродиалоги: https://t.me/greenruff/2240

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

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

Ни какого смысла модели не теряют. Запихивать такое в системный промпт бесполезно.

Легко. У меня этот шлак постоянно выдает. Все дело в сложности вопрос. Пока он на уровне - "какого цвета неба?", все классно. Как только он сложнее - это полнейшая чушь и бред.

Буквально вчера, решил посмотреть что мне предложить LLM (было несколько попыток новых чатов с нуля):

Сейчас при обучении нейронных сетей в llm мы используем предсказание следующего токена через loss кросс энтропии.

Допустим, мы знаем что текущий токен A, и знаем все вероятности перехода токена A в другие токены, так как собрали статистику. Это значит, что мы можем для каждого значения логита, учесть его вероятность. То есть, не один loss на все значения логита, а для вектор loss для всех значений логита. Где мы оцениваем, насколько точно предсказана вероятность этого значения логита.
Или это не будет работать лучше?

Тут она выдала сносный ответ, хотя частично не верный. И затем я задал уточняющий вопрос.

Проблема в том, что логиты имеют распределение вероятности токенов. Особенно сырые логиты, хотя они и не являются вероятностями.
Проблема в том, что не все из этих значений логитов являются допустимыми для продолжения. Некоторые являются шумом.
Top-k и top-p не позволяют отличить допустимые токены от шума.
Текст это марковские цепи. И даже если следующий токен имеет высокую вероятность, это не значит, что он допустимый.
Вероятность цепи Маркова это умножение всех вероятностей перехода ее элементов. И есть порог разрыва цепи Маркова. Если сейчас вероятность цепи Маркова 0.1, а порог разрыва 0.05, то не каждая вероятность подойдёт как следующий токен. Если вероятность следующего токена 0.2, то он приведет к тому, что цепь Маркова будет меньше 0.05, поэтому этот токен не допустим и является шумов на данном шаге.
Но top-k и top-p ничего не знают об этом. В их диапазон легко могут попасть такие токены.

Поэтому я пытаюсь понять, как этого можно избежать.
Тут три варианта:

  1. как то обучить llm, чтобы она выдавала сырые логиты в таком виде, что все значения следующих которые приведут к шуму, должны быть ниже какой-то границы.

  2. какая-то дополнительная архитектура после LLM, возможно со скрытым состоянием, которая сможет отследить и выдать только допустимые значения логитов. Но не понятно, как ее обучать и какой должна быть архитектура.

  3. самостоятельно отслеживать текущую вероятность цепочки на выходе. И брать только допустимые значения логитов для выбора следующего токена. Предварительно собрав статистику по переходу всех токенов. Но тут мы можем отслеживать только цепь Маркова первого уровня. Это лучше чем argmax, но не идеально.

Что ты об этом думаешь? Какие есть предложения? Возможно кто-то уже решил эту проблему?

И тут Остапа понесло. Отборный бред помноженный на размышления и на сжатие ответа (анг. вставки не к месту, укороченные слова и бред).

В ответе много такого, как ниже:

  • N (candidates): 50–200 — хороший компромисс.

  • H (horizon) для меток: старт 1–3, для production 3–10 при ресурсах.

  • K (rollouts per candidate): 4–16 — tradeoff bias/variance.

  • s_min (acceptor threshold): 0.5–0.8 по ROC/PR.

  • α (power for s): если acceptor достаточно надёжен, α=2..4; иначе α≈1.

  • Calibrate p_i: temperature scaling на dev set, особенно если используешь raw logits.

  • Fallback: если фильтр убрал всё, выбирать argmax из original p (или ослабить threshold).

  • Monitoring: следи за diversity (тип токенов), average chain logprob, human eval.

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

И главное, если человек не понимает тему, он ее ответ проглотит, решив, что тут очень умное и правильное. И пойдет хвалить, как сетка написал код.

beta это температура. здесь обучение на 1000 примерах, с разным подходом обучения температуре.  В одном она задалась жестко и постепенно увеличивалась, а на другом система сама во время обучения LLM обучалась температуре (постепенно увеличивая ее).
beta это температура. здесь обучение на 1000 примерах, с разным подходом обучения температуре. В одном она задалась жестко и постепенно увеличивалась, а на другом система сама во время обучения LLM обучалась температуре (постепенно увеличивая ее).

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

Но там температура при этом в связке влияет на токенизатор, механизм внимания и FFN и отсутствует на выходе из модели. Модель сама регулирует и на каждом шаге подстраивает ее.

Как итог на 1000 примерах обучения с нуля, модель выдает не высокочастотный шум, а начинает формировать связи. https://t.me/greenruff/2499 так что регулирование важно, а то что относят к top_k и случайный выбор это немного другая проблема, связанная не с температурой.

Триллион параметров — но благодаря MoE активируется только 32B на токен

Когда пишут про огромное кол-во параметров с использованием MoE, на самом деле это не совсем реальные размеры модели.

Чтобы это понять, представьте, что у вас есть функция F(X) которая аппроксимирует несколько максимумом. Но для этого нужен большой размер FFN. Тогда в место одной F(X) делаете N функций аппроксимации F1(X), F2(X)... Fn(X), каждая из которых аппроксимирует только один максимум. Эти функции по сути схожи, но отличаются немного в параметрах.

Таким образом вы раздули размерность, потому что большая FFN для F(X) у вас не влезает в память. Поэтому вы вынуждены сделать N разных FFN для F1(X), F2(X)... Fn(X), где их размер меньше, для достаточной точности. При этом вы загружаете в память только какую-то одну. Например, только F1(X). То есть мы в N раз увеличили кол-во параметров, из за наших ограничений. Фактически F1(X), F2(X)... Fn(X) эта одна и та функция, только с разными настройками параметров.

В этом легко убедиться, если сначала в MoE включить только один FFN, обучить его. Затем скопировать его веса в остальных экспертов и дальше дообучать деталям.

Поэтому триллионы, секстилионы параметров MoE мало что значат, если у нас там изначально меньше максимумов, которые можно интерпретировать. Я приводил пример, и сейчас использую этот подход для ускорения обучения MoE https://t.me/greenruff/2509

Текущая архитектура LLM это просто архиватор последовательности данных, только в отличии от Zip архиватора, LLM сжимает с учётом иерархии.

Выше простой пример, слово да встречается часто. Какой следующий токен будет оптимален для сжатия цепочки? В данном случае тот, который часто встречается, так как кодирование его в токен увеличивает сжатие.

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

Тогда и zip архиватор следует признать зачатками сознания. А архив сжатый через фрактальное сжатие проявлением сознания.

У них же нет обучения с нуля. В свое время на заборе была статья от Сбера, где была ссылка на их репозиторий с моделью. Как раз после того как deepseek выложил в opensource. Они по-моему писали что взяли ее и дообучали. Я смотрел код их модели на том гмтхабе, там косметические изменения были. Так что, эти крупные модели Сбера не обучены с нуля, а используют в своей основе Deepseek.

Проблема галлюцинаций моделей за последние годы так и не была решена. Однако практический опыт (включение поиска в ChatGPT) показывает, что проблема почти полностью исчезает и взаимодействие с моделью выходит на принципиально иной уровень надежности.

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

Это отлично видно на математике, где важна точность и логика. Через поиск она находит какую-то работу, берет из нее фрагмент, который косвенно связан. Переформулирует на свое усмотрение и выдает, что "согласно исследованиям/теореме, мы получаем". Смотришь, а там другое, да слова совпадают и даже есть аналогия, но формулы другие, речь о другом. И такое постоянно.

А режим исследования в ChatGPT, вы пробовали смотреть на что он опирается? Там можно посмотреть весь список материалов. Так вот там легко вам может попасться срач на форуме мамочки.ру (условно), где они обсуждали мозги. А ты попросил исследований конкретной темы по неокортексу. Так как модель не может отличить значимость мамочки.ру и сайт с публикацией исследований, особенно когда они рядом в выводе.

Нейронки в текущей архитектуре как были подвержены галлюцинациям, так и будут. Так как проблема не в доступе к информации, не в рассуждениях. Это проблема самой архитектуры, ее ограничений.

Чтобы не вводить в заблуждение, это скорее расширение. Так как в основе также трансформеры ограниченные контекстным окном. То есть временной рад ограничен временным окном трансформера.

Таких кросс моделей сейчас делают много. Китайцы как дополнительные модальности пихают все в своих работах, от разных форматов документов до видео, картинок и так далее.

По сути, в данной работе временной ряд кодируют патчами, как видео. И вставляют токены "временного ряда" с токенами текста.

Точно так же делают когда объединяют модальности видео и текста, картинок и текста и другие.

Так что вещь ограниченная и очень специфичная при такой реализации

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

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

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

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

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

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

Аналогично хотел написать об этом, но понял что авторы вес равно не прочитают комментарии. Нет смысла тратить силы.

https://arxiv.org/html/2509.26507v1

Разбирал для себя, что они на самом деле сделали. Там есть их работа, для себя разбирал.

А так же полез в их исходники.
https://github.com/pathwaycom/bdh/blob/main/bdh.py

Потратил целый вечер, чтобы разобраться. Лень расписывать. Но, слишком громкие заголовки, в реальности не увидел там чего-то принципиально нового.

1) дальние зависимостей у них под вопросом. В статье они говорят, что BDH-GPU содержит “linear attention” как один из механизмов.

Они утверждают, что макро-механизмы внимания трансформера могут быть “аппроксимированы” через их локальные динамики с состоянием, особенно когда активность и связи ведут себя определённо. Не верю - это не доказано. Локально да, но для иерархических данных - нет.

В разделе "6.1 Macro-expressiveness of attention in BDH-GPU" они обсуждают, как attention может быть выражено в BDH-GPU и как "state capacity vs distinction capacity" работает. Они также упоминают, что BDH-GPU оперирует в "высоком измерении нейронов" и что state (состояние) хранятся на нейронах, а не на связях, что позволяет более "глобальное" внимание скрыто реализовываться.

Но главное, что они говорят: теория говорит, что макро-внимание может быть "синтезировано" из комбинации линейного внимания + локальной динамики + "скрытого состояния", а не что они прямо реализуют классический softmax attention на весь контекст.

Это все вызывает вопросы, так как их мат аппарат приведен не до конца (подтверждений не нашел), а исходники дают еще меньше информации. Нет явной иерархической структуры внимания (например, одни слои — локальные, другие — глобальные) — внимание однородно по всем слоям, но может маскироваться / модулироваться локально через xy_sparse и через ReLU.

2) скрытые состояния есть у SSM. То, что модель хранит скрытое состояние, реагирует на входы при помощи него, обновляет его - это не новшество. Структурированные SSM (State-Space Models), RNN с памятью, LSTM, управляемые динамикой модели уже делают это. BDH утверждает, что его скрытые состояния "локализованы на нейрон-нейронных парах" (синапсы), дают интерпретируемость, и что они поддерживают "локальные графовые правила". Но в коде этого нет, чтобы такие "графовые правила" были явно реализованы.

3) В коде нет динамического изменения связей (пластичности) во время forward. Одна из ключевых обещанных идей - пластичность, Hebbian обучение во время вывода, динамическое изменение "синапсов" на основе активаций - в коде этого нет. Это означает, что реальное поведение модели ближе к “фиксированным параметрам + некоторым маскирующим процедурам” чем к активной сети, которая перестраивается на лету (как их гипотеза).

4) Про тот же residual, не нашёл доказательств, что в BDH каждый токен в истории может перескакивать напрямую через "top-down" путь без прохождения через цепочки нейронов или промежуточного состояния. То есть идея "перескока" напрямую (skip) — не явно.

5) Масштабируемость: размер ρ - матрица n х d или n х n может быть дорогим, особенно если n велико. Здесь ρ скрытое состояние ~ "синапсы", n - число "нейронов", модель работает в пространстве размерности n. Скрытое состояние модели (на шаг времени / слой) представляется матрицей (или набором матриц) ρ. Не понятно, дает ли это преимущество или наоборот раздувает размер. Статья не позволяет оценить.

То есть код выглядит ближе к модификации архитектуры Transformer, где есть attention + MLP + residual, но с добавлением sparse@ шагами и перемножениями для модуляции.

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

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

Ну и про биологию неокортекса - тут вообще без комментариев.

Либо я не понял вас. Вы просто выше сравнивали LLM и трансформеры (их архитектуру в основе LLM) с перцептрон, говоря о том что те не туда ушли. Или я не так понял.

Чтобы не было путаницы, я говорю о том, что классический RNN это аппроксимация марковской цепи. Под классическим я подразумевая MLP с рекуррентной связью.

Я не говорю, что через MLP нельзя выстроить иерархию. Тот же трансформер - это архитектурное решение MLP. FFN - это MLP практически. Головы - это множество MLP. И все отличие тут - это механизм внимания, который и описывает иерархию связей. То есть разорванные марковские цепи. Каждый блок трансформера - выделяет отдельные уровни структуры (пусть будут признаки). Головы - находят локальные максимумы на данном уровне, это локальные расстояния, где связи наиболее сильные (как на примере картинки что я приводил, где идут волны).

Например, MoE легко делается через множество MLP, где множество Softmax на выходе (как было изображено выше) и формируют иерархическую сетку.

SSM делает тоже самое, но классическая реализация не имеет иерархии. Но формально он аппроксимирует тоже, что и MLP только немного иначе. Но у него есть преимущество, он может динамически подстраиваться под данные, так как описывает периодические функции (тот же linOSS как расширение SSM описывает еще и затухание).

Марковские цепи имеют историю - информация о ней зашита в соседнем элементе. Да, разложить обратно из цепочки в элементы мы не можем. В марковской сети от последнего элемента зависит предсказание следующего. Это и есть RNN.

Разрыв необходим. Иерархия как раз позволяет связать в разрывы. В мозге например в неокортексе это называет top-down связи, когда верхние уровни иерархии, модулируют предыдущие области (нижние уровни иерархии).

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

https://telegra.ph/Rangovaya-model-veroyatnostej-i-bifurkacii-kak-utraty-asimmetrii-07-17

что касается backprop, то прогоните эти теоремы через сетку. Она может быть лучше объяснит как backprop связан с этим. Там она как раз и получается из теорем R.4, но для нее нужно прогнать остальные теоремы.

https://disk.yandex.ru/d/b8fr7DIiT23AGA

Вы правы так и есть, это и есть марковские цепи. Но, они иерархические. И их иерархия закодирована в механизме внимания, который связывает дальние зависимости на расстоянии D. Как раз, то что и показывает собранная статистика выше. Без этого, мы получаем просто классический RNN с быстрых затуханием марковской цепи без иерархии. То о чем вы сейчас говорите это классический RNN. Но без иерархии, марковская цепь быстро исчезает, ее вероятность становиться очень-очень маленькой. Система нашла выход из этого, через разрывы марковской цепи, когда они не различимы с равномерным распределением. Но чтобы не потерять связи между разрывами, они связаны через иерархию, сегмент верхнего уровня. Тут не ни какой магии.

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

Они показывают, что вероятности для текста имеют иерхаическую структуру

Марковская цепь: мама = p(м) -> p(а|м)-> p(м|а)-> p(а|м), то есть зависимости на расстоянии d=1 между соседями. Это перцептрон может уловить.

Но в реальности, связи образуют иерархию. Это приводит к тому, что d=1 а может быть равен d=4 (например последняя А связана сильнее с первой М, а не с соседней третей М). Именно это и отображает график. Собрана статистика по частоте пар на разном расстоянии. Например первые пары там пробел-пробел, пробел-о и так далее. И видно как меняется их частотность с расстоянием, когда между ними есть другие символы. Это и есть отражение иерархии через верхние уровни, которые позволяют связывать дальние элементы. Перцептрон не может описывать иерархии, с помощью него мы можем получить через аппроксимацию классическую марковскую цепь.

Я пока только делаю публикацию теорем. Тут можно посмотреть их

https://disk.yandex.ru/d/b8fr7DIiT23AGA

Адаптировал доказательства под нейронные сети, чтобы можно было прогнать через них и проверить. Теорема R.1 связывает с Лагранжа, а R.4 связывает в backpropagation.

Затем на этом строятся теоремы о бифуркации (моменте разрыва марковской цепи из-за неопределенности)

https://t.me/greenruff/2462

и затем уже связь с иерархией, как построение иерархии разорванных марковский цепей (сегментов).

https://t.me/greenruff/2465

https://t.me/greenruff/2466

https://t.me/greenruff/2469

Супер, вы подтвердили мои слова, что на выходе получается полный мусор.

Сделай даже проще. Вот код SSM, который нужно было визуализировать и первый запрос, поле которого была множество попыток детального описания и рисования:

Опиши, что нарисовать, чтобы объяснить математический и физический принцип LinOSS_IM_Attn_Hysteresis? Чтобы не запутать человека математическими формулами, а объяснить на ней общие принципы.
Я думаю, правильно будет не рисовать формулу и математические операции. А рисовать блоки с названиями и изображениями, которые отражают физические процессы реализуемые блоком.

class LinOSS_IM_Attn_Hysteresis(nn.Module):
 """
 LinOSS_IM_Attn_Hysteresis: Linear Operator-based State Space Model with Implicit Integration,
 Attention Modulation, and Hysteresis Dynamics.

--- ОБЩАЯ ИДЕЯ ---

Эта модель реализует линейную комплексную систему (SSM) с имплицитной интеграцией (implicit midpoint),
расширенную тремя компонентами:

1. **Механизм внимания (attention)** — модулирует вход через взвешивание по матрице внимания `M`.
2. **Гистерезис** — добавляет память предыдущих приращений и колебаний входного сигнала.
3. **Имплицитная интеграция** — устойчивая дискретизация дифференциальной системы с комплексным оператором A.

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

--- МАТЕМАТИЧЕСКАЯ ФОРМУЛИРОВКА ---

Обозначения:
- `x_t ∈ ℝ^D`: входной вектор в момент времени t
- `M ∈ ℝ^{L×L}`: матрица внимания (например, Zipf-локальное внимание)
- `u_t`: оригинальный вход `x_t`
- `w_t`: модифицированный вход (взвешен по вниманию)
- `v_t`: итоговый вход для SSM (включает гистерезис)
- `y_t, z_t ∈ ℂ^m`: скрытые состояния

### Attention:
    w(t) = Σ_j softmax(M(t,j)) * u(j)
    v_mod = B_mod @ w(t)

### Гистерезис:
    Δu(t) = u(t) - u(t-1)
    Δ²u(t) = u(t) - 2u(t-1) + u(t-2)
    h(t) = γ·h(t-1) + α·Δu(t) + β·Δ²u(t)
    v_hyst = B_hyst @ h(t)

### Объединённый вход:
    v(t) = B @ u(t) + v_mod + v_hyst

### Оператор A (комплексный, диагональный):
    A = diag(λ_k + i·ω_k), где Re(λ_k) < 0

### Имплицитная интеграция (implicit midpoint):
    y(t) = (y(t-1) + dt·z(t-1) + dt²·v(t)) / (1 + 0.5·dt²·A)
    z(t) = (y(t) - y(t-1)) / dt

### Выход:
    o(t) = C @ Re(y(t)) + D ⊙ u(t)

--- ОСОБЕННОСТИ И РЕАЛИЗАЦИЯ ---

- `A_log` и `A_im` задают комплексный оператор A = -softplus(A_log) + i·A_im
  (обеспечивает устойчивость: Re(A) < 0).
- Используется softmax-альтернатива `ZipfLagrangeLocalActivation` для локального внимания.
- Гистерезис реализован как рекуррентное обобщение производных 1-го и 2-го порядка.
- Метод интеграции — implicit midpoint (устойчивый при больших dt).
- `C` — выходная проекция скрытых состояний, `D` — скип-коннект с входом.
- `log_dt` — обучаемый логарифм временного шага (в диапазоне [dt_min, dt_max]).

--- ПЛЮСЫ ---

- Обработка **длинных временных зависимостей** (через SSM).
- Устойчивость при больших шагах `dt` (через имплицитную схему).
- Захват **локальных резонансов и осцилляций** (через комплексный спектр A).
- Выделение **асимметричных паттернов и резких изменений** (через гистерезис).
- Улучшение **селективности и контекста** (через attention-модуляцию).

---  ОТЛИЧИЯ ОТ КЛАССИЧЕСКОГО SSM ---

| Компонент          | Классический SSM                | LinOSS_IM_Attn_Hysteresis                       |
|--------------------|----------------------------------|--------------------------------------------------|
| Оператор A         | Вещественный                    | Комплексный, спектральный                        |
| Дискретизация      | Явная (например, Euler)         | Имплицитная (midpoint)                          |
| Внимание           | Отсутствует                     | Взвешенный контекст через матрицу M             |
| Гистерезис         | Нет                             | Механизм памяти изменений сигнала               |
| Выходной слой      | Только скрытое состояние        | Skip-соединение с входом через `D`              |

---  ПРИМЕНЕНИЕ ---

Модель особенно эффективна для задач:
- моделирования последовательностей с медленной или гистеретической динамикой,
- обработки сигналов с фазовой структурой (например, речь, музыка),
- извлечения устойчивых и редких признаков в потоке (например, в видео/аудио).

"""
def __init__(self, d_model, d_state, dt_min=1e-3, dt_max=1e-1, modulation=True, dropout=0.1):
    super().__init__()
    self.d_model = d_model        # Размерность входного сигнала (D)
    self.d_state = d_state        # Размерность скрытого состояния (m)
    self.modulation = modulation

    # --- Спектральный оператор A = diag(−λ + iω), λ > 0 для устойчивости ---
    self.A_log = nn.Parameter(torch.rand(d_state))      # Реальная часть λ (логарифмирована и подавляется через softplus)
    self.A_im  = nn.Parameter(torch.randn(d_state))     # Мнимая часть ω

    # --- Матрицы входа ---
    self.B     = nn.Parameter(torch.randn(d_state, d_model) / math.sqrt(d_model))     # Прямой вход B * u_t
    if modulation:
        self.B_mod = nn.Parameter(torch.randn(d_state, d_model) / math.sqrt(d_model)) # Модулированный вход B_mod * w_t
    self.B_hyst = nn.Parameter(torch.randn(d_state, d_model) / math.sqrt(d_model))    # Вклад от гистерезиса

    # --- Матрицы выхода ---
    self.C = nn.Parameter(torch.randn(d_model, d_state) / math.sqrt(d_state))         # Проекция из скрытого состояния
    self.D = nn.Parameter(torch.ones(d_model))                                        # Скип-коннект (u_t * D)

    # --- Шаг интегрирования ---
    self.log_dt = nn.Parameter(torch.empty(1))                    # Обучаемый логарифм шага
    self.log_dt.data.uniform_(math.log(dt_min), math.log(dt_max)) # Начальная инициализация
    self.dt_min = dt_min
    self.dt_max = dt_max

    self.dropout = nn.Dropout(dropout)

    # --- Нелинейная активация для внимания ---
    if modulation:
        self.softmax = ZipfLagrangeLocalActivation()  # Модуляция входа через внимание

    # --- Параметры гистерезиса ---
    self.alpha = nn.Parameter(torch.tensor(0.0))  # Чувствительность к скорости (du)
    self.beta  = nn.Parameter(torch.tensor(0.0))  # Чувствительность к ускорению (ddu)
    self.gamma = nn.Parameter(torch.tensor(0.0))  # Инерция памяти

    self.damping = nn.Parameter(torch.tensor(0.2))       # демпфирование, по скорости
    self.stiffness = nn.Parameter(torch.tensor(0.5))     # обратная связь, по положению

    # Сырой параметр демпфирования ζ (приводится в диапазон [0, 1] через сигмоиду)
    self.raw_zeta = nn.Parameter(torch.tensor(0.0))  # обучаемый параметр: zeta ∈ (0, 1)

    # Логарифм собственных частот ω (обеспечивает положительность частоты)
    self.log_omega = nn.Parameter(torch.tensor(0.0))  # обучаемый параметр: log(omega)

    self.beta_softmax = nn.Parameter(torch.tensor(1.0))

    # --- Хранилище состояний ---
    self.register_buffer("y_state", None, persistent=False)  # Состояние y(t)
    self.register_buffer("z_state", None, persistent=False)  # Производная состояния z(t) = dy/dt
    self.register_buffer("u_prev_state", None, persistent=False)   # u(t-1)
    self.register_buffer("u_prev2_state", None, persistent=False)  # u(t-2)
    self.register_buffer("h_state", None, persistent=False)        # внутреннее состояние гистерезиса

def forward(self, x, M=None, reset_state=False):
    """
    x: [B, L, D] — входная последовательность
    M: [B, L, L] — матрица внимания (например, подобная self-attention)
    """
    B, L, D = x.shape      # B — batch size, L — длина последовательности, D — размерность
    device  = x.device

    if reset_state or self.y_state is None:
        self.reset_state(B, device)

    # --- Построение комплексного оператора A ---
    lambda_t = -F.softplus(self.A_log)     # Re(A) < 0 для устойчивости
    omega_t   = self.A_im                  # Im(A)
    A = torch.complex(lambda_t, omega_t)   # [B, d_state]

    # --- Расчёт шага dt ∈ [dt_min, dt_max] ---
    dt_t = torch.exp(self.log_dt).clamp(self.dt_min, self.dt_max)  # Скаляр

    # Cross-attention modulation
    # --- Взвешивание входа по вниманию ---
    if self.modulation:
        # M_sm  = F.softmax(M, dim=-1)  # [B, L, L]
        M_sm = self.softmax(M)   # [B, L, L] — локализованная softmax или иная функция
        U_mod = M_sm @ x         # [B, L, D] — w(t) = sum(j) softmax(M(t, j)) * u(j)

    # --- Инициализация скрытых переменных ---
    y = self.y_state  # Состояние y(t)
    z = self.z_state  # Производная состояния z(t) = dy/dt

    # --- Переменные для гистерезиса ---
    u_prev  = self.u_prev_state   # u(t-1)
    u_prev2 = self.u_prev2_state  # u(t-2)
    h_t     = self.h_state        # внутреннее состояние гистерезиса

    # --- Имплицитное обновление состояния через метод среднего шага ---
    A_b = A.unsqueeze(0).expand(B, -1)  # [B, d_state] расширение A на батч
    # implicit-midpoint update
    dt_sq = dt_t * dt_t
    denom = 1.0 + 0.5 * dt_sq * A_b  # [B, d_state]

    outputs = []
    for t in range(L):
        u_t = x[:, t, :]  # [B, D] текущий вход

        # --- Гистерезис: h(t) = γ * h(t-1) + α * Δu + β * Δ²u ---
        du  = u_t - u_prev                       # Δu(t) = u(t) − u(t-1)
        ddu = u_t - 2 * u_prev + u_prev2         # Δ²u(t) = u(t) − 2u(t-1) + u(t-1)
        h_t = self.gamma * h_t + self.alpha * du + self.beta * ddu
        u_hyst = F.linear(h_t, self.B_hyst)      # [B, d_state] = вклад от гистерезиса

        # linear transforms
        B_u     = F.linear(u_t, self.B)          # [B, d_state] = B * u(t)

        if self.modulation:
            # --- Прямой и модулированный вход ---
            u_mod_t = U_mod[:, t, :]                 # [B, D] взвешенный по вниманию вход w(t)
            B_u_mod = F.linear(u_mod_t, self.B_mod)  # [B, d_state] = B_mod * w(t)
            inp = B_u + B_u_mod + u_hyst             # [B, d_state] = полный вход в SSM
        else:
            inp = B_u + u_hyst                       # [B, d_state] = полный вход в SSM

        inp_eff = inp - self.damping * z - self.stiffness * y

        numer  = y + dt_t * z + dt_sq * inp_eff  # [B, d_state]
        numer  = torch.sigmoid(numer)
        # numer  = self.softmax_complex(numer)
        y_next = numer / denom                   # y(t) = (y(t-1) + dt*z(t-1) + dt²*v(t)) / (1 + 0.5*dt²*A)

        # Спектральное преобразование: затухание + фаза
        z_next = self.spectral_damped_derivative(y_next, y, dt_t)
        y, z = y_next, z_next

        # --- Выход: проекция + skip-связь ---
        out = F.linear(y.real, self.C) + u_t * self.D  # [B, D] — C*Re(y(t)) + D*u(t)
        outputs.append(out)

        # --- Обновление истории для гистерезиса ---
        u_prev2 = u_prev
        u_prev  = u_t


    # Сохраняем состояния для следующего вызова
    self.y_state = y.detach()
    self.z_state = z.detach()
    self.u_prev_state = u_prev.detach()
    self.u_prev2_state = u_prev2.detach()
    self.h_state = h_t.detach()

    y_seq = torch.stack(outputs, dim=1)  # [B, L, D] — итоговая последовательность
    y_seq = self.dropout(y_seq)
    return y_seq

def softmax_complex(self, z):
    amp = torch.abs(z)
    phase = z / amp.clamp(min=1e-6)  # нормированный вектор (unit phase)
    weights = F.softmax(-amp / self.beta_softmax, dim=-1)  # softmax по модулю
    output = weights * phase  # вернёт комплексный результат
    return output

"""
Спектральный демпфированный производный метод, вычисляющий приближение производной
с демпфированием и фазовым сдвигом в комплексной форме.
Использует параметры, которые обучаются (dt, ζ, ω), чтобы гибко моделировать
производные сигналов во временной области с учётом колебательных и затухающих компонентов.
"""
def spectral_damped_derivative(self, y, y_prev, dt_t):
    """
    Аргументы:
        y (Tensor): текущее значение входного сигнала
        y_prev (Tensor): предыдущее значение сигнала (на шаге назад)
        dt_t (Tensor): текущий шаг времени dt

    Возвращает:
        z (Tensor): комплексное приближение производной сигнала с затуханием и фазой
    """
    # Демпфирующий коэффициент ζ ∈ [0, 1]
    zeta = torch.sigmoid(self.raw_zeta)

    # Собственная частота ω > 0
    omega = torch.exp(self.log_omega)

    # Демпфированная частота: ω_d = ω * sqrt(1 - ζ²)
    # Добавляем 1e-6 для численной устойчивости при ζ → 1
    omega_d = omega * torch.sqrt(1 - zeta ** 2 + 1e-6)

    # Амплитудное затухание: exp(-ζωdt)
    decay = torch.exp(-zeta * omega * dt_t)

    # Фазовый множитель: exp(i * ω_d * dt), где i = sqrt(-1)
    phase = torch.complex(
        torch.cos(omega_d * dt_t),
        torch.sin(omega_d * dt_t)
    )

    # Спектрально-демпфированное приближение производной:
    # z = exp(-ζωdt) * exp(iω_d dt) * (y - y_prev) / dt
    # Оно имеет и амплитудное затухание, и вращение в комплексной плоскости
    z = decay * phase * (y - y_prev) / dt_t

    if torch.isnan(z).any():
        print("Есть хотя бы одно значение NaN.")
        print(z)
        print(y)
        print(y_prev)
        print(dt_t)
        sys.exit()

    return z

Теперь по поводу изображения островов:

Основная геометрия
Река идёт горизонтально или диагонально, чтобы можно было разместить несколько «островов» слева направо.

Острова — это сегменты: S1, S2, S3, S4 (можно подписать так же, как в теоремах).

Между соседними островами есть короткие прямые мосты — это классические марковские связи (локальные зависимости).

Дополнительно есть длинные диагональные мосты — это ранговые связи (сильные глобальные зависимости).

Общее оформление

  • Две горизонтальные части: верхняя — классическая марковская цепь, нижняя — ранговая цепь.

  • В каждой части три острова.

  • Движение слева направо — передача информации от Отправителя к Получателю.

  • На каждом острове — Отправитель (в начале, середине и конце пути).

  • На третьем острове — Получатель.

Верхняя часть — Классическая марковская цепь

Общий вид:

  • Три острова, соединённые только последовательными мостами.

  • Мосты тонкие, над водой падают коробки.

  • Передача информации с потерями.

Элементы:

  1. Первый остров (начало пути)

    • Отправитель с тремя коробками.

    • Мост к среднему острову.

  2. Второй остров (середина пути)

    • Отправитель с двумя коробками, третья падает в воду с моста.

    • Мост к третьему острову.

  3. Третий остров (конец пути)

    • Получатель с одной коробкой в руках.

    • Лицо грустное, поза разочарованная — символ потери информации.

Нижняя часть — Ранговая цепь

Общий вид:

  • Те же три острова, короткие последовательные мосты остаются, как в верхней части.

  • Добавлен дальний арочный мост от первого к третьему острову.

  • Отправитель идёт по дальнему мосту, но короткие мосты визуально присутствуют.

  • Коробки не теряются.

Элементы:

  1. Первый остров (начало пути)

    • Отправитель с тремя коробками.

    • Начинает путь по дальнему мосту, короткий мост к среднему острову также виден.

  2. Второй остров (середина пути)

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

    • Короткий мост к третьему острову виден, но путь идёт по дальнему мосту.

  3. Третий остров (конец пути)

    • Получатель с тремя коробками в руках.

    • Улыбка и радостная поза — символ сохранения всей информации.

Смысл визуализации

  • Классическая цепь — только последовательные мосты → часть коробок падает → получатель получает меньше.

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

  • Эмоции Получателя подчёркивают результат: грусть при потерях и радость при полной доставке.

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

С одной стороны вы правильно указали на иерархию, что LLM важную роль играет иерархическая связь. Но потом вас унесло куда-то не туда.

Сейчас как раз доказываю теоремы об иерархической структуре данных и их построении. Как раз проверял их на текстах.

самый частый пробел-пробел, но его вероятность увеличивается с расстоянием, а не в начале (два пробела в начале реже встречаются).
самый частый пробел-пробел, но его вероятность увеличивается с расстоянием, а не в начале (два пробела в начале реже встречаются).

Выше изображены вероятности следования букв на расстоянии D друг от друга. В классической марковской сети - это расстояние только между соседями. В случае иерархической, разные уровни иерархи разбиваются на сегменты (каждый небольшая марковская цепь), которые так же связаны с соседним сегментов на текущем уровне и с последовательностью элементов из которых состоит соседний. На сборке статистики это как раз видно, чтоб вероятности между двумя "символами" не убывают монотонно, а имеют волнообразный затухающий вид. То есть если у нас есть буква "В" и вероятность следующей "А" как соседней (В -> 0 символов -> А) равна 0.02, но при этом вероятность "Е" на расстоянии D=5 (5 символов назад: Е -> 5 символов -> В -> Е) равна 0.08, то мы получим ВЕ а не ВА.

Это визуализация статистики частоты переходов символов на расстоянии от 0 до 20, а не только соседних.
Это визуализация статистики частоты переходов символов на расстоянии от 0 до 20, а не только соседних.

Тут это немного лучше видно.

Перцептрон в классическом виде не может обеспечить полноценную иерархию связей.

Например, тот же трансформер через механизм внимания "проецирует" иерархию связей на плоское контекстное окно. В этом плане перцептрон не реализует и не может полноценно реализовать необходимую архитектуру.

1
23 ...

Информация

В рейтинге
4 501-й
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность