Перейти к содержимому
Ступень 55.1 Масштабирование

Данные для претрейна

Как из сырого интернета получают триллионы чистых токенов — Common Crawl, фильтры качества, MinHash-дедупликация, смеси данных, синтетика — и какое место в этом занимают русский и китайский.

УРОКstage-5/5-1-scaling/02-pretraining-data.mdx1 ч 50 минУрок 2 из 2
После урока вы сможете
  • Описать конвейер подготовки веб-данных — от снимка Common Crawl до токенов
  • Реализовать эвристический фильтр качества и MinHash-дедупликацию
  • Объяснить, как классификаторы качества, смеси данных и синтетика меняют модель при том же числе токенов
  • Оценить место русского и китайского языков в мировых корпусах

В прошлом уроке данные были просто числом DD в формуле C≈6NDC \approx 6ND. На практике триллион токенов триллиону рознь. В проекте DCLM (2024) модель на 7B параметров, обученная на 2.6T токенов тщательно отфильтрованного веба, набрала 64% на MMLU. Главный вывод DCLM: при той же архитектуре и том же бюджете результат сильнее всего зависит от фильтрации данных. Хорошие данные сдвигают вниз всю кривую масштабирования.

Поэтому корпускорпус текстовEN corpus — главный секрет лабораторий. В техотчётах DeepSeek, Qwen и Llama архитектуру описывают до последней матрицы, а про данные пишут общими словами. Зато открытые проекты (FineWeb, DCLM, Dolma) публикуют конвейеры целиком, и по ним можно понять, как это делается.

В этом уроке вы пройдёте весь путь: сырой веб → извлечение текста → фильтры → дедупликация → смесь → токены. И своими руками напишете два ключевых инструмента: эвристический фильтр и MinHash.

Common Crawl — некоммерческий проект, который с 2008 года обходит интернет и публикует снимки (crawls) в открытом доступе. Свежий снимок CC-MAIN-2026-39 содержит около 2.17 млрд страниц. Данные лежат в трёх форматах:

  • WARC — сырые HTTP-ответы с полным HTML;
  • WAT — метаданные и ссылки;
  • WET — уже извлечённый простой текст.

Казалось бы, бери WET и учи. Но FineWeb показал, что извлекать текст из WARC самому (библиотекой trafilatura) выгоднее: в WET остаётся слишком много меню, подвалов и рекламных блоков.

Как распределены языки в снимке CC-MAIN-2026-39 (основной язык страницы по детектору CLD2):

ЯзыкДоля страниц
английский41.9%
русский6.7%
немецкий5.7%
японский5.2%
испанский4.7%
французский4.7%
китайский4.2%

Русский — второй язык веба по этой статистике. К этому мы вернёмся в конце урока.

Кроме веба, в корпус добавляют источники поменьше, но плотнее по знаниям: Википедию, книги (с ними много юридических проблем), научные статьи arXiv, код с GitHub, вопросы и ответы StackExchange, математические страницы. В 2025–2026 годах к ним прибавились текст из PDF (через OCRоптическое распознавание символов (OCR)EN optical character recognition (OCR) — распознавание текста на картинках — и мультимодальные модели) и синтетические данные.

flowchart TB
A["Снимок Common Crawl (WARC)"] --> C["URL-фильтр: блок-листы"]
C --> B["Извлечение текста из HTML"]
B --> D["Определение языка"]
D --> E["Эвристические фильтры"]
E --> F["Дедупликация (MinHash)"]
F --> G["Классификатор качества"]
G --> H["Удаление PII"]
H --> I["Токенизация и смесь с кодом, книгами, математикой"]
Типичный конвейер подготовки веб-данных (по мотивам FineWeb)

Порядок не случаен. Сначала идут дешёвые шаги, которые выбрасывают больше всего: URL-фильтр по спискам сайтов для взрослых и спама, определение языкаопределение языкаEN language identification (LID) (fastText в FineWeb, GlotLID в FineWeb-2), простые правила. Дорогие шаги вроде классификатора на нейросети запускают на том, что осталось. В конце из текста убирают персональные данныеперсональные данные (PII)EN personally identifiable information (PII): FineWeb, например, анонимизирует адреса почты и IP-адреса.

Из 96 снимков Common Crawl за 2013–2024 годы FineWeb получил около 15T токенов. Это много, но от исходного объёма веба осталась малая часть.

Фильтрация по качествуфильтрация по качествуEN quality filtering начинается с простых правил. Каждое ловит свой тип мусора: меню и навигацию, SEO-простыни из ключевых слов, таблицы чисел, повторяющиеся шаблоны.

Классические наборы (SEO-тексты — страницы, написанные для поисковых роботов, а не для людей):

  • C4 (Google, 2019): оставлять только строки, которые кончаются знаком препинания; выбрасывать страницы короче трёх предложений, со словом «lorem ipsum», с фигурными скобками (признак кода) и со словами из чёрного списка.
  • Gopher (DeepMind, 2021): от 50 до 100 000 слов; средняя длина слова от 3 до 10 символов; символов # и многоточий — не больше 0.1 на слово; не меньше 80% слов с буквами; хотя бы 2 стоп-слова из восьми (the, be, to, of, and, that, have, with); плюс фильтры повторов строк, абзацев и n-грамм.
  • FineWeb (2024) добавил свои: доля строк, которые кончаются знаком конца предложения, доля коротких строк, доля символов в повторяющихся строках.

Для других языков пороги приходится подбирать заново. В FineWeb-2 их настроили отдельно для каждого языка, а фильтры C4 отключили совсем: в многоязычных абляцияхабляционный эксперимент, абляцияEN ablation studyУбрать или заменить один компонент и сравнить с полной моделью, чтобы измерить вклад этого компонента. (опытах, где по очереди включают и выключают одну деталь) они ухудшали результат. Вот сравнение для английского Gopher и русской конфигурации FineWeb-2 (rus_Cyrl):

ПравилоЧто ловитGopher (английский)FineWeb-2 (русский)
Средняя длина словатаблицы, URL, склейки3–103–11
Доля слов с буквамичисла, код, разметкуне меньше 80%не меньше 71.3%
Стоп-словаSEO, списки ключевых слов2 из 8список из 22 слов
Строки со знаком конца предложенияменю, каталоги—не меньше 23.1% строк
Повторяющиеся строкишаблоны, подвалыне больше 30%не больше 32.2%

В русском списке стоп-слов FineWeb-2 есть очевидные «в», «и», «на», «что», «не», а есть неожиданные «года» и «году». Список подбирали по частотам в реальном вебе, а там очень много новостей и справочных статей с датами.

Правила отсекают явный мусор, но не отличают скучную рекламу от хорошей статьи. Для этого обучают классификатор качестваклассификатор качестваEN quality classifierМодель (часто fastText или маленький трансформер), которая оценивает «полезность» документа для обучения LLM.: дешёвую модель, которая оценивает, насколько документ похож на «хороший».

Главный вопрос — что считать хорошим. Три известных ответа:

  1. GPT-3 (2020). Положительные примеры — курируемые корпуса (WebText, Википедия, книги), отрицательные — сырой Common Crawl. Логистическая регрессия; документы брали с вероятностью, зависящей от оценки. Из 45 ТБ сжатого текста осталось 570 ГБ.
  2. FineWeb-Edu (2024). Llama-3-70B-Instruct оценила сотни тысяч страниц (порядка полумиллиона) по «образовательной ценности» от 0 до 5. На этих оценках обучили маленький классификатор и прогнали его по всему FineWeb. Страницы с оценкой не ниже 3 — это около 1.3T токенов из 15T. Модели на FineWeb-Edu заметно выигрывают на тестах на знания вроде MMLU и ARC.
  3. DCLM (2024). Классификатор fastText, положительные примеры — инструкции OpenHermes 2.5 и лучшие ответы из сабреддита r/ExplainLikeImFive. Отсюда те самые 64% на MMLU у 7B-модели.

Обратите внимание на схему FineWeb-Edu: большая модель размечает выборку, маленькая переносит разметку на триллионы токенов. Тот же приём вы увидите в пост-обучении: сильная модель как «судья» и дешёвая модель для масштаба.

Минус классификаторов — однообразие. Узкое понятие «качества» вырезает целые жанры: форумы, художественную прозу, разговорную речь. Поэтому отфильтрованную часть обычно смешивают с более широкой.

В вебе огромное количество копий: одна новость на сотне сайтов, шаблонные страницы магазинов, зеркала, перепечатки. ДедупликациядедупликацияEN deduplication нужна по трём причинам:

  • вычисления: дубликат съедает бюджет, ничего не добавляя;
  • запоминание: Lee et al. (2021) нашли в корпусе C4 предложение из 61 слова, повторённое больше 60 тыс. раз; модели на дедуплицированных данных примерно в 10 раз реже выдают заученный текст дословно;
  • честная оценка: копии тестовых заданий в обучении завышают результаты (это утечка тестовых данныхзагрязнение данных (утечка бенчмарка в обучение)EN data contaminationЗадачи из тестового бенчмарка попали в обучающий корпус LLM — оценка становится завышенной. Родственное явление — «шуабан», подгонка модели под лидерборд.).

Точные дубликаты ловятся хешем документа. Сложнее с почти-дубликатамипочти-дубликатEN near-duplicate: та же статья, но с другой шапкой, датой или парой исправленных слов. (Те же приёмы в рабочей задаче — почти-дубли в выгрузке обращений в поддержку — разобраны в уроке 11.1.1.)

Разобьём документ на шинглы — пересекающиеся словесные n-граммы (в FineWeb n=5n = 5). Документ превращается в множество шинглов AA, и сходство двух документов измеряется сходством Жаккарасходство ЖаккараEN Jaccard similarity|A ∩ B| / |A ∪ B| — доля общих элементов двух множеств.:

J(A,B)=∣A∩B∣∣A∪B∣J(A, B) = \frac{\lvert A \cap B \rvert}{\lvert A \cup B \rvert}

Обозначения из теории множеств (урок 1.0.5): A∩BA \cap B — пересечение (элементы, которые есть в обоих множествах), A∪BA \cup B — объединение (элементы, которые есть хотя бы в одном), ∣A∣\lvert A \rvert — число элементов. В Python это ровно операции над set из ступени 0: len(A & B) / len(A | B). Пример: у множеств {1,2,3}\{1, 2, 3\} и {2,3,4}\{2, 3, 4\} общих элементов 2, всего разных 4, значит J=2/4=0.5J = 2/4 = 0.5. Одинаковые множества дают 1, не имеющие общих элементов — 0.

Шинглы очень чувствительны к правкам. Возьмём абзац из 56 слов (52 шингла по 5 слов). Замена одного слова ломает до 5 шинглов, и JJ падает до 0.82. Замена двух слов ломает 10 шинглов: J=42/62≈0.68J = 42 / 62 \approx 0.68. Поэтому пороги почти-дубликатов обычно берут около 0.7–0.8, а не 0.95.

На миллиардах документов попарно считать JJ нельзя: это n2n^2 сравнений больших множеств. MinHashMinHashEN MinHashКороткая подпись множества; доля совпавших позиций двух подписей — оценка сходства Жаккара. сжимает каждое множество в короткую подпись.

Возьмём случайную хеш-функцию hh и запомним минимум хеша по всем шинглам документа: min⁡s∈Ah(s)\min_{s \in A} h(s). Главное свойство:

P[min⁡s∈Ah(s)=min⁡s∈Bh(s)]=J(A,B)P\left[\min_{s \in A} h(s) = \min_{s \in B} h(s)\right] = J(A, B)

Почему так: посмотрим на элемент объединения A∪BA \cup B с самым маленьким хешем. Для случайной hh им с равной вероятностью оказывается любой элемент объединения. Минимумы AA и BB совпадают ровно тогда, когда этот элемент лежит в пересечении. Вероятность этого — ∣A∩B∣/∣A∪B∣\lvert A \cap B \rvert / \lvert A \cup B \rvert.

Возьмём kk независимых хеш-функций. Получим подпись из kk чисел, а доля совпавших позиций двух подписей и будет оценкой JJ. На практике kk «разных» функций получают из одной: hi(x)=(aix+bi) mod ph_i(x) = (a_i x + b_i) \bmod p ( mod \bmod — остаток от деления, % в Python) со случайными aia_i, bib_i и большим простым pp — так устроена и практика ниже. Ошибка оценки около J(1−J)/k\sqrt{J(1-J)/k}: при J=0.8J = 0.8 и k=112k = 112 это примерно ±0.04.

Даже короткие подписи нельзя сравнить попарно для миллиардов документов. Помогает локально-чувствительное хешированиелокально-чувствительное хеширование (LSH)EN locality-sensitive hashing (LSH): подпись режут на bb полос по rr значений, и документы, у которых совпала хотя бы одна полоса целиком, попадают в кандидаты. Вероятность для пары со сходством ss:

P(кандидат)=1−(1−sr)bP(\text{кандидат}) = 1 - (1 - s^r)^b

Откуда формула. Каждая позиция подписи совпадает с вероятностью ss, поэтому целая полоса из rr позиций совпадает с вероятностью srs^r, а не совпадает — с вероятностью 1−sr1 - s^r. Чтобы пара не стала кандидатом, не должна совпасть ни одна из bb полос: (1−sr)b(1 - s^r)^b. Всё остальное — «кандидат». Пример: s=0.8s = 0.8, r=8r = 8, b=14b = 14: 0.88≈0.1680.8^8 \approx 0.168, (1−0.168)14≈0.076(1 - 0.168)^{14} \approx 0.076, итого 1−0.076≈0.921 - 0.076 \approx 0.92.

В FineWeb b=14b = 14, r=8r = 8 (112 хешей). Получается S-образная кривая: её крутой участок находится около (1/b)1/r=(1/14)1/8≈0.72(1/b)^{1/r} = (1/14)^{1/8} \approx 0.72, а авторы FineWeb целились в документы, похожие хотя бы на 75%:

Сходство ss0.50.60.70.750.80.9
Вероятность стать кандидатом0.050.210.570.770.92≈1.00

Логично дедуплицировать все снимки вместе. FineWeb попробовал и получил модели хуже, чем при дедупликации каждого снимка отдельно. Оказалось, что глобальная дедупликация выкидывает слишком много, а то, что после неё остаётся в старых снимках, в среднем хуже качеством. По-видимому, хорошие страницы чаще копируют и переобходят, поэтому они и попадают в дубликаты.

FineWeb-2 сделал иначе: дедуплицирует каждый язык глобально, но от каждого кластера дубликатов оставляет один документ и записывает в его метаданные размер кластера. Это позволяет потом «регидрировать» данные — вернуть популярным документам часть веса. Рецепт из репозитория FineWeb-2: документ из кластера в 2 или 3 копии повторяется в данных столько же раз, из кластера в 4 копии — 3 раза, в 5–99 копий — 5 раз, в 100–999 копий — 8 раз. А кластеры из тысячи и больше копий снова получают вес 1: авторы считают, что такие огромные кластеры обычно низкого качества. Веса подбирали без большого перебора, но для крупных языков прирост был заметен. Число копий оказалось сигналом качества.

Один веб — плохая диета. Смесь данныхсмесь данныхEN data mixtureДоли источников (веб, код, математика, книги, языки) в обучающем потоке токенов. задаёт доли источников, и она сильно влияет на характер модели. В техотчёте Llama 3 итоговая смесь такая: около 50% общих знаний, 25% математики и рассуждений, 17% кода и 8% многоязычных данных.

Что важно знать о смесях:

  • Код и математика улучшают не только программирование, но и рассуждения, поэтому их доля растёт от поколения к поколению.
  • Источники повторяют неравномерно: Википедию и книги могут пройти несколько эпох, сырой веб — одну. Помните из прошлого урока: до ~4 повторов почти не вредят.
  • Отжиг. В конце предобучения learning rate снижают и подмешивают самые качественные данные. Этот отжиготжиг (финальная фаза обучения)EN annealingКонец предобучения, когда learning rate снижают и подмешивают больше самых качественных данных. даёт заметный прирост на тестах, особенно у небольших моделей: в техотчёте Llama 3 он заметно поднял математику у 8B, а у 405B прирост оказался пренебрежимым. Поэтому лучшие данные часто берегут для финала.
  • Смесь подбирают абляциями: обучают маленькие модели на разных пропорциях и сравнивают. Так же проверяют и шаги очистки: FineWeb-2 после каждого шага конвейера обучал модель на 1.46B параметров и сравнивал её на наборе тестов.

Когда хороший человеческий текст заканчивается, его генерируют. Синтетические данныесинтетические данныеEN synthetic data уже стали обычной частью претрейна:

  • TinyStories (2023): простые английские сказки, написанные GPT-3.5 и GPT-4. На них модели размером около 10M параметров пишут связные истории. Для вашего проекта в модуле 5.6 это важная идея: маленькой модели нужны простые данные.
  • phi-1, «Textbooks Are All You Need» (Microsoft, 2023): модель на 1.3B параметров для кода обучили на наборе примерно из 7B токенов (несколько проходов) — отфильтрованный «учебный» код из веба плюс синтетические учебники и упражнения от GPT-3.5. Результат — 50.6% на HumanEval (164 задачи «напиши функцию на Python», проверяемые тестами), уровень гораздо более крупных моделей того времени.
  • Переписывание веба: шумную страницу просят переформулировать чистым языком в стиле Википедии или вопросов-ответов.
  • Qwen3: по техотчёту, текст из PDF извлекали моделью Qwen2.5-VL, а Qwen2.5-Math и Qwen2.5-Coder сгенерировали триллионы токенов синтетики: учебники, задачи с решениями, код.

Риски тоже известны. Модели, которые поколение за поколением учатся на собственных текстах, теряют редкие события из «хвостов» распределения — это коллапс моделиколлапс моделиEN model collapseДеградация моделей, которые поколение за поколением учатся на текстах, сгенерированных предыдущими моделями. (Shumailov et al., Nature, 2024). Синтетика однообразнее живого текста и повторяет ошибки модели-учителя. Наконец, условия использования некоторых API запрещают обучать на их ответах конкурирующие модели. На практике синтетику смешивают с реальными данными и проверяют на утечку тестов: например, по совпадающим 13-граммам с тестовыми наборами, как в GPT-3.

Сведём цифры. В Common Crawl русский занимает 6.7% страниц, второе место. А в обучающих смесях картина другая. У Llama 3 на все многоязычные данные приходится 8% токенов, и делятся они на десятки языков. Значит, на русский — от силы пара процентов (это наша оценка, точных долей Meta не публикует). Добавьте то, что русский текст «дороже» в токенах (урок 4.2), и станет понятно, почему многие западные модели пишут по-русски заметно хуже, чем по-английски.

Что в этом полезного для вас:

  • Готовые русские данные есть. В FineWeb-2 русский (rus_Cyrl) обработан отдельным конвейером со своими порогами и стоп-словами (их вы используете в практике). Лицензия FineWeb — ODC-By.
  • У русского веба свои ловушки: латинские буквы-двойники в кириллических словах (так спамеры обходят фильтры), «е» и «ё», дореформенная орфография в старых текстах, транслит.
  • Доля языка в смеси — решение разработчиков, а не закон природы. В проекте модуля 5.6 вы будете учить модель только на русском и увидите, сколько может маленькая модель на «своём» языке.

Соберите мини-конвейер из двух частей. Первая — эвристический фильтр по мотивам Gopher с порогами и стоп-словами из русской конфигурации FineWeb-2. Функция возвращает причину отказа, как настоящие фильтры, чтобы выброшенное можно было разобрать. Вторая — MinHash: подписи, оценка сходства, жадная дедупликация и формула LSH.

Фильтр качества и MinHash-дедупликация8 тестов
import random
import zlib

# ── Часть 1. Эвристический фильтр качества (по мотивам Gopher и FineWeb-2 для rus_Cyrl) ──
# Стоп-слова — из конфигурации FineWeb-2 для русского языка.
STOP_WORDS = {"в", "и", "на", "с", "года", "по", "году", "из", "был", "к", "не",
              "от", "что", "за", "для", "его", "как", "а", "он", "также", "до", "после"}
PUNCT = ".,!?;:«»\"'()—–-…"
TERMINAL = (".", "!", "?", "…", "»", '"')

MIN_WORDS = 30                # в Gopher — 50; у нас короче, чтобы примеры помещались на экран
MIN_AVG_WORD_LEN, MAX_AVG_WORD_LEN = 3, 11
MIN_ALPHA_WORDS = 0.7         # доля «слов», где есть хотя бы одна буква (в FineWeb-2 для rus_Cyrl — 0.713)
MAX_SYMBOL_RATIO = 0.1        # (# + многоточия) на одно слово
MIN_STOP_WORDS = 2
MIN_PUNCT_LINES = 0.23        # доля строк, которые заканчиваются знаком конца предложения
MAX_DUP_LINES = 0.32          # доля строк-повторов


def clean_word(w):
    """Нижний регистр и без пунктуации по краям: «Года,» → «года»."""
    return w.lower().strip(PUNCT)


def quality_check(text):
    """Проверяет правила СТРОГО по порядку и возвращает (True, 'ok')
    или (False, причина) для первого нарушенного правила:

    1. 'too_short'   — слов (text.split()) меньше MIN_WORDS;
    2. 'word_length' — средняя длина слова вне [MIN_AVG_WORD_LEN, MAX_AVG_WORD_LEN];
    3. 'not_alpha'   — доля слов хотя бы с одной буквой (ch.isalpha()) меньше MIN_ALPHA_WORDS;
    4. 'symbols'     — (число '#' + число '...' + число '…') / слов > MAX_SYMBOL_RATIO;
    5. 'stop_words'  — слов, у которых clean_word(w) в STOP_WORDS, меньше MIN_STOP_WORDS;
    6. 'line_punct'  — среди непустых строк (после strip) доля оканчивающихся на TERMINAL < MIN_PUNCT_LINES;
    7. 'dup_lines'   — (строк − уникальных строк) / строк > MAX_DUP_LINES.
    """
    # TODO
    ...


# ── Часть 2. MinHash-дедупликация ──
PRIME = (1 << 61) - 1         # простое число Мерсенна


def shingles(text, n=5):
    """Множество словесных n-грамм (шинглов) документа. Готово."""
    words = [w for w in (clean_word(x) for x in text.split()) if w]
    if len(words) < n:
        return {" ".join(words)}
    return {" ".join(words[i:i + n]) for i in range(len(words) - n + 1)}


def base_hash(s):
    """Детерминированный 32-битный хеш строки. Готово."""
    return zlib.crc32(s.encode("utf-8"))


def make_permutations(num_perm, seed=1):
    """Параметры (a, b) для num_perm хеш-функций h(x) = (a·x + b) mod PRIME. Готово."""
    rng = random.Random(seed)
    return [(rng.randrange(1, PRIME), rng.randrange(0, PRIME)) for _ in range(num_perm)]


def jaccard(a, b):
    """Сходство Жаккара двух непустых множеств: |A ∩ B| / |A ∪ B|."""
    # TODO
    ...


def minhash_signature(sh, perms):
    """MinHash-подпись множества шинглов sh: список длины len(perms).
    Для каждой пары (a, b): min по шинглам s значения (a * base_hash(s) + b) % PRIME."""
    # TODO
    ...


def estimate_jaccard(sig1, sig2):
    """Оценка сходства по подписям: доля позиций, где значения совпали."""
    # TODO
    ...


def deduplicate(docs, threshold=0.7, num_perm=128):
    """Идём по документам по порядку и оставляем документ, только если его оценка сходства
    со ВСЕМИ уже оставленными меньше threshold. Вернуть список индексов оставленных.
    Перестановки: make_permutations(num_perm); шинглы: shingles(doc)."""
    # TODO
    ...


def lsh_probability(s, bands, rows):
    """Вероятность, что пара со сходством s попадёт в кандидаты LSH
    (bands полос по rows значений подписи): 1 − (1 − s^rows)^bands."""
    # TODO
    ...


# Проверьте себя кнопкой «Запустить»:
text = ("Common Crawl — некоммерческий проект, который с 2008 года регулярно обходит интернет "
        "и публикует снимки веба. Каждый снимок содержит миллиарды страниц на сотнях языков, "
        "и русский язык стабильно входит в число самых крупных. Из этих страниц собирают корпуса "
        "для предобучения языковых моделей, но сначала текст нужно очистить от мусора.")
print(quality_check(text))
print(quality_check("Купить дёшево!!! " * 3))

После тестов поэкспериментируйте: замените в тексте 1, 2, 3 слова и посмотрите, как падает настоящее и оценённое сходство; уменьшите число хешей до 16 и оцените, насколько растёт ошибка.

Проверь себя6 вопросов
1 Какие документы отсечёт эвристический фильтр из этого урока?Можно выбрать несколько ответов
2 Сходство Жаккара множеств {a,b,c,d}\{a, b, c, d\} и {c,d,e,f}\{c, d, e, f\}? Округлите до двух знаков.
3 Чему равна вероятность того, что минимумы случайной хеш-функции по множествам AA и BB совпадут?
4 LSH с b=10b = 10 полосами по r=5r = 5 хешей. С какой вероятностью пара со сходством s=0.7s = 0.7 станет кандидатом? Округлите до двух знаков.
5 FineWeb сравнил глобальную дедупликацию всех снимков Common Crawl и дедупликацию каждого снимка отдельно. Что оказалось?
6 Llama 3: 8% токенов — многоязычные данные на десятках языков. Что из этого следует для русского?
  • Основной источник — Common Crawl (около 2 млрд страниц в снимке); текст лучше извлекать из WARC самому.
  • Конвейер: URL-фильтр → язык → эвристики → дедупликация → классификатор качества → PII. Выброшенное нужно смотреть глазами.
  • MinHash оценивает сходство Жаккара по коротким подписям, LSH находит кандидатов без сравнения всех пар (FineWeb: 14 × 8 хешей, 5-граммы).
  • Качество смеси (код, математика, отжиг на лучших данных, синтетика) меняет модель не меньше, чем её размер.
  • Русский — второй язык веба (6.7% Common Crawl), но в мировых обучающих смесях его доля в разы меньше.

Дальше: модуль 5.2 — как ужать KV-кэш: MQA, GQA и MLA от DeepSeek. Начнём с MQA и GQA.