- BrainTools - https://www.braintools.ru -
Всё началось с простой идеи: что если подключать к языковой модели новые «навыки» как приложения к смартфону — без переобучения, без деградации, за полчаса? Я потратил 22 шага экспериментов и 97.5 GPU-часов на одной видеокарте, чтобы это проверить. Архитектура заработала идеально. А потом выяснилось, что модель, которая говорит на языке математики [1], совершенно не умеет решать задачи. Это история о том, как красивая метрика обманула исследователя, и как модель в итоге нашла выход сама.
Меня зовут Борисов Павел, занимаюсь ML-исследованиями в BorisovAI [2]. Этот проект — часть нашей работы над адаптивными архитектурами нейросетей.
Представьте: у вас есть предобученная языковая модель. Вы замораживаете её целиком — ни один вес не меняется. Рядом с каждым MLP-слоем прикручиваете маленький обучаемый модуль — «эксперт». Сверху ставите маршрутизатор — линейный слой на 37 тысяч параметров, — который для каждого токена решает, какого эксперта вызвать.
Это вариация архитектуры «смесь экспертов» (Mixture of Experts, MoE) [1], но с принципиальным отличием от Mixtral [2] или DeepSeek-MoE [3]. Там модель обучается с нуля на триллионе токенов, а маршрутизация — часть пред обучения [3]. Здесь базовая модель замораживается целиком, а эксперты подключаются поверх неё, как плагины.
Обучение нового эксперта — три шага:
Изоляция. Замораживаем всё, кроме одного эксперта. Прогоняем через него тексты нужной области — математику, код, научные статьи. 15 минут на GPU.
Интеграция. Размораживаем только маршрутизатор. Показываем ему тексты из всех областей сразу — он учится направлять каждый токен к нужному эксперту. 15 минут на GPU.
Горячее подключение. Хотим новую область? Добавляем ещё одного эксперта — повторяем [4] шаги 1-2. Старых экспертов не трогаем.
Деградация на существующих областях при добавлении нового эксперта: 0.000%. Не «близко к нулю». Буквально ноль, с точностью до четвёртого знака. На трёх масштабах подряд. Катастрофическое забывание [5] — явление, при котором нейросеть теряет прежние знания при обучении на новых данных [4], — полностью исключено архитектурно: веса базовой модели заморожены, забывать [6] нечего.
Я последовательно протестировал архитектуру на GPT-2 (124M параметров), Pythia-410M и Pythia-1B:
|
Базовая модель |
Областей |
Снижение перплексии |
Отставание от идеала |
Деградация при подключении |
|---|---|---|---|---|
|
GPT-2 124M |
4 |
33.4% |
6.6% |
— |
|
Pythia-410M |
6 |
34.3% |
5.9% |
0.000% |
|
Pythia-1B |
8 |
31.2% |
3.2% |
0.000% |
Перплексия — мера «растерянности» модели перед текстом: чем ниже, тем лучше модель предсказывает следующее слово. Снижение стабильно (~31-34%) на всех трёх масштабах.
Отставание от идеала — это разница между решением маршрутизатора и теоретически лучшим выбором (оракулом, который знает правильный ответ заранее). Оно сужается с ростом модели: 6.6% –> 5.9% –> 3.2%. Чем умнее модель, тем точнее работает маршрутизатор — и это контринтуитивно.
Математический эксперт показал рекордную специализацию: перплексия упала на 85.1%, а разрыв между «своим» и «чужим» доменом составил 64.9x. Разговорный эксперт специализировался хуже всех (3.1%) — разговорный стиль слишком «общий», в нём мало уникального.
По пути были найдены вещи, которые не работают:
Вспомогательные функции потерь. В классической смеси экспертов маршрутизатор может «зациклиться» на одних экспертах и перестать использовать остальные — это называется вырождение экспертов. Обычно с этим борются, добавляя к основной функции потерь штрафы за неравномерную нагрузку. Я проверил четыре таких штрафа (balance, diversity, entropy, importance) — все ухудшили результат на 11-27%. Это согласуется с выводами Wang et al. [5]: «слишком большой вспомогательный штраф ухудшает качество модели» — именно поэтому DeepSeek-V3 [6] отказался от штрафов в пользу безлоссовой балансировки.
Совместное обучение экспертов и маршрутизатора одновременно — коллапс: точность падает с 80.8% до 73.7%. Эксперты и маршрутизатор мешают друг другу сходиться. В DeepSeek-MoE [3] пришли к похожему выводу: общий эксперт обучается отдельно от маршрутизируемых.
Маршрутизация по меткам. Казалось бы, если мы знаем, из какой области каждый текст, — можно напрямую указать маршрутизатору, куда слать токены. Но оказалось наоборот: маршрутизатор, который учился только на задаче предсказания следующего слова, без каких-либо подсказок об областях, нашёл доменные границы точнее (6.6% отставание от идеала), чем маршрутизатор с явными метками (7.3%). Текст содержит больше информации о своей принадлежности, чем бинарная метка.
Вместо штрафов я использовал безлоссовую балансировку [5]: у маршрутизатора есть обучаемое смещение, которое мягко выравнивает нагрузку между экспертами. Результат: 100% экспертов живы на всех масштабах.
К этому моменту всё выглядело как безоговорочный успех. Перплексия падает на треть. Маршрутизация работает на 96%. Эксперты живы на 100%. Горячее подключение идеальное.
И тут я проверил, как это влияет на способность модели решать реальные задачи.
Шаг 17. Pythia-1B + 8 доменных экспертов. Перплексия красивая. Запускаю оценку на MMLU — бенчмарке общих знаний по 57 предметам — и GSM8K — наборе из 8.5 тысяч школьных задач по математике.
MMLU: +0.29 процентных пункта. Почти шум.
Ок, модель маленькая. Может на 3 миллиардах параметров будет лучше? Шаг 18. Qwen 2.5 3B — серьёзная модель, 74.4% на GSM8K из коробки. Обучаю математического эксперта. Перплексия на математических текстах снижается на 23.9%. Меж доменный разрыв: 64.9x. Маршрутизация: 100% — все токены идут куда надо.
GSM8K после подключения эксперта: 65.8%. Минус 8.6 процентных пунктов.
Эксперт, идеально обученный на математических текстах, с идеальной маршрутизацией и рекордной специализацией, ухудшил способность модели решать математические задачи. На 8.6 пунктов.
Я перепроверил три раза. Попробовал разморозить верхние слои базовой модели. Попробовал совместное обучение. Попробовал двухфазную схему. Результат стабильно отрицательный: от -8.4 до -8.6 п.п.
Это не новость для исследователей. Hu et al. [7] показали, что «качество языкового моделирования не согласуется с качеством на большинстве целевых задач». Fang et al. [8] зафиксировали корреляцию перплексии и результатов на бенчмарках, близкую к нулю. Но одно дело читать об этом в чужой статье, другое — увидеть -8.6 п.п. в собственном эксперименте.
Вот что произошло. Эксперт, обученный на сырых математических текстах (учебники, статьи, формулы), выучил статистику языка математики. Он знает, что после «решим уравнение» вероятнее идёт формула, а не рецепт борща. Это снижает перплексию.
Но GSM8K спрашивает не «что обычно идёт после слова “уравнение”», а «сколько яблок осталось у Маши». Для этого нужна логика [7] рассуждения, а не знание частотности слов.
Модель стала лучше говорить на языке математики, но не лучше думать математически.
А самое обидное: маршрутизатор при этом работал идеально. Отставание от идеала — 0.4%, рекорд проекта. Маршрутизатор даже научился избегать эксперта на задачах, где тот вредит — на MMLU маршрутизатор показал результат на +0.15 п.п. выше, чем идеальный (оракульный) выбор. Маршрутизатор оказался умнее исследователя.
Шаг 19. Гипотеза: проблема не в архитектуре, а в данных. Смесь экспертов работает. Маршрутизация работает. Эксперт специализируется. Но на чём он специализируется — вот вопрос.
Что если обучить эксперта не на сырых текстах, а на пошаговых рассуждениях самой модели?
Идея не новая. Wei et al. [9] показали, что если попросить языковую модель рассуждать по шагам (этот приём называют цепочкой рассуждений, Chain-of-Thought), она решает задачи значительно лучше. Zelikman et al. [10] пошли дальше: в методе STaR модель генерирует такие цепочки, обучается на правильных, и повторяет цикл — улучшая себя раз за разом. Но STaR дообучивает всю модель. Я хотел проверить: работает ли это с внешним экспертом, который подключается поверх замороженной модели и не трогает её веса?
Генерирую 750 задач из GSM8K. Qwen 2.5 3B решает 638 из них правильно (85.1%). Получается 119 тысяч токенов — в 33 раза меньше, чем 4 миллиона токенов сырого текста из предыдущего шага. Только правильные решения. Формат «Вопрос: … Ответ: …» — точно как при инференсе (применении модели).
Обучаю тот же эксперт на этих данных.
GSM8K: 75.5%. Плюс 1.1 п.п. к исходному уровню. Плюс 9.7 п.п. к шагу 18.
9.7 процентных пунктов разницы. Та же архитектура. Тот же эксперт. Тот же маршрутизатор. Другие данные.
Самодистилляция — обучение модели на её собственных выходах — решила проблему, которую не могли решить ни разморозка слоёв, ни совместное обучение, ни увеличение масштаба. Модель обучила свой эксперт на собственных рассуждениях — и эксперт усилил именно способность рассуждать, а не знание доменного языка.
Парадокс [8]: перплексия на данных самодистилляции ухудшилась на 17.8%. Эксперт стал хуже предсказывать следующее слово в общем смысле, но научился воспроизводить паттерны пошагового вывода, которые нужны именно для решения задач. Это подтверждает разрыв между перплексией и качеством на бенчмарках с другой стороны: перплексия может вырасти, а результат на задачах — улучшиться.
Важные нюансы:
Формат данных критичен. Формат «Вопрос/Ответ» (совпадает с тем, как модель отвечает при инференсе) дал на 2-3 п.п. больше, чем формат «Задача/Решение». Модель учится лучше, когда обучающие данные выглядят так же, как входы при реальном использовании.
Качество важнее объёма. 119 тысяч токенов правильных решений побили 4 миллиона токенов сырого текста с отрывом в 9.7 п.п.
LoRA-вариант — адаптация через низкоранговые матрицы (13.4 млн обучаемых параметров против 67.6 млн у смеси экспертов) — показал 74.0%: всего -0.4 п.п. от исходного уровня. В пять раз эффективнее по параметрам, но без маршрутизации.
Если модель может обучить своего эксперта на собственных решениях и стать лучше — что мешает повторить это в цикле? Модель решает задачи, обучает эксперта, решает ещё лучше, обучает ещё лучше… По сути, это вопрос о том, возможно ли самоулучшение без учителя — один из центральных в исследованиях ИИ.
Шаг 20. Замыкаю цикл. В нулевом цикле модель решила 638 из 750 задач. Обучаю эксперта на этих решениях. В первом цикле модель с экспертом решает уже 658 задач — 20 новых, которые раньше не поддавались. Обучаю эксперта на обновлённых данных. Второй цикл: 668 задач, ещё 10 новых.
|
Цикл |
Верных решений |
Новых |
GSM8K |
|---|---|---|---|
|
0 (исходный) |
638/750 |
— |
75.5% |
|
1 |
658/750 |
+20 |
75.5% |
|
2 |
668/750 |
+10 |
76.0% |
Кривая растёт монотонно. Никакой деградации. Модель улучшает себя!
Но если присмотреться: +20 новых решений в первом цикле, +10 во втором. Прирост вдвое меньше. Прогноз на третий: ~5. На четвёртый: ~2. Модель быстро выжимает «лёгкие» задачи — те, которые она почти решала и раньше. Оставшиеся 82 задачи ей принципиально не по зубам с текущим объёмом знаний.
И всё же — 76.0% на GSM8K, +0.5 п.п. за два цикла без какого-либо внешнего вмешательства. Я был в восторге.
Шаги 21-22. Я решил оптимизировать цикл: подобрать длительность обучения, регуляризацию, стратегию генерации. Результаты скакали от запуска к запуску на 3-5 п.п. Сначала я списывал это на разницу в настройках. А потом посмотрел внимательнее.
Каждый раз, когда я создавал нового эксперта через QwenWithMoE(), PyTorch инициализировал его веса случайными числами. Без фиксации генератора случайных чисел. То есть каждый запуск начинался с другого эксперта — и разброс результатов из-за этого составлял ~5 п.п. А эффект, который я измерял (75.5% –> 76.0%), составлял 0.5 п.п.
Я измерял сигнал в десять раз слабее шума.
Одна строчка — torch.manual_seed(42) перед созданием эксперта — всё изменила. Три запуска с разными начальными состояниями, 500 задач для оценки вместо 200:
|
Начальное состояние |
GSM8K |
|---|---|
|
seed 42 |
76.4% |
|
seed 123 |
75.2% |
|
seed 456 |
76.0% |
|
Среднее +/- разброс |
75.87% +/- 0.61 п.п. |
Хорошая новость: весь процесс воспроизводим, разброс всего 0.61 п.п. Плохая новость: теперь надо перепроверить цикл самоулучшения с этой точностью.
Запускаю тот же цикл, но с фиксированной инициализацией и оценкой на 500 задачах. Два варианта:
Холодный старт — каждый цикл создаю свежего эксперта с нуля: цикл 1 = 76.4%, цикл 2 = 74.6%, цикл 3 = 74.6%. Плато. Никакого роста.
Тёплый старт — продолжаю обучение эксперта с того места, где остановился: цикл 1 = 76.4%, цикл 2 = 75.0%, цикл 3 = 71.6%.
Деградация. И вот что особенно коварно: перплексия при тёплом старте продолжала улучшаться — 1.58, 1.45, 1.36. С каждым циклом эксперт всё увереннее предсказывал следующий токен в обучающих данных. На графике потерь всё выглядело идеально. А GSM8K тем временем падал: 76.4%, 75.0%, 71.6%. Минус 4.8 п.п. за два цикла.
Это та же ловушка перплексии, что и в Акте II, но хитрее. Тогда перплексия снижалась на чужих текстах и не помогала. Здесь перплексия снижалась на собственных решениях — и всё равно не помогала. Эксперт не учился решать новые задачи, а всё точнее запоминал старые.
Узкое место оказалось фундаментальным: от цикла к циклу 85-90% задач в обучающей выборке оставались теми же. Модель решала 638 из 750, потом 658 из 750, потом 668 из 750 — но ядро из ~630 задач повторялось каждый раз. Эксперт не получал нового знания, он переобучался на старом.
«Улучшение» из шага 20 (75.5% –> 76.0%) оказалось статистическим шумом. Доверительный интервал при оценке на 200 задачах составлял ~5 п.п. — в десять раз больше, чем измеренный эффект.
Ещё одна неожиданная находка. Среди прочего я попробовал сглаживание меток — стандартный приём регуляризации, при котором модель штрафуется за чрезмерную уверенность в ответе. В классификации изображений этот приём обычно помогает. Здесь он обрушил GSM8K на -9 п.п.
Müller et al. [11] показали, что сглаживание «сжимает» выходные вероятности модели, делая все варианты ответа более равновероятными. Для классификации фотографий это полезно: «90% кошка, 10% собака» лучше, чем «99.99% кошка». Но для математического рассуждения это катастрофа.
Когда модель решает «В корзине было 15 яблок, Маша взяла 7», ответ «8» не может быть «скорее 8, но немного 7». Каждое число, каждый оператор, каждый промежуточный шаг требует абсолютной уверенности. Сглаживание размывает именно эту уверенность — и цепочка рассуждений рассыпается.
22 шага, четыре акта, один сквозной сюжет: перплексия врёт. Вот чем закончилась каждая линия:
Архитектура — работает надёжно. Горячее подключение экспертов даёт ровно 0.000% деградации на трёх масштабах. Безлоссовая балансировка [5] держит всех экспертов живыми — штрафные слагаемые в функции потерь только вредят. Маршрутизатор с точностью 96% находит границы между областями сам, без подсказок. Всё это воспроизводимо и стабильно.
Перплексия как метрика — не работает. Это главный сквозной вывод проекта. Перплексия обманула трижды: в Акте I (31% снижение = +0.29 п.п. на бенчмарке), в Акте II (-8.6 п.п. при «идеальном» улучшении перплексии) и в Акте IV (перплексия падает от цикла к циклу, а качество на задачах деградирует). Каждый раз механизм разный, но урок один: модель, которая лучше предсказывает следующее слово, не обязательно лучше думает. Это подтверждают и независимые исследования [7, 8].
Самодистилляция — единственный прорыв. Та же архитектура, тот же эксперт — но обученный на собственных пошаговых решениях модели вместо сырого текста. Разворот на 9.7 п.п.: с минус 8.6 до плюс 1.1. Проблема была не в архитектуре, а в данных — и модель сама оказалась лучшим источником данных для себя.
Цикл самоулучшения — не масштабируется. Замкнутый цикл «решаю –> обучаюсь –> решаю лучше» упирается в плато: 85-90% задач повторяются между циклами, и эксперт переобучается на старом вместо того, чтобы учить новое. Для продолжения роста нужен внешний сигнал — новые задачи, другие модели, расширение обучающей выборки.
Модель, обученная на текстах о математике, не учится решать задачи. Модель, обученная на собственных решениях задач — учится.
Разница между «знать язык предмета» и «уметь думать в предмете» — фундаментальна. И эта разница невидима по перплексии. Вы можете добиться идеального снижения перплексии, идеальной маршрутизации, идеальной специализации — и получить деградацию на реальных задачах.
Самодистилляция — не серебряная пуля, но единственная техника в этом проекте, которая развернула кривую из минуса в плюс. 119 тысяч токенов собственных пошаговых решений сделали то, чего не смогли 4 миллиона токенов сырого текста.
Потребление видеопамяти (Pythia-1B + 8 экспертов):
|
Компонент |
Видеопамять |
|---|---|
|
Базовая модель bf16 (заморожена) |
2.0 ГБ |
|
8 экспертов fp32 |
2.15 ГБ |
|
Состояния оптимизатора (AdamW) |
4.3 ГБ |
|
Активации (размер батча 4) |
2.0 ГБ |
|
Маршрутизатор + прочее |
0.3 ГБ |
|
Итого |
~10.5 ГБ |
8 доменов Pythia-1B — таблица специализации:
|
Область |
Исх. перплексия |
С экспертом |
Снижение |
Разрыв «свой/чужой» |
|---|---|---|---|---|
|
Математика |
10.68 |
1.59 |
85.1% |
64.9x |
|
Код |
5.52 |
3.79 |
31.3% |
8.5x |
|
Наука [9] |
15.93 |
11.05 |
30.6% |
5.7x |
|
Инструкции |
7.83 |
5.14 |
34.4% |
7.0x |
|
Энциклопедия |
24.43 |
15.26 |
37.5% |
4.5x |
|
Художественные тексты |
24.42 |
19.95 |
18.3% |
— |
|
Диалоги |
8.21 |
7.96 |
3.1% |
3.5x |
|
Новости |
14.39 |
13.06 |
9.2% |
2.5x |
[1] Shazeer et al. Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer. ICLR 2017. arxiv:1701.06538 [10]
[2] Jiang et al. Mixtral of Experts. 2024. arxiv:2401.04088 [11]
[3] Dai et al. DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models. 2024. arxiv:2401.06066 [12]
[4] Kirkpatrick et al. Overcoming Catastrophic Forgetting in Neural Networks. PNAS 2017. arxiv:1612.00796 [13]
[5] Wang et al. Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts. 2024. arxiv:2408.15664 [14]
[6] DeepSeek-AI. DeepSeek-V3 Technical Report. 2024. arxiv:2412.19437 [15]
[7] Hu et al. Can Perplexity Reflect Large Language Model’s Ability in Long Text Understanding? 2024. arxiv:2405.06105 [16]
[8] Fang et al. What is Wrong with Perplexity for Long-context Language Modeling? 2024. arxiv:2410.23771 [17]
[9] Wei et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS 2022. arxiv:2201.11903 [18]
[10] Zelikman et al. STaR: Bootstrapping Reasoning With Reasoning. NeurIPS 2022. arxiv:2203.14465 [19]
[11] Müller, Kornblith, Hinton. When Does Label Smoothing Help? NeurIPS 2019. arxiv:1906.02629 [20]
Исследование проведено в BorisovAI [2]. Код и все результаты экспериментов: GitVerse [21] | GitFlic [22]
Автор: borisovai-ru
Источник [23]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/26695
URLs in this post:
[1] математики: http://www.braintools.ru/article/7620
[2] BorisovAI: https://borisovai.ru
[3] обучения: http://www.braintools.ru/article/5125
[4] повторяем: http://www.braintools.ru/article/4012
[5] забывание: http://www.braintools.ru/article/3931
[6] забывать: http://www.braintools.ru/article/333
[7] логика: http://www.braintools.ru/article/7640
[8] Парадокс: http://www.braintools.ru/article/8221
[9] Наука: http://www.braintools.ru/article/7634
[10] arxiv:1701.06538: https://arxiv.org/abs/1701.06538
[11] arxiv:2401.04088: https://arxiv.org/abs/2401.04088
[12] arxiv:2401.06066: https://arxiv.org/abs/2401.06066
[13] arxiv:1612.00796: https://arxiv.org/abs/1612.00796
[14] arxiv:2408.15664: https://arxiv.org/abs/2408.15664
[15] arxiv:2412.19437: https://arxiv.org/abs/2412.19437
[16] arxiv:2405.06105: https://arxiv.org/abs/2405.06105
[17] arxiv:2410.23771: https://arxiv.org/abs/2410.23771
[18] arxiv:2201.11903: https://arxiv.org/abs/2201.11903
[19] arxiv:2203.14465: https://arxiv.org/abs/2203.14465
[20] arxiv:1906.02629: https://arxiv.org/abs/1906.02629
[21] GitVerse: https://gitverse.ru/borsiovai/seed-net
[22] GitFlic: https://gitflic.ru/project/borisovai/seed-net
[23] Источник: https://habr.com/ru/articles/1005168/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1005168
Нажмите здесь для печати.