Перейти к содержимому

Архитектуры больших языковых моделей: учебное пособие

Документация · Руководство пользователя · Для разработчиков

Это пособие объясняет, как устроены современные большие языковые модели (LLM), на примере шести архитектур, реализованных «с нуля» на PyTorch в библиотеке llm/: GPT-1, GPT-2, LLaMA, Mistral, Mixtral и Gemma. Каждый механизм разбирается на трёх уровнях:

  1. Идея и научное обоснование. Какую задачу решает механизм, откуда он взялся, со ссылкой на статью.
  2. Математика. Формулы с расшифровкой каждого символа и формы тензора, пошаговые выводы и небольшие числовые примеры, которые можно проверить на бумаге.
  3. Код. Какой класс и какая строка библиотеки реализуют формулу, чем реализация отличается от оригинальной статьи и как это проверено.

Для студентов, инженеров и технических специалистов, которые знают Python и математику первых курсов: векторы и матрицы, производную, вероятность. Опыт в глубоком обучении не требуется — всё нужное вводится по ходу. Если какая-то запись непонятна, загляните в Обозначения и Глоссарий.

  • Последовательно. Часть I строит модель по частям: от задачи и токенов до обучения и генерации. Часть II собирает из этих частей конкретные архитектуры в историческом порядке: каждая глава описывает, что изменилось по сравнению с предыдущей моделью.
  • По архитектурам. Можно начать с нужной главы части II: там кратко напоминаются формулы и даются ссылки на подробные выводы в части I.
  • С кодом. Каждой архитектуре соответствует ноутбук в notebooks/ с пошаговым разбором, а скрипт experiments/llm_only/run_llm_experiment.py обучает и запускает любую из шести моделей.

В конце каждой главы есть «Итоги», «Вопросы и упражнения» (к расчётным заданиям приложены ответы под спойлером) и список литературы.

Справочник

Часть I. Основы

№ГлаваО чём
1Языковое моделированиевероятность текста, предсказание следующего токена, cross-entropy, перплексия, схема decoder-only трансформера
2Токенизацияподслова, алгоритм BPE, претокенизация, специальные токены
3Эмбеддинги и выходная проекциятаблица эмбеддингов, logits, weight tying, масштаб √d
4Позиционное кодированиеобучаемые и синусоидальные позиции, RoPE с полным выводом, база частот
5Механизм вниманияscaled dot-product, multi-head, MHA/GQA/MQA, скользящее окно, KV-кэш
6Маскиcausal-маска, окно, attention_mask и паддинг
7Нормализация и residual-связиLayerNorm, RMSNorm, post-LN и pre-LN
8Feed-forward сеть и активацииFFN, GELU, SiLU, SwiGLU, GeGLU, размер скрытого слоя
9Mixture-of-Expertsроутер, top-k, разреженность, load-balancing loss
10Обучениеградиент cross-entropy, AdamW, warmup, clipping, инициализация, точность вычислений
11Генерация текстаgreedy, температура, top-k, top-p, KV-кэш при генерации

Часть II. Архитектуры

№ГлаваГод / источникЧто нового
12GPT-1OpenAI, 2018decoder-only трансформер, обучаемые позиции, стандартный MHA, post-LN
13GPT-2OpenAI, 2019pre-LN, финальная нормализация, масштабированная инициализация
14LLaMAMeta, 2023RoPE, RMSNorm, SwiGLU, без bias; обычный MHA
15MistralMistral AI, 2023Grouped Query Attention, скользящее окно
16MixtralMistral AI, 2024Mixture-of-Experts вместо плотного FFN
17GemmaGoogle DeepMind, 2024Multi-Query Attention (2B), GeGLU, масштаб эмбеддингов, словарь 256k

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

Стрелка означает «опирается на».

flowchart LR
    LM["1 · Языковое<br/>моделирование"]:::gray --> TOK["2 · Токенизация"]:::gray
    TOK --> EMB["3 · Эмбеддинги"]:::blue
    EMB --> POS["4 · Позиции"]:::rope
    EMB --> ATT["5 · Attention"]:::blue
    POS --> ATT
    ATT --> MSK["6 · Маски"]:::gold
    ATT --> NRM["7 · Нормализация"]:::gray
    NRM --> FFN["8 · FFN"]:::purple
    FFN --> MOE["9 · MoE"]:::purple
    LM --> TRN["10 · Обучение"]:::gray
    ATT --> GEN["11 · Генерация"]:::gray
    TRN --> GPT["GPT-1 → GPT-2"]:::green
    GEN --> GPT
    GPT --> LLA["LLaMA"]:::green
    LLA --> MIS["Mistral"]:::green
    MIS --> MIX["Mixtral"]:::green
    LLA --> GEM["Gemma"]:::green
    MOE --> MIX

    classDef blue fill:#dae8fc,stroke:#6c8ebf,color:#1a1a1a;
    classDef purple fill:#e1d5e7,stroke:#9673a6,color:#1a1a1a;
    classDef gray fill:#f5f5f5,stroke:#666666,color:#1a1a1a;
    classDef gold fill:#fff2cc,stroke:#d6b656,color:#1a1a1a;
    classDef rope fill:#d5f0ec,stroke:#3a9e8f,color:#1a1a1a;
    classDef green fill:#d5e8d4,stroke:#82b366,color:#1a1a1a;
GPT-1GPT-2LLaMAMistralMixtralGemma
ПозицииобучаемыеобучаемыеRoPERoPERoPERoPE
НормализацияLayerNorm, post-LNLayerNorm, pre-LNRMSNorm, pre-LNRMSNorm, pre-LNRMSNorm, pre-LNRMSNorm, pre-LN
AttentionMHAMHAMHAGQA + окноGQAMQA (2B) / MHA (7B)
FFNGELUGELUSwiGLUSwiGLUMoE из SwiGLUGeGLU
Weight tyingдаданетнетнетда
Класс в llmGPTGPT2LlamaMistralMixtralGemma

Таблица описывает оригинальные модели. В библиотеке многие особенности включаются ключами конфига (tie_word_embeddings, bias, intermediate_size, window_size, num_kv_heads и др.), а по умолчанию сохранена прежняя структура, чтобы загружались старые чекпоинты; подробности — в разделах «Отличия от оригинала» глав части II.

Цепочка развития: GPT-1 → GPT-2 → LLaMA → Mistral → Mixtral. Gemma — параллельная ветка на той же основе (RoPE + RMSNorm + gated FFN).

  • Mistral, Mixtral — окно sliding window шириной window_size + 1 позиций (как в тексте статьи и prefill эталонного кода), а в HuggingFace — window_size; при загрузке весов HF — window_size = sliding_window − 1, см. mistral.md.

Полный список технического долга с приоритетами и способами исправления — в backlog.md.

Все основные работы, на которые ссылается пособие. Отдельные главы ссылаются и на другие статьи — они перечислены в конце каждой главы.

  • Radford, Narasimhan, Salimans, Sutskever. Improving Language Understanding by Generative Pre-Training. OpenAI, 2018. PDF (на arXiv не публиковалась)
  • Radford, Wu, Child, Luan, Amodei, Sutskever. Language Models are Unsupervised Multitask Learners. OpenAI, 2019. PDF (на arXiv не публиковалась)
  • Touvron et al. LLaMA: Open and Efficient Foundation Language Models. 2023. arXiv:2302.13971
  • Touvron et al. Llama 2: Open Foundation and Fine-Tuned Chat Models. 2023. arXiv:2307.09288 — GQA в линейке LLaMA появляется здесь (модели 34B и 70B)
  • Jiang et al. Mistral 7B. 2023. arXiv:2310.06825
  • Jiang et al. Mixtral of Experts. 2024. arXiv:2401.04088
  • Gemma Team. Gemma: Open Models Based on Gemini Research and Technology. 2024. arXiv:2403.08295
  • Vaswani et al. Attention Is All You Need. 2017. arXiv:1706.03762
  • Liu et al. Generating Wikipedia by Summarizing Long Sequences. 2018. arXiv:1801.10198 — decoder-only трансформер, на который опирается GPT-1
  • Su et al. RoFormer: Enhanced Transformer with Rotary Position Embedding. 2021. arXiv:2104.09864
  • Ba, Kiros, Hinton. Layer Normalization. 2016. arXiv:1607.06450
  • Zhang, Sennrich. Root Mean Square Layer Normalization. 2019. arXiv:1910.07467
  • Xiong et al. On Layer Normalization in the Transformer Architecture. 2020. arXiv:2002.04745 — почему pre-LN обучается стабильнее post-LN
  • Shazeer. Fast Transformer Decoding: One Write-Head is All You Need. 2019. arXiv:1911.02150 — Multi-Query Attention
  • Ainslie et al. GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints. 2023. arXiv:2305.13245
  • Beltagy, Peters, Cohan. Longformer: The Long-Document Transformer. 2020. arXiv:2004.05150 — sliding window attention
  • Hendrycks, Gimpel. Gaussian Error Linear Units (GELUs). 2016. arXiv:1606.08415
  • Shazeer. GLU Variants Improve Transformer. 2020. arXiv:2002.05202 — SwiGLU и GeGLU
  • Shazeer et al. Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer. 2017. arXiv:1701.06538
  • Fedus, Zoph, Shazeer. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity. 2021. arXiv:2101.03961 — load-balancing loss для роутера
  • Loshchilov, Hutter. Decoupled Weight Decay Regularization. 2019. arXiv:1711.05101 — AdamW
  • Holtzman et al. The Curious Case of Neural Text Degeneration. 2020. arXiv:1904.09751 — nucleus (top-p) sampling
  • Sennrich, Haddow, Birch. Neural Machine Translation of Rare Words with Subword Units. 2016. arXiv:1508.07909 — BPE-токенизация

Формулы записаны в LaTeX и рендерятся GitHub: выключные — блоками math, строчные — в виде …\ldots. Все обозначения собраны в notation.md.

Диаграммы — на Mermaid (рендерятся нативно на GitHub). Схема блока каждой модели устроена одинаково:

  • сверху вниз: token ids → эмбеддинги → стек декодеров → финальная нормализация → Linear → logits;
  • зелёная рамка — один блок декодера, повторяется num_layers раз; внутри показан путь одного блока, пунктир — residual-связи;
  • жирная обводка — то, что изменилось по сравнению с предыдущей моделью в линейке;
  • пунктирная стрелка от logits — шаг генерации (softmax и выбор токена выполняются в generate(), а не в forward).

Цвета: синий — эмбеддинги токенов и attention, фиолетовый — обучаемые позиционные эмбеддинги (GPT) и FFN, бирюзовый — RoPE, жёлтый — маски, серый — нормализация, линейные слои и dropout.

RoPE нарисован сбоку от декодера с пунктирной стрелкой в attention: он не прибавляется к основному потоку, как позиционные эмбеддинги GPT, а поворачивает Q и K внутри attention каждого слоя. Подробно — в positional-encoding.md.