17 января 2023 года Андрей Карпатый опубликовал видеоруководство по созданию архитектуры GPT с нуля. Он демонстрирует процесс написания кода на языке Python с использованием библиотеки PyTorch. Главная цель урока — показать внутреннее устройство трансформеров, которые лежат в основе ChatGPT.
📊 Подготовка данных и токенизация 7:53
Андрей Карпатый использует набор данных Tiny Shakespeare объёмом около 1 МБ . Этот файл содержит все произведения Шекспира, объединённые в одну строку из 1 миллиона символов . Для обучения модели автор выбирает посимвольную токенизацию вместо обработки целых слов.
Процесс обработки данных включает:
- Создание словаря из 65 уникальных символов, встречающихся в тексте .
- Написание функций
encodeиdecodeдля преобразования букв в целые числа и обратно . - Разделение данных на обучающую (90%) и валидационную (10%) выборки .
В индустрии чаще используют субсимвольную токенизацию (subword tokenization). Например, Google применяет SentencePiece, а OpenAI в своих моделях GPT использует библиотеку TikToken и алгоритм Byte Pair Encoding (BPE) . Посимвольный подход в данном уроке выбран для максимальной простоты кода .
🧱 Формирование обучающих блоков и батчей 14:40
Модель не получает весь текст целиком, так как это вычислительно невозможно. Данные подаются случайными фрагментами заданной длины, которую называют block_size или контекстным окном .
Технические особенности формирования выборки:
- Для
block_sizeравного 8 модель обучается делать 8 предсказаний одновременно . - Входной тензор
xсодержит контекст, а целевой тензорy— те же символы со сдвигом на один шаг вправо . - Обучение на фрагментах разной длины (от 1 до
block_size) позволяет трансформеру предсказывать следующий символ даже при минимальном контексте . - Параметр
batch_sizeопределяет количество независимых фрагментов, обрабатываемых параллельно на GPU .
Андрей Карпатый использует функцию torch.stack для объединения одномерных фрагментов в тензоры размерности BxT (Batch by Time) .
📉 Базовая модель Bigram Language Model 22:11
В качестве отправной точки автор строит простейшую модель Bigram. В ней вероятность появления следующего символа зависит только от текущего . Модель использует таблицу эмбеддингов (nn.Embedding) размером 65x65 .
Результаты работы Bigram-модели:
- Начальная функция потерь (loss) составляет около 4.87 при ожидаемом теоретическом значении 4.17 .
- Генерация текста на этом этапе выдаёт бессмысленный набор символов, так как токены не «общаются» друг с другом .
- Для минимизации потерь используется оптимизатор AdamW с типичной скоростью обучения 3e-4 .
После 10 000 итераций обучения потери снижаются до 2.5, но текст всё ещё остаётся трудночитаемым .
🧠 Механизм Self-Attention: математический трюк 42:13
Для улучшения предсказаний токены должны учитывать контекст. Самый простой способ — усреднить векторы предыдущих токенов . Андрей Карпатый показывает, как эффективно реализовать это через матричное умножение .
Ключевой метод реализации:
- Создание нижней треугольной матрицы
trilиз единиц с помощьюtorch.tril. - Нормализация строк матрицы так, чтобы их сумма равнялась 1 .
- Матричное умножение этой маски на тензор данных для получения скользящего среднего.
В трансформерах этот процесс расширяется до Softmax-нормализации. Автор заполняет верхний треугольник матрицы значениями -inf (минус бесконечность), чтобы модель не могла «заглядывать в будущее» при обучении .
🔗 Реализация голов внимания (Query, Key, Value) 1:02:13
Self-attention в GPT работает на основе трёх векторов для каждого токена: Query (Запрос), Key (Ключ) и Value (Значение) .
Принцип взаимодействия:
- Query: что я ищу .
- Key: что я содержу .
- Value: какую информацию я передам, если мой ключ совпадёт с чьим-то запросом .
Аффинитет (степень связи) вычисляется как скалярное произведение Query одного токена и Key всех предыдущих токенов . Полученные веса масштабируются делением на квадратный корень из размерности головы (Scaled Dot-Product Attention), чтобы контролировать дисперсию при инициализации .
🏗️ Сборка полнофункционального трансформера 1:20:55
Андрей Карпатый объединяет компоненты в полноценную архитектуру, следуя статье «Attention is All You Need» .
Стандартный блок трансформера включает:
- Multi-Head Attention: несколько голов внимания, работающих параллельно для захвата разных типов связей в тексте .
- Feed-Forward Network: небольшой многослойный перцептрон, который даёт токенам возможность «обдумать» собранную информацию .
- Residual Connections: проброс связей (Skip connections) для борьбы с затуханием градиентов в глубоких сетях .
- Layer Normalization: нормализация признаков внутри каждого токена .
Автор отмечает, что в современных реализациях (включая GPT) слой нормализации ставят перед блоком внимания (Pre-norm), в отличие от оригинальной статьи 2017 года .
🚀 Масштабирование и обучение 1:39:32
Для финального обучения Андрей Карпатый увеличивает параметры модели. Он устанавливает 6 слоёв трансформера, 6 голов внимания и размерность эмбеддинга 384 . Контекстное окно расширяется до 256 символов .
Результаты финальной модели:
- Время обучения на GPU NVIDIA A100 составило около 15 минут .
- Валидационные потери снизились до 1.48 .
- Сгенерированный текст стал напоминать структуру шекспировских пьес с разделением на роли и узнаваемой лексикой .
Модель насчитывает около 10 миллионов параметров, что в тысячи раз меньше GPT-3 (175 миллиардов параметров) .
🤖 Путь от GPT к ChatGPT 1:49:05
Андрей Карпатый объясняет, что обученная модель является лишь «достройщиком документов» (document completer) . Чтобы превратить её в помощника вроде ChatGPT, требуется второй этап — Fine-tuning (тонкая настройка).
Этапы превращения в ассистента:
- SFT (Supervised Fine-tuning): обучение на специально отобранных диалогах «вопрос-ответ» .
- Reward Model: создание модели, которая оценивает качество ответов .
- PPO (Reinforcement Learning): использование обучения с подкреплением для максимизации оценок от модели вознаграждения .
Библиотека nanoGPT, созданная автором, фокусируется именно на первом этапе — предварительном обучении (pre-training) .