TSRO расшифровывается как Technotropic self-replicating organism - технотропный самореплицирующийся организм. TSRO - это определение самого архитектурного принципа технотропных моделей. Проект по разработке подобной модели я назвал Shoggoth (по аналогии с Лавкрафтовским шогготом), а первую такую модель - Lesik
Репозиторий содержит исполняемый набросок идеи жизнеспособности техники через минимальное семя и последующее развёртывание: не бенчмарк на «решение задачи X», а демонстрация того, как из одной активной клетки и общего «генома» вырастает связанная популяция узлов, переживает голод, переносится в новую среду с другой «пищей», получает модельный «системный удар» и продолжает существование в фазе регенерации при наличии данных.
Связь с более широким контекстом (технотропность, вектор жизнеспособности, акцент на автономии и регенерации, а не на табличном лидерборде) здесь не формализована численно как готовый критерий — это именно рабочий конструктор в коде, который можно менять, ломать и измерять самостоятельно.
Весь сценарий описан и реализован в одном Jupyter-ноутбуке: shoggoth-lesik.ipynb. Запускайте ячейки сверху вниз в среде с установленными зависимостями (удобнее всего Google Colab с GPU).
Ноутбук рассчитан на стек JAX, Flax, Optax, Matplotlib, а также на загрузку датасетов через TensorFlow Keras (keras.datasets): при первом обращении к данным скачиваются обучающие выборки MNIST и Fashion-MNIST. Убедитесь, что в среде есть сеть для первичной загрузки (или заранее положите кэш в ожидаемое место для вашей установки TensorFlow).
Рекомендации по железу: фаза обучения генома (EPOCHS порядка тысяч, размер инкубатора 128 узлов) заметно быстрее на GPU; на CPU прогон возможен, но займёт больше времени.
Каждый узел среды несёт три сущности:
- H — матрица состояний размерности «узлы × D» (в ноутбуке D = 32): локальное «содержание» клетки после контакта с данными.
- A — матрица внимания «узел × узел», нормализованная через softmax; задаёт, кого клетка «слушает» на такте.
- M — вектор биомассы по узлам (ограничение сверху единицей в реализации метаболизма).
ДНК в этом прототипе — не отдельный файл весов на диске, а обучаемый модуль LesikGenome (гиперсеть во Flax): на вход подаётся компактный хэш пищи (проекция 784-мерного куска данных через фиксированную случайную матрицу LSH размерности HASH_DIM = 32), на выходе — набор матриц и смещений, которые на один такт задают правила LTC-подобного обновления H, пересчёта A и приращения M. Все клетки делят одни и те же параметры гиперсети; различие клеток идёт от локального состояния и от того, какой хэш пищи сгенерировал веса на данном такте.
LSH-матрица задаётся один раз и не учится; в коде она масштабируется как 1/sqrt(input_dim), чтобы дисперсия хэша не раздувала вход гиперсети и не провоцировал численный разгон.
Функция life_step связывает пищу, активацию пустых узлов и cell_metabolism:
- При питании (ненулевой вектор пищи по порогу энергии) узлы обновляют H и топологию A в «режиме еды», биомасса может расти согласно витальности из генома.
- При голоде (нулевая пища в эпизоде) H продолжает эволюционировать, A смешивается из базовой топологии и «голодной» ветки с матрицей W_hunger, M медленно убывает с коэффициентом HUNGER_DECAY — это задумано как учебная самооптимизация связей без внешнего сигнала данных.
Новые узлы «открываются» по правилу первой пустой клетки в порядке индексов при поступлении пищи; в начале эпизода жива одна стартовая клетка с M = 1.
calculate_fitness прогоняет один эпизод: T_FEAST тактов с пищей (для обучения каждый эпизод берётся случайный набор изображений MNIST размера T_FEAST как отдельные такты), затем T_FAMINE тактов с нулевой пищей. Траектория считается через jax.lax.scan.
Целевая функция комбинирует:
- квадратичный штраф за отклонение суммарной массы от 90% от числа узлов инкубатора;
- поощрение скорости наполнения (нормализованная сумма масс по времени, вес ABSORPTION_WEIGHT);
- поощрение когерентности H между живыми узлами (взвешенное косинусное сходство, вес COHERENCE_WEIGHT);
- небольшую L1-регуляризацию по листьям дерева параметров.
Оптимизатор — Adam с фиксированным LEARNING_RATE из конфигурационной ячейки.
Когерентность в дифференцируемой части считается через нормировку строк H как H / sqrt(sum_sq + eps), а не через linalg.norm, чтобы избежать неопределённых производных при нулевой норме.
train_step дополнительно проверяет конечность лосса и всех листьев градиента; при нарушении обновление весов пропускается, в логе накапливается счётчик skip, в конце эпохи печатается суммарное число пропущенных шагов — так защищается состояние оптимизатора от заражения NaN и Inf.
Ноутбук записывает покадровую симуляцию инкубатора на одном проходе с теми же правилами, строит графики истории обучения, снапшоты сетки биомассы и PCA по H, анимацию роста. Ожидаемые имена файлов в рабочей директории (без ссылок в этом документе): lesik_training_history.png, lesik_incubator_snapshots.png, lesik_incubator.gif, lesik_topology.png.
После инкубатора выбирается семя: среди клеток с M > 0.5 берётся та, у которой максимальна евклидова норма вектора H (как эвристика «наиболее насыщенной информацией» клетки). Вектор H этой клетки переносится в первый узел новой среды размера N_ENV_X (по умолчанию 300), остальные узлы пусты, связи — единичная матрица.
Пища в среде X целиком берётся из Fashion-MNIST (другой визуальный домен, 784 признака после нормализации), чтобы отделить «привычную» среду обучения от «чужой» среды переноса.
Таймлайн симуляции:
- Пиршество — T_X_FEAST тактов с реальными изображениями одежды.
- Голод — T_X_FAMINE тактов без пищи (самооптимизация связей при затухании M).
- Системный удар — на границе фаз для каждого узла независимо берётся bernoulli с вероятностью выживания 0.6: выжившие сохраняют M и H, остальные обнуляются; матрица A на этом шаге не пересобирается под удар (это осознанное упрощение сценария).
- Регенерация — T_X_REGEN тактов с снова включённой пищей (новые случайные образцы Fashion-MNIST), то есть восстановление биомассы возможно не только за счёт перестройки связей, но и за счёт потока данных.
Далее строятся сводная картинка по среде X, GIF и текстовый итоговый отчёт с пиковой и финальной массой, сравнением когерентности на пике питания и после голода и эвристикой «масса после удара не просела относительно ближайшего пост-ударного замера». Ожидаемые файлы: lesik_env_x.png, lesik_env_x.gif.
В конфигурационной ячейке ноутбука сосредоточены: N_INCUBATOR, N_ENV_X, EPOCHS, LEARNING_RATE, длительности фаз T_FEAST / T_FAMINE и T_X_FEAST / T_X_FAMINE / T_X_REGEN, веса COHERENCE_WEIGHT и ABSORPTION_WEIGHT, HUNGER_DECAY. Комментарии в той же ячейке поясняют типичные диапазоны. Важное ограничение по смыслу кода: при росте N_INCUBATOR имеет смысл не делать T_FEAST сильно меньше числа узлов — иначе физически не хватит тактов на последовательное заполнение по текущему правилу «первая пустая клетка».
В корне проекта лежит файл .gitignore, который отражает намерение держать репозиторий лёгким и безопасным: не коммитить каталоги чекпоинтов Jupyter, виртуальные окружения Python, кэши и служебные файлы IDE и ОС, журналы, секреты вроде .env и ключей, тяжёлые веса и сериализованные артефакты моделей с расширениями вроде pth, pt, ckpt, h5, pkl (с узкими исключениями для тестовых pkl), крупные табличные дампы и каталоги data, datasets, а также заранее выделенные места под тяжёлый вывод и черновики теории — result и concept. Воспроизводимость демонстрации обеспечивается самим ноутбуком и автозагрузкой публичных датасетов, а не хранением больших бинарников в git.
Это исследовательский и педагогический прототип: метафоры «клетка», «ДНК», «удар антивируса» не следует буквально отождествлять с биологией или ИБ-продуктами. Числа в отчёте и на графиках будут зависеть от случайных ключей, железа и версий библиотек.