Что такое curriculum learning на уровне данных для LLM?

Краткий тезис

Curriculum learning (CL) — это стратегия организации порядка подачи данных во время обучения LLM, при которой модель сначала тренируется на лёгких примерах (короткие, простые тексты), а затем постепенно переходит к более сложным (длинные, технические, многозначные). Такой подход имитирует человеческое обучение и позволяет модели быстрее сходиться, избегать переобучения на шуме и достигать лучшего качества на сложных задачах. На практике CL реализуется через динамическую вероятность сэмплирования, зависящую от шага обучения и метрики сложности примера, и даёт прирост в метриках вроде MMLU на 2–3%.


1. Термин: Curriculum Learning (обучение по учебному плану)

Curriculum Learning — метод машинного обучения, при котором данные подаются модели в порядке возрастания сложности. Впервые формализован Bengio et al. (2009). Для LLM это означает, что на ранних этапах обучения модель видит короткие, грамматически простые, высокочастотные тексты, а на поздних — длинные, редкие, технические или многозначные.

Зачем это нужно

  • Ускоряет сходимость (модель быстрее осваивает базовые паттерны).
  • Улучшает финальное качество на сложных задачах (модель не «застревает» в локальных минимумах из-за шумных данных).
  • Снижает риск переобучения на редких или шумных примерах на ранних шагах.

2. Мотивация: почему порядок данных важен

При стандартном случайном сэмплировании модель может столкнуться со сложным примером на первом же шаге, что приведёт к большому градиенту и дестабилизации обучения. CL решает эту проблему, выстраивая прогрессию сложности.

Аналогия с человеком ребёнок сначала учится складывать слоги, потом читать простые предложения, затем — сложные тексты. Если дать ему сразу «Войну и мир», он не сможет извлечь пользу.

Экспериментальные данные

  • В работе «Curriculum Learning for Language Modeling» (2019) показано, что CL на корпусе WikiText-2 снижает perplexity на 3–5 пунктов.
  • Для LLM масштаба 7B параметров CL на смеси CommonCrawl и книг даёт прирост MMLU на 2–3% при том же количестве шагов.

3. Критерии сложности данных

Чтобы применить CL, нужно определить, что считать «лёгким» или «сложным» примером. Основные критерии:

КритерийЛёгкий примерСложный пример
Длина текста< 128 токенов> 1024 токенов
Частота словВысокочастотные (top-10k)Низкочастотные, редкие термины
Грамматическая сложностьПростые предложенияСложноподчинённые, инверсии
ТехничностьОбщие темы (спорт, погода)Научные статьи, юридические документы
Перплексия базовой моделиНизкая (модель легко предсказывает)Высокая (модель ошибается)
Наличие шумаЧистый текстOCR-ошибки, опечатки, разметка

Метрика сложности часто вычисляется как взвешенная сумма этих факторов, либо используется perplexity небольшой предобученной модели (например, GPT-2) — чем выше perplexity, тем сложнее пример.


4. Реализация: динамическое сэмплирование

На практике CL реализуется через вероятность сэмплирования, которая зависит от сложности примера и текущего шага обучения.

Формула

P(example_i) = softmax( -alpha * (step / total_steps) * complexity_i )

где alpha — гиперпараметр крутизны кривой, complexity_i — нормализованная сложность (0..1). На ранних шагах (step мало) все примеры имеют почти равную вероятность; к концу обучения сложные примеры получают больший вес.

Альтернативный подход — ступенчатый задаются пороги сложности, и на каждом этапе (например, каждые 10% шагов) включается новый пул более сложных данных.

Пример кода на Python (псевдокод с HuggingFace Trainer):

from transformers import Trainer
import numpy as np

class CurriculumTrainer(Trainer):
    def get_train_dataloader(self):
        # Вычисляем сложность для каждого примера (заранее)
        complexities = compute_complexities(self.train_dataset)
        # На каждом шаге пересчитываем веса
        step = self.state.global_step
        total = self.args.max_steps
        alpha = 5.0
        weights = np.exp(-alpha * (step / total) * complexities)
        weights /= weights.sum()
        sampler = WeightedRandomSampler(weights, len(weights))
        return DataLoader(self.train_dataset, sampler=sampler, ...)

5. Стратегии curriculum learning

СтратегияОписаниеКогда применять
Прямая (forward)От простого к сложному, как описано вышеСтандартный случай
Обратная (reverse)Сначала сложные, потом простые (для «доучивания» на лёгких)Когда модель уже обучена на сложных, но хочет улучшить базовые навыки
Ступенчатая (staged)Фиксированные этапы с резким переключением пулаКогда сложность можно чётко разбить на категории
Плавная (smooth)Непрерывное изменение вероятностиКогда сложность — континуум
Self-pacedМодель сама выбирает, какие примеры ей «по силам» (по loss)Когда нет априорной метрики сложности

Self-paced learning — особый случай: модель на каждом шаге выбирает примеры, loss которых ниже порога (т.е. которые она уже может осилить). Порог постепенно увеличивается.


6. Экспериментальные результаты

  • MMLU (Massive Multitask Language Understanding): прирост 2–3% на моделях 7B–13B при одинаковом количестве токенов обучения.
  • Perplexity: снижение на 1–2 пункта на тестовых доменах.
  • Скорость сходимости для достижения того же loss требуется на 15–20% меньше шагов.
  • Устойчивость к шуму CL уменьшает влияние грязных данных, так как модель сначала учится на чистых примерах.

Важно эффект сильнее для маленьких моделей (<1B) и ослабевает для очень больших (>100B), где случайное сэмплирование уже достаточно хорошо.


7. Связь с другими методами

CL часто комбинируют с:

  • Data filtering — отсев шумных данных перед обучением.
  • Data mixing — пропорции разных источников (книги, веб, код) могут меняться по curriculum.
  • Active learning — модель запрашивает сложные примеры у человека.
  • Progressive learning — увеличение размера контекста (сначала короткие, потом длинные последовательности).

8. Проблемы и ограничения

  • Определение сложности субъективно; один и тот же текст может быть лёгким для одной задачи и сложным для другой.
  • Переобучение на простых данных если слишком долго держать модель на лёгких примерах, она может забыть сложные паттерны.
  • Дополнительные вычисления нужно предварительно оценить сложность всех примеров (O(N) по времени).
  • Не всегда выгодно для некоторых задач (например, генерация кода) обратный curriculum (сначала сложные задачи) может быть эффективнее.

9. Инструменты и фреймворки

  • HuggingFace Trainer — можно переопределить get_train_dataloader для кастомного сэмплера.
  • PyTorch WeightedRandomSampler — базовая реализация.
  • Datasets library — позволяет добавить колонку complexity и фильтровать/сортировать.
  • MLflow / W&B — логирование распределения сложности по шагам для мониторинга.

Пет-проект для закрепления

Задача Реализовать curriculum learning для дообучения небольшой LLM (например, GPT-2 124M) на датасете с текстами разной длины и техничности.

Инструменты Python, HuggingFace Transformers, Datasets, PyTorch.

Шаги:

  1. Загрузить датасет (например, c4 или wikitext-2).
  2. Вычислить сложность каждого примера: длина в токенах + perplexity базовой модели (GPT-2 small).
  3. Нормализовать сложность в [0,1].
  4. Написать кастомный Trainer, который на каждом шаге пересчитывает веса сэмплирования по формуле w = exp(-alpha * step/total * complexity).
  5. Обучить модель с CL и без (контроль) на одинаковом количестве шагов.
  6. Оценить на MMLU (или на perplexity тестового набора).

Ожидаемый результат Модель, обученная с CL, покажет на 1–3% лучшее качество на сложных подмножествах теста (например, на научных текстах) при той же или меньшей финальной perplexity.


Связь с другими вопросами

ВопросТема
476Data mixing strategies для LLM
478Active learning для сбора данных
479Progressive learning (увеличение контекста)
480Self-supervised learning для LLM
481Fine-tuning на сложных доменах
482Оценка качества данных (data quality metrics)

Навигация