Тридцать лет. Именно столько исследователи бились над catastrophic forgetting — проклятием любой нейронной сети, которая после обучения на новой задаче безвозвратно теряет старые навыки. До недавнего времени приходилось выбирать: либо хранить гигабайты данных для replay, либо жертвовать точностью ради пластичности. Но в середине 2025 года группа разработчиков выложила в открытый доступ Paradigm-Swarm — библиотеку, реализующую изоляцию весов для трансформеров. Результат на тесте CIFAR-100 с ResNet-18 — 79% accuracy после последовательного обучения на 50 задачах. Без единого примера из прошлого. Звучит как магия? Давайте разберемся, как это работает и почему это ломает старые правила.
Изоляция весов: никакого компромисса
Классические подходы (EWC, SI, memory replay) пытаются найти золотую середину между старым и новым. Они штрафуют изменение важных весов или подмешивают старые данные в батч. Это работает, но плохо масштабируется: чем больше задач, тем сильнее падает точность, или растет объем памяти. Изоляция весов предлагает радикально иное решение — физически разделить параметры модели под каждую задачу.
В Paradigm-Swarm используется техника task-specific masks. При обучении на новой задаче сеть выбирает подмножество существующих нейронов (или создает новые) и закрепляет их за этой задачей. Веса предыдущих задач замораживаются — они буквально неприкосновенны для градиентов. В результате сеть напоминает коммутатор: входные данные перенаправляются в нужную подсеть, а остальные остаются нетронутыми.
Важный нюанс: в отличие от Progressive Neural Networks (которые добавляют целые слои), Paradigm-Swarm работает на уровне отдельных весов, что экономит ресурсы. Для трансформеров это особенно актуально — вместо дублирования гигантских attention-блоков модель точечно выделяет под каждый паттерн свои QKV-проекции.
Внутренняя кухня: при инициализации каждой новой задачи модель запускает быстрый forward pass, определяет нейроны с низкой загрузкой (или самые «уверенные» для данной задачи) и маркирует их маской. Градиенты обновляют только свободные веса. Порог свободности — гиперпараметр, который по умолчанию равен 0.3. На практике это означает, что около 30% весов в каждом слое остаются незакрепленными и могут быть использованы следующей задачей.
Парадокс точности: эксперимент на 50 задачах
Разработчики Paradigm-Swarm выбрали жесткий бенчмарк: ResNet-18, адаптированный под CIFAR-100 (50 классов), разбитый на 50 задач по 2 класса каждая. Обучали последовательно: задача 1 (классы 0-1), затем задача 2 (классы 2-3) и так далее. Без доступа к предыдущим данным. Для чистоты эксперимента каждый запуск повторяли 5 раз с разными разбивками.
| Метод | Точность после 50 задач | Дополнительная память на задачу |
|---|---|---|
| EWC (Elastic Weight Consolidation) | 42% | ~10 MB (матрица Фишера) |
| Experience Replay (буфер 5000 примеров) | 61% | ~30 MB (изображения+метки) |
| Progressive Neural Networks (дублирование слоев) | 73% | ~200 MB (новые слои) |
| Paradigm-Swarm (изоляция весов) | 79% | ~5 MB (маски и смещения) |
Цифры говорят сами за себя: 79% — это почти вровень с моделью, обученной на всех данных сразу (80-82% на полном CIFAR-100). При этом накладные расходы минимальны. Единственный минус — точность на первой задаче чуть ниже (около 72%), так как модель на старте не знает, какие весы закреплять. Но уже со второй задачи механизм адаптируется.
Как попробовать самому: быстрый старт с Paradigm-Swarm
Библиотека написана на PyTorch 2.5+ и устанавливается одной командой:
pip install paradigm-swarm
Допустим, вы хотите обучить трансформер (например, mini-BERT) на последовательности из трех текстовых задач: классификация тональности, определение спама, распознавание сущностей. Код будет выглядеть так:
import torch
from paradigm_swarm import SwarmModel, TaskRouter
# Инициализируем базовый трансформер (загружаем предобученный mini-BERT)
base_model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'google/bert_uncased_L-4_H-256_A-4')
model = SwarmModel(base_model, mask_threshold=0.3)
# Определяем задачи
tasks = [
TaskRouter('sentiment', num_classes=2),
TaskRouter('spam', num_classes=2),
TaskRouter('ner', num_classes=9)
]
# Обучаем последовательно
for task in tasks:
train_loader = load_data(task.name) # ваша функция загрузки
model.fit(task, train_loader, epochs=5, lr=2e-5)
print(f"{task.name} accuracy: {model.evaluate(task, test_loader)}")
# Инференс на любой задаче
model.switch('ner')
outputs = model(texts)
Под капотом SwarmModel перехватывает градиенты и автоматически расставляет маски. После обучения каждой задачи веса закрепляются — их можно сохранить отдельно или в составе модели. При переключении на новую задачу модель не тратит время на загрузку старых весов (они уже в RAM), просто меняется маска активных нейронов.
Подводные камни: кому Paradigm-Swarm не подойдет
Библиотека не панацея. Первое: она требует, чтобы все задачи были известны заранее или появлялись последовательно, но без смены распределения на лету. Если в середине обучения внезапно меняется входной формат (например, с изображений на текст), механизм масок ломается — приходится дообучать классификатор с нуля для нового домена. Второе: при сильном перекрытии задач (например, две почти одинаковые классификации текста) изоляция весов приводит к дублированию, что снижает эффективность. Наконец, для сверхбольших моделей (70B+ параметров) маски становятся слишком разряженными, и точность падает до 70-72% на 10 задачах — авторы работают над улучшением.
Если ваша задача — детерминированный вывод без обучения (вроде трансформера как программируемого компьютера), изоляция весов избыточна. В таких случаях лучше обратить внимание на трансформер как программируемый компьютер — там нет проблемы забывания, потому что обучение вообще не нужно.
Почему это сломает рынок continual learning
До сих пор индустрия шла по пути реплея: хранить данные, дообучать на смешанных батчах — это дорого и неэтично (GDPR, удаление пользовательских данных). Изоляция весов позволяет забыть о хранении примеров. Компании вроде тех, кто использует облачные модели с риском утечки кода, могут спокойно обучать модель на локальных данных, не опасаясь, что она перезапишет конфиденциальные паттерны.
Кроме того, Paradigm-Swarm открывает путь к lifelong learning для роботов, дронов и IoT-устройств, где веса хранятся на борту и обновляются без доступа к серверу. Правда, тут есть подвох: метод работает только если вы уверены, что задачи не антагонистичны друг другу. Если задача А требует выделения «красных пикселей», а задача Б — «зеленых», маски могут конфликтовать. Авторы решают это через динамическое расширение архитектуры, но код пока в бета-версии.
Важно: Paradigm-Swarm пока не поддерживает автоматическое определение момента появления новой задачи. Придется указывать границы вручную — либо по явному сигналу, либо через детектор сдвига распределения. В следующем релизе планируют встроить адаптивный порог на основе Kullback-Leibler дивергенции.
Сравнение с другими open-source методами
На рынке есть несколько проектов, решающих ту же проблему, но с другими компромиссами:
- Avalanche (ContinualAI) — фреймворк для Continual Learning, поддерживает EWC, replay, SI. Больше для экспериментов, чем для продакшена. Не дает прироста точности свыше 40 задач.
- L2T (Learn to Transfer) — мета-обучение с разделением весов через task-embeddings. Точность выше (75% на 50 задачах CIFAR-100), но требует предобученного графа задач и двухфазного обучения.
- PackNet — итеративное сжатие сетей с масками после каждой задачи. Хорош для небольших моделей, но на трансформерах теряет 15-20% точности из-за необходимости повторно обучать часть весов после pruning.
- CODA — метод оптимизации через GEMM-эпилог, который косвенно уменьшает забывание за счет стабильной матричной факторизации (см. обзор CODA). Однако CODA не решает catastrophic forgetting напрямую — это просто техника ускорения.
Paradigm-Swarm выигрывает за счет чистоты подхода: изоляция весов без внешних данных, без дублирования слоев, с минимальным ростом памяти. И главное — код полностью открыт, без зависимостей от проприетарных фреймворков.
Куда копать дальше?
Сейчас команда работает над гибридной версией для state-space моделей — это связано с недавними исследованиями устойчивости архитектур к adversarial атакам (см. сравнение трансформеров и SSM). Если изоляция весов будет адаптирована для SSM, то catastrophic forgetting могут забыть раз и навсегда.
Мой совет: не ждите идеала. Загрузите Paradigm-Swarm уже сегодня, попробуйте на своей задаче (пусть небольшой) и замерьте прирост. Вероятно, вы будете неприятно удивлены, как много задач можно обучить без единого реплея. А если наткнетесь на баг — контрибьютьте в репозиторий. Это тот случай, когда открытый код делает нас всех чуточку умнее.