- BrainTools - https://www.braintools.ru -

Учим небольшую LLM с нуля: гибридное внимание, XSA, доменные бленды и загадки роста онлайн-бенчмарков

Обучение [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], это заметно помогает на математических и кодовых бенчмарках.

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

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

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

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

В 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 (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 здесь [16].

Немного про Gated Delta Net [раскрывающийся блок]

Квадратичный 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). Это более аккуратная запись в память, чем у классического линейного внимания. Сила записи регулируется скаляром β, вычисляемым для каждого токена.

Delta-правило обновления состояния GatedDeltaNet

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

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

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

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

Главное отличие: полный 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, fp16, bf16 и fp8

Сравнение числовых форматов fp32, fp16, bf16 и fp8

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


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

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

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⁻⁵

Расписание 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 [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-фазы.

Иллюстрация 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 [2] модифицирует выход 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 [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%

Стабилизация 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 [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

www.BrainTools.ru

Rambler's Top100