中文翻译暂不可用,显示俄语原文。

Что такое 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 для LLMlength-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 под конкретные задачи:

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 для логирования.

Шаги:

  1. Подготовить датасет: токенизировать тексты, разбить на чанки разной длины (128–1024 токена).
  2. Реализовать два тренировочных цикла:
    • Без curriculum: всегда max_len=1024.
    • С curriculum: начать с 128, увеличивать до 1024 за 10 эпох (линейно).
  3. Обучить обе модели на одинаковом количестве шагов.
  4. Замерить loss, perplexity на валидации (фиксированная длина 1024).
  5. Построить графики: loss vs шаги, финальная perplexity.

Ожидаемый результат: Модель с curriculum покажет более гладкий loss, меньшую финальную perplexity и лучшее качество на длинных последовательностях (например, на тесте с coherence).


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

ВопросТема
465Как обучать LLM с длинным контекстом?
467Что такое progressive training?
468Как работает warmup в обучении LLM?
470Какие техники стабилизации обучения LLM вы знаете?
480Как устроен self-attention в LLM?
500Что такое Flash Attention и как он ускоряет обучение?

Навигация