Обучение 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) на 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. Все модели этой серии широко применяются в продуктах Wildberries: в ИИ-ассистенте для покупателей, сравнении и поиске товаров, а также в инструментах, помогающих продавцам готовить ответы на отзывы и вопросы покупателей. Кроме того, модели BerryLM используются для автоматизации ряда внутренних процессов RWB. Следующий шаг для команды - проверить, насколько сложно самостоятельно собрать полный цикл pretrain с нуля и каких результатов можно добиться на открытых датасетах.

Для компании собственный пайплайн обучения особенно важен: он позволяет контролировать состав данных и добавлять доменные знания для конкретных бизнес-задач. Сразу скажем, что в рамках этой задачи мы не ставили целью обучить base-модель, которая обошла бы открытые аналоги. Честное сравнение потребовало бы очистить корпус от утечек бенчмарков, но такой контур фильтрации данных в начале наших экспериментов ещё не был готов.

Наша задача была другой: отработать внутренне повторяемый pretrain-пайплайн, сборку и балансировку доменных датасетов, обучение гибридной архитектуры с нуля и диагностику нестабильностей. Поэтому бенчмарки в статье — прежде всего проверка работоспособности пайплайна, а не заявка на место в лидерборде.

При выборе архитектуры остановились на Qwen3.5-2B по нескольким причинам:

  • это современная модель, опубликованная в феврале 2026 года;

  • малое число параметров позволяет быстро итерироваться по проверяемым гипотезам и экспериментам;

  • интересная архитектура: помимо привычного квадратичного self-attention (SDPA) в ней используется GatedDeltaNet, рекуррентный механизм внимания с линейной сложностью по длине последовательности.

Мы провели два эксперимента на этой модели: сначала компактный — на 1 трлн токенов в две фазы, затем — расширенный, на 11 трлн токенов, с трёхфазным доменным расписанием. Отметим, что модель изначально мультимодальная, но мы обучали только текстовую часть.

Во время обучения мы заметили странное на первый взгляд поведение MMLU. Пока остальные метрики росли, MMLU заметно дольше держался около уровня случайного угадывания и «ожил» только на второй фазе. Разбираясь, почему так произошло, мы наткнулись на не самую очевидную деталь самого бенчмарка, которую разберем в отдельном разделе.

Параллельно с экспериментами на Qwen3.5-2B мы провели исследовательский эксперимент с недавно предложенной модификацией attention XSA (Exclusive Self-Attention). Поскольку 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 даёт ориентир около 20 токенов на параметр, чтобы при фиксированном количестве вычислений достичь наименьшего лосса. На практике индустрия давно ушла далеко за эту границу:

Модель

Параметры

Токены pretrain

Tokens/Parameters

× Chinchilla

Источник

Llama 3.2-1B

1.23B

до 9T

~7 300

~365×

Llama 3.2 card

Gemma 3-1B

1B

2T

~2 000

~100×

Gemma 3 card

Qwen3 (0.6B…8B)

0.6–8B

36T (общий корпус)

~4 000–60 000

~200–3 000×

Qwen3

Llama 3.2-3B

3.21B

до 9T

~2 800

~140×

Llama 3.2 card

Gemma 3-4B

4B

4T

~1 000

~50×

Gemma 3 card

OLMo 3-7B

7B

5.93T

~850

~42×

OLMo 3 card

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, только высококачественного),

  • код,

  • математика.

Общая практика обучения показывает, что удобнее не смешивать их в одной пропорции на всё обучение, а менять баланс по фазам:

  • на первой фазе модель в первую очередь учит общую языковую статистику — здесь доминирует веб (65–80%), код занимает 10–15%, а знания и математика делят остаток;

  • на второй фазе акцент смещается на знания и понимание — доля веба падает, добавляются высококачественные и энциклопедические источники;

  • на опциональной третьей фазе усиливают код и математику, а иногда добавляют reasoning-трейсы или даже SFT-данные в текстовом виде — по данным AllenAI из работы по Olmo3, это заметно помогает на математических и кодовых бенчмарках.

Пример доменных миксов для SmolLM3

пример доменных миксов для SmolLM3
пример доменных миксов для SmolLM3

Архитектура: Qwen3.5-2B

В Qwen3.5-2B каждый четвёртый слой — квадратичный GatedAttention, а остальные — GatedDeltaNet. Gated Attention отличается от «обычного SDPA» дополнительным output gate, а GatedDeltaNet весь предыдущий контекст сжимает в матрицу фиксированного размера, а не честно хранит целиком, как квадратичный. Это дает выигрыш по памяти ценой выразительности слоя, и в семействе моделей 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 (mrope_section [11,11,10]); для текста численно эквивалентно обычному RoPE, поэтому оставили RoPE

модальности

text-only

точность

bf16 + fp8 hybrid (E4M3 forward / E5M2 backward)

инициализация весов

N(0, std^2), std=0.02

Токенайзер взяли готовый для этой модели. Что интересно, у него (как и у всех Qwen3.5) достаточно большой размер словаря (около 248к), значительно больше, чем у предыдущего семейства Qwen3 (около 150к), из-за поддержки большего числа языков.

Полные конфиги модели можно посмотреть на HF здесь.

Немного про Gated Delta Net

Квадратичный attention хранит представления прошлых токенов: на каждом шаге новый токен «смотрит» на предыдущие key/value-векторы в KV-cache. Это даёт прямой доступ к любому месту контекста, но при обучении вычисления растут как O(n²) по длине, а память KV-cache на инференсе — линейно.

Gated DeltaNet — это линейное внимание с рекуррентным механизмом: вместо хранения всей истории он держит состояние фиксированного размера (компактную матрицу-«память» S) и обновляет его по мере чтения токенов так, чтобы произведение S * key приближалось к значению value. Благодаря этому на инференсе мы можем не хранить value векторы для предыдущих токенов, и память не растёт с контекстом.

Ключевых механизма два:

  • Delta-правило — состояние обновляется не простым накоплением, а «дельтой»: для нового ключа старая ассоциация S(t-1) * k(t) частично перезаписывается свежим значением v(t). Это более аккуратная запись в память, чем у классического линейного внимания. Сила записи регулируется скаляром β, вычисляемым для каждого токена.

Delta-правило обновления состояния GatedDeltaNet
Delta-правило обновления состояния GatedDeltaNet
  • Гейт (gating) — гейт α, также зависящий от конкретного токена, решает, сколько старой информации «забыть», а сколько сохранить. Это позволяет модели адаптивно стирать неактуальный контекст. Добавляется в формулу выше и действует на всю матрицу-состояние.

Итоговая формула имеет вид:

Delta-правило с забывающим гейтом
Delta-правило с забывающим гейтом

Главное отличие: полный attention хранит историю явно, а GatedDeltaNet сжимает её в состояние фиксированного размера. Чистые GatedDeltaNet-модели возможны и исследованы в оригинальной работе, однако гибридная схема даёт более сильный практический баланс качества и эффективности.


На чём это всё крутится

Ядро пайплайна — Megatron-LM. Его BlendedDataset читает токенизированные бинарные шарды (.bin/.idx) и на лету собирает из них взвешенный бленд с заданными весами. Распределенное обучение, смешанная точность, восстановление обучения с последнего чекпоинта — всё это закрывается стандартными возможностями Megatron, поэтому дополнительной обёртки поверх фреймворка мы не писали. Отдельно подключили ClearML для логирования основных настроек запусков и хода экспериментов.

Из неожиданных нюансов на этапе подготовки токенизированных данных обнаружили, что на очень крупных источниках (свыше 2 млрд документов) сборка индекса неожиданно падала с segfault — оказалось, что счётчик документов упирался в переполнение int32, поэтому такие датасеты разделили на несколько частей, чтобы уместиться в численный предел Megatron датасета.

Для промежуточной оценки качества по ходу обучения используем lm-evaluation-harness: для модели такого размера набор стандартных бенчмарков успевает посчитаться за интервал между сохранением чекпоинтов, так что метрики можно смотреть прямо на дашборде обучения. Финальную оценку делаем отдельным офлайн-прогоном — после экспорта весов в формат 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, fp16, bf16 и fp8
Сравнение числовых форматов fp32, fp16, bf16 и fp8

Использование классического fp32 для всех операций в обучении очень затратно как по вычислениям, так и по памяти, поэтому часто используются другие форматы. Мы выбрали базовый формат bf16 (такой же диапазон, как у fp32 за счет огрубления точности - меньше битов на мантиссу). Поверх этого для части самых вычислительно емких операций включается fp8 в гибридном формате - в forward, где больше важна точность, используется E4M3, в backward, где важнее учесть порядок градиентов, используется E5M2. Такой смешанный режим вычислений позволил ускорить обучение без каких-то нестабильностей и всплесков loss.


Первый эксперимент: 1 трлн токенов

Расписание обучения

Global batch size — 1024 (примерно вдвое больше, чем у SmolLM3, и втрое меньше, чем в рецепте Nemotron-Nano). 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⁻⁵

Расписание lr
Расписание lr

Loss

По train/validation loss видно, что обучение идет стабильно и всплесков на отдельных шагах нет. Валидация запускалась каждые 5 тыс. итераций, начиная с шага 5000. Разные уровни линий вызваны изменением состава train/validation датасетов между фазами.

Train и validation loss
Train и validation loss

Что показывала online-оценка

По ходу обучения на каждом сохраненном чекпойнте считали шесть бенчмарков:

Бенчмарк

что измеряет

уровень случайного выбора

Hellaswag

общий здравый смысл (правдоподобное продолжение бытовой ситуации)

25%

Winogrande

общий здравый смысл (разрешение кореференции в тексте)

50%

ARC-Easy

знания о мире, вопросы школьного уровня

около 25%; число вариантов различается

ARC-Challenge

знания о мире + рассуждение, более сложные вопросы

около 25%; число вариантов различается

MMLU

мультидисциплинарные знания

25%

PIQA

здравый смысл в бытовых ситуациях

50%

Все онлайн замеры проводятся в zero-shot, logprobs формате: evaluator сравнивал условные вероятности вариантов ответа, а не запускал свободную генерацию. Оценка проводится каждые 10k итераций, начинается с 10000.

Online-метрики первого эксперимента
Online-метрики первого эксперимента

На этих графиках сразу обращает на себя внимание MMLU: пока остальные бенчмарки отрывались от уровня случайного выбора уже на первой фазе, MMLU оставался рядом с ним и резко вырос около перехода ко второй фазе. По одному графику сложно однозначно установить причину скачка: одновременно менялись данные, learning rate и состояние модели. Но сравнение разных MMLU-протоколов показало, что выбранная форма вопроса действительно сильно влияет на траекторию метрики.

Дело в формулировке вопроса. Причём об этом уже писали в статье про SmolLM2: один и тот же 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.

В наших экспериментах разница в поведении форм значительна: CF даёт полезный сигнал в начале обучения, но и на плато выходит раньше. MCF стартует позже, но продолжает расти вплоть до конца decay-фазы.

Иллюстрация MMLU CF/MCF из техрепорта SmolLM2

Иллюстрация MMLU CF/MCF из техрепорта SmolLM2
Иллюстрация MMLU CF/MCF из техрепорта SmolLM2

Поэтому во всех следующих экспериментах мы используем 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 со второй фазы — данные для третьей фазы на тот момент еще не были собраны. С учетом небольшого объема данных, метрики выглядят заметно ниже, но для первого запуска этого было достаточно, чтобы проверить пайплайн и корректность собранных конфигов датасетов.


Модификация внимания: XSA на Qwen3-1.7B

Параллельно с экспериментами на Qwen3.5-2B мы провели отдельный research-трек по XSA (Exclusive Self-Attention). Каноническое определение из работы Shuangfei Zhai модифицирует выход SDPA: для каждого токена и головы из Y = SDPA(Q, K, V) вычитается проекция Y на self-value-вектор этого же токена:

Z = Y − (Y · V̂) V̂, где V̂ = V / ||V||.

Каноническая формула Exclusive Self-Attention
Каноническая формула Exclusive Self-Attention

В ablation проекта Marin удаление XSA давало ухудшение loss примерно на 0,015–0,018.

Поскольку XSA меняет SDPA, а не GatedDeltaNet, для проверки взяли Qwen3-1.7B — компактную модель с квадратичным вниманием на всех слоях. Использовали тот же Megatron-пайплайн, но другой, преимущественно англоязычный доменный blend.

Домен

Доля

Веб-данные EN

~49%

Синтетика на основе веб-данных

~15%

Код

~11%

Математика

~8%

Мультиязычный веб

~6%

Reasoning / QA / энциклопедические тексты

~6%

Качественные учебные тексты

~5%

Стабилизация XSA

В нашем сетапе (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

дрейф + мёртвые параметры

Дрейф max attention-логита в ablation-прогонах XSA
Дрейф max attention-логита в ablation-прогонах XSA

Подробнее о модификациях

Далее — пояснения по каждому варианту, в псевдокоде.

чистый 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.


Второй эксперимент: масштабируем обучение до 11 трлн токенов

Финальный эксперимент на 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

Расписание LR

Перед каждым переходом между фазами добавили короткий re-warmup на 2 тыс. итераций (на графике две пунктирные почти отвесные линии) — чтобы модель адаптировалась к смене доменного распределения.

Расписание learning rate второго эксперимента
Расписание learning rate второго эксперимента

Loss

Как и в первом эксперименте, разрывы loss кривых связаны с re-warmup и сменой датасетов между фазами. Само обучение прошло стабильно, без видимых всплесков лосса.

Train и validation loss второго эксперимента
Train и validation loss второго эксперимента

Online-метрики (раскрывающийся блок)

Online-метрики второго эксперимента
Online-метрики второго эксперимента

Ещё раз про MMLU: CF против MCF

Захотелось проверить, повторится ли паттерн из первого прогона — и он повторился почти в точности:

  • CF-форма хорошо отслеживает прогресс на ранних этапах, но быстро выходит на плато;

  • MCF-форма разгоняется позже, но именно она продолжает расти во второй половине обучения.

MMLU log-likelihood MCF и MMLU continuation (наш эксперимент)
MMLU log-likelihood MCF и MMLU continuation (наш эксперимент)

Итоговые метрики

Все три модели оценивали 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 за счёт специализированных датасетов и подготовка русскоязычного дополнения к собранному англоязычному корпусу.

Источники


Авторы статьи: Матвей Сапрыкин, Антон Егоров (@trueanton1), Дамир Чанышев (@Binar), Юрий Софронов (@YuriyYurievich), Адель Халилов (@adelkhalilov), Андрей Якубой (@FutynMaker), Антон Тихонов (@itwastony), Владимир Кравцов (@vladimir_kravtsov), Данил Сморчков (@danilsmor), Игорь Богданов (@ievbogdanov), Мария Коршунова (@mmkorshunova), Михаил Алешин (@mikhailalesh), Юлия Иванова (@x_oncrix), Юлия Тукмачева


Больше про машинное обучение — в telegram-канале RWB делает ML. Подписывайтесь!