- BrainTools - https://www.braintools.ru -
Обучение [1] LLM — это в первую очередь инфраструктурная задача: нужен пайплайн, который можно перезапускать с новыми данными, архитектурой или другим расписанием обучения и получать повторяемый внутри команды результат. В этом материале — рассказ команды обучения и инференса моделей RWB о том, как мы с нуля, без загрузки pretrained-весов, обучили текстовую модель на основе гибридной архитектуры Qwen3.5-2B-Base и какие выводы сделали по пути — от сборки датасетов до чтения графиков онлайн-оценки.
Кратко о результатах:
Собрали внутренне повторяемый pretrain-пайплайн на Megatron-LM и обучили гибридную архитектуру Qwen3.5-2B — сначала на 1 трлн токенов, затем на 11 трлн с трёхфазным доменным блендом. Обучали только текстовую часть.
В эксперименте на 1 трлн токенов проверили, что модель ведет себя стабильно, получили адекватные метрики на основных бенчмарках и поняли, что необходимо добавить больше математических датасетов в собранный бленд данных.
В наших двух запусках MMLU в разных форматах вопроса вёл себя по-разному: completion-form (CF) раньше выходил на плато, а multiple-choice form (MCF) стартовал медленнее, но продолжал расти до конца decay-фазы.
В одном парном эксперименте с модифицированным attention-слоем XSA (Exclusive Self-Attention [2]) на Qwen3-1.7B получили Δ val loss = −0,009 и +1,6 п. п. на MMLU ценой примерно 5–10% throughput. Повторные полные прогоны на разных seed пока не проводили.
Финальный эксперимент на 11 трлн токенов дал сопоставимые с нашим внутренним замером Qwen3.5-2B-Base метрики на commonsense-бенчмарках. Отметим, что эти цифры сравнимы только внутри зафиксированного eval-протокола.
Слабым местом остаётся качество модели на математических и логических задачах, и это мы планируем исправить, расширив коллекцию доменных датасетов.
Ранее наша команда выпустила семейство post-train моделей BerryLM, дообученных на русский язык. На момент публикации крупнейшая модель, BerryLM-XL, вошла в топ-3 бенчмарка MERA [3]. Все модели этой серии широко применяются в продуктах Wildberries: в ИИ-ассистенте для покупателей, сравнении и поиске товаров, а также в инструментах, помогающих продавцам готовить ответы на отзывы и вопросы покупателей. Кроме того, модели BerryLM используются для автоматизации ряда внутренних процессов RWB. Следующий шаг для команды – проверить, насколько сложно самостоятельно собрать полный цикл pretrain с нуля и каких результатов можно добиться на открытых датасетах.
Для компании собственный пайплайн обучения особенно важен: он позволяет контролировать состав данных и добавлять доменные знания для конкретных бизнес-задач. Сразу скажем, что в рамках этой задачи мы не ставили целью обучить base-модель, которая обошла бы открытые аналоги. Честное сравнение потребовало бы очистить корпус от утечек бенчмарков, но такой контур фильтрации данных в начале наших экспериментов ещё не был готов.
Наша задача была другой: отработать внутренне повторяемый pretrain-пайплайн, сборку и балансировку доменных датасетов, обучение гибридной архитектуры с нуля и диагностику нестабильностей. Поэтому бенчмарки в статье — прежде всего проверка работоспособности пайплайна, а не заявка на место в лидерборде.
При выборе архитектуры остановились на Qwen3.5-2B по нескольким причинам:
это современная модель, опубликованная в феврале 2026 года;
малое число параметров позволяет быстро итерироваться по проверяемым гипотезам и экспериментам;
интересная архитектура: помимо привычного квадратичного self-attention (SDPA) в ней используется GatedDeltaNet [4], рекуррентный механизм внимания [5] с линейной сложностью по длине последовательности.
Мы провели два эксперимента на этой модели: сначала компактный — на 1 трлн токенов в две фазы, затем — расширенный, на 11 трлн токенов, с трёхфазным доменным расписанием. Отметим, что модель изначально мультимодальная, но мы обучали только текстовую часть.
Во время обучения мы заметили странное на первый взгляд поведение [6] MMLU. Пока остальные метрики росли, MMLU заметно дольше держался около уровня случайного угадывания и «ожил» только на второй фазе. Разбираясь, почему так произошло, мы наткнулись на не самую очевидную деталь самого бенчмарка, которую разберем в отдельном разделе.
Параллельно с экспериментами на Qwen3.5-2B мы провели исследовательский эксперимент с недавно предложенной модификацией attention XSA (Exclusive Self-Attention [7]). Поскольку XSA меняет именно квадратичное внимание, а не GatedDeltaNet, для проверки взяли другую небольшую модель — Qwen3-1.7B-Base с обычным SDPA — и другой доменный микс датасетов. Один парный полный прогон дал небольшой выигрыш; статистическую воспроизводимость результата ещё предстоит проверить на нескольких seed.
Для внешних утверждений мы ссылаемся на первичные источники: официальные model cards и конфиги для архитектур, статьи авторов методов и исходные task-конфиги evaluation-фреймворков. Сводка таких ссылок находится в конце статьи.
Для наших экспериментов источником истины являются неизменяемые конфиги настроек обучения, манифесты, описывающие состав датасетов, и фикисрованные версии задач для бенчмарков в evaluation пайплайне. Пока они не опубликованы, наши численные результаты следует считать внутренними, а сравнения — валидными только для моделей, которые мы оценивали одним и тем же evaluator и конфигом.
Мы не стали собирать корпус полностью с нуля, а использовали готовые открытые источники и сгруппировали их по доменам: web, multilingual, code, math, knowledge и reasoning. Синтетику сами не генерировали, но использовали открытые синтетические датасеты. На этом этапе важнее было довести до конца повторяемый цикл, а генерация данных — отдельная и дорогая задача.
Чтобы не писать вручную отдельный конвертер под каждый новый датасет, мы использовали LLM-агента. Ему давали небольшой случайный sample, около 10 записей, и описание целевого формата. По этим примерам агент генерировал код конвертера. Такой подход ускорял подключение новых источников, но не был полностью автономным: небольшой sample мог не покрыть редкие поля. Результат проверял человек, при необходимости уточнял требования и запускал перегенерацию. После полного прогона данные валидировались по схеме и набором базовых quality checks, и только после этого попадали в обучение.
Часть исходных веб-корпусов уже была отфильтрована, поэтому html-разметку, мусорные документы и повторы убирать заново не потребовалось. Однако это не устраняет проблему cross-source и глобальных дублей: источники могут пересекаться, а benchmark decontamination мы не выполняли. Собственный контур глобальной дедупликации и очистки остаётся задачей следующей итерации.
Эмпирическая нижняя граница объёма данных известна давно — Chinchilla [8] даёт ориентир около 20 токенов на параметр, чтобы при фиксированном количестве вычислений достичь наименьшего лосса. На практике индустрия давно ушла далеко за эту границу:
|
Модель |
Параметры |
Токены pretrain |
Tokens/Parameters |
× Chinchilla |
Источник |
|---|---|---|---|---|---|
|
Llama 3.2-1B |
1.23B |
до 9T |
~7 300 |
~365× |
Llama 3.2 card [9] |
|
Gemma 3-1B |
1B |
2T |
~2 000 |
~100× |
Gemma 3 card [10] |
|
Qwen3 (0.6B…8B) |
0.6–8B |
36T (общий корпус) |
~4 000–60 000 |
~200–3 000× |
Qwen3 [11] |
|
Llama 3.2-3B |
3.21B |
до 9T |
~2 800 |
~140× |
Llama 3.2 card [9] |
|
Gemma 3-4B |
4B |
4T |
~1 000 |
~50× |
Gemma 3 card [10] |
|
OLMo 3-7B |
7B |
5.93T |
~850 |
~42× |
OLMo 3 card [12] |
|
Qwen3.5-2B [наш эксперимент] |
~2B |
11T |
~5 500 |
~275× |
эта статья |
Объем данных в наших экспериментах для 2B-модели сопоставим с аналогами ее класса. Прямого указания в техрепортах Qwen по объему их pretrain датасетов для этой модели мы не нашли.
В первом эксперименте мы обучали модель на 1 трлн токенов, разделённых на две стадии: 731 млрд на первую и 269 млрд на вторую. Итоговое доменное распределение получилось таким:
|
Домен |
phase1, % |
phase2, % |
|---|---|---|
|
Web EN |
69.6 |
45.3 |
|
Multilingual |
12.6 |
11.7 |
|
Code |
12.6 |
21.8 |
|
Math |
2.7 |
11.3 |
|
Academic / wiki / QA |
2.5 |
3.1 |
|
Synth |
— |
4.5 |
|
Reasoning & sft data |
— |
2.3 |
|
Σ |
100 |
100 |
Все датасеты первой стадии обучения условно распадаются на четыре домена:
обычный веб-контент (в том числе на разных языках),
энциклопедические и учебные тексты (в некоторых источниках это тоже часть web, только высококачественного),
код,
математика [13].
Общая практика обучения показывает, что удобнее не смешивать их в одной пропорции на всё обучение, а менять баланс по фазам:
на первой фазе модель в первую очередь учит общую языковую статистику — здесь доминирует веб (65–80%), код занимает 10–15%, а знания и математика делят остаток;
на второй фазе акцент смещается на знания и понимание — доля веба падает, добавляются высококачественные и энциклопедические источники;
на опциональной третьей фазе усиливают код и математику, а иногда добавляют reasoning-трейсы или даже SFT-данные в текстовом виде — по данным AllenAI из работы по Olmo3 [14], это заметно помогает на математических и кодовых бенчмарках.
В Qwen3.5-2B каждый четвёртый слой — квадратичный GatedAttention, а остальные — GatedDeltaNet. Gated Attention отличается от «обычного SDPA» дополнительным output gate, а GatedDeltaNet весь предыдущий контекст сжимает в матрицу фиксированного размера, а не честно хранит целиком, как квадратичный. Это дает выигрыш по памяти [15] ценой выразительности слоя, и в семействе моделей Qwen, где GatedDeltaNet применяется (сюда же относятся Qwen3-Next и Qwen3.6), используется смешивание слоев: блоки из 3 линейных слоев и одного квадратичного. Такой гибридный паттерн сочетает эффективность линейного механизма и точный доступ полного внимания.
Основные детали модели:
|
характеристика |
значение |
|---|---|
|
тип модели и количество параметров |
dense, 2B |
|
cлои / hidden / FFN |
hidden size 2048, intermediate size 6144 |
|
конфигурация гибридного внимания |
6 × (3 слоя GatedDeltaNet + 1 слой Gated Attention) |
|
Gated Attention |
8 Q-голов / 2 KV-группы (GQA 4:1), head_dim 256 |
|
GatedDeltaNet |
16/16 key/value голов, head_dim 128, conv kernel 4 |
|
max_length |
4096, стандартно для pretrain фазы (типовые значения 2048 – 8192) |
|
позиционное кодирование |
в оригинале multimodal-RoPE ( |
|
модальности |
text-only |
|
точность |
bf16 + fp8 hybrid (E4M3 forward / E5M2 backward) |
|
инициализация весов |
N(0, std^2), std=0.02 |
Токенайзер взяли готовый для этой модели. Что интересно, у него (как и у всех Qwen3.5) достаточно большой размер словаря (около 248к), значительно больше, чем у предыдущего семейства Qwen3 (около 150к), из-за поддержки большего числа языков.
Полные конфиги модели можно посмотреть на HF здесь [16].
Квадратичный attention хранит представления прошлых токенов: на каждом шаге новый токен «смотрит» на предыдущие key/value-векторы в KV-cache. Это даёт прямой доступ к любому месту контекста, но при обучении вычисления растут как O(n²) по длине, а память KV-cache на инференсе — линейно.
Gated DeltaNet — это линейное внимание с рекуррентным механизмом: вместо хранения всей истории он держит состояние фиксированного размера (компактную матрицу-«память» S) и обновляет его по мере чтения токенов так, чтобы произведение S * key приближалось к значению value. Благодаря этому на инференсе мы можем не хранить value векторы для предыдущих токенов, и память не растёт с контекстом.
Ключевых механизма два:
Delta-правило — состояние обновляется не простым накоплением, а «дельтой»: для нового ключа старая ассоциация [17] S(t-1) * k(t) частично перезаписывается свежим значением v(t). Это более аккуратная запись в память, чем у классического линейного внимания. Сила записи регулируется скаляром β, вычисляемым для каждого токена.
Гейт (gating) — гейт α, также зависящий от конкретного токена, решает, сколько старой информации «забыть», а сколько сохранить. Это позволяет модели адаптивно стирать неактуальный контекст. Добавляется в формулу выше и действует на всю матрицу-состояние.
Итоговая формула имеет вид:
Главное отличие: полный attention хранит историю явно, а GatedDeltaNet сжимает её в состояние фиксированного размера. Чистые GatedDeltaNet-модели возможны и исследованы в оригинальной работе [18], однако гибридная схема даёт более сильный практический баланс качества и эффективности.
Ядро пайплайна — Megatron-LM [19]. Его BlendedDataset [20] читает токенизированные бинарные шарды (.bin/.idx) и на лету собирает из них взвешенный бленд с заданными весами. Распределенное обучение, смешанная точность, восстановление обучения с последнего чекпоинта — всё это закрывается стандартными возможностями Megatron, поэтому дополнительной обёртки поверх фреймворка мы не писали. Отдельно подключили ClearML для логирования основных настроек запусков и хода экспериментов.
Из неожиданных нюансов на этапе подготовки токенизированных данных обнаружили, что на очень крупных источниках (свыше 2 млрд документов) сборка индекса неожиданно падала с segfault — оказалось, что счётчик документов упирался в переполнение int32, поэтому такие датасеты разделили на несколько частей, чтобы уместиться в численный предел Megatron датасета.
Для промежуточной оценки качества по ходу обучения используем lm-evaluation-harness [21]: для модели такого размера набор стандартных бенчмарков успевает посчитаться за интервал между сохранением чекпоинтов, так что метрики можно смотреть прямо на дашборде обучения. Финальную оценку делаем отдельным офлайн-прогоном — после экспорта весов в формат HuggingFace.
|
Формат |
Всего бит |
Знак |
Экспонента |
Мантисса |
В обучении |
|---|---|---|---|---|---|
|
fp32 |
32 |
1 |
8 |
23 |
Эталон точности; накопления в оптимизаторе, master-веса |
|
fp16 |
16 |
1 |
5 |
10 |
Узкий диапазон → нужен loss scaling; в LLM почти вытеснен bf16 |
|
bf16 |
16 |
1 |
8 |
7 |
Базовый режим вычислений (веса, активации, градиенты) |
|
fp8 E4M3 |
8 |
1 |
4 |
3 |
Прямой проход (forward): активации и веса |
|
fp8 E5M2 |
8 |
1 |
5 |
2 |
Обратный проход (backward): градиенты |
Использование классического fp32 для всех операций в обучении очень затратно как по вычислениям, так и по памяти, поэтому часто используются другие форматы. Мы выбрали базовый формат bf16 (такой же диапазон, как у fp32 за счет огрубления точности – меньше битов на мантиссу). Поверх этого для части самых вычислительно емких операций включается fp8 в гибридном формате – в forward, где больше важна точность, используется E4M3, в backward, где важнее учесть порядок градиентов, используется E5M2. Такой смешанный режим вычислений позволил ускорить обучение без каких-то нестабильностей и всплесков loss.
Global batch size — 1024 (примерно вдвое больше, чем у SmolLM3, и втрое меньше, чем в рецепте Nemotron-Nano [22]). Learning rate менялся так:
|
Итерации |
Режим |
Learning rate |
|---|---|---|
|
0 – 14 000 |
warmup |
0 → 5×10⁻⁴ |
|
14 001 – 174 268 |
constant |
5×10⁻⁴ |
|
174 269 – 175 549 |
re-warmup |
5×10⁻⁵ → 5×10⁻⁴ |
|
175 550 – 219 249 |
constant |
5×10⁻⁴ |
|
219 250 – 241 701 |
cosine decay |
5×10⁻⁴ → 5×10⁻⁵ |
По train/validation loss видно, что обучение идет стабильно и всплесков на отдельных шагах нет. Валидация запускалась каждые 5 тыс. итераций, начиная с шага 5000. Разные уровни линий вызваны изменением состава train/validation датасетов между фазами.
По ходу обучения на каждом сохраненном чекпойнте считали шесть бенчмарков:
|
Бенчмарк |
что измеряет |
уровень случайного выбора |
|---|---|---|
|
Hellaswag |
общий здравый смысл (правдоподобное продолжение бытовой ситуации) |
25% |
|
Winogrande |
общий здравый смысл (разрешение кореференции в тексте) |
50% |
|
ARC-Easy |
знания о мире, вопросы школьного уровня |
около 25%; число вариантов различается |
|
ARC-Challenge |
знания о мире + рассуждение, более сложные вопросы |
около 25%; число вариантов различается |
|
MMLU |
мультидисциплинарные знания |
25% |
|
PIQA |
здравый смысл в бытовых ситуациях |
50% |
Все онлайн замеры проводятся в zero-shot, logprobs формате: evaluator сравнивал условные вероятности вариантов ответа, а не запускал свободную генерацию. Оценка проводится каждые 10k итераций, начинается с 10000.
На этих графиках сразу обращает на себя внимание MMLU: пока остальные бенчмарки отрывались от уровня случайного выбора уже на первой фазе, MMLU оставался рядом с ним и резко вырос около перехода ко второй фазе. По одному графику сложно однозначно установить причину скачка: одновременно менялись данные, learning rate и состояние модели. Но сравнение разных MMLU-протоколов показало, что выбранная форма вопроса действительно сильно влияет на траекторию метрики.
Дело в формулировке вопроса. Причём об этом уже писали в статье про SmolLM2 [23]: один и тот же MMLU-бенчмарк можно измерять как минимум тремя разными способами.
MCF (multiple choice form) — варианты ответа перечислены прямо в вопросе как A/B/C/D, evaluator сравнивает log-likelihood букв ответа. В lm-eval-harness это task mmlu.
CF (completion form) — вариантов в prompt нет, evaluator сравнивает log-likelihood полного текста каждого ответа. Task mmlu_continuation.
Generative MCF — модель просто генерирует ответ жадным декодингом. Task mmlu_generative.
Актуальные определения задач приведены по README MMLU из lm-evaluation-harness [24].
В наших экспериментах разница в поведении [25] форм значительна: CF даёт полезный сигнал в начале обучения, но и на плато выходит раньше. MCF стартует позже, но продолжает расти вплоть до конца decay-фазы.
Поэтому во всех следующих экспериментах мы используем online-оценку сразу в двух формах — mmlu и mmlu_continuation.
На нашем внутреннем протоколе оценивания мы получили следующие метрики:
|
Бенчмарк |
Формат |
our_first_run_phase2 (1 трлн токенов) |
SmolLM3-3B_phase2 (10 трлн токенов) |
|---|---|---|---|
|
MMLU (MCF) |
5-shot, generative |
49.37 |
55.09 |
|
MMLU-Pro |
5-shot, generative |
18.11 |
23.68 |
|
HellaSwag |
10-shot, acc_norm, logprobs |
66.37 |
73.88 |
|
Winogrande |
5-shot, logprobs |
62.67 |
70.64 |
|
GSM8K (CoT) |
8-shot, generative |
25.70 |
39.27 |
|
MATH-500 |
4-shot, pass@32, generative |
17.6 |
19.20 |
|
ARC-Challenge |
25-shot, acc_norm, logprobs |
63.65 |
70.22 |
|
PIQA |
0-shot, logprobs |
75.52 |
78.18 |
В качестве сравнения взяли чекпойнт SmolLM3 со второй фазы — данные для третьей фазы на тот момент еще не были собраны. С учетом небольшого объема данных, метрики выглядят заметно ниже, но для первого запуска этого было достаточно, чтобы проверить пайплайн и корректность собранных конфигов датасетов.
Параллельно с экспериментами на Qwen3.5-2B мы провели отдельный research-трек по XSA (Exclusive Self-Attention). Каноническое определение из работы Shuangfei Zhai [2] модифицирует выход SDPA: для каждого токена и головы из Y = SDPA(Q, K, V) вычитается проекция Y на self-value-вектор этого же токена:
Z = Y − (Y · V̂) V̂, где V̂ = V / ||V||.
В ablation проекта Marin [26] удаление XSA давало ухудшение loss примерно на 0,015–0,018.
Поскольку XSA меняет SDPA, а не GatedDeltaNet, для проверки взяли Qwen3-1.7B — компактную модель с квадратичным вниманием на всех слоях. Использовали тот же Megatron-пайплайн, но другой, преимущественно англоязычный доменный blend.
|
Домен |
Доля |
|---|---|
|
Веб-данные EN |
~49% |
|
Синтетика на основе веб-данных |
~15% |
|
Код |
~11% |
|
Математика |
~8% |
|
Мультиязычный веб |
~6% |
|
Reasoning / QA / энциклопедические тексты |
~6% |
|
Качественные учебные тексты |
~5% |
В нашем сетапе (AdamW, bf16) «чистая» формула из статьи без стабилизации разошлась: max attention-логит ушёл к ~90, после чего запуск остановили. Мы прогнали короткие ablation’ы разных способов стабилизации. Смотрели на три вещи: val loss на 10k шагов, max attention-логит (насколько разгоняются логиты) и num-zeros — сколько параметров к концу прогона занулилось намертво.
|
Вариант |
val loss (10k) |
max logit |
num-zeros |
Итог |
|---|---|---|---|---|
|
baseline (без XSA) |
2,567 |
22,8 |
~9 |
референс |
|
чистый XSA (без gate) |
— |
90+ (дрейф) |
— |
нестабилен |
|
XSA + head_gate |
2,541 |
22,0 |
4,1k ↗ |
«умирают» головы |
|
XSA + λ_h |
2,545 |
23,6 |
~9 |
выбран |
|
XSA + GatedNorm |
2,535 |
97,5 |
29M |
дрейф + мёртвые параметры |
Далее — пояснения по каждому варианту, в псевдокоде.
чистый XSA — вычитание как есть, ничем не ограниченное:
y = attention(q, k, v) # [B, T, H, d] — обычный SDPA / FlashAttention
vn = normalize(v, dim=-1) # v / ‖v‖, по каждой голове
z = y - (y * vn).sum(-1, keepdim=True) * vn # снять компоненту выхода вдоль своего V
out = z.reshape(B, T, H * d) @ W_o
Head Gate — обучаемый гейт на выходе головы:
y = attention(q, k, v)
vn = normalize(v, dim=-1)
z = y - (y * vn).sum(-1, keepdim=True) * vn
g = 2 * sigmoid(x @ W_g) # [B, T, H]; W_g: [D, H]
out = (g.unsqueeze(-1) * z).reshape(B, T, H * d) @ W_o
Гейт не трогает само вычитание — он масштабирует вклад головы целиком. Формально лучший loss (2,541) и спокойные логиты (22,0), но num-zeros растёт ступеньками ровно по 2048 — это hidden_size, то есть целая строка W_g, отвечающая за одну голову. Механизм: гейт этой головы насытился в ноль, производная сигмоиды в bf16 занулилась, строка перестала получать градиент — обратно голова уже не вернётся. К 10k шагов таких смертей две (пик num-zeros — 4,1k), а на продолженном до 50k прогоне — около тринадцати голов из 448, и счётчик всё ещё рос. Гейт учится не «дозировать XSA», а выключать голову вместе с ним там, где он мешает.
GatedNorm — низкоранговый покомпонентный гейт в слоте нормировки, на входе блока:
def gated_norm(x): # r = D // 4; init W_up = 0, b = 4 → σ ≈ 1
return x * sigmoid(W_up @ silu(W_down @ x) + b)
x = gated_norm(x) # дальше — обычный блок: RMSNorm → qkv → attention → XSA
В этом ablation max logit достиг 97,5, а num-zeros — 29 млн. Несмотря на минимальный loss на 10 тыс. шагов, вариант не выбрали: короткий loss не компенсирует выраженный дрейф диагностик.
λ_h — гейт не на выходе, а на силе самого вычитания:
y = attention(q, k, v)
vn = normalize(v, dim=-1)
lam = sigmoid(self.lam) # self.lam: [H], init 0 → σ = 0,5 (половина силы)
z = y - lam.view(1, 1, H, 1) * (y * vn).sum(-1, keepdim=True) * vn
out = z.reshape(B, T, H * d) @ W_o
Модель может ослабить коррекцию, но не может ни разогнать её, ни выключить голову: σ(λ_h) ограничен отрезком (0, 1), а вклад головы в остальном не трогается. Цена — n_layers × n_heads скаляров.
Выбрали λ_h: max logit оставался рядом с baseline (23,6 против 22,8), loss был близок к head gate (2,545 против 2,541), а num-zeros не рос. На полном прогоне коэффициент был около 0,99 на первом слое и около 0,75 на 14-м: ближе ко входу проекция вычиталась почти полностью, в середине сети — слабее.
Отдельный вывод не про XSA, а про мониторинг: max attention-логит и num-zeros стоит логировать всегда. Обе метрики ловят расхождение за тысячи шагов до того, как оно дойдет до loss’а — а на loss-кривой к этому моменту чинить уже поздно.
Baseline vs XSA (λ_h), одинаковые данные и размер датасета (~9,9 трлн токенов), все метрики замерялись в zero-shot сетапе:
|
Бенчмарк |
Baseline, % |
XSA (λ_h), % |
Δ |
|---|---|---|---|
|
MMLU (MCF) |
44,2 |
45,8 |
+1,6 |
|
HellaSwag |
38,8 |
40,4 |
+1,6 |
|
ARC-Challenge |
39,2 |
39,7 |
+0,5 |
|
ARC-Easy |
68,2 |
68,3 |
+0,1 |
|
Winogrande |
63,1 |
63,1 |
0,0 |
|
PIQA |
70,3 |
69,9 |
-0,4 |
|
LAMBADA |
50,1 |
51,2 |
+1,1 |
|
val loss |
1,855 |
1,846 |
−0,009 |
|
val perplexity |
6,39 |
6,34 |
−0,05 |
В среднем по семи бенчмаркам чекпоинт с XSA лучше: выигрыш на пяти задачах, ничья на Winogrande и −0,4 на PIQA. То есть XSA на этом одиночном эксперименте дал небольшой выигрыш за счет 5–10% throughput; для более статистически значимых выводов эти эксперименты необходимо будет проделать с разными random seeds.
Финальный эксперимент на Qwen3.5-2B-Base мы запустили после первого прогона и исследовательского трека с XSA. Настройки обучения к тому моменту уже выглядели стабильными, поэтому взяли больший global batch size (1536) и растянули обучение до 11 трлн токенов, разбив его на три фазы по образцу схемы SmolLM3:
на первой фазе преобладает общий веб-контент и код, математики совсем немного;
на второй фазе доля математики растёт за счёт веба;
на третьей — усиливается код и добавляется небольшая доля reasoning-текстов в формате обычного текста (без специальной разметки).
|
Домен |
phase1, % |
phase2, % |
phase3, % |
|---|---|---|---|
|
Web EN |
69.60 |
63.00 |
50.00 |
|
Academic / wiki / QA |
2.65 |
2.30 |
1.52 |
|
Multilingual web |
12.50 |
10.05 |
11.45 |
|
Math |
2.70 |
11.28 |
12.60 |
|
Code |
12.55 |
13.37 |
23.33 |
|
Reasoning CoT |
— |
— |
1.10 |
|
Σ |
100.00 |
100.00 |
100.00 |
Перед каждым переходом между фазами добавили короткий re-warmup на 2 тыс. итераций (на графике две пунктирные почти отвесные линии) — чтобы модель адаптировалась к смене доменного распределения.
Как и в первом эксперименте, разрывы loss кривых связаны с re-warmup и сменой датасетов между фазами. Само обучение прошло стабильно, без видимых всплесков лосса.
Захотелось проверить, повторится ли паттерн из первого прогона — и он повторился почти в точности:
CF-форма хорошо отслеживает прогресс на ранних этапах, но быстро выходит на плато;
MCF-форма разгоняется позже, но именно она продолжает расти во второй половине обучения.
Все три модели оценивали c помощью внутреннего evaluation протокола на базе lm-evaluation-harness. Столбцы SmolLM3-Base и Qwen3.5-2B-Base – наши оценки открытых чекпоинтов, а не цифры из официальных model cards (в них не всегда точно указывают конкретные настройки оценивания бенчмарков, что делает их плохо сравнимыми между собой). Для сравнительной таблицы MMLU оставили в log-probs, а не generative форме, так как для оригинального чекпоинта Qwen3.5-2B в mmlu 5-shot generative на наших замерах получилось слишком низкое значение 37.27 – при том что и для нашей модели, и для SmolLM3 значения между logbrobs и generative формами отличалось незначительно.
|
Бенчмарк |
Формат |
Qwen3.5-2B-Base (наш претрейн с нуля) |
SmolLM-3B-Base phase3 |
Qwen3.5-2B-Base |
|---|---|---|---|---|
|
Knowledge |
|
|
|
|
|
MMLU (MCF) |
5-shot, logprobs |
51.61 |
58.65 |
54.02 |
|
MMLU-Pro |
5-shot, generative |
21.67 |
31.39 |
36.38 |
|
Commonsense |
|
|
|
|
|
HellaSwag |
10-shot, acc_norm, logprobs |
71.74 |
77.68 |
67.48 |
|
WinoGrande |
5-shot, logprobs |
68.67 |
73.95 |
66.61 |
|
PIQA |
0-shot, logprobs |
77.75 |
78.51 |
75.03 |
|
Science |
|
|
|
|
|
ARC-Challenge |
25-shot, acc_norm, logprobs |
66.30 |
78.75 |
84.56 |
|
OpenBookQA |
0-shot, acc_norm, logprobs |
45.40 |
43.60 |
37.40 |
|
Math & Reasoning |
|
|
|
|
|
GSM8K (CoT) |
8-shot, generative |
52.17 |
72.10 |
67.70 |
|
MATH-500 |
4-shot, pass@32, generative |
33.60 |
45.60 |
34.60 |
По сравнению с SmolLM3-3B наша модель слабее, что ожидаемо: параметров в полтора раза меньше, а часть исходного обучающего корпуса модели сравнения была недоступна для воспроизведения. Относительно исходной Qwen3.5-2B-Base по commonsense-бенчмаркам (HellaSwag, WinoGrande, PIQA) наш чекпойнт держится наравне или чуть выше, а по knowledge и reasoning-задачам уступает. Для base-модели, задача которой — быть отправной точкой для SFT, дистилляции и RL, а не финальным продуктом, это вполне ожидаемый и рабочий результат.
Модели крупнее — следующий шаг это прогоны на бо́льших размерах, вплоть до MoE-архитектур; текущий стек на Megatron-LM и BlendedDataset для этого готов, поменяется в основном конфиг модели.
XSA на гибридных архитектурах — проверить, переносится ли наблюдение на Gated Attention-слои Qwen3.5-2B и более крупных моделей.
Дистилляция знаний из более крупных моделей — способ поднять качество 2B-чекпойнта без пропорционального роста объема обучающих данных.
Длинный контекст — корпус длинных документов и отдельная фаза дообучения на контекстное окно 256k/1M токенов.
Данные на русском языке — сбор русскоязычных датасетов и расчет соответствующих бенчмарков (MERA/ru-MMLU) для каждого значимого чекпоинта.
Главный результат этих работ — не конкретные цифры на бенчмарках, а работающий и повторяемый внутри команды цикл. Гибридную архитектуру Qwen3.5-2B удалось довести до 1 трлн и 11 трлн токенов без видимых провалов loss и каких-либо нестабильностей.
Отдельный вывод касается измерений: поведение MMLU в разных форматах вопроса (CF против MCF) — это не баг данных и не баг модели, а особенность конкретного протокола оценки, которую легко спутать с реальной проблемой обучения, если смотреть на бенчмарк только в одной форме. Так мы поняли, что необходимо больше внимания уделять выбору формата замера бенчмарков, и не торопиться с выводами на ранних этапах обучения модели.
В одной паре полных прогонов вариант XSA с λ_h показал меньший validation loss и более высокий MMLU при небольшом снижении throughput. Это основание для продолжения экспериментов, проверяющих воспроизводимость эффекта.
Следующая итерация — эксперименты с моделями большего размера, улучшение math/reasoning за счёт специализированных датасетов и подготовка русскоязычного дополнения к собранному англоязычному корпусу.
Архитектуры: официальная Qwen3.5-2B-Base model card [16] · Qwen3.5 в Transformers [27] · Gated DeltaNet [18]
Данные и объём обучения: Chinchilla [28] · SmolLM3-3B-Base model card [29] · NVIDIA pretraining recipe [30] · OLMo 3 [31]
Training stack и precision: Megatron-LM BlendedDataset [20] · Transformer Engine FP8 [32]
Evaluation: lm-evaluation-harness MMLU tasks [24] · SmolLM3 training playbook [33] · SmolLM2 [34]
XSA: Exclusive Self-Attention [2] · Marin XSA ablations [26]
Авторы статьи: Матвей Сапрыкин, Антон Егоров (@trueanton1 [35]), Дамир Чанышев (@Binar [36]), Юрий Софронов (@YuriyYurievich [37]), Адель Халилов (@adelkhalilov [38]), Андрей Якубой (@FutynMaker [39]), Антон Тихонов (@itwastony [40]), Владимир Кравцов (@vladimir_kravtsov [41]), Данил Сморчков (@danilsmor [42]), Игорь Богданов (@ievbogdanov [43]), Мария Коршунова (@mmkorshunova [44]), Михаил Алешин (@mikhailalesh [45]), Юлия Иванова (@x_oncrix [46]), Юлия Тукмачева
Больше про машинное обучение — в telegram-канале RWB делает ML [47]. Подписывайтесь!
Автор: Vtmpas
Источник [48]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/34484
URLs in this post:
[1] Обучение: http://www.braintools.ru/article/5125
[2] Exclusive Self-Attention: https://arxiv.org/abs/2603.09078
[3] MERA: https://mera.a-ai.ru/ru/text/leaderboard
[4] GatedDeltaNet: https://arxiv.org/pdf/2412.06464
[5] внимания: http://www.braintools.ru/article/7595
[6] поведение: http://www.braintools.ru/article/9372
[7] Exclusive Self-Attention: https://arxiv.org/pdf/2603.09078
[8] Chinchilla: https://arxiv.org/pdf/2203.15556
[9] Llama 3.2 card: https://github.com/meta-llama/llama-models/blob/main/models/llama3_2/MODEL_CARD.md
[10] Gemma 3 card: https://ai.google.dev/gemma/docs/core/model_card_3
[11] Qwen3: https://arxiv.org/abs/2505.09388
[12] OLMo 3 card: https://huggingface.co/allenai/Olmo-3-1025-7B
[13] математика: http://www.braintools.ru/article/7620
[14] работы по Olmo3: https://arxiv.org/pdf/2512.13961
[15] памяти: http://www.braintools.ru/article/4140
[16] здесь: https://huggingface.co/Qwen/Qwen3.5-2B-Base
[17] ассоциация: http://www.braintools.ru/article/621
[18] оригинальной работе: https://arxiv.org/abs/2412.06464
[19] Megatron-LM: https://github.com/nvidia/megatron-lm
[20] BlendedDataset: https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/core/datasets/blended_dataset.py
[21] lm-evaluation-harness: https://github.com/EleutherAI/lm-evaluation-harness
[22] рецепте Nemotron-Nano: https://docs.nvidia.com/nemotron/latest/nemotron/nano3/pretrain.html#
[23] SmolLM2: https://arxiv.org/pdf/2502.02737
[24] README MMLU из lm-evaluation-harness: https://github.com/EleutherAI/lm-evaluation-harness/tree/main/lm_eval/tasks/mmlu
[25] поведении: http://www.braintools.ru/article/5593
[26] Marin: https://github.com/marin-community/marin/issues/4772
[27] Qwen3.5 в Transformers: https://huggingface.co/docs/transformers/model_doc/qwen3_5
[28] Chinchilla: https://arxiv.org/abs/2203.15556
[29] SmolLM3-3B-Base model card: https://huggingface.co/HuggingFaceTB/SmolLM3-3B-Base
[30] NVIDIA pretraining recipe: https://docs.nvidia.com/nemotron/latest/nemotron/nano3/pretrain.html
[31] OLMo 3: https://arxiv.org/abs/2512.13961
[32] Transformer Engine FP8: https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/features/low_precision_training/fp8_current_scaling/fp8_current_scaling.html
[33] SmolLM3 training playbook: https://huggingfacetb-smol-training-playbook.hf.space/#understanding-what-works-evaluation
[34] SmolLM2: https://arxiv.org/abs/2502.02737
[35] @trueanton1: https://www.braintools.ru/users/trueanton1
[36] @Binar: https://www.braintools.ru/users/Binar
[37] @YuriyYurievich: https://www.braintools.ru/users/YuriyYurievich
[38] @adelkhalilov: https://www.braintools.ru/users/adelkhalilov
[39] @FutynMaker: https://www.braintools.ru/users/FutynMaker
[40] @itwastony: https://www.braintools.ru/users/itwastony
[41] @vladimir_kravtsov: https://www.braintools.ru/users/vladimir_kravtsov
[42] @danilsmor: https://www.braintools.ru/users/danilsmor
[43] @ievbogdanov: https://www.braintools.ru/users/ievbogdanov
[44] @mmkorshunova: https://www.braintools.ru/users/mmkorshunova
[45] @mikhailalesh: https://www.braintools.ru/users/mikhailalesh
[46] @x_oncrix: https://www.braintools.ru/users/x_oncrix
[47] RWB делает ML: https://t.me/+VbgP8r9UCOAzNGQ6
[48] Источник: https://habr.com/ru/companies/rwb/articles/1069148/?utm_campaign=1069148&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.