Блок трансформера и модель GPT целиком

Урок 11 из 16 курса «Нейросети с нуля: по открытому коду Андрея Карпати»: неофициальный курс AI University по открытому коду (MIT). Урок входит в платный доступ; первые уроки курса бесплатно.

О чём урок

Этот урок завершает сборку трансформера: в прошлый раз вы разобрали механизм self-attention, теперь к нему добавится вычислительная часть блока (MLP), схема остаточных связей с нормализацией и, наконец, класс GPT, который оборачивает всё это в полноценную языковую модель. После урока вы сможете читать model.py от начала до конца, понимать, откуда берётся каждая группа параметров, и самостоятельно создать модель на PyTorch, прогнать через неё случайный батч и получить осмысленную стартовую функцию потерь.

Неофициальный курс AI University по открытому коду (MIT). В уроке приводится код из karpathy/nanoGPT © Andrej Karpathy, лицензия MIT; комментарии переведены на русский, объяснения написаны нашей командой. Курс не связан с автором кода и не одобрен им.

Self-attention решает задачу «коммуникации»: токены обмениваются информацией друг с другом. Но после того как каждый токен собрал нужный контекст, его представление нужно как-то переработать, то есть применить к нему нелинейное преобразование независимо от остальных токенов. Эту работу выполняет MLP (multi-layer perceptron), простой полносвязный блок, который применяется к каждой позиции последовательности отдельно и одинаково.

Обратите внимание на коэффициент 4: первый линейный слой c_fc расширяет размерность эмбеддинга в 4 раза, а второй, c_proj, сжимает обратно. Это расширение даёт сети больше «места» для вычислений внутри блока: промежуточное представление временно живёт в пространстве большей размерности, где нелинейности GELU есть с чем работать, а затем проецируется обратно в n_embd, чтобы форма тензора не менялась от блока к блоку. Именно это расширение в 4 раза даёт основную долю параметров трансформера, что вы увидите чуть ниже на конкретных числах.

GELU (Gaussian Error Linear Unit) здесь используется вместо ReLU: это гладкая функция активации, которая не обрезает отрицательные значения резко до нуля, как ReLU, а плавно уменьшает их вклад, что на практике немного улучшает обучение глубоких сетей.

PyTorch не позволяет напрямую создать nn.LayerNorm без смещения (bias), поэтому в nanoGPT есть своя небольшая обёртка:

LayerNorm нормализует вектор каждого…

План урока

  1. MLP: вычислительная часть блока
  2. LayerNorm и схема pre-norm
  3. Конфигурация GPTConfig
  4. Класс GPT: эмбеддинги, веса, инициализация
  5. forward: от индексов токенов к логитам
  6. Считаем параметры: конфигурация shakespeare_char
  7. Наш пример: первый прогон модели
  8. Попробуйте сами

Урок входит в полный доступ. Полный текст и видео открываются после оплаты. Первые уроки каждого курса бесплатны.

Полезные гиды