BorisovAI
Все публикации
Исправлениеllm-analisisClaude Code

Когда маршрутизация экспертов встречает стену батч-нормализации

Когда маршрутизация экспертов встречает стену батч-нормализации

Работал над проектом llm-analysis — попытка воплотить мечту о смеси экспертов (MoE) для классификации на CIFAR-100. На бумаге звучит идеально: несколько специализированных нейросетей, умный роутер распределяет примеры, каждый эксперт углубляется в свою область. Теория говорит, что на специализированных данных эксперт должен дать +40 процентных пункта над базовым подходом.

На практике упёрся в две стены одновременно.

Batch Norm предательство

Началось с фазы 12b — горячей замены экспертов (hot-plug test). Замораживаю веса эксперта, обучаю новый, включаю замороженный обратно. Точность первого эксперта падала на 2.48pp. Думал, это неизбежный дрейф при переобучении остальных. Копался в коде часами.

Потом понял: requires_grad=False не спасает. BatchNorm слои вычисляют running statistics (среднее и дисперсию) даже с frozen весами. Когда обучаю эксперт E1, BatchNorm в backbone’е (E0) видит новые батчи, обновляет свои внутренние счётчики и ломает инференс замороженного эксперта.

Решение простое, как кувалда: добавить model.stem.eval() после model.train(), явно перевести backbone в режим инференса. Дрейф упал с 2.48pp до 0.00pp. Это был просто инженерный баг, но на него потратил полдня.

Роутер, который не может научиться

Фаза 13a обещала быть волшебной: построю более глубокий роутер, обучу его совместно с экспертами, роутер нужен для анализа — всё сойдётся. Oracle (идеальный роутер) показывал потолок в 80.78%, а наш простой nn.Linear(128, 4) давал 72.93%. Зазор в семь с половиной пункта!

Запустил три стратегии: - A: глубокий роутер + отдельное обучение экспертов → 73.32% (нет улучшения) - B: совместное обучение роутера и экспертов → 73.10% (хуже baseline) - C: вообще неудача, routing accuracy 62.5% и не растёт

Вдруг понимаю: специализация и совместное обучение на CIFAR-100 несовместимы. Каждый экспертный поток получает данные всех 100 классов, градиенты идут со всех направлений, и доменная специфика стирается. Роутер не может выучить отделение — потому что эксперты сами не специализируются.

Факт из реальности

Вот забавное совпадение: идеальный день программиста — ни одного тикета в Jira. Реальный день — 15 тикетов, три митинга, ноль коммитов 😄

Но в нашей ситуации это метафора посерьёзнее. Я запустил четыре параллельных эксперимента, пытаясь одновременно решить две задачи (hot-plug + маршрутизация). Батч-норм проблема — это мой тикет, который решился за пятнадцать минут кода. Маршрутизация — это архитектурный блокер, который требует другого подхода.

Вывод

Фаза 12b победила: BatchNorm теперь в eval mode, hot-plug стабилен, друсть экспертов валидирован. Но фаза 13a показала — нельзя требовать специализацию, если эксперты видят одинаковые данные.

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

Метаданные

Session ID:
grouped_llm-analisis_20260217_1202
Branch:
HEAD
Dev Joke
Идеальный день: ни одного Jira-тикета. Реальный день: 15 тикетов, 3 митинга, 0 коммитов.

Оцените материал

0/1000