# Как Андрей Карпатый собрал GPT из 200 строк кода

Источник: https://www.youtube.com/watch?v=kCc8FmEb1nY
Канал: Andrej Karpathy
Опубликовано: 17.01.2023

---

17 января 2023 года Андрей Карпатый опубликовал видеоруководство по созданию архитектуры GPT с нуля. Он демонстрирует процесс написания кода на языке Python с использованием библиотеки PyTorch. Главная цель урока — показать внутреннее устройство трансформеров, которые лежат в основе ChatGPT.

## 📊 Подготовка данных и токенизация
[[JUMP:07:53]]

Андрей Карпатый использует набор данных Tiny Shakespeare объёмом около 1 МБ [08:07]. Этот файл содержит все произведения Шекспира, объединённые в одну строку из 1 миллиона символов [08:20]. Для обучения модели автор выбирает посимвольную токенизацию вместо обработки целых слов.

Процесс обработки данных включает:

*   Создание словаря из 65 уникальных символов, встречающихся в тексте [09:16].
*   Написание функций `encode` и `decode` для преобразования букв в целые числа и обратно [10:34].
*   Разделение данных на обучающую (90%) и валидационную (10%) выборки [13:51].

В индустрии чаще используют субсимвольную токенизацию (subword tokenization). Например, Google применяет SentencePiece, а OpenAI в своих моделях GPT использует библиотеку TikToken и алгоритм Byte Pair Encoding (BPE) [11:13]. Посимвольный подход в данном уроке выбран для максимальной простоты кода [12:45].

## 🧱 Формирование обучающих блоков и батчей
[[JUMP:14:40]]

Модель не получает весь текст целиком, так как это вычислительно невозможно. Данные подаются случайными фрагментами заданной длины, которую называют `block_size` или контекстным окном [14:53].

Технические особенности формирования выборки:

*   Для `block_size` равного 8 модель обучается делать 8 предсказаний одновременно [15:56].
*   Входной тензор `x` содержит контекст, а целевой тензор `y` — те же символы со сдвигом на один шаг вправо [16:24].
*   Обучение на фрагментах разной длины (от 1 до `block_size`) позволяет трансформеру предсказывать следующий символ даже при минимальном контексте [17:28].
*   Параметр `batch_size` определяет количество независимых фрагментов, обрабатываемых параллельно на GPU [18:20].

Андрей Карпатый использует функцию `torch.stack` для объединения одномерных фрагментов в тензоры размерности BxT (Batch by Time) [20:17].

## 📉 Базовая модель Bigram Language Model
[[JUMP:22:11]]

В качестве отправной точки автор строит простейшую модель Bigram. В ней вероятность появления следующего символа зависит только от текущего [23:07]. Модель использует таблицу эмбеддингов (`nn.Embedding`) размером 65x65 [23:20].

Результаты работы Bigram-модели:

*   Начальная функция потерь (loss) составляет около 4.87 при ожидаемом теоретическом значении 4.17 [28:10].
*   Генерация текста на этом этапе выдаёт бессмысленный набор символов, так как токены не «общаются» друг с другом [33:44].
*   Для минимизации потерь используется оптимизатор AdamW с типичной скоростью обучения 3e-4 [35:05].

После 10 000 итераций обучения потери снижаются до 2.5, но текст всё ещё остаётся трудночитаемым [37:06].

## 🧠 Механизм Self-Attention: математический трюк
[[JUMP:42:13]]

Для улучшения предсказаний токены должны учитывать контекст. Самый простой способ — усреднить векторы предыдущих токенов [43:56]. Андрей Карпатый показывает, как эффективно реализовать это через матричное умножение [47:18].

Ключевой метод реализации:

1.  Создание нижней треугольной матрицы `tril` из единиц с помощью `torch.tril` [48:54].
2.  Нормализация строк матрицы так, чтобы их сумма равнялась 1 [51:04].
3.  Матричное умножение этой маски на тензор данных для получения скользящего среднего.

В трансформерах этот процесс расширяется до Softmax-нормализации. Автор заполняет верхний треугольник матрицы значениями `-inf` (минус бесконечность), чтобы модель не могла «заглядывать в будущее» при обучении [55:20].

## 🔗 Реализация голов внимания (Query, Key, Value)
[[JUMP:1:02:13]]

Self-attention в GPT работает на основе трёх векторов для каждого токена: Query (Запрос), Key (Ключ) и Value (Значение) [1:04:00]. 

Принцип взаимодействия:

*   **Query**: что я ищу [1:04:12].
*   **Key**: что я содержу [1:04:12].
*   **Value**: какую информацию я передам, если мой ключ совпадёт с чьим-то запросом [1:10:15].

Аффинитет (степень связи) вычисляется как скалярное произведение Query одного токена и Key всех предыдущих токенов [1:06:16]. Полученные веса масштабируются делением на квадратный корень из размерности головы (Scaled Dot-Product Attention), чтобы контролировать дисперсию при инициализации [1:17:18].

## 🏗️ Сборка полнофункционального трансформера
[[JUMP:1:20:55]]

Андрей Карпатый объединяет компоненты в полноценную архитектуру, следуя статье «Attention is All You Need» [1:22:13].

Стандартный блок трансформера включает:

*   **Multi-Head Attention**: несколько голов внимания, работающих параллельно для захвата разных типов связей в тексте [1:22:27].
*   **Feed-Forward Network**: небольшой многослойный перцептрон, который даёт токенам возможность «обдумать» собранную информацию [1:25:00].
*   **Residual Connections**: проброс связей (Skip connections) для борьбы с затуханием градиентов в глубоких сетях [1:28:43].
*   **Layer Normalization**: нормализация признаков внутри каждого токена [1:33:09].

Автор отмечает, что в современных реализациях (включая GPT) слой нормализации ставят перед блоком внимания (Pre-norm), в отличие от оригинальной статьи 2017 года [1:35:46].

## 🚀 Масштабирование и обучение
[[JUMP:1:39:32]]

Для финального обучения Андрей Карпатый увеличивает параметры модели. Он устанавливает 6 слоёв трансформера, 6 голов внимания и размерность эмбеддинга 384 [1:40:11]. Контекстное окно расширяется до 256 символов [1:39:46]. 

Результаты финальной модели:

*   Время обучения на GPU NVIDIA A100 составило около 15 минут [1:40:49].
*   Валидационные потери снизились до 1.48 [1:40:37].
*   Сгенерированный текст стал напоминать структуру шекспировских пьес с разделением на роли и узнаваемой лексикой [1:41:29].

Модель насчитывает около 10 миллионов параметров, что в тысячи раз меньше GPT-3 (175 миллиардов параметров) [1:50:24].

## 🤖 Путь от GPT к ChatGPT
[[JUMP:1:49:05]]

Андрей Карпатый объясняет, что обученная модель является лишь «достройщиком документов» (document completer) [1:51:44]. Чтобы превратить её в помощника вроде ChatGPT, требуется второй этап — Fine-tuning (тонкая настройка).

Этапы превращения в ассистента:

1.  **SFT (Supervised Fine-tuning)**: обучение на специально отобранных диалогах «вопрос-ответ» [1:52:39].
2.  **Reward Model**: создание модели, которая оценивает качество ответов [1:53:32].
3.  **PPO (Reinforcement Learning)**: использование обучения с подкреплением для максимизации оценок от модели вознаграждения [1:53:45].

Библиотека nanoGPT, созданная автором, фокусируется именно на первом этапе — предварительном обучении (pre-training) [1:54:24].