Что такое curriculum learning для LLM и как его реализовать?
Краткий тезис
Curriculum learning (обучение по учебному плану) для LLM — это стратегия постепенного усложнения обучающих примеров в процессе тренировки. Основная реализация заключается в увеличении длины контекстного окна от коротких последовательностей (например, 256 токенов) до полной длины (2048+ токенов) по мере обучения. Такой подход стабилизирует градиенты, улучшает сходимость и позволяет модели эффективно учиться обрабатывать длинные зависимости без начальной нестабильности.
1. Термин: Curriculum Learning
Curriculum learning — методика машинного обучения, при которой модель сначала обучается на простых примерах, а затем постепенно переходит к более сложным. Идея заимствована из человеческого образования: сначала изучают базовые понятия, потом переходят к продвинутым. Для LLM «сложность» может определяться:
- длиной последовательности (количество токенов);
- сложностью синтаксиса или семантики (например, перплексия предложения);
- типом задачи (сначала генерация, потом reasoning, затем multi-step).
Термин введён в работе Bengio et al. (2009) «Curriculum Learning», а для LLM популяризирован в контексте обучения с большими контекстными окнами (например, GPT, LLaMA).
2. Зачем curriculum learning для LLM?
Обучение LLM «с нуля» на длинных последовательностях (например, 8192 токена) сразу приводит к проблемам:
- Нестабильность градиентов: длинные последовательности создают большие вариации в градиентах, особенно на ранних этапах.
- Медленная сходимость: модель тратит ресурсы на изучение локальных паттернов, не успевая обобщить дальние зависимости.
- Переобучение на коротких контекстах: если сразу давать длинные примеры, модель может игнорировать дальние токены, фокусируясь на ближних.
Curriculum learning решает эти проблемы:
- Начало с коротких последовательностей (128–256 токенов) позволяет модели стабильно выучить базовые n-граммы и синтаксис.
- Постепенное увеличение длины (512, 1024, 2048, …) даёт время адаптировать self-attention к растущему рецептивному полю.
- Улучшается конвергенция — loss снижается быстрее, финальное качество на длинных контекстах выше.
3. Основной подход: увеличение длины контекстного окна
Самый распространённый вариант curriculum для LLM — length-based curriculum. Обучение разбивается на этапы (stages), на каждом из которых максимальная длина последовательности (sequence length|max_seq_len) фиксирована или выбирается из распределения, которое со временем сдвигается вправо.
Типичное расписание (на примере LLaMA):
- Этап 1: sequence length|max_seq_len = 256 токенов (10% шагов)
- Этап 2: sequence length|max_seq_len = 512 токенов (20% шагов)
- Этап 3: sequence length|max_seq_len = 1024 токена (30% шагов)
- Этап 4: sequence length|max_seq_len = 2048 токенов (40% шагов)
Или более плавное: линейное увеличение от 256 до 2048 за N шагов.
4. Реализация: Sampler с распределением длин
На практике curriculum learning реализуется через динамический батч-самплер (batch sampler), который на каждом шаге выбирает длину последовательности для каждого примера в батче. Распределение длин контролируется параметром curriculum_step.
Псевдокод sampler’а на Python:
import numpy as np
class CurriculumSampler:
def __init__(self, min_len=256, max_len=2048, total_steps=100000):
self.min_len = min_len
self.max_len = max_len
self.total_steps = total_steps
self.current_step = 0
def sample_length(self):
# Линейное увеличение среднего значения
progress = self.current_step / self.total_steps
mean_len = self.min_len + (self.max_len - self.min_len) * progress
# Добавляем шум для разнообразия
length = int(np.random.normal(mean_len, scale=mean_len*0.1))
length = np.clip(length, self.min_len, self.max_len)
return length
def __call__(self, batch_size):
lengths = [self.sample_length() for _ in range(batch_size)]
self.current_step += 1
return lengths
В реальных фреймворках (например, Megatron-LM, PyTorch Lightning) такой sampler используется для динамического паддинга (padding) и маскирования.
5. Детали реализации: расписания (schedules)
Расписание увеличения длины может быть:
- Линейное: max_len = min_len + (max_len_final - min_len) * (step / total_steps)
- Ступенчатое: фиксированные этапы с резким увеличением (как в LLaMA).
- Экспоненциальное: max_len = min_len * (growth_factor) ** floor(step / stage_size)
- Косинусное: плавное ускорение в середине обучения.
Выбор расписания зависит от архитектуры и объёма данных. Для больших моделей (70B+) часто используют ступенчатое, чтобы дать модели время адаптироваться на каждой длине.
6. Пример кода: интеграция в цикл обучения
import torch
from torch.utils.data import DataLoader, Dataset
class DynamicLengthDataset(Dataset):
def __init__(self, data, sampler):
self.data = data
self.sampler = sampler
def __getitem__(self, idx):
length = self.sampler.sample_length()
# Обрезаем или дополняем последовательность до length
seq = self.data[idx][:length]
return torch.tensor(seq, dtype=torch.long)
# Использование
sampler = CurriculumSampler(min_len=256, max_len=2048, total_steps=50000)
dataset = DynamicLengthDataset(tokenized_data, sampler)
dataloader = DataLoader(dataset, batch_size=32, collate_fn=custom_collate)
Важно: при динамической длине нужно корректно маскировать паддинг в функции потерь (ignore_index).
7. Дополнительные аспекты curriculum для LLM
7.1 Data curriculum (по сложности данных)
Не только длина, но и качество/сложность текстов. Например:
- Сначала обучать на чистых, простых текстах (Wikipedia, книги).
- Затем добавлять шумные данные (Reddit, код с ошибками).
- В конце — сложные рассуждения (math, научные статьи).
Реализуется через фильтрацию по перплексии (perplexity) или классификатор сложности.
7.2 Task curriculum (по типу задачи)
Для fine-tuning LLM под конкретные задачи:
- Сначала простые задачи (генерация, суммаризация).
- Потом multi-turn диалоги.
- Затем reasoning (Chain-of-Thought, математика).
7.3 Curriculum для агентов (Agentic RAG)
В контексте агентов curriculum learning может применяться для обучения модели постепенно усложняющимся сценариям: сначала простые retrieval-запросы, затем multi-hop, затем планирование с инструментами.
8. Преимущества и недостатки
| Преимущества | Недостатки |
|---|---|
| Стабилизация обучения (меньше spikes в loss) | Требует дополнительного tuning расписания |
| Улучшение сходимости (быстрее достигается low loss) | Может замедлить обучение на ранних этапах (короткие последовательности менее информативны) |
| Позволяет обучать модели с большим контекстом (8K+) без OOM | Необходимость динамического паддинга и маскирования |
| Уменьшает переобучение на коротких контекстах | Сложность реализации в распределённом обучении |
9. Связь с другими техниками
- Warmup (разогрев learning rate) — часто используется вместе с curriculum: сначала короткие последовательности + низкий LR, затем увеличение и LR, и длины.
- Progressive training — более общий термин, включающий curriculum по длине, размеру модели (начиная с маленькой), количеству данных.
- Length-based sampling — альтернатива: не curriculum, а просто равномерное распределение длин, но с бОльшим весом коротких (не даёт преимущества постепенности).
Пет-проект для закрепления
Задача: Обучить небольшую GPT-подобную модель (например, 4 слоя, 4 головы) на синтетических данных (тексты из книг) с curriculum по длине и без него, сравнить сходимость.
Инструменты: PyTorch, Hugging Face Transformers (или собственная реализация), Weights & Biases для логирования.
Шаги:
- Подготовить датасет: токенизировать тексты, разбить на чанки разной длины (128–1024 токена).
- Реализовать два тренировочных цикла:
- Без curriculum: всегда max_len=1024.
- С curriculum: начать с 128, увеличивать до 1024 за 10 эпох (линейно).
- Обучить обе модели на одинаковом количестве шагов.
- Замерить loss, perplexity на валидации (фиксированная длина 1024).
- Построить графики: loss vs шаги, финальная perplexity.
Ожидаемый результат: Модель с curriculum покажет более гладкий loss, меньшую финальную perplexity и лучшее качество на длинных последовательностях (например, на тесте с coherence).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 465 | Как обучать LLM с длинным контекстом? |
| 467 | Что такое progressive training? |
| 468 | Как работает warmup в обучении LLM? |
| 470 | Какие техники стабилизации обучения LLM вы знаете? |
| 480 | Как устроен self-attention в LLM? |
| 500 | Что такое Flash Attention и как он ускоряет обучение? |
Навигация
- Предыдущий: 465
- Следующий: 467
- Индекс: 00. Индекс разборов