Привет! Я Дима Стоянов, MLE в команде разработки фундаментальных моделей. Мы продолжаем рассказывать о наших моделях T-lite и T-pro. Общие характеристики и результаты бенчмарков описывали в предыдущей публикации. В этой статье раскроем детали предобучения: от подготовки данных до финальных экспериментов, а совсем скоро поделимся особенностями этапа post-training.
Открытые модели все увереннее конкурируют с проприетарными решениями, что наглядно демонстрирует успех DeepSeek R1 и реакция сообщества на ее выпуск.
Ситуация с русскоязычными моделями обстоит сложнее: в открытом доступе представлено ограниченное количество LLM. Крупные игроки чаще всего публикуют модели с ограничивающими лицензиями или же выкладывают легкие версии своих флагманских разработок.
В мире открытых моделей процесс обучения моделей часто описывается скудно, особенно это касается обработки данных. Мы хотели поддержать опенсорс-сообщество, выложив модели с открытой лицензией. А в этой статье детально раскроем наш процесс обучения: от философии проекта до технических нюансов предобработки данных. Поделимся успешными и неудачными экспериментами, рассмотрим актуальные исследования в этой области и наше видение дальнейшего развития.
Большинство сильных открытых моделей англоцентричны, то есть их тренировочный датасет по большей части состоит из англоязычных текстов. Это происходит по естественным причинам: больше всего данных, особенно высококачественных, представлено именно на английском языке. Доля русского языка в таких моделях обычно не превышает нескольких процентов датамикса.
Англоязычность моделей и небольшая доля русского приводит к проблемам:
субоптимальное качество ответов на русском языке;
артефакты при генерации русскоязычного текста, например неестественные предложения;
code-switch, когда модель переключается между языками в ходе одного предложения;
недостаточное знание российской культуры.
Полное предобучение с нуля как один из способов решения перечисленных проблем требует значительных вычислительных ресурсов на каждый эксперимент и может быть дорогим в приложениях. Открытые модели не стоят на месте, постоянно улучшая качество.
Нашей целью было получить рецепт обучения, который позволит использовать прогресс open-source-моделей и одновременно улучшить качество для русского языка. Так мы пришли к многостадийному continual-pretraining c последующими general-alignment-ом. Это позволяет нам балансировать между забыванием исходного распределения данных, на котором предобучалась базовая модель, и глубиной адаптации под наши цели.
Помимо этого, наш рецепт можно повторить и для доменной адаптации на внутренние домены или, например, финансовый домен. В результате доменно адаптированная модель будет лучше решать банковские задачи.
Но, так как open-source не стоит на месте, мы каждый раз продолжаем проверять стадии нашего рецепта и наблюдаем, что каждая из них приносит значимый прирост на бенчмарках.
Существуют различные подходы к обучению моделей: от создания моделей с нуля, включая все этапы обучения, до более легковесных решений.
Легковесные методы адаптации. Наименее затратным методом являются Parameter Efficient Fine-Tuning методы — когда обучают лишь часть параметров модели.Такое обучение можно легко завести на consumer-grade-видеокартах для большинства моделей, а для обучения зачастую достаточно сотен тысяч примеров. PEFT широко применяется для адаптации модели под конкретные бизнес-задачи, обеспечивая высокую эффективность при минимальных затратах.
Если качество обученной модели, дообученной с помощью PEFT, оказывается недостаточным, применяют Supervised Fine Tuning. В этом случае обучаются уже все параметры модели, что требует больше вычислительных ресурсов и позволяет значительнее влиять на поведение модели и целевые метрики.
Обучение моделей общего назначения, не ориентированных на узкоспециализированные сценарии, проходит с помощью General Post-Training.
General Post-Training включает:
General SFT — дообучение модели на разнообразных инструкциях для расширения ее функциональных возможностей.
Alignment — настройку модели в соответствии с человеческими предпочтениями и этическими принципами.
Обучение моделей с нуля дает максимальную гибкость, позволяя выбирать архитектуру, закладывать необходимые знания и адаптировать модель под конкретные задачи. Полное обучение включает:
Выбор архитектуры.
Обучение токенизатора.
General Pre-Training.
General Post-Training.
Хотя такой подход позволяет достичь передовых результатов (SOTA), он требует колоссальных ресурсов: тысячи видеокарт, так как SOTA-модели обучаются на десятках триллионах токенов. Еще нужны огромные вычислительные мощности и значительные инженерные усилия. Кроме того, циклы экспериментов могут длиться неделями, а полный процесс создания модели — занимать месяцы. За это время в опенсорсе может появиться более мощная модель, что делает вложенные ресурсы неэффективными.
Мы использовали гибридный подход Continual Pretraining, который сочетает элементы Pre-Training и Post-Training, но вместо обучения модели с нуля мы взяли за основу уже сильную открытую модель — Qwen2.5. Это позволило нам:
значительно снизить затраты;
ускорить процесс обучения;
сохранить преимущества глубокой адаптации.
Continual Pretraining дает баланс между качеством, гибкостью и стоимостью, обеспечивая эффективное развитие моделей для реальных задач.
Наш рецепт обучения состоит из шести стадий:
выбор оптимальной базовой модели;
опциональный этап по расширению токенизатора;
continual pretraining stage 1;
continual pretraining stage 2 с добавлением инструктивных данных;
SFT;
DPO.
Основная идея — дообучать уже сильные открытые модели, тратя на обучение на порядки меньше ресурсов, чем создатели текущих моделей лидеров индустрии.
Мы сохраняем возможность улучшать необходимые навыки, адаптировать модель к целевым доменам и нивелировать недостатки опенсорс-моделей, например переключение на китайский язык во время генерации.
Мы хотим обучать модель на сотнях миллиардах токенов: этого достаточно, чтобы оказать значимое влияние на способности модели, при этом осуществлять короткий цикл экспериментов и экономить ресурсы.
В релизе T-lite-it-1.0/T-Pro-it-1.0 мы не проводили этап расширения токенизатора, поскольку существующие токены родного токенизатора Qwen-2.5 были обучены на гораздо большем токен-бюджете и нам не хотелось рисковать деградацией способностей модели.
Нативный токенизатор Qwen-2.5 имеет не самую оптимальную плотность на русском языке, и этот этап действительно актуален. В будущих релизах планируем увеличить эффективность токенизации на русском языке.
Помимо стандартных методов расширения токенизатора с прогревом embdding-слоев и дообучением на большом корпусе претрейн-данных существуют менее вычислительно затратные методы, например подход Learned Embeddings Propogation от RuAdapt.
Первым этапом нашего рецепта был выбор сильной открытой модели. Мы оценивали кандидатов по нескольким критериям:
высокие бенчмарки на популярных англоязычных бенчмарках;
позиции на LMSYS Arena, включая срез русскоязычных запросов;
результаты на русскоязычной арене;
достойные показатели на русскоязычных бенчмарках (MERA, ru-arena-hard);
развитые мультиязычные способности;
субъективные впечатления от промптинга модели на различных задачах;
качество перевода на русский язык.
Мы начали с анализа опубликованных бенчмарков, поскольку это наиболее доступный и быстрый способ получить предварительное представление о модели. Затем самостоятельно протестировали кандидатов на MERA, оценивая их поведение в конкретных задачах.
Стоит учитывать, что некоторые задачи в MERA имеют специфический формат, непривычный для LLM. Это может приводить к неоптимальным результатам не из-за недостатка знаний или способностей модели, а из-за особенностей промптинга и формулировки заданий. Тем не менее оценки на MERA дают полезный сигнал для отбора моделей.
Статические бенчмарки помогают оценить уровень знаний модели, однако для понимания ее полезности в реальных сценариях важны диалоговые бенчмарки, такие как арены. В них пользователи голосуют за лучшие ответы, формируя лидерборд, который позволяет выявить модели с наиболее качественными и естественными ответами.
Поскольку наша цель — улучшение модели в русскоязычном сегменте, мы изначально ориентировались на мультиязычные модели, обладающие хорошими зачатками работы с русским языком. Это позволило существенно упростить процесс адаптации.
Хотя бенчмарки дают важную информацию, полностью полагаться на них нельзя: у них есть свои ограничения и недостатки, также их часто «гейнят». Поэтому ключевую роль в окончательном выборе сыграли реальные сценарии использования:
генерация синтетических данных;
перевод на русский язык;
решение In-Context Learning (ICL) задач.
На основе совокупности всех тестов и критериев мы выбрали семейство Qwen-2.5 в качестве базовой модели.
После выбора модели возникает вопрос: с какой версии начинать дообучение — базовой или инструктивной?
С одной стороны, дообучение базовой модели дает полный контроль над ее диалоговыми способностями и логично дополняется этапом допредобучения. С другой стороны, передовые инструктивные модели уже обучены на миллионах, а иногда и на десятках миллионов инструкций, а их post-training включает значительные усилия по улучшению качества ответов. Это делает использование таких моделей привлекательным, поскольку позволяет сразу задействовать их сильные стороны.
Наши эксперименты показали, что дообучение на основе инструктивной модели оказалось более эффективным, чем на базовой. Но это объясняется относительно небольшим токен-бюджетом нашего обучения: веса модели не слишком сильно отклонились от исходного состояния, что минимизировало проблему катастрофического забывания.
При обучении на значительно больших объемах данных дообучение поверх базовой модели может быть более оптимальным, так как позволяет глубже интегрировать новые знания и настраивать модель под конкретные задачи.
Бюджет первой стадии обучения составляет 100B токенов. Достаточно, чтобы значимо повлиять на знание русского языка, при этом позволяет сохранять короткий цикл экспериментов.
При дообучении под русский язык все еще необходимо добавлять повтор на английском языке в датамикс для уменьшения эффекта деградации на английском языке. Но деградация все равно будет, и, как показывает статья авторов модели Sailor, существует компромисс между скоростью обучения целевому языку и снижением качества бенчмарков на доминирующем исходно, при этом такой деградации полностью не избежать. Авторы вывели зависимость валидационного лосса от доли повторов.
Для нас результаты модели на русском языке значительно важнее просадки на англоязычных бенчмарках, поэтому мы решили оставить лишь 10% англоязычных текстов в первой стадии обучения. В ходе проведенных аблейшнов эта конфигурация также проявила себя оптимальнее всего.
Помимо английского языка, необходимо выбрать долю кода в датамиксе. Основываясь на актуальных исследованиях по связи кода и навыков рассуждения, мы решили установить значительную долю кода в распределение датамикса — 25%.
Более половины распределения по источникам составляют очищенные и дедублицированные через CCNet-like пайплайн веб-страницы из Common Craw. Их объем позволяет масштабировать датамикс до триллионов токенов. Такие документы характеризуются большой разнообразностью, но содержат большое количество дублей, некачественного и бесполезного контента, который необходимо вычищать.
Относительно небольшой объем Stage 1 позволяет установить значительную долю таким высококачественным источникам, как Википедия, книги, синтетические инструкции и специализированные форумы.
При выборе весов макрогрупп мы ориентировались на четыре критерия:
1) известные распределения у сильных открытых моделей;
2) избегали чрезмерного повторения семплов в датамиксе;
3) приоритизация более высококачественных источников, таких как Википедия и книги;
4) разнообразность и качество источника, а также необходимые навыки.
Мы проводили аблейшны с различными долями макрогрупп для определения оптимальной доли кода, книг и синтетических данных.
СС содержит разнообразные документы по стилям и тематикам, но эти распределения не сбалансированы. Например, большую часть CC составляют новости и реклама — не самые полезные документы для обучения языковой модели. Мы сэмплировали документы, балансируя распределение тематик и стилей, при этом уменьшая долю малоинформативных групп.
Среди книг доминируют жанры «Фэнтези» и «Проза», в то время как научные жанры составляют малую долю выборки. Поэтому по аналогии с CC мы ребалансировали распределение жанров, уменьшая долю доминирующих.
Кодовые датасеты являются неотъемлемой частью любой сильной LLM. В Llama 3 доля кодовых данных составила 17% датамикса, а согласно исследованию Cohere добавление кодовых данных улучшает метрики не только на кодовых задачах, но и для любых других, требующих навыка рассуждения. Еще они пришли к выводу, что оптимальная доля кода — 25%.
В тренировочном датасете токенизатора Claude, вероятно, содержалось еще больше кодовых данных. Исследователи из Cohere с помощью атаки на токенизатор выяснили примерную долю доменов в датамиксе, и оказалось, что у модели Anthropic кодовые данные занимают больше половины датамикса! Тренировочный датасет токенизатора и самой LLM может отличаться, но обычно их делают похожими по распределению, чтобы модель эффективно «вложила» в эти токены знания.
Даже несмотря на то, что кодовые задачи не являются приоритетным сценарием использования для нашей модели, мы понимали необходимость улучшать пайплайн обработки кодовых данных.
Из открытых кодовых корпусов наиболее актуален The Stack v2 — примерно 900 миллиардов токенов на 600+ языках программирования. Он был использован для обучения Starcoder 2 — сильной кодовой модели своего времени. Многие опенсорс-модели продвинулись дальше в обработке кодовых данных и уже имели более сильные результаты на кодовых бенчмарках.
При дообучении базовой модели на новый язык необходимо приближать распределение и качество датасета к датасету оригинальной модели для избежания деградации в основных навыках. Если учить такую базовую модель, как Qwen-2.5, на кодовых данных хуже, чем в тренировочном датасете Qwen-а, мы рискуем ухудшить способности модели к рассуждению.
Создать полностью свой пайплайн сбора и очистки кодовых данных трудозатратно, поэтому нашей целью были быстрореализуемые методы фильтрации и преобразования данных для улучшения способностей к генерации кода с русскоязычными инструкциями. Мы сузили список из 600 языков программирования до 10 наиболее популярных, таких как Python, Java, C++, SQL и других, формата хранения данных JSON и языка разметки Markdown.
Мы применили Fill in the middle для кодовых данныхс вероятностью 50% по аналогии с Starcoder 2. Эта техника заключается в разбиении сэмпла на три случайные части: prefix, middle и suffix. Далее сэмпл форматируется в следующем формате:
<fim_prefix>filepath1
code1_pre<fim_suffix>code1_suf<fim_middle>code1_mid<|endoftext|>
Мы меняем местами середину и конец файла, и при обучении на следующий токен модель будет использовать контекст и префикса, и суффикса. При этом не делаем архитектурных изменений в декодере и все еще используем causal attention. Применение техники FIM позволяет улучшать навыки заполнения пропусков в коде, что полезно для кодовых ассистентов.
В статье phi-4 авторы использовали более продвинутый метод: они создали набор упражнений на восстановление осмысленной части текста, например части функции с пропущенной логикой. Логика пропущенного блока кода описывается текстом, и задача модели заключается в восстановлении кода сегмента. Такой подход позволяет создавать инструктивные пары, не требуя наличия пар контекста и верного ответа, и масштабировать его на сотни миллиардов токенов.
Для Python мы сделали этап дополнительной фильтрации. Отфильтровали все файлы с некорректным синтаксисом с помощью ast-парсинга. Большая часть таких файлов — python2-скрипты.
Мы отформатировали 80% файлов кода с помощью утилит unify, autopep8, black и isort. Так мы стандартизировали стиль и форматирование кода.
Помимо этого, использовали взвешенное семплирование. Вес семпла вычисляется из двух величин: логарифма от количества форков репозитория и средней оценки качества кода линтером.
Linter score получен из агрегации ошибок, найденных линтерами mypy, flake8, pylint с взвешиванием по типам ошибок. Например, ошибка в типе данных более критична, чем неиспользованный импорт. Метрика учитывает не только количество ошибок, но и объем файла. Метрики по файлам агрегируются в метрику по репозиторию, в результате у репозитория с более чистым кодом больше вероятность пройти этап фильтрации.
Альтернативный подход — фильтрация с помощью educational-классификаторов, например python-edu-scorer от HuggingFace. Авторы использовали LLM для оценки образовательной ценности фрагментов кода и выставляли оценку от 1 до 5. Полученные оценки были дистиллированы в легковесный классификатор, в результате предсказаний которого был получен датасет Python-Edu, использованный для обучения моделей SmolLM и SmolLM2.
Несмотря на перспективность подхода, его применение было у маленьких моделей (не более 1.7B). Такие модели могут иметь разные рецепты обучения, и не все идеи переносятся на больший размер.
Мы обратили внимание на то, что классификатор высоко оценивает короткие, чистые и простые блоки кода. Но в реальности полезный код бывает куда сложнее и менее похож на код из туториалов. В то время как для маленьких моделей резонно добавлять более простые и понятные паттерны обучения, мы не были уверены в применимости этого подхода для больших моделей. Тем не менее это интересная идея для дальнейших исследований.
Большинство написанного кода содержит англоязычные комментарии. Также такие форумы, как StackOverflow, имеют значительно большее количество контента на английском языке по сравнению с русским.
Чтобы улучшить способности понимать кодовые инструкции на русском языке, мы:
отфильтровали кодовые данные с русскоязычными комментариями и увеличили их долю в датамиксе;
перевели StackOverflow на русский язык с помощью опенсорс-моделей с сильными мультиязычными способностями;
перевели комментарии на русский для части Python-данных.
При переводе StackOverflow от модели переводчика необходимо глубокое понимание концепций кода, терминов и, естественно, хорошие мультиязычные способности.
Также необходимо контролировать «ленивость» моделей: часто на задаче перевода длинного контекста модель генерирует лишь частичный перевод.
Есть два способа бороться с проблемой: переводить только данные с небольшим контекстом (обычно не более 4000 токенов) или делить текст на чанки ограниченной длины, а после объединять переводы.
Недостаток деления на чанки — отсутствие полного контекста в запросе, который получает LLM. В некоторых случаях это может влиять на качество перевода. В промпт помимо чанка можно добавить исходный вопрос пользователя, при этом просить LLM переводить только часть текста, нивелируя проблему генерации длинного контекста.
Еще при переводе необходимо проверять специальные теги и не модифицировать код, то есть проверять, что исходный код не исказился при переводе LLM.
Одним из вариантов подобной проверки может быть такая эвристика:
проверка на зацикливание модели (симптом — если модель не сгенерировала eos-токен);
переключение на неожиданные языки (например, появление языка, отличного от исходного и от того, на который вы переводите);
совпадение количества блоков кода, элементов разметки, реплик и любых других известных элементов структуры;
значительное изменение длины переведенного текста относительно исходного;
создание blacklist-а наиболее частых фраз, не относящихся к переводу (Here is a translated text…).
Для облегчения постпроцессинга переводов можно использовать структурированную генерацию, например JSON-формат с заранее заданной схемой. LLM не всегда отвечает корректным JSON, однако в большинстве случаев этот ответ близок к корректному JSON-объекту и/или его можно восстановить с помощью специальных библиотек.
Мы подготовили датасет для обучения Stage 1. Теперь перейдем к техническим деталям тренировки:
на каком оборудовании обучалась модель;
какие ключевые нюансы возникли в процессе;
с какими гиперпараметрами проводилось предобучение;
как мы оценивали результаты Stage 1.
В обеих стадиях предобучения у нас есть существенный процент данных, состоящих из сконкатенированных в один семпл коротких текстов. Это, в свою очередь, требует маскирования для разделения контекстов между текстами.
В статье Fewer truncations improve language modeling предложили алгоритм конкатенации семплов, минимизирующий долю обрезаемых токенов.
В претрейн-обучении для более высокой производительности не используются паддинги. Вместо этого происходит конкатенация сэмплов в последовательность фиксированной длины. Обычно порядок семплов в конкатенации никак не контролируется, и это приводит к проблеме обрезанных семплов. В результате модель обучается на неполном контексте.
В худшем случае в конец одного сиквенса может попасть текст и вопрос по тексту, а в следующий сиквенс — ответ на эту инструкцию. В результате модель будет учиться отвечать на незаданный вопрос по отсутствующему тексту, то есть галлюцинировать.
Авторы статьи предложили жадный алгоритм, который минимизирует количество обрезаний последовательностей текстов. Полное решение такой задачи является NP сложной задачей, но существуют быстрые и достаточно точные аппроксимации с временной асимптотикой O(n*log(n)). Результаты исследования показали, что меньшее количество обрезаний улучшает работу с текстом, значительно улучшает следование инструкциям и эффективно уменьшает долю галлюцинаций.
Аппаратная конфигурация: обучение проводилось на H100-кластере, максимальный сетап для обучения данной модели был 256 H100 80 Gb. Использовалась технология Fully Sharded Data Parallel (FSDP) для распределенного обучения с full shard/hybrid shard стратегиями. Модели 7B и 32B достигали производительности 1 900 и 4 500 токенов/сек/GPU соответственно. В ходе обучения MFU достигал 44%.
Гиперпараметры оптимизации: мы использовали оптимизатор AdamW с параметрами β1 = 0.9, β2 = 0.95, eps = 1.0e-8. Learning rate установлен на 1e-5 с константным расписанием и разогревом в течении 10 батчей.
Параметры тренировки:
Максимальная длина последовательности: 8192.
Глобальный batch размер: 768 батчей (где 768 × 8192 = около 6 млн токенов).
Длительность тренировки: 16000 батчей.
Интервал оценки: 2000 батчей.
Количество токенов на стадии 1: до 100B, все данные уникальны.
Метрики, которые мы отслеживали в ходе обучения:
Perplexity.
Cross Entropy Loss.
ruMMLU и Mera бенчмарки.
Мы решили использовать недавно ставшую популярной идею двухстадийного предобучения. Первая стадия содержит больше данных, в основном это веб-страницы, за счет объема и разнообразности она закладывает основные знания. Вторая стадия может быть на порядки меньше, при этом содержит более высококачественные данные, такие как инструктивные данные.
Например, в модели MiniCPM в первой стадии обучения доля Common Crawl (CC) подобных данных составляет 64%, еще 25% занимает код. Во второй стадии за счет меньшего объема такие высококачественные данные, как Википедия и набор инструктивных данных, уже не размываются в общем распределении и оказывают значительное влияние на качество модели.
Двухстадийное обучение позволяет более эффективно обучать модели, демонстрируя преимущества по сравнению со стандартным одностадийным подходом. Исследования подтверждают, что этот метод приводит к улучшению метрик. Хотя на второй стадии используются инструктивные данные, частично перекрывающиеся с этапом SFT, модель, прошедшая оба этапа предобучения, показывает более высокие результаты после стадии алаймента.
В недавно вышедшей модели SmolLM2 и вовсе использовали четыре стадии предобучения. Свой выбор исследователи объясняют принципами:
Модель обучается с нуля и модель небольшого размера, математические навыки развиваются не сразу. Поэтому не имеет смысла значительно добавлять математические данные в первые стадии обучения.
Высококачественные данные добавляются в последние фазы обучения, поскольку таких данных меньше. Авторы стараются избегать чрезмерного повторения данных, а именно не повторять один пример более 5 раз.
В последней фазе обучения используется learning rate annealing. Как было показано в техрепорте Llama 3, этот метод отлично работает, как бы полируя накопленные знания в модели и превращает их в полезные навыки.
Датасеты средних размеров вводятся в середине обучения, чтобы избежать их размытия в наиболее крупных первых стадиях.
Стоит заметить, что предыдущие статьи описывали подход обучения с нуля, но мы собираемся дообучать открытую модель, которая уже была обучена на десятках триллионах токенов и уже обладает сильными способностями. Правда ли, что двухстадийное обучение все еще имеет смысл?
Для ответа на этот вопрос мы обратились к статье от Nvidia Reuse, Don’t Retrain: A Recipe for Continued Pretraining of Language Models. В ней авторы используют двухстадийное дообучение: на первой стадии обучают на данных, максимально похожих по распределению на данные, которые могли использоваться для обучения базовой модели, увеличивая вес у более высококачественных источников, и навыках, в которых качество модели недостаточное. Во второй стадии датамикс в основном состоит из QA-пар и диалоговых данных.
Авторы статьи подчеркивают, что необходимо оптимально выбирать момент переключения распределения данных и что он зависит от расписания learning rate и токен-бюджета.
В статье описываются эксперименты с разными составляющими первой стадии обучения. Оказалось, что датамикс без данных веб-страниц показал наилучшее качество, но авторы решили использовать смесь веб-данных и заапсемпленных высококачественных данных для большей стабильности.
Скейлинг допретрена. Другое интересное исследование — зависимость качества модели от токен-бюджета дообучения. Авторы статьи масштабируют свой подход от 100 миллиардов токенов до триллиона, при этом метрики растут с ростом обучающего датасета.
Во время обучения T-lite и T-pro мы пробовали увеличивать размер первой стадии с 100B до 500B токенов, но не получили значительного прироста, а по некоторым метрикам получили даже незначительную просадку.
Одной из гипотез является разница в распределении обучающего датасета исходной модели и нашего: в нашей модели большую часть датасета составляют русскоязычные тексты, в то время как в базовой модели их доля была значительно меньше.
При большем дообучении модель сильнее отклоняется от изначального распределения и может потерять ранее имевшиеся навыки. Кроме того, мы видели более эффективным улучшение второй стадии обучения, также как и масштабирование алайнмента стало более значимо, чем улучшения в предобучении. Поэтому для ускорения циклов экспериментов мы остановились на бюджете 100B токенов в первой стадии обучения.
Вторая стадия обучения охватывает 40 миллиардов токенов и основана на текстах повышенного качества. В этой стадии доля английского языка существенно возрастает — до 38,1% по сравнению с первой стадией.
Увеличение обусловлено тем, что высококачественные обучающие материалы доступны преимущественно на английском языке, особенно наборы инструкций. Хотя перевод подобных датасетов на целевой язык является общепринятой практикой, он может привести к неточностям и искажениям смысла. Поэтому для достижения оптимальных результатов рекомендуется включать в обучающую выборку как переведенные материалы, так и оригинальные англоязычные тексты.
Stage 2 включает в себя разнообразные источники, смешивая данные, используемые на этапе предобучения и на этапе SFT. Эта стадия характеризуется более высококачественными данными, поэтому для каждого типа источников мы старались фильтровать или сбалансировать распределение данных внутри этого источника. Например, мы увеличивали долю образовательных и научных жанров книг.
СС содержит триллионы токенов, но не все из них полезные. Помимо стандартных способов очистки из CCNet pipeline можно оценивать качество данных — насколько такой пример будет полезен при обучении языковой модели.
Textbooks are all you need — статья от Microsoft, в которой они обучают классификатор образовательной ценности и фильтруют данные для предобучения.
На основе подхода fineweb-edu мы составили промпт для оценки образовательной ценности документа.
Ниже приведено содержание веб-страницы.
Оцените, имеет ли страница высокую образовательную ценность и может ли она быть полезной в образовательной среде для обучения от начальной до средней школы, используя описанную ниже пятибалльную систему оценки. Очки накапливаются на основе удовлетворения каждого критерия:
— Добавьте 1 балл, если фрагмент содержит некоторую базовую информацию, актуальную для образовательных тем, даже если он включает в себя некоторые несущественные или неакадемические материалы, такие как рекламные материалы.
— Добавьте еще 1 балл, если фрагмент затрагивает определенные элементы, важные для образования, но не полностью соответствует образовательным стандартам.
Он может смешивать образовательный контент с необразовательным материалом, предлагая поверхностный обзор потенциально полезных тем, или представлять информацию в беспорядочной манере и несогласованном стиле письма.
— Назначьте третий балл, если фрагмент подходит для образовательного использования и вводит ключевые концепции, актуальные для школьных учебных программ.
Он согласован, хотя и может быть неполным или может включать в себя некоторую постороннюю информацию. Он может напоминать вводный раздел учебника или базовый учебник, который подходит для обучения, но имеет значительные ограничения, например обрабатывает концепции, слишком сложные для учеников начальной школы.
— Присвойте четвертый балл, если фрагмент очень актуален и полезен для образовательных целей для уровня не выше начальной школы, демонстрируя четкий и последовательный стиль письма.
Он может быть похож на главу из учебника или учебник, предлагающий значительный образовательный контент, включая упражнения и решения, с минимальным количеством несущественной информации, и концепции, не слишком сложные для учеников начальной школы. Контент согласован, сфокусирован и ценен для структурированного обучения.
— Предоставьте пятый балл, если фрагмент выдающийся по своей образовательной ценности, идеально подходит для обучения в начальной или средней школе.
Он следует подробному обоснованию, стиль письма легко следовать и предлагает глубокие и тщательные знания по предмету, не содержащие никаких необразовательных или сложных материалов.
Материал: {}.
После рассмотрения материала:
— Кратко обоснуйте свой общий балл, до 100 слов.
— Закончите с оценкой в формате: «Образовательный балл: <общий балл>»
Получив 10 000+ размеченных документов из СС с помощью модели-оракула, мы обучили BERT-like-модель на задачу многоклассовой классификации. Далее использовали обученный классификатор для предсказаний образовательной ценности по всем веб-документам. В Stage 2 оставили только те документы, которые получили 3 балла или выше.
Фильтрация «мета»-документов. В результатах отфильтрованных данных мы обнаружили много примеров, которые можно отнести к образовательным. Однако некоторые примеры не содержали полезной нагрузки, а были лишь «мета»- информацией — например, описание учебника, оглавление, описание образовательного товара и так далее. Для фильтрации «мета»-документов мы обучили fasttext-классификатор на основе разметки из нескольких тысяч документов.
Ранее были попытки обучать языковые модели на курируемых высококачественных датасетах. Например BERT обучался на текстах из Википедии, датасет Pile содержал различные источники: книги, научные статьи — и использовался для обучения GPT-J. Но позже RefinedWeb показали, что использование только данных из СС позволяет превзойти курируемые датасеты при грамотном пайплайне очистки данных.
Применение классификаторов качества вносит определенное смещение в оригинальное распределение данных и является спорным вопросом. Refined Web избегают использования классификаторов и полагаются только на эвристики для очистки данных. Тем не менее многие передовые LLM в том или ином виде используют классификаторы качества. Результаты fine-web-edu показывают, что фильтрация по образовательной ценности увеличивает метрику на MMLU-бенчмарке, делая обучение более эффективным. Мы обнаружили похожий эффект при использовании нашего классификатора качества данных.
В нашем случае фильтрация по образовательной ценности привела к смещению тематик и стилистик документов: чаще стали появляться образовательные статьи. Для сохранения высокой разнообразности мы применили более агрессивную ребалансировку по сравнению с первой стадией дообучения. К тому же фильтрация по образовательной ценности значительно уменьшает размер тренировочной выборки. Так, образовательную оценку от 3 баллов получило только 22% исходных документов, а выше 4 баллов — только 6% документов. Объем русскоязычных данных в СС сильно меньше англоязычных, это может быть проблемой для обучения больших языковых моделей с нуля, но имеет существенно меньшее влияние на вторую стадию из-за меньшего токен-бюджета.
Книги — один из наиболее богатых источников качественных данных. Для получения данных из книжек мы использовали источники открытых библиотек и OCR-пайплайн распознавания контента из .pdf- и .djvu-файлов.
В итоге мы получили больше 30 тысяч документов на русском языке. Распознанные документы могут содержать артефакты, особенно в структурированных данных типа таблиц. Для улучшения качества документов мы разработали refine-пайплайн, используя большие открытые языковые модели, так как эмпирически выяснили, что они хорошо справляются с такими задачами, как исправление ошибок в LaTeX-формулах, таблицах, опечатках и других небольших искажениях текста после распознавания. Как и в пайплайнах выше, длинные документы чанковались по эвристике, оставляя контекст до 2 тысяч токенов во избежание «оптимизации» текста моделями, после чего возвращались в исходную структуру.
Рефайн состоял из нескольких последовательных вызовов с шагами рефлексии на основании вывода формальных парсеров, чтобы увеличить долю корректных чанков и, как следствие, документов. Как и для СС, применялись классификаторы определения языка, тематик, стиля и образовательной ценности контента с последующей фильтрацией. Дополнительно очистили артефакты markdown’а, оглавлений и повторяющихся элементов.
Математические навыки — ключевые для развития способностей к рассуждению. Последний год создатели передовых LLM пытались улучшить значения математических бенчмарков, направив свои усилия на создание масштабных и высококачественных математических корпусов. Например, доля математических данных и данных, связанных с рассуждениями, в Llama 3 составляет 25%!
Помимо образовательных русскоязычных учебников по STEM-предметам мы перевели такие англоязычные ресурсы, как Math StackExchange. Этот источник — QA-форум по различным математическим тематикам с системой голосования за более качественные ответы. Наличие тегов позволяет балансировать датасет по охватываемым тематикам, а реакции пользователей — выбирать наиболее интересные вопросы и полные ответы.
Другой подход сбора математического корпуса — фильтрация математических документов из веб-страниц CommonCrawl. Один из таких корпусов — OpenWebMath, состоящий из почти 15B токенов. Префильтрация осуществляется за счет классификатора, обученного на определение схожести страницы на математический контент. Источниками тренировочных данных для такого классификатора являлись домены известных математических крупных сайтов.
Мы также перевели OpenWebMath на русский язык и добавили в датамикс обучения.
Альтернативным решением является повторение методологии OpenWebMath для русскоязычных страниц CC. Из недостатков корпуса OpenWebMath можно выделить достаточно низкое качество некоторых документов, связанное с ошибками парсинга или очистки.
Стоит обратить внимание на интересное исследование GAIR Lab, в ходе которого обучили небольшую языковую модель (SLM) для улучшения контента документа. Языковая модель генерирует вызов заранее заданных правил: оставить или удалить целый документ, удалить набор строк или нормализовать строку. Даже такого ограниченного набора правил хватило, чтобы значительно улучшить качество документов и получить прирост на бенчмарках. Авторы выложили датасет OpenWebMath-Pro на huggingface.
Исследование продемонстрировало эффективность применения моделей машинного обучения (SLM) на этапах предварительной очистки массивных текстовых корпусов с высоким уровнем шума, таких как Common Crawl, архивы форумов, научные публикации и программный код. Генерируемые с помощью SLM эвристики демонстрируют существенно большую гибкость по сравнению с традиционными правилами, которые были разработаны и верифицированы вручную в существующих системах очистки данных (Gopher, CCnet, RefinedWeb и других).
Хотя использование SLM требует значительно больших вычислительных ресурсов по сравнению с применением простых эвристик, эта технология не заменяет традиционные методы полностью, а служит дополнительным инструментом для повышения качества очистки данных.
Параллельные данные представляют собой пары соответствующих друг другу текстов или предложений на разных языках, которые используются для улучшения качества машинного перевода (MT) языковых моделей.
Исследование Alma продемонстрировало, что даже небольшой объем параллельных данных в сочетании с дообучением на целевом языке значительно повышает качество перевода. Основываясь на этих результатах, мы включили в наш датасет параллельные данные из открытых источников, таких как xP3x и Aya Dataset. Дополнительно обогатили данные переводами инструктивных пар с английского на русский, специально собранными для расширения русскоязычной составляющей тренировочного набора данных.
Инструктивные данные — важная составляющая второй стадии обучения. Они отличаются по формату от обычных данных для предобучения, поскольку состоят из нескольких реплик с разными ролями, в то время как данные предобучения — просто сплошной текст. Мы смешиваем инструктивные и обычные данные предобучения, а для инструктивных данных применяем все по аналогии с SFT-обучением: чат теплейт, маскирование лосса для запроса пользователя.
Fun fact: баг с токенизацией, который мы нашли не сразуХотя токенизация данных с помощью библиотеки transformers обычно выполняется одним вызовом функции, подготовка токенизированных инструктивных диалогов требует более сложного подхода. Основная причина заключается в особенностях работы функции tokenizer.apply_chat_template(), которая не формирует тензор меток (labels) автоматически.
При обучении модели на диалогах необходимо правильно настроить маску потерь (loss mask), чтобы модель училась только на ответах ассистента. Для этого требуется токенизировать каждую реплику диалога отдельно и вручную присваивать метки: −100 для реплик пользователя и системных сообщений (чтобы исключить их из расчета функции потерь) и фактические значения токенов для ответов ассистента.
Такой подход позволяет корректно обучать модель, фокусируясь только на генерации ответов ассистента и игнорируя остальные части диалога при вычислении потерь.
Наш код:
python
result_tokens = []
enable_loss = []
for msg in chat:
templated_msg = self.tokenizer.apply_chat_template([msg], tokenize=False,
chat_template=chat_template,
add_generation_prompt=False)
templated_msg = self.remove_eos_and_bos(templated_msg)
msg_tokens = self.tokenizer(templated_msg, truncation=False, padding=False, add_special_tokens=False)[
'input_ids']
result_tokens += msg_tokens
fill = 0 if msg.get('disable_loss') else 1
enable_loss += [fill] * len(msg_tokens)
result_tokens = self.bos_tokens + result_tokens + self.eos_tokens
if self.bos_tokens:
enable_loss = [1] + enable_loss
enable_loss = enable_loss + [1]
При переходе с модели Gemma-2 на Qwen-2.5 мы столкнулись с неочевидной проблемой токенизации, которая привела к деградации метрик. Корень проблемы заключался в различиях chat template между моделями.
Особенность токенизатора Qwen-2.5 в том, что он всегда добавляет системное сообщение в диалог, даже если его нет в исходных репликах. В нашем коде мы вызывали функцию apply_chat_template для каждой реплики отдельно, что приводило к многократному добавлению дефолтного системного промпта в токенизированные данные. При этом на бенчмарках использовался стандартный подход с единым вызовом apply_chat_template для всего диалога. Расхождение между форматами обучения и инференса привело к снижению качества модели. Хотя падение производительности оказалось менее критичным, чем обычно наблюдается при ошибках токенизации, это затрудняло своевременное обнаружение бага.
Этот опыт позволил сделать важные выводы:
Необходимо тщательно тестировать код токенизации, поскольку ошибки в нем могут иметь серьезные последствия для качества модели.
При интеграции новых моделей критически важно детально изучать их chat template. Поскольку шаблоны реализованы на языке Jinja, который предоставляет большую гибкость, единого стандарта для них не существует.
Любые модификации стандартного процесса токенизации требуют особенно тщательной проверки и валидации.
Мы собрали открытые инструктивные датасеты с huggingface по различным доменам:
General (OpenAssistant, WildChat, Synthetic LMSys-Chat-1M, UltraFeedback, OpenHermes-2.5, capybara, InfinityInstruct, Magpie-Ultra, neo_sft_phase2, tulu v3.1 mix, Synthia).
Knowledge (Flan v2, WebInstructSub, Dolphin).
Math (Numina-CoT, MetaMathQA, MathInstruct, TemplateGSM).
Reasoning (Numina-TIR, OpenPlatypus).
Code (Self-OSS-Instruct-SC2, Evol CodeAlpaca, OASST-Code-Octopack, CommitPackFT).
IF (ifeval-like, SystemChat).
Англоязычные датасеты перевели на русский язык с помощью открытых LLM. Набор промптов инструкций почти полностью пересекается с SFT-сетом, но отличается большим объемом за счет менее строгих критериев качества и фильтрации.
Поскольку многие источники инструкций содержат пересекающиеся наборы промптов, необходимым этапом подготовки является глобальная дедупликация всех инструктивных данных. Мы использовали LSH-дедупликацию для минимизации количества дублей в тренировочном датасете.
Генерация синтетических инструктивных данных — популярный подход как для обогащения и формирования датамиксов предобучения, так и для получения SFT-like инструктивных данных.
Одним из известных примеров синтетического корпуса предобучения является Cosmopedia. Суть подхода состоит в том, чтобы на основании отрывка веб-страницы и выбранных высококачественных источников сгенерировать длинный текст, расширяющий контекст данного отрывка, а вариативность достигается с помощью применения разных стилей.
Подход Cosmopedia лишь частично обусловлен по данному на вход контексту, но без ограничений генераций на внесение дополнительной информации как на уровне промптинга, так и на уровне фильтраций в постпроцессинге такой подход может приводить к галлюцинациям.
Мы решили больше концентрироваться на второй стадии пайплайна обучения и инструктивных данных в ней, потому что она меньше по объему, содержит более высококачественные данные и больше влияет на финальное качество модели. Основная проблема, с которой мы столкнулись во время сбора инструктивных датамиксов, — отсутствие качественных и достаточно больших датасетов на русском языке, а существующие недостаточно покрывали common knowledge будучи в большей степени переводами соответствующих англоязычных источников. Мы рассматривали два варианта получения синтетики:
перевод, как и с открытыми наборами данных;
генерация синтетических инструктивных и question answering (как отдельный вид инструкций) пар, обусловленных на некоторый контекст.
Первый подход применялся на формализуемых доменах, таких как математика. Как и в случае кодовых наборов данных, перевод проводился большими открытыми языковыми моделями с последующей фильтрацией по эвристикам. Отличие заключалось в дополнительном шаге — проверке совпадения блоков LaTeX / MathJax.
Важно, что доменно специфичные термины часто искажаются при подобном подходе, но неточности языка в нашем случае в последующем выравниваются на post-training-стадиях.
В качестве источника формирования инструктивных пар рассматривались поддомены StackExchange с фильтрацией по частотным тэгам, голосам как вопроса, так и комментариев.
В случае с математическим доменом дополнительно сформировали blacklist тегов, покрывающих узкоспециализированные тематики, где перевод терминов был наиболее неточный и плохо верифицируемый. Брались только данные, теги которых покрывают 90% запросов пользователей, пост и комментарии к нему должны были быть оценены минимум одним пользователем. Итоговая пара «запрос — ответ» формировалась по правилу: ответ, который принят инициатором треда и автоматически считается верным, и ответ с самым высоким рейтингом, если он отличен от принятого.
Генерация синтетических инструктивных данных стала достаточно популярной после выхода статьи, описывающей Self-Instruct-подход. Он без дополнительных ограничений склонен вырождаться, и полученный датасет может обладать малым разнообразием, более того, как и в случае с Comopedia, никак не ограничиваются галлюцинации.
Чтобы побороть эти две основные проблемы, мы, опираясь на работы MAmmoTH2: Scaling Instructions from the Web и Nemotron-4 340B Technical Report, использовали подмножество сбалансированных СС-данных с метрикой образовательной ценности большей или равной 4, и книги с образовательной ценностью как минимум 3 в качестве контекста для генерации. Далее для фиксированного чанка контекста генерировалась пара «инструкция — ответ» и список вопросов и ответов, опирающихся на текст, что ограничивалось напрямую в затравке наряду с образовательной ценностью сгенерированного ответа.
Следующим этапом пайплайна стала фильтрация данных на основе оценки их согласованности с контекстом и корректности с точки зрения языковой модели. Использование абстрактных шкал оценивания на этом этапе приводило к тому, что калибровку порога оценки необходимо было производить для каждой модели, что в общем случае не масштабируемо. Мы пришли к списку бинарных критериев. В итоге доля синтетических данных в первой стадии дообучения составила 5,7% и 4,7% — во второй.
Мы описали особенности сбора датасета обучения для второй стадии предобучения. Перейдем к описанию технических деталей обучения.
Инструктивные маски. Во второй стадии в датамиксе появляются инструктивные данные, состоящие из запроса пользователя и ответа ассистента. Для таких данных мы маскировали loss для токенов, соответствующих запросу, и учили модель только на токенах ответа так же, как это делают при SFT-обучении.
Аблейшны показали эффективность этого метода. Маскирование промпта способствует тому, что модель лучше фокусируется на выполнении задачи, снижая риск переобучения на некачественные или дублирующиеся запросы. При этом ответы в инструктивных датасетах, как правило, являются сгенерированными и проходят контроль качества, в отличие от исходных пользовательских запросов.
Помимо маскирования промта существуют подходы смешанного маскирования, например с использованием Prompt Loss Weight. Увтерждается, что на датасетах с короткими генерациями использование ненулевого PLW превосходит стандартное SFT-like-обучение с полным маскированием промптов. Но для длинных генераций эффект нивелируется.
Стоит отметить, что многие инструктивные задачи, такие как Natural Language Instruction, имеют короткие ответы. Мы не пробовали этот подход, но он выглядит перспективным. Необходимо следить не только за распределением общей длины инструктивных примеров, но и за соотношением длинных и коротких промптов и генераций.
Мы использовали те же гиперпараметры оптимизации, что и в Stage 1. Единственное отличие — расписание learning rate. После разогрева learning rate достигает 1e-5 и постепенно затухает до 1e-6 (alpha_f = 0.1).
Параметры тренировки:
Максимальная длина последовательности: 8192.
Глобальный batch размер: 768 батчей (где 768 × 8192 = около 6 млн токенов).
Длительность тренировки: 6500 батчей.
Интервал оценки: 2000 батчей.
Количество токенов на стадии 2: до 40B (20/40), где 1 эпоха — 20B.
Метрики:
После Stage 2 значимый прирост наблюдается в следующих бенчмарках: USE (ЕГЭ), RWSD, MultiQ (multi-hop QA), CheGeKa, математических ruMultiAr и MathLogicQA.
Как видно по результатам замеров, претрейн-чекпоинт получает даже больший результат, чем T-pro-it-1.0 (то есть заалайненная модель). Заметим, что при составлении SFT-сета главной целью было развитие диалоговых способностей модели, что может отражаться на бенчмарках, нацеленных на знания модели.
Мы подробно раскрыли процесс предобучения наших моделей T-lite и T-pro, сосредоточившись на детальном описании каждого этапа: от подготовки данных до финальных экспериментов.
Наш опыт показывает, что гибридный подход позволяет значительно сократить вычислительные затраты при сохранении высокого качества моделей. Обучение на сотнях миллиардов токенов оказывается достаточным для существенного улучшения способностей модели в работе с русским языком, при этом позволяя сохранить преимущества базовой архитектуры и знания, заложенные в исходной модели.
В следующей статье мы планируем раскрыть особенности этапа post-training, который включает SFT и alignment.
P.S. Спасибо всей команде, которая помогла этой статье быть: Оле Цымбой, Мише Гашкову, Герману Абрамову и Толе Потапову.